From ff0771a83f1818b702ad0b5cf8d740ea74c90644 Mon Sep 17 00:00:00 2001 From: zyl Date: Thu, 26 Mar 2026 16:23:31 +0800 Subject: [PATCH] feat: refactor sgclaw around zeroclaw compat runtime --- Cargo.lock | 2118 ++- Cargo.toml | 6 + README.md | 20 + .../2026-03-26-deepseek-browser-smoke-plan.md | 134 + .../2026-03-26-zeroclaw-core-refactor-plan.md | 274 + resources/rules.json | 6 +- src/agent/mod.rs | 14 +- src/agent/planner.rs | 54 +- src/compat/browser_tool_adapter.rs | 156 + src/compat/config_adapter.rs | 38 + src/compat/cron_adapter.rs | 98 + src/compat/event_bridge.rs | 63 + src/compat/memory_adapter.rs | 30 + src/compat/mod.rs | 6 + src/compat/runtime.rs | 197 + src/lib.rs | 1 + src/pipe/browser_tool.rs | 16 +- tests/browser_tool_test.rs | 11 + tests/compat_browser_tool_test.rs | 203 + tests/compat_config_test.rs | 55 + tests/compat_cron_test.rs | 63 + tests/compat_memory_test.rs | 42 + tests/compat_runtime_test.rs | 334 + tests/planner_test.rs | 18 + third_party/zeroclaw/.cargo/audit.toml | 12 + third_party/zeroclaw/.cargo/config.toml | 13 + .../.claude/skills/github-issue/SKILL.md | 133 + .../.claude/skills/github-pr/SKILL.md | 209 + .../.claude/skills/skill-creator/LICENSE.txt | 202 + .../.claude/skills/skill-creator/SKILL.md | 485 + .../skills/skill-creator/agents/analyzer.md | 274 + .../skills/skill-creator/agents/comparator.md | 202 + .../skills/skill-creator/agents/grader.md | 223 + .../skill-creator/assets/eval_review.html | 146 + .../eval-viewer/generate_review.py | 471 + .../skill-creator/eval-viewer/viewer.html | 1325 ++ .../skill-creator/references/schemas.md | 430 + .../skills/skill-creator/scripts/__init__.py | 0 .../scripts/aggregate_benchmark.py | 401 + .../skill-creator/scripts/generate_report.py | 326 + .../scripts/improve_description.py | 247 + .../skill-creator/scripts/package_skill.py | 136 + .../skill-creator/scripts/quick_validate.py | 103 + .../skills/skill-creator/scripts/run_eval.py | 310 + .../skills/skill-creator/scripts/run_loop.py | 328 + .../skills/skill-creator/scripts/utils.py | 47 + .../zeroclaw/.claude/skills/zeroclaw/SKILL.md | 285 + .../.claude/skills/zeroclaw/evals/evals.json | 23 + .../zeroclaw/references/cli-reference.md | 277 + .../skills/zeroclaw/references/rest-api.md | 505 + third_party/zeroclaw/.coderabbit.yaml | 71 + third_party/zeroclaw/.dockerignore | 71 + third_party/zeroclaw/.editorconfig | 44 + third_party/zeroclaw/.env.example | 122 + third_party/zeroclaw/.envrc | 1 + third_party/zeroclaw/.gemini/style-guide.md | 89 + third_party/zeroclaw/.gitattributes | 61 + third_party/zeroclaw/.githooks/pre-commit | 8 + third_party/zeroclaw/.githooks/pre-push | 53 + third_party/zeroclaw/.github/CODEOWNERS | 32 + .../.github/ISSUE_TEMPLATE/bug_report.yml | 138 + .../.github/ISSUE_TEMPLATE/config.yml | 11 + .../ISSUE_TEMPLATE/feature_request.yml | 107 + third_party/zeroclaw/.github/actionlint.yaml | 3 + .../.github/assets/show-tool-calls-after.png | Bin 0 -> 85650 bytes .../.github/assets/show-tool-calls-before.png | Bin 0 -> 112731 bytes .../zeroclaw/.github/codeql/codeql-config.yml | 8 + third_party/zeroclaw/.github/dependabot.yml | 52 + .../zeroclaw/.github/label-policy.json | 21 + third_party/zeroclaw/.github/labeler.yml | 448 + .../zeroclaw/.github/pull_request_template.md | 114 + .../zeroclaw/.github/workflows/README.md | 17 + .../.github/workflows/checks-on-pr.yml | 175 + .../zeroclaw/.github/workflows/ci-run.yml | 210 + .../workflows/cross-platform-build-manual.yml | 82 + .../.github/workflows/discord-release.yml | 145 + .../.github/workflows/master-branch-flow.md | 130 + .../.github/workflows/pr-path-labeler.yml | 19 + .../zeroclaw/.github/workflows/pub-aur.yml | 181 + .../.github/workflows/pub-homebrew-core.yml | 235 + .../zeroclaw/.github/workflows/pub-scoop.yml | 165 + .../.github/workflows/publish-crates-auto.yml | 160 + .../.github/workflows/publish-crates.yml | 108 + .../workflows/release-beta-on-push.yml | 462 + .../workflows/release-stable-manual.yml | 598 + .../.github/workflows/tweet-release.yml | 308 + third_party/zeroclaw/.gitignore | 54 + third_party/zeroclaw/.markdownlint-cli2.yaml | 15 + third_party/zeroclaw/.vscode/extensions.json | 14 + third_party/zeroclaw/.vscode/launch.json | 73 + third_party/zeroclaw/.vscode/settings.json | 22 + third_party/zeroclaw/.vscode/tasks.json | 133 + third_party/zeroclaw/AGENTS.md | 92 + third_party/zeroclaw/CHANGELOG.md | 1 + third_party/zeroclaw/CLAUDE.md | 16 + third_party/zeroclaw/CODE_OF_CONDUCT.md | 128 + third_party/zeroclaw/CONTRIBUTING.md | 582 + third_party/zeroclaw/Cargo.lock | 12652 +++++++++++++ third_party/zeroclaw/Cargo.toml | 337 + third_party/zeroclaw/Dockerfile | 152 + third_party/zeroclaw/Dockerfile.ci | 25 + third_party/zeroclaw/Dockerfile.debian | 130 + third_party/zeroclaw/Dockerfile.debian.ci | 34 + third_party/zeroclaw/Justfile | 78 + third_party/zeroclaw/LICENSE-APACHE | 176 + third_party/zeroclaw/LICENSE-MIT | 21 + third_party/zeroclaw/NOTICE | 58 + third_party/zeroclaw/README.ar.md | 755 + third_party/zeroclaw/README.bn.md | 755 + third_party/zeroclaw/README.cs.md | 755 + third_party/zeroclaw/README.da.md | 755 + third_party/zeroclaw/README.de.md | 755 + third_party/zeroclaw/README.el.md | 755 + third_party/zeroclaw/README.es.md | 755 + third_party/zeroclaw/README.fi.md | 755 + third_party/zeroclaw/README.fr.md | 755 + third_party/zeroclaw/README.he.md | 755 + third_party/zeroclaw/README.hi.md | 755 + third_party/zeroclaw/README.hu.md | 755 + third_party/zeroclaw/README.id.md | 755 + third_party/zeroclaw/README.it.md | 755 + third_party/zeroclaw/README.ja.md | 755 + third_party/zeroclaw/README.ko.md | 755 + third_party/zeroclaw/README.md | 751 + third_party/zeroclaw/README.nb.md | 755 + third_party/zeroclaw/README.nl.md | 755 + third_party/zeroclaw/README.pl.md | 755 + third_party/zeroclaw/README.pt.md | 755 + third_party/zeroclaw/README.ro.md | 755 + third_party/zeroclaw/README.ru.md | 755 + third_party/zeroclaw/README.sv.md | 755 + third_party/zeroclaw/README.th.md | 755 + third_party/zeroclaw/README.tl.md | 755 + third_party/zeroclaw/README.tr.md | 755 + third_party/zeroclaw/README.uk.md | 755 + third_party/zeroclaw/README.ur.md | 755 + third_party/zeroclaw/README.vi.md | 755 + third_party/zeroclaw/README.zh-CN.md | 755 + third_party/zeroclaw/SECURITY.md | 93 + third_party/zeroclaw/VENDORED_FROM.md | 7 + third_party/zeroclaw/apps/tauri/Cargo.toml | 29 + third_party/zeroclaw/apps/tauri/build.rs | 3 + .../apps/tauri/capabilities/default.json | 14 + .../apps/tauri/capabilities/desktop.json | 14 + .../apps/tauri/capabilities/mobile.json | 8 + .../zeroclaw/apps/tauri/gen/android/.gitkeep | 0 .../zeroclaw/apps/tauri/gen/apple/.gitkeep | 0 .../zeroclaw/apps/tauri/icons/.gitkeep | 0 .../zeroclaw/apps/tauri/icons/128x128.png | Bin 0 -> 1002 bytes .../zeroclaw/apps/tauri/icons/32x32.png | Bin 0 -> 243 bytes .../zeroclaw/apps/tauri/icons/icon.icns | Bin 0 -> 52246 bytes .../zeroclaw/apps/tauri/icons/icon.ico | Bin 0 -> 243 bytes .../zeroclaw/apps/tauri/icons/icon.svg | 4 + .../apps/tauri/icons/tray-disconnected.png | Bin 0 -> 199 bytes .../zeroclaw/apps/tauri/icons/tray-error.png | Bin 0 -> 208 bytes .../zeroclaw/apps/tauri/icons/tray-idle.png | Bin 0 -> 168 bytes .../apps/tauri/icons/tray-working.png | Bin 0 -> 201 bytes .../zeroclaw/apps/tauri/src/commands/agent.rs | 17 + .../apps/tauri/src/commands/channels.rs | 11 + .../apps/tauri/src/commands/gateway.rs | 19 + .../zeroclaw/apps/tauri/src/commands/mod.rs | 4 + .../apps/tauri/src/commands/pairing.rs | 19 + .../zeroclaw/apps/tauri/src/gateway_client.rs | 213 + third_party/zeroclaw/apps/tauri/src/health.rs | 40 + third_party/zeroclaw/apps/tauri/src/lib.rs | 136 + third_party/zeroclaw/apps/tauri/src/main.rs | 8 + third_party/zeroclaw/apps/tauri/src/mobile.rs | 6 + third_party/zeroclaw/apps/tauri/src/state.rs | 99 + .../zeroclaw/apps/tauri/src/tray/events.rs | 25 + .../zeroclaw/apps/tauri/src/tray/icon.rs | 105 + .../zeroclaw/apps/tauri/src/tray/menu.rs | 19 + .../zeroclaw/apps/tauri/src/tray/mod.rs | 34 + .../zeroclaw/apps/tauri/tauri.conf.json | 35 + .../zeroclaw/benches/agent_benchmarks.rs | 329 + third_party/zeroclaw/build.rs | 181 + third_party/zeroclaw/clippy.toml | 13 + .../zeroclaw/crates/aardvark-sys/Cargo.toml | 25 + .../zeroclaw/crates/aardvark-sys/build.rs | 27 + .../zeroclaw/crates/aardvark-sys/src/lib.rs | 475 + .../crates/aardvark-sys/vendor/aardvark.h | 919 + .../crates/aardvark-sys/vendor/aardvark.so | Bin 0 -> 86512 bytes .../zeroclaw/crates/robot-kit/Cargo.toml | 70 + .../zeroclaw/crates/robot-kit/PI5_SETUP.md | 515 + .../zeroclaw/crates/robot-kit/README.md | 213 + third_party/zeroclaw/crates/robot-kit/SOUL.md | 65 + .../zeroclaw/crates/robot-kit/robot.toml | 150 + .../zeroclaw/crates/robot-kit/src/config.rs | 217 + .../zeroclaw/crates/robot-kit/src/drive.rs | 428 + .../zeroclaw/crates/robot-kit/src/emote.rs | 326 + .../zeroclaw/crates/robot-kit/src/lib.rs | 154 + .../zeroclaw/crates/robot-kit/src/listen.rs | 208 + .../zeroclaw/crates/robot-kit/src/look.rs | 250 + .../zeroclaw/crates/robot-kit/src/safety.rs | 537 + .../zeroclaw/crates/robot-kit/src/sense.rs | 457 + .../zeroclaw/crates/robot-kit/src/speak.rs | 231 + .../zeroclaw/crates/robot-kit/src/tests.rs | 540 + .../zeroclaw/crates/robot-kit/src/traits.rs | 123 + third_party/zeroclaw/deny.toml | 53 + third_party/zeroclaw/dev/README.md | 169 + third_party/zeroclaw/dev/ci.sh | 159 + third_party/zeroclaw/dev/ci/Dockerfile | 22 + third_party/zeroclaw/dev/cli.sh | 140 + third_party/zeroclaw/dev/config.template.toml | 32 + .../zeroclaw/dev/docker-compose.ci.yml | 23 + third_party/zeroclaw/dev/docker-compose.yml | 72 + .../dev/recompute_contributor_tiers.sh | 324 + third_party/zeroclaw/dev/sandbox/Dockerfile | 34 + .../zeroclaw/dev/test-termux-release.sh | 261 + third_party/zeroclaw/dist/aur/.SRCINFO | 16 + third_party/zeroclaw/dist/aur/PKGBUILD | 32 + third_party/zeroclaw/dist/scoop/zeroclaw.json | 27 + third_party/zeroclaw/docker-compose.yml | 71 + third_party/zeroclaw/docs/README.ar.md | 96 + third_party/zeroclaw/docs/README.bn.md | 96 + third_party/zeroclaw/docs/README.cs.md | 96 + third_party/zeroclaw/docs/README.da.md | 96 + third_party/zeroclaw/docs/README.de.md | 96 + third_party/zeroclaw/docs/README.el.md | 96 + third_party/zeroclaw/docs/README.es.md | 96 + third_party/zeroclaw/docs/README.fi.md | 96 + third_party/zeroclaw/docs/README.fr.md | 95 + third_party/zeroclaw/docs/README.he.md | 96 + third_party/zeroclaw/docs/README.hi.md | 96 + third_party/zeroclaw/docs/README.hu.md | 99 + third_party/zeroclaw/docs/README.id.md | 99 + third_party/zeroclaw/docs/README.it.md | 99 + third_party/zeroclaw/docs/README.ja.md | 92 + third_party/zeroclaw/docs/README.ko.md | 99 + third_party/zeroclaw/docs/README.md | 91 + third_party/zeroclaw/docs/README.nb.md | 99 + third_party/zeroclaw/docs/README.nl.md | 96 + third_party/zeroclaw/docs/README.pl.md | 96 + third_party/zeroclaw/docs/README.pt.md | 96 + third_party/zeroclaw/docs/README.ro.md | 96 + third_party/zeroclaw/docs/README.ru.md | 92 + third_party/zeroclaw/docs/README.sv.md | 96 + third_party/zeroclaw/docs/README.th.md | 96 + third_party/zeroclaw/docs/README.tl.md | 96 + third_party/zeroclaw/docs/README.tr.md | 96 + third_party/zeroclaw/docs/README.uk.md | 96 + third_party/zeroclaw/docs/README.ur.md | 96 + third_party/zeroclaw/docs/README.vi.md | 96 + third_party/zeroclaw/docs/README.zh-CN.md | 98 + third_party/zeroclaw/docs/SUMMARY.ar.md | 89 + third_party/zeroclaw/docs/SUMMARY.bn.md | 89 + third_party/zeroclaw/docs/SUMMARY.cs.md | 89 + third_party/zeroclaw/docs/SUMMARY.da.md | 89 + third_party/zeroclaw/docs/SUMMARY.de.md | 89 + third_party/zeroclaw/docs/SUMMARY.el.md | 89 + third_party/zeroclaw/docs/SUMMARY.es.md | 89 + third_party/zeroclaw/docs/SUMMARY.fi.md | 89 + third_party/zeroclaw/docs/SUMMARY.fr.md | 89 + third_party/zeroclaw/docs/SUMMARY.he.md | 89 + third_party/zeroclaw/docs/SUMMARY.hi.md | 89 + third_party/zeroclaw/docs/SUMMARY.hu.md | 92 + third_party/zeroclaw/docs/SUMMARY.id.md | 92 + third_party/zeroclaw/docs/SUMMARY.it.md | 92 + third_party/zeroclaw/docs/SUMMARY.ja.md | 89 + third_party/zeroclaw/docs/SUMMARY.ko.md | 92 + third_party/zeroclaw/docs/SUMMARY.md | 140 + third_party/zeroclaw/docs/SUMMARY.nb.md | 92 + third_party/zeroclaw/docs/SUMMARY.nl.md | 89 + third_party/zeroclaw/docs/SUMMARY.pl.md | 89 + third_party/zeroclaw/docs/SUMMARY.pt.md | 89 + third_party/zeroclaw/docs/SUMMARY.ro.md | 89 + third_party/zeroclaw/docs/SUMMARY.ru.md | 89 + third_party/zeroclaw/docs/SUMMARY.sv.md | 89 + third_party/zeroclaw/docs/SUMMARY.th.md | 89 + third_party/zeroclaw/docs/SUMMARY.tl.md | 89 + third_party/zeroclaw/docs/SUMMARY.tr.md | 89 + third_party/zeroclaw/docs/SUMMARY.uk.md | 89 + third_party/zeroclaw/docs/SUMMARY.ur.md | 89 + third_party/zeroclaw/docs/SUMMARY.vi.md | 89 + third_party/zeroclaw/docs/SUMMARY.zh-CN.md | 114 + .../zeroclaw/docs/aardvark-integration.md | 325 + .../adr-004-tool-shared-state-ownership.md | 202 + .../docs/assets/Hardware_architecture.jpg | Bin 0 -> 85764 bytes .../docs/assets/architecture-diagrams.md | 832 + .../zeroclaw/docs/assets/architecture.svg | 312 + .../zeroclaw/docs/assets/zeroclaw-banner.png | Bin 0 -> 871066 bytes .../docs/assets/zeroclaw-comparison.jpeg | Bin 0 -> 1637969 bytes .../zeroclaw/docs/assets/zeroclaw-trans.png | Bin 0 -> 2156411 bytes third_party/zeroclaw/docs/assets/zeroclaw.png | Bin 0 -> 1203230 bytes third_party/zeroclaw/docs/browser-setup.md | 215 + .../zeroclaw/docs/contributing/README.md | 20 + .../contributing/actions-source-policy.md | 82 + .../contributing/adding-boards-and-tools.md | 116 + .../docs/contributing/cargo-slicer-speedup.md | 57 + .../docs/contributing/change-playbooks.md | 64 + .../zeroclaw/docs/contributing/ci-map.md | 136 + third_party/zeroclaw/docs/contributing/cla.md | 132 + .../docs/contributing/custom-providers.md | 206 + .../docs/contributing/doc-template.md | 63 + .../docs/contributing/docs-contract.md | 34 + .../docs/contributing/extension-examples.md | 407 + .../docs/contributing/label-registry.md | 213 + .../contributing/langgraph-integration.md | 239 + .../docs/contributing/pr-discipline.md | 86 + .../zeroclaw/docs/contributing/pr-workflow.md | 366 + .../docs/contributing/release-process.md | 170 + .../docs/contributing/reviewer-playbook.md | 191 + .../docs/contributing/testing-telegram.md | 303 + .../zeroclaw/docs/contributing/testing.md | 149 + third_party/zeroclaw/docs/hardware/README.md | 19 + .../zeroclaw/docs/hardware/android-setup.md | 100 + .../docs/hardware/arduino-uno-q-setup.md | 217 + .../docs/hardware/datasheets/arduino-uno.md | 37 + .../docs/hardware/datasheets/esp32.md | 22 + .../docs/hardware/datasheets/nucleo-f401re.md | 16 + .../hardware/hardware-peripherals-design.md | 324 + .../zeroclaw/docs/hardware/nucleo-setup.md | 147 + third_party/zeroclaw/docs/i18n/README.md | 28 + third_party/zeroclaw/docs/i18n/ar/README.md | 35 + third_party/zeroclaw/docs/i18n/ar/SUMMARY.md | 20 + third_party/zeroclaw/docs/i18n/bn/README.md | 35 + third_party/zeroclaw/docs/i18n/bn/SUMMARY.md | 20 + third_party/zeroclaw/docs/i18n/de/README.md | 35 + third_party/zeroclaw/docs/i18n/de/SUMMARY.md | 20 + third_party/zeroclaw/docs/i18n/hi/README.md | 35 + third_party/zeroclaw/docs/i18n/hi/SUMMARY.md | 20 + third_party/zeroclaw/docs/i18n/ko/README.md | 35 + third_party/zeroclaw/docs/i18n/ko/SUMMARY.md | 20 + third_party/zeroclaw/docs/i18n/tl/README.md | 35 + third_party/zeroclaw/docs/i18n/tl/SUMMARY.md | 20 + .../i18n/zh-CN/contributing/README.zh-CN.md | 20 + .../actions-source-policy.zh-CN.md | 79 + .../adding-boards-and-tools.zh-CN.md | 116 + .../cargo-slicer-speedup.zh-CN.md | 57 + .../contributing/change-playbooks.zh-CN.md | 55 + .../i18n/zh-CN/contributing/ci-map.zh-CN.md | 127 + .../docs/i18n/zh-CN/contributing/cla.zh-CN.md | 98 + .../contributing/custom-providers.zh-CN.md | 206 + .../zh-CN/contributing/doc-template.zh-CN.md | 62 + .../zh-CN/contributing/docs-contract.zh-CN.md | 34 + .../contributing/extension-examples.zh-CN.md | 407 + .../langgraph-integration.zh-CN.md | 239 + .../zh-CN/contributing/pr-discipline.zh-CN.md | 86 + .../zh-CN/contributing/pr-workflow.zh-CN.md | 366 + .../contributing/release-process.zh-CN.md | 133 + .../contributing/reviewer-playbook.zh-CN.md | 191 + .../contributing/testing-telegram.zh-CN.md | 310 + .../i18n/zh-CN/contributing/testing.zh-CN.md | 149 + .../docs/i18n/zh-CN/hardware/README.zh-CN.md | 19 + .../zh-CN/hardware/android-setup.zh-CN.md | 103 + .../hardware/arduino-uno-q-setup.zh-CN.md | 217 + .../hardware/datasheets/arduino-uno.zh-CN.md | 37 + .../zh-CN/hardware/datasheets/esp32.zh-CN.md | 22 + .../datasheets/nucleo-f401re.zh-CN.md | 16 + .../hardware-peripherals-design.zh-CN.md | 324 + .../i18n/zh-CN/hardware/nucleo-setup.zh-CN.md | 147 + .../i18n/zh-CN/maintainers/README.zh-CN.md | 17 + .../zh-CN/maintainers/docs-inventory.zh-CN.md | 104 + .../zh-CN/maintainers/i18n-coverage.zh-CN.md | 76 + ...roject-triage-snapshot-2026-02-18.zh-CN.md | 94 + .../maintainers/refactor-candidates.zh-CN.md | 231 + .../i18n/zh-CN/maintainers/repo-map.zh-CN.md | 255 + .../maintainers/structure-README.zh-CN.md | 87 + .../i18n/zh-CN/maintainers/trademark.zh-CN.md | 98 + .../docs/i18n/zh-CN/ops/README.zh-CN.md | 24 + .../zh-CN/ops/network-deployment.zh-CN.md | 305 + .../zh-CN/ops/operations-runbook.zh-CN.md | 128 + .../zh-CN/ops/proxy-agent-playbook.zh-CN.md | 229 + .../i18n/zh-CN/ops/resource-limits.zh-CN.md | 109 + .../i18n/zh-CN/ops/troubleshooting.zh-CN.md | 242 + .../docs/i18n/zh-CN/reference/README.zh-CN.md | 23 + .../reference/api/channels-reference.zh-CN.md | 513 + .../reference/api/config-reference.zh-CN.md | 696 + .../api/providers-reference.zh-CN.md | 309 + .../reference/cli/commands-reference.zh-CN.md | 219 + .../i18n/zh-CN/reference/sop/README.zh-CN.md | 64 + .../zh-CN/reference/sop/connectivity.zh-CN.md | 143 + .../zh-CN/reference/sop/cookbook.zh-CN.md | 92 + .../reference/sop/observability.zh-CN.md | 39 + .../i18n/zh-CN/reference/sop/syntax.zh-CN.md | 90 + .../docs/i18n/zh-CN/security/README.zh-CN.md | 22 + .../zh-CN/security/agnostic-security.zh-CN.md | 355 + .../zh-CN/security/audit-logging.zh-CN.md | 192 + .../security/frictionless-security.zh-CN.md | 312 + .../zh-CN/security/matrix-e2ee-guide.zh-CN.md | 141 + .../i18n/zh-CN/security/sandboxing.zh-CN.md | 200 + .../zh-CN/security/security-roadmap.zh-CN.md | 188 + .../i18n/zh-CN/setup-guides/README.zh-CN.md | 34 + .../macos-update-uninstall.zh-CN.md | 112 + .../setup-guides/mattermost-setup.zh-CN.md | 63 + .../nextcloud-talk-setup.zh-CN.md | 78 + .../setup-guides/one-click-bootstrap.zh-CN.md | 126 + .../zh-CN/setup-guides/zai-glm-setup.zh-CN.md | 142 + .../zeroclaw/docs/maintainers/README.md | 17 + .../docs/maintainers/docs-inventory.md | 104 + .../docs/maintainers/i18n-coverage.md | 76 + .../project-triage-snapshot-2026-02-18.md | 94 + .../docs/maintainers/refactor-candidates.md | 232 + .../zeroclaw/docs/maintainers/repo-map.md | 255 + .../docs/maintainers/structure-README.md | 87 + .../zeroclaw/docs/maintainers/trademark.md | 129 + .../docs/openai-temperature-compatibility.md | 73 + third_party/zeroclaw/docs/ops/README.md | 24 + .../zeroclaw/docs/ops/network-deployment.md | 305 + .../zeroclaw/docs/ops/operations-runbook.md | 186 + .../zeroclaw/docs/ops/proxy-agent-playbook.md | 229 + .../zeroclaw/docs/ops/resource-limits.md | 105 + .../zeroclaw/docs/ops/troubleshooting.md | 242 + .../zeroclaw/docs/ops/troubleshooting.vi.md | 7 + third_party/zeroclaw/docs/reference/README.md | 23 + .../docs/reference/api/channels-reference.md | 539 + .../docs/reference/api/config-reference.md | 793 + .../docs/reference/api/config-reference.vi.md | 7 + .../docs/reference/api/providers-reference.md | 312 + .../docs/reference/cli/commands-reference.md | 219 + .../reference/cli/commands-reference.vi.md | 7 + .../zeroclaw/docs/reference/sop/README.md | 64 + .../docs/reference/sop/connectivity.md | 143 + .../zeroclaw/docs/reference/sop/cookbook.md | 92 + .../docs/reference/sop/observability.md | 39 + .../zeroclaw/docs/reference/sop/syntax.md | 90 + third_party/zeroclaw/docs/security/README.md | 22 + .../docs/security/agnostic-security.md | 353 + .../zeroclaw/docs/security/audit-logging.md | 191 + .../docs/security/frictionless-security.md | 309 + .../docs/security/matrix-e2ee-guide.md | 255 + .../zeroclaw/docs/security/sandboxing.md | 195 + .../docs/security/security-roadmap.md | 185 + .../zeroclaw/docs/setup-guides/README.md | 34 + .../zeroclaw/docs/setup-guides/README.vi.md | 29 + .../setup-guides/macos-update-uninstall.md | 112 + .../docs/setup-guides/mattermost-setup.md | 63 + .../docs/setup-guides/nextcloud-talk-setup.md | 78 + .../docs/setup-guides/one-click-bootstrap.md | 229 + .../setup-guides/one-click-bootstrap.vi.md | 7 + .../docs/setup-guides/windows-setup.md | 110 + .../docs/setup-guides/zai-glm-setup.md | 142 + .../specs/2026-03-13-linkedin-tool-design.md | 314 + ...19-google-workspace-operation-allowlist.md | 281 + third_party/zeroclaw/docs/vi/README.md | 92 + .../zeroclaw/docs/vi/actions-source-policy.md | 95 + .../docs/vi/adding-boards-and-tools.md | 116 + .../zeroclaw/docs/vi/agnostic-security.md | 353 + .../zeroclaw/docs/vi/arduino-uno-q-setup.md | 217 + third_party/zeroclaw/docs/vi/audit-logging.md | 191 + .../zeroclaw/docs/vi/channels-reference.md | 424 + third_party/zeroclaw/docs/vi/ci-map.md | 125 + .../zeroclaw/docs/vi/commands-reference.md | 159 + .../zeroclaw/docs/vi/config-reference.md | 560 + .../zeroclaw/docs/vi/contributing/README.md | 18 + .../zeroclaw/docs/vi/custom-providers.md | 111 + .../docs/vi/datasheets/arduino-uno.md | 37 + .../zeroclaw/docs/vi/datasheets/esp32.md | 22 + .../docs/vi/datasheets/nucleo-f401re.md | 16 + .../zeroclaw/docs/vi/frictionless-security.md | 309 + .../docs/vi/getting-started/README.md | 29 + .../docs/vi/hardware-peripherals-design.md | 324 + .../zeroclaw/docs/vi/hardware/README.md | 19 + .../zeroclaw/docs/vi/langgraph-integration.md | 239 + .../zeroclaw/docs/vi/matrix-e2ee-guide.md | 141 + .../zeroclaw/docs/vi/mattermost-setup.md | 63 + .../zeroclaw/docs/vi/network-deployment.md | 206 + third_party/zeroclaw/docs/vi/nucleo-setup.md | 147 + .../zeroclaw/docs/vi/one-click-bootstrap.md | 120 + .../zeroclaw/docs/vi/operations-runbook.md | 128 + .../zeroclaw/docs/vi/operations/README.md | 24 + third_party/zeroclaw/docs/vi/pr-workflow.md | 366 + .../zeroclaw/docs/vi/project/README.md | 17 + .../zeroclaw/docs/vi/providers-reference.md | 254 + .../zeroclaw/docs/vi/proxy-agent-playbook.md | 229 + .../zeroclaw/docs/vi/reference/README.md | 22 + .../zeroclaw/docs/vi/release-process.md | 133 + .../zeroclaw/docs/vi/resource-limits.md | 105 + .../zeroclaw/docs/vi/reviewer-playbook.md | 191 + third_party/zeroclaw/docs/vi/sandboxing.md | 195 + .../zeroclaw/docs/vi/security-roadmap.md | 185 + .../zeroclaw/docs/vi/security/README.md | 22 + .../zeroclaw/docs/vi/troubleshooting.md | 236 + third_party/zeroclaw/docs/vi/zai-glm-setup.md | 142 + .../aardvark/HARDWARE_aardvark_snippet.md | 34 + .../aardvark/devices/aardvark0.md.example | 41 + .../examples/hardware/aardvark/skills/i2c.md | 63 + .../zeroclaw/firmware/arduino/arduino.ino | 143 + .../firmware/esp32-ui/.cargo/config.toml | 13 + .../zeroclaw/firmware/esp32-ui/Cargo.toml | 46 + .../zeroclaw/firmware/esp32-ui/README.md | 106 + .../zeroclaw/firmware/esp32-ui/build.rs | 14 + .../zeroclaw/firmware/esp32-ui/src/main.rs | 22 + .../zeroclaw/firmware/esp32-ui/ui/main.slint | 83 + .../firmware/esp32/.cargo/config.toml | 11 + .../zeroclaw/firmware/esp32/Cargo.lock | 1794 ++ .../zeroclaw/firmware/esp32/Cargo.toml | 41 + third_party/zeroclaw/firmware/esp32/README.md | 80 + third_party/zeroclaw/firmware/esp32/SETUP.md | 156 + third_party/zeroclaw/firmware/esp32/build.rs | 3 + .../firmware/esp32/rust-toolchain.toml | 3 + .../zeroclaw/firmware/esp32/src/main.rs | 163 + .../zeroclaw/firmware/nucleo/Cargo.lock | 851 + .../zeroclaw/firmware/nucleo/Cargo.toml | 41 + .../zeroclaw/firmware/nucleo/src/main.rs | 187 + third_party/zeroclaw/firmware/pico/main.py | 2 + .../zeroclaw/firmware/pico/zeroclaw-pico.uf2 | Bin 0 -> 512 bytes .../zeroclaw/firmware/uno-q-bridge/app.yaml | 9 + .../firmware/uno-q-bridge/python/main.py | 66 + .../uno-q-bridge/python/requirements.txt | 1 + .../firmware/uno-q-bridge/sketch/sketch.ino | 24 + .../firmware/uno-q-bridge/sketch/sketch.yaml | 11 + .../zeroclaw-nucleo/.cargo/config.toml | 3 + third_party/zeroclaw/flake.lock | 99 + third_party/zeroclaw/flake.nix | 61 + third_party/zeroclaw/fuzz/Cargo.toml | 44 + .../fuzz_targets/fuzz_command_validation.rs | 10 + .../fuzz/fuzz_targets/fuzz_config_parse.rs | 9 + .../fuzz_targets/fuzz_provider_response.rs | 9 + .../fuzz/fuzz_targets/fuzz_tool_params.rs | 9 + .../fuzz/fuzz_targets/fuzz_webhook_payload.rs | 9 + third_party/zeroclaw/install.sh | 1763 ++ third_party/zeroclaw/python/README.md | 154 + third_party/zeroclaw/python/README.vi.md | 154 + third_party/zeroclaw/python/pyproject.toml | 68 + third_party/zeroclaw/python/tests/__init__.py | 0 .../zeroclaw/python/tests/test_tools.py | 103 + .../python/zeroclaw_tools/__init__.py | 32 + .../python/zeroclaw_tools/__main__.py | 133 + .../zeroclaw/python/zeroclaw_tools/agent.py | 173 + .../zeroclaw_tools/integrations/__init__.py | 7 + .../integrations/discord_bot.py | 177 + .../python/zeroclaw_tools/tools/__init__.py | 20 + .../python/zeroclaw_tools/tools/base.py | 50 + .../python/zeroclaw_tools/tools/file.py | 60 + .../python/zeroclaw_tools/tools/memory.py | 85 + .../python/zeroclaw_tools/tools/shell.py | 32 + .../python/zeroclaw_tools/tools/web.py | 88 + third_party/zeroclaw/rustfmt.toml | 15 + third_party/zeroclaw/scripts/99-act-led.rules | 10 + third_party/zeroclaw/scripts/README.md | 232 + .../zeroclaw/scripts/browser/start-browser.sh | 21 + .../zeroclaw/scripts/browser/start-vnc.sh | 52 + .../zeroclaw/scripts/browser/stop-vnc.sh | 11 + .../zeroclaw/scripts/ci/check_binary_size.sh | 46 + .../scripts/ci/collect_changed_links.py | 178 + .../zeroclaw/scripts/ci/docs_links_gate.sh | 28 + .../zeroclaw/scripts/ci/docs_quality_gate.sh | 186 + .../zeroclaw/scripts/ci/fetch_actions_data.py | 209 + .../zeroclaw/scripts/ci/rust_quality_gate.sh | 19 + .../scripts/ci/rust_strict_delta_gate.sh | 237 + third_party/zeroclaw/scripts/deploy-rpi.sh | 223 + .../scripts/release/cut_release_tag.sh | 85 + third_party/zeroclaw/scripts/rpi-config.toml | 631 + third_party/zeroclaw/scripts/zeroclaw.service | 22 + third_party/zeroclaw/setup.bat | 335 + third_party/zeroclaw/skills/browser/SKILL.md | 122 + third_party/zeroclaw/skills/browser/TEST.sh | 3 + third_party/zeroclaw/src/agent/agent.rs | 1673 ++ third_party/zeroclaw/src/agent/classifier.rs | 216 + .../zeroclaw/src/agent/context_analyzer.rs | 155 + .../zeroclaw/src/agent/context_compressor.rs | 648 + third_party/zeroclaw/src/agent/dispatcher.rs | 443 + third_party/zeroclaw/src/agent/eval.rs | 442 + .../zeroclaw/src/agent/history_pruner.rs | 283 + third_party/zeroclaw/src/agent/loop_.rs | 9506 ++++++++++ .../zeroclaw/src/agent/loop_detector.rs | 696 + .../zeroclaw/src/agent/memory_loader.rs | 262 + third_party/zeroclaw/src/agent/mod.rs | 22 + third_party/zeroclaw/src/agent/personality.rs | 253 + third_party/zeroclaw/src/agent/prompt.rs | 685 + third_party/zeroclaw/src/agent/tests.rs | 1342 ++ third_party/zeroclaw/src/agent/thinking.rs | 424 + third_party/zeroclaw/src/approval/mod.rs | 611 + .../zeroclaw/src/auth/anthropic_token.rs | 86 + third_party/zeroclaw/src/auth/gemini_oauth.rs | 599 + third_party/zeroclaw/src/auth/mod.rs | 574 + third_party/zeroclaw/src/auth/oauth_common.rs | 183 + third_party/zeroclaw/src/auth/openai_oauth.rs | 437 + third_party/zeroclaw/src/auth/profiles.rs | 716 + .../zeroclaw/src/channels/acp_server.rs | 588 + third_party/zeroclaw/src/channels/bluesky.rs | 573 + .../zeroclaw/src/channels/clawdtalk.rs | 435 + third_party/zeroclaw/src/channels/cli.rs | 146 + third_party/zeroclaw/src/channels/dingtalk.rs | 398 + third_party/zeroclaw/src/channels/discord.rs | 2394 +++ .../zeroclaw/src/channels/discord_history.rs | 555 + .../zeroclaw/src/channels/email_channel.rs | 1030 + .../zeroclaw/src/channels/gmail_push.rs | 1147 ++ third_party/zeroclaw/src/channels/imessage.rs | 1318 ++ third_party/zeroclaw/src/channels/irc.rs | 1023 + third_party/zeroclaw/src/channels/lark.rs | 3636 ++++ .../zeroclaw/src/channels/link_enricher.rs | 462 + third_party/zeroclaw/src/channels/linq.rs | 1126 ++ third_party/zeroclaw/src/channels/matrix.rs | 2261 +++ .../zeroclaw/src/channels/mattermost.rs | 1523 ++ .../zeroclaw/src/channels/media_pipeline.rs | 409 + third_party/zeroclaw/src/channels/mochat.rs | 328 + third_party/zeroclaw/src/channels/mod.rs | 10727 +++++++++++ third_party/zeroclaw/src/channels/mqtt.rs | 276 + .../zeroclaw/src/channels/nextcloud_talk.rs | 714 + third_party/zeroclaw/src/channels/nostr.rs | 400 + third_party/zeroclaw/src/channels/notion.rs | 616 + third_party/zeroclaw/src/channels/qq.rs | 1795 ++ third_party/zeroclaw/src/channels/reddit.rs | 506 + .../zeroclaw/src/channels/session_backend.rs | 122 + .../zeroclaw/src/channels/session_sqlite.rs | 647 + .../zeroclaw/src/channels/session_store.rs | 365 + third_party/zeroclaw/src/channels/signal.rs | 925 + third_party/zeroclaw/src/channels/slack.rs | 4554 +++++ third_party/zeroclaw/src/channels/telegram.rs | 5100 +++++ third_party/zeroclaw/src/channels/traits.rs | 346 + .../zeroclaw/src/channels/transcription.rs | 1423 ++ third_party/zeroclaw/src/channels/tts.rs | 805 + third_party/zeroclaw/src/channels/twitter.rs | 487 + .../zeroclaw/src/channels/voice_call.rs | 846 + .../zeroclaw/src/channels/voice_wake.rs | 532 + third_party/zeroclaw/src/channels/wati.rs | 1065 ++ third_party/zeroclaw/src/channels/webhook.rs | 411 + third_party/zeroclaw/src/channels/wecom.rs | 167 + third_party/zeroclaw/src/channels/whatsapp.rs | 1819 ++ .../zeroclaw/src/channels/whatsapp_storage.rs | 1347 ++ .../zeroclaw/src/channels/whatsapp_web.rs | 1460 ++ third_party/zeroclaw/src/cli_input.rs | 152 + third_party/zeroclaw/src/commands/mod.rs | 2 + .../zeroclaw/src/commands/self_test.rs | 281 + third_party/zeroclaw/src/commands/update.rs | 599 + third_party/zeroclaw/src/config/mod.rs | 119 + third_party/zeroclaw/src/config/schema.rs | 15700 ++++++++++++++++ third_party/zeroclaw/src/config/traits.rs | 14 + third_party/zeroclaw/src/config/workspace.rs | 382 + third_party/zeroclaw/src/cost/mod.rs | 8 + third_party/zeroclaw/src/cost/tracker.rs | 565 + third_party/zeroclaw/src/cost/types.rs | 193 + third_party/zeroclaw/src/cron/mod.rs | 1016 + third_party/zeroclaw/src/cron/schedule.rs | 306 + third_party/zeroclaw/src/cron/scheduler.rs | 1429 ++ third_party/zeroclaw/src/cron/store.rs | 1696 ++ third_party/zeroclaw/src/cron/types.rs | 244 + third_party/zeroclaw/src/daemon/mod.rs | 1019 + third_party/zeroclaw/src/doctor/mod.rs | 1320 ++ third_party/zeroclaw/src/gateway/api.rs | 2121 +++ .../zeroclaw/src/gateway/api_pairing.rs | 383 + .../zeroclaw/src/gateway/api_plugins.rs | 77 + .../zeroclaw/src/gateway/api_webauthn.rs | 321 + third_party/zeroclaw/src/gateway/canvas.rs | 278 + .../zeroclaw/src/gateway/hardware_context.rs | 427 + third_party/zeroclaw/src/gateway/mod.rs | 3587 ++++ third_party/zeroclaw/src/gateway/nodes.rs | 622 + third_party/zeroclaw/src/gateway/sse.rs | 162 + .../zeroclaw/src/gateway/static_files.rs | 94 + third_party/zeroclaw/src/gateway/tls.rs | 456 + third_party/zeroclaw/src/gateway/ws.rs | 560 + third_party/zeroclaw/src/hands/mod.rs | 229 + third_party/zeroclaw/src/hands/types.rs | 345 + third_party/zeroclaw/src/hardware/aardvark.rs | 225 + .../zeroclaw/src/hardware/aardvark_tools.rs | 574 + .../zeroclaw/src/hardware/datasheet.rs | 355 + third_party/zeroclaw/src/hardware/device.rs | 864 + third_party/zeroclaw/src/hardware/discover.rs | 94 + third_party/zeroclaw/src/hardware/gpio.rs | 628 + .../zeroclaw/src/hardware/introspect.rs | 121 + third_party/zeroclaw/src/hardware/loader.rs | 327 + third_party/zeroclaw/src/hardware/manifest.rs | 194 + third_party/zeroclaw/src/hardware/mod.rs | 731 + .../zeroclaw/src/hardware/pico_code.rs | 723 + .../zeroclaw/src/hardware/pico_flash.rs | 296 + third_party/zeroclaw/src/hardware/protocol.rs | 148 + third_party/zeroclaw/src/hardware/registry.rs | 102 + third_party/zeroclaw/src/hardware/rpi.rs | 646 + third_party/zeroclaw/src/hardware/serial.rs | 297 + .../zeroclaw/src/hardware/subprocess.rs | 467 + .../zeroclaw/src/hardware/tool_registry.rs | 396 + .../zeroclaw/src/hardware/transport.rs | 115 + third_party/zeroclaw/src/hardware/uf2.rs | 351 + third_party/zeroclaw/src/health/mod.rs | 184 + third_party/zeroclaw/src/heartbeat/engine.rs | 853 + third_party/zeroclaw/src/heartbeat/mod.rs | 35 + third_party/zeroclaw/src/heartbeat/store.rs | 305 + .../src/hooks/builtin/command_logger.rs | 69 + third_party/zeroclaw/src/hooks/builtin/mod.rs | 5 + .../src/hooks/builtin/webhook_audit.rs | 567 + third_party/zeroclaw/src/hooks/mod.rs | 10 + third_party/zeroclaw/src/hooks/runner.rs | 483 + third_party/zeroclaw/src/hooks/traits.rs | 140 + third_party/zeroclaw/src/i18n.rs | 311 + third_party/zeroclaw/src/identity.rs | 1488 ++ third_party/zeroclaw/src/integrations/mod.rs | 234 + .../zeroclaw/src/integrations/registry.rs | 1095 ++ third_party/zeroclaw/src/lib.rs | 600 + third_party/zeroclaw/src/main.rs | 2807 +++ third_party/zeroclaw/src/memory/audit.rs | 293 + third_party/zeroclaw/src/memory/backend.rs | 158 + .../zeroclaw/src/memory/battle_tests.rs | 1070 ++ third_party/zeroclaw/src/memory/chunker.rs | 377 + third_party/zeroclaw/src/memory/cli.rs | 328 + third_party/zeroclaw/src/memory/conflict.rs | 173 + .../zeroclaw/src/memory/consolidation.rs | 214 + third_party/zeroclaw/src/memory/decay.rs | 151 + third_party/zeroclaw/src/memory/embeddings.rs | 358 + third_party/zeroclaw/src/memory/hygiene.rs | 585 + third_party/zeroclaw/src/memory/importance.rs | 107 + .../zeroclaw/src/memory/knowledge_graph.rs | 859 + third_party/zeroclaw/src/memory/lucid.rs | 718 + third_party/zeroclaw/src/memory/markdown.rs | 399 + third_party/zeroclaw/src/memory/mod.rs | 662 + third_party/zeroclaw/src/memory/none.rs | 93 + third_party/zeroclaw/src/memory/policy.rs | 192 + third_party/zeroclaw/src/memory/qdrant.rs | 669 + .../zeroclaw/src/memory/response_cache.rs | 526 + third_party/zeroclaw/src/memory/retrieval.rs | 267 + third_party/zeroclaw/src/memory/snapshot.rs | 470 + third_party/zeroclaw/src/memory/sqlite.rs | 2761 +++ third_party/zeroclaw/src/memory/traits.rs | 323 + third_party/zeroclaw/src/memory/vector.rs | 403 + third_party/zeroclaw/src/migration.rs | 663 + third_party/zeroclaw/src/multimodal.rs | 595 + third_party/zeroclaw/src/nodes/mod.rs | 3 + third_party/zeroclaw/src/nodes/transport.rs | 235 + .../zeroclaw/src/observability/dora.rs | 393 + third_party/zeroclaw/src/observability/log.rs | 287 + third_party/zeroclaw/src/observability/mod.rs | 214 + .../zeroclaw/src/observability/multi.rs | 163 + .../zeroclaw/src/observability/noop.rs | 118 + .../zeroclaw/src/observability/otel.rs | 693 + .../zeroclaw/src/observability/prometheus.rs | 847 + .../src/observability/runtime_trace.rs | 414 + .../zeroclaw/src/observability/traits.rs | 324 + .../zeroclaw/src/observability/verbose.rs | 122 + third_party/zeroclaw/src/onboard/mod.rs | 27 + third_party/zeroclaw/src/onboard/wizard.rs | 7636 ++++++++ .../zeroclaw/src/peripherals/arduino_flash.rs | 145 + .../src/peripherals/arduino_upload.rs | 161 + .../src/peripherals/capabilities_tool.rs | 99 + third_party/zeroclaw/src/peripherals/mod.rs | 339 + .../zeroclaw/src/peripherals/nucleo_flash.rs | 83 + third_party/zeroclaw/src/peripherals/rpi.rs | 173 + .../zeroclaw/src/peripherals/serial.rs | 275 + .../zeroclaw/src/peripherals/traits.rs | 75 + .../zeroclaw/src/peripherals/uno_q_bridge.rs | 151 + .../zeroclaw/src/peripherals/uno_q_setup.rs | 143 + third_party/zeroclaw/src/plugins/error.rs | 45 + third_party/zeroclaw/src/plugins/host.rs | 392 + third_party/zeroclaw/src/plugins/mod.rs | 84 + third_party/zeroclaw/src/plugins/signature.rs | 508 + .../zeroclaw/src/plugins/wasm_channel.rs | 44 + third_party/zeroclaw/src/plugins/wasm_tool.rs | 63 + .../zeroclaw/src/providers/anthropic.rs | 2057 ++ .../zeroclaw/src/providers/azure_openai.rs | 759 + third_party/zeroclaw/src/providers/bedrock.rs | 1847 ++ .../zeroclaw/src/providers/claude_code.rs | 523 + .../zeroclaw/src/providers/compatible.rs | 3989 ++++ third_party/zeroclaw/src/providers/copilot.rs | 822 + third_party/zeroclaw/src/providers/gemini.rs | 2274 +++ .../zeroclaw/src/providers/gemini_cli.rs | 326 + third_party/zeroclaw/src/providers/glm.rs | 361 + third_party/zeroclaw/src/providers/kilocli.rs | 326 + third_party/zeroclaw/src/providers/mod.rs | 3625 ++++ third_party/zeroclaw/src/providers/ollama.rs | 1381 ++ third_party/zeroclaw/src/providers/openai.rs | 1017 + .../zeroclaw/src/providers/openai_codex.rs | 1177 ++ .../zeroclaw/src/providers/openrouter.rs | 1237 ++ .../zeroclaw/src/providers/reliable.rs | 2982 +++ third_party/zeroclaw/src/providers/router.rs | 1179 ++ third_party/zeroclaw/src/providers/telnyx.rs | 391 + third_party/zeroclaw/src/providers/traits.rs | 1092 ++ third_party/zeroclaw/src/rag/mod.rs | 395 + third_party/zeroclaw/src/routines/engine.rs | 438 + .../zeroclaw/src/routines/event_matcher.rs | 183 + third_party/zeroclaw/src/routines/mod.rs | 37 + third_party/zeroclaw/src/runtime/docker.rs | 275 + third_party/zeroclaw/src/runtime/mod.rs | 87 + third_party/zeroclaw/src/runtime/native.rs | 102 + third_party/zeroclaw/src/runtime/traits.rs | 142 + third_party/zeroclaw/src/runtime/wasm.rs | 687 + third_party/zeroclaw/src/security/audit.rs | 1252 ++ .../zeroclaw/src/security/bubblewrap.rs | 183 + third_party/zeroclaw/src/security/detect.rs | 175 + third_party/zeroclaw/src/security/docker.rs | 216 + .../zeroclaw/src/security/domain_matcher.rs | 259 + third_party/zeroclaw/src/security/estop.rs | 422 + third_party/zeroclaw/src/security/firejail.rs | 195 + .../zeroclaw/src/security/iam_policy.rs | 449 + third_party/zeroclaw/src/security/landlock.rs | 262 + .../zeroclaw/src/security/leak_detector.rs | 594 + third_party/zeroclaw/src/security/mod.rs | 133 + third_party/zeroclaw/src/security/nevis.rs | 587 + third_party/zeroclaw/src/security/otp.rs | 318 + third_party/zeroclaw/src/security/pairing.rs | 753 + third_party/zeroclaw/src/security/playbook.rs | 459 + third_party/zeroclaw/src/security/policy.rs | 3127 +++ .../zeroclaw/src/security/prompt_guard.rs | 360 + third_party/zeroclaw/src/security/seatbelt.rs | 415 + third_party/zeroclaw/src/security/secrets.rs | 903 + third_party/zeroclaw/src/security/traits.rs | 118 + .../zeroclaw/src/security/vulnerability.rs | 397 + third_party/zeroclaw/src/security/webauthn.rs | 1368 ++ .../src/security/workspace_boundary.rs | 211 + third_party/zeroclaw/src/service/mod.rs | 1710 ++ .../zeroclaw/src/skillforge/evaluate.rs | 272 + .../zeroclaw/src/skillforge/integrate.rs | 252 + third_party/zeroclaw/src/skillforge/mod.rs | 255 + third_party/zeroclaw/src/skillforge/scout.rs | 339 + third_party/zeroclaw/src/skills/audit.rs | 889 + third_party/zeroclaw/src/skills/creator.rs | 903 + third_party/zeroclaw/src/skills/improver.rs | 462 + third_party/zeroclaw/src/skills/mod.rs | 2183 +++ .../zeroclaw/src/skills/symlink_tests.rs | 116 + third_party/zeroclaw/src/skills/testing.rs | 471 + third_party/zeroclaw/src/sop/audit.rs | 254 + third_party/zeroclaw/src/sop/condition.rs | 451 + third_party/zeroclaw/src/sop/dispatch.rs | 753 + third_party/zeroclaw/src/sop/engine.rs | 2090 ++ third_party/zeroclaw/src/sop/metrics.rs | 1405 ++ third_party/zeroclaw/src/sop/mod.rs | 934 + third_party/zeroclaw/src/sop/types.rs | 639 + third_party/zeroclaw/src/tools/ask_user.rs | 503 + third_party/zeroclaw/src/tools/backup_tool.rs | 466 + third_party/zeroclaw/src/tools/browser.rs | 2653 +++ .../zeroclaw/src/tools/browser_delegate.rs | 757 + .../zeroclaw/src/tools/browser_open.rs | 532 + third_party/zeroclaw/src/tools/calculator.rs | 824 + third_party/zeroclaw/src/tools/canvas.rs | 636 + third_party/zeroclaw/src/tools/claude_code.rs | 451 + .../zeroclaw/src/tools/claude_code_runner.rs | 520 + .../zeroclaw/src/tools/cli_discovery.rs | 265 + third_party/zeroclaw/src/tools/cloud_ops.rs | 851 + .../zeroclaw/src/tools/cloud_patterns.rs | 412 + third_party/zeroclaw/src/tools/codex_cli.rs | 349 + third_party/zeroclaw/src/tools/composio.rs | 1937 ++ .../zeroclaw/src/tools/content_search.rs | 1003 + third_party/zeroclaw/src/tools/cron_add.rs | 810 + third_party/zeroclaw/src/tools/cron_list.rs | 103 + third_party/zeroclaw/src/tools/cron_remove.rs | 203 + third_party/zeroclaw/src/tools/cron_run.rs | 285 + third_party/zeroclaw/src/tools/cron_runs.rs | 177 + third_party/zeroclaw/src/tools/cron_update.rs | 583 + .../zeroclaw/src/tools/data_management.rs | 320 + third_party/zeroclaw/src/tools/delegate.rs | 2875 +++ .../zeroclaw/src/tools/discord_search.rs | 204 + third_party/zeroclaw/src/tools/escalate.rs | 635 + third_party/zeroclaw/src/tools/file_edit.rs | 814 + third_party/zeroclaw/src/tools/file_read.rs | 1083 ++ third_party/zeroclaw/src/tools/file_write.rs | 577 + third_party/zeroclaw/src/tools/gemini_cli.rs | 349 + .../zeroclaw/src/tools/git_operations.rs | 986 + third_party/zeroclaw/src/tools/glob_search.rs | 423 + .../zeroclaw/src/tools/google_workspace.rs | 1035 + .../zeroclaw/src/tools/hardware_board_info.rs | 208 + .../zeroclaw/src/tools/hardware_memory_map.rs | 207 + .../src/tools/hardware_memory_read.rs | 183 + .../zeroclaw/src/tools/http_request.rs | 1018 + third_party/zeroclaw/src/tools/image_gen.rs | 494 + third_party/zeroclaw/src/tools/image_info.rs | 493 + third_party/zeroclaw/src/tools/jira_tool.rs | 1523 ++ .../zeroclaw/src/tools/knowledge_tool.rs | 581 + third_party/zeroclaw/src/tools/linkedin.rs | 804 + .../zeroclaw/src/tools/linkedin_client.rs | 1726 ++ third_party/zeroclaw/src/tools/llm_task.rs | 489 + third_party/zeroclaw/src/tools/mcp_client.rs | 419 + .../zeroclaw/src/tools/mcp_deferred.rs | 552 + .../zeroclaw/src/tools/mcp_protocol.rs | 231 + third_party/zeroclaw/src/tools/mcp_tool.rs | 230 + .../zeroclaw/src/tools/mcp_transport.rs | 1282 ++ .../zeroclaw/src/tools/memory_export.rs | 195 + .../zeroclaw/src/tools/memory_forget.rs | 179 + .../zeroclaw/src/tools/memory_purge.rs | 279 + .../zeroclaw/src/tools/memory_recall.rs | 258 + .../zeroclaw/src/tools/memory_store.rs | 224 + .../zeroclaw/src/tools/microsoft365/auth.rs | 400 + .../src/tools/microsoft365/graph_client.rs | 495 + .../zeroclaw/src/tools/microsoft365/mod.rs | 567 + .../zeroclaw/src/tools/microsoft365/types.rs | 55 + third_party/zeroclaw/src/tools/mod.rs | 1418 ++ .../src/tools/model_routing_config.rs | 1204 ++ .../zeroclaw/src/tools/model_switch.rs | 264 + .../zeroclaw/src/tools/node_capabilities.rs | 266 + third_party/zeroclaw/src/tools/node_tool.rs | 303 + third_party/zeroclaw/src/tools/notion_tool.rs | 438 + .../zeroclaw/src/tools/opencode_cli.rs | 344 + third_party/zeroclaw/src/tools/pdf_read.rs | 551 + third_party/zeroclaw/src/tools/pipeline.rs | 617 + third_party/zeroclaw/src/tools/poll.rs | 473 + .../zeroclaw/src/tools/project_intel.rs | 750 + .../zeroclaw/src/tools/proxy_config.rs | 550 + third_party/zeroclaw/src/tools/pushover.rs | 433 + third_party/zeroclaw/src/tools/reaction.rs | 546 + third_party/zeroclaw/src/tools/read_skill.rs | 187 + .../src/tools/report_template_tool.rs | 204 + .../zeroclaw/src/tools/report_templates.rs | 602 + third_party/zeroclaw/src/tools/schedule.rs | 803 + third_party/zeroclaw/src/tools/schema.rs | 838 + third_party/zeroclaw/src/tools/screenshot.rs | 327 + .../zeroclaw/src/tools/security_ops.rs | 659 + third_party/zeroclaw/src/tools/sessions.rs | 573 + third_party/zeroclaw/src/tools/shell.rs | 793 + third_party/zeroclaw/src/tools/skill_http.rs | 224 + third_party/zeroclaw/src/tools/skill_tool.rs | 323 + third_party/zeroclaw/src/tools/sop_advance.rs | 449 + third_party/zeroclaw/src/tools/sop_approve.rs | 271 + third_party/zeroclaw/src/tools/sop_execute.rs | 266 + third_party/zeroclaw/src/tools/sop_list.rs | 224 + third_party/zeroclaw/src/tools/sop_status.rs | 455 + third_party/zeroclaw/src/tools/swarm.rs | 959 + .../zeroclaw/src/tools/text_browser.rs | 409 + third_party/zeroclaw/src/tools/tool_search.rs | 368 + third_party/zeroclaw/src/tools/traits.rs | 121 + .../zeroclaw/src/tools/verifiable_intent.rs | 254 + .../zeroclaw/src/tools/weather_tool.rs | 873 + third_party/zeroclaw/src/tools/web_fetch.rs | 1502 ++ .../src/tools/web_search_provider_routing.rs | 91 + .../zeroclaw/src/tools/web_search_tool.rs | 731 + .../zeroclaw/src/tools/workspace_tool.rs | 356 + third_party/zeroclaw/src/trust/mod.rs | 6 + third_party/zeroclaw/src/trust/tests.rs | 616 + third_party/zeroclaw/src/trust/types.rs | 237 + third_party/zeroclaw/src/tunnel/cloudflare.rs | 215 + third_party/zeroclaw/src/tunnel/custom.rs | 220 + third_party/zeroclaw/src/tunnel/mod.rs | 488 + third_party/zeroclaw/src/tunnel/ngrok.rs | 151 + third_party/zeroclaw/src/tunnel/none.rs | 64 + third_party/zeroclaw/src/tunnel/openvpn.rs | 254 + third_party/zeroclaw/src/tunnel/pinggy.rs | 207 + third_party/zeroclaw/src/tunnel/tailscale.rs | 133 + third_party/zeroclaw/src/util.rs | 165 + .../zeroclaw/src/verifiable_intent/crypto.rs | 357 + .../zeroclaw/src/verifiable_intent/error.rs | 113 + .../src/verifiable_intent/issuance.rs | 501 + .../zeroclaw/src/verifiable_intent/mod.rs | 37 + .../zeroclaw/src/verifiable_intent/types.rs | 374 + .../src/verifiable_intent/verification.rs | 738 + third_party/zeroclaw/taplo.toml | 30 + .../tests/component/config_persistence.rs | 252 + .../zeroclaw/tests/component/config_schema.rs | 522 + .../tests/component/dockerignore_test.rs | 344 + .../zeroclaw/tests/component/gateway.rs | 158 + .../tests/component/gemini_capabilities.rs | 79 + third_party/zeroclaw/tests/component/mod.rs | 11 + .../otel_dependency_feature_regression.rs | 17 + .../tests/component/provider_resolution.rs | 479 + .../tests/component/provider_schema.rs | 327 + .../reply_target_field_regression.rs | 70 + .../zeroclaw/tests/component/security.rs | 164 + .../component/whatsapp_webhook_security.rs | 133 + third_party/zeroclaw/tests/fixtures/hello.mp3 | Bin 0 -> 7104 bytes .../zeroclaw/tests/fixtures/test_document.pdf | 22 + .../zeroclaw/tests/fixtures/test_photo.jpg | Bin 0 -> 159 bytes .../fixtures/traces/multi_tool_chain.json | 66 + .../fixtures/traces/single_tool_echo.json | 38 + .../tests/fixtures/traces/smoke_greeting.json | 24 + .../zeroclaw/tests/integration/agent.rs | 378 + .../tests/integration/agent_robustness.rs | 254 + .../integration/backup_cron_scheduling.rs | 310 + .../tests/integration/channel_matrix.rs | 1462 ++ .../tests/integration/channel_routing.rs | 328 + .../zeroclaw/tests/integration/hooks.rs | 96 + .../tests/integration/memory_comparison.rs | 453 + .../tests/integration/memory_restart.rs | 375 + third_party/zeroclaw/tests/integration/mod.rs | 11 + .../integration/report_template_tool_test.rs | 238 + .../telegram_attachment_fallback.rs | 298 + .../integration/telegram_finalize_draft.rs | 208 + .../live/gemini_fallback_oauth_refresh.rs | 236 + third_party/zeroclaw/tests/live/mod.rs | 3 + .../tests/live/openai_codex_vision_e2e.rs | 268 + third_party/zeroclaw/tests/live/providers.rs | 50 + .../manual/telegram/generate_test_messages.py | 99 + .../tests/manual/telegram/quick_test.sh | 30 + .../telegram/test_telegram_integration.sh | 362 + .../tests/manual/telegram/testing-telegram.md | 352 + .../tests/manual/test_dockerignore.sh | 169 + .../tests/manual/tmux/onboard_wrapper.sh | 11 + .../tmux/test_onboard_provider_input_paths.sh | 200 + .../zeroclaw/tests/support/assertions.rs | 62 + third_party/zeroclaw/tests/support/helpers.rs | 142 + .../zeroclaw/tests/support/mock_channel.rs | 86 + .../zeroclaw/tests/support/mock_provider.rs | 199 + .../zeroclaw/tests/support/mock_tools.rs | 152 + third_party/zeroclaw/tests/support/mod.rs | 11 + third_party/zeroclaw/tests/support/trace.rs | 84 + .../zeroclaw/tests/system/full_stack.rs | 149 + third_party/zeroclaw/tests/system/mod.rs | 1 + third_party/zeroclaw/tests/test_component.rs | 2 + .../zeroclaw/tests/test_integration.rs | 2 + third_party/zeroclaw/tests/test_live.rs | 2 + third_party/zeroclaw/tests/test_system.rs | 2 + .../zeroclaw/tool_descriptions/ar.toml | 62 + .../zeroclaw/tool_descriptions/bn.toml | 62 + .../zeroclaw/tool_descriptions/cs.toml | 63 + .../zeroclaw/tool_descriptions/da.toml | 62 + .../zeroclaw/tool_descriptions/de.toml | 62 + .../zeroclaw/tool_descriptions/el.toml | 63 + .../zeroclaw/tool_descriptions/en.toml | 62 + .../zeroclaw/tool_descriptions/es.toml | 62 + .../zeroclaw/tool_descriptions/fi.toml | 62 + .../zeroclaw/tool_descriptions/fr.toml | 62 + .../zeroclaw/tool_descriptions/he.toml | 62 + .../zeroclaw/tool_descriptions/hi.toml | 62 + .../zeroclaw/tool_descriptions/hu.toml | 63 + .../zeroclaw/tool_descriptions/id.toml | 63 + .../zeroclaw/tool_descriptions/it.toml | 62 + .../zeroclaw/tool_descriptions/ja.toml | 62 + .../zeroclaw/tool_descriptions/ko.toml | 62 + .../zeroclaw/tool_descriptions/nb.toml | 62 + .../zeroclaw/tool_descriptions/nl.toml | 63 + .../zeroclaw/tool_descriptions/pl.toml | 62 + .../zeroclaw/tool_descriptions/pt.toml | 62 + .../zeroclaw/tool_descriptions/ro.toml | 63 + .../zeroclaw/tool_descriptions/ru.toml | 62 + .../zeroclaw/tool_descriptions/sv.toml | 63 + .../zeroclaw/tool_descriptions/th.toml | 62 + .../zeroclaw/tool_descriptions/tl.toml | 62 + .../zeroclaw/tool_descriptions/tr.toml | 63 + .../zeroclaw/tool_descriptions/uk.toml | 63 + .../zeroclaw/tool_descriptions/ur.toml | 63 + .../zeroclaw/tool_descriptions/vi.toml | 62 + .../zeroclaw/tool_descriptions/zh-CN.toml | 63 + third_party/zeroclaw/web/.gitignore | 3 + third_party/zeroclaw/web/index.html | 14 + third_party/zeroclaw/web/package-lock.json | 3979 ++++ third_party/zeroclaw/web/package.json | 29 + third_party/zeroclaw/web/public/logo.png | Bin 0 -> 2156411 bytes third_party/zeroclaw/web/src/App.tsx | 255 + .../web/src/components/SettingsModal.tsx | 447 + .../web/src/components/layout/Header.tsx | 124 + .../web/src/components/layout/Layout.tsx | 35 + .../web/src/components/layout/Sidebar.tsx | 121 + .../web/src/contexts/ThemeContext.tsx | 227 + .../web/src/contexts/ThemeContextDef.ts | 60 + .../zeroclaw/web/src/contexts/colorThemes.ts | 285 + .../zeroclaw/web/src/contexts/fontLoader.ts | 25 + .../zeroclaw/web/src/contexts/themeStorage.ts | 66 + third_party/zeroclaw/web/src/hooks/useApi.ts | 174 + third_party/zeroclaw/web/src/hooks/useAuth.ts | 128 + .../zeroclaw/web/src/hooks/useDevices.ts | 44 + .../zeroclaw/web/src/hooks/useDraft.ts | 45 + third_party/zeroclaw/web/src/hooks/useSSE.ts | 124 + .../zeroclaw/web/src/hooks/useTheme.ts | 4 + .../zeroclaw/web/src/hooks/useWebSocket.ts | 118 + third_party/zeroclaw/web/src/index.css | 675 + third_party/zeroclaw/web/src/lib/api.ts | 328 + third_party/zeroclaw/web/src/lib/auth.ts | 42 + third_party/zeroclaw/web/src/lib/basePath.ts | 20 + third_party/zeroclaw/web/src/lib/i18n.ts | 1159 ++ third_party/zeroclaw/web/src/lib/sse.ts | 186 + third_party/zeroclaw/web/src/lib/tauri.ts | 15 + third_party/zeroclaw/web/src/lib/uuid.ts | 27 + third_party/zeroclaw/web/src/lib/ws.ts | 152 + third_party/zeroclaw/web/src/main.tsx | 15 + .../zeroclaw/web/src/pages/AgentChat.tsx | 409 + third_party/zeroclaw/web/src/pages/Canvas.tsx | 355 + third_party/zeroclaw/web/src/pages/Config.tsx | 233 + third_party/zeroclaw/web/src/pages/Cost.tsx | 149 + third_party/zeroclaw/web/src/pages/Cron.tsx | 531 + .../zeroclaw/web/src/pages/Dashboard.tsx | 921 + third_party/zeroclaw/web/src/pages/Doctor.tsx | 216 + .../zeroclaw/web/src/pages/Integrations.tsx | 153 + third_party/zeroclaw/web/src/pages/Logs.tsx | 282 + third_party/zeroclaw/web/src/pages/Memory.tsx | 275 + .../zeroclaw/web/src/pages/Pairing.tsx | 177 + third_party/zeroclaw/web/src/pages/Tools.tsx | 202 + third_party/zeroclaw/web/src/types/api.ts | 143 + third_party/zeroclaw/web/src/vite-env.d.ts | 1 + third_party/zeroclaw/web/tsconfig.app.json | 32 + third_party/zeroclaw/web/tsconfig.json | 13 + third_party/zeroclaw/web/tsconfig.node.json | 24 + third_party/zeroclaw/web/vite.config.ts | 19 + tools/browser_smoke/fake_deepseek_server.mjs | 229 + .../fake_deepseek_server.test.mjs | 98 + .../run_deepseek_browser_smoke.mjs | 75 + 1059 files changed, 409460 insertions(+), 23 deletions(-) create mode 100644 docs/plans/2026-03-26-deepseek-browser-smoke-plan.md create mode 100644 docs/plans/2026-03-26-zeroclaw-core-refactor-plan.md create mode 100644 src/compat/browser_tool_adapter.rs create mode 100644 src/compat/config_adapter.rs create mode 100644 src/compat/cron_adapter.rs create mode 100644 src/compat/event_bridge.rs create mode 100644 src/compat/memory_adapter.rs create mode 100644 src/compat/mod.rs create mode 100644 src/compat/runtime.rs create mode 100644 tests/compat_browser_tool_test.rs create mode 100644 tests/compat_config_test.rs create mode 100644 tests/compat_cron_test.rs create mode 100644 tests/compat_memory_test.rs create mode 100644 tests/compat_runtime_test.rs create mode 100644 third_party/zeroclaw/.cargo/audit.toml create mode 100644 third_party/zeroclaw/.cargo/config.toml create mode 100644 third_party/zeroclaw/.claude/skills/github-issue/SKILL.md create mode 100644 third_party/zeroclaw/.claude/skills/github-pr/SKILL.md create mode 100644 third_party/zeroclaw/.claude/skills/skill-creator/LICENSE.txt create mode 100644 third_party/zeroclaw/.claude/skills/skill-creator/SKILL.md create mode 100644 third_party/zeroclaw/.claude/skills/skill-creator/agents/analyzer.md create mode 100644 third_party/zeroclaw/.claude/skills/skill-creator/agents/comparator.md create mode 100644 third_party/zeroclaw/.claude/skills/skill-creator/agents/grader.md create mode 100644 third_party/zeroclaw/.claude/skills/skill-creator/assets/eval_review.html create mode 100644 third_party/zeroclaw/.claude/skills/skill-creator/eval-viewer/generate_review.py create mode 100644 third_party/zeroclaw/.claude/skills/skill-creator/eval-viewer/viewer.html create mode 100644 third_party/zeroclaw/.claude/skills/skill-creator/references/schemas.md create mode 100644 third_party/zeroclaw/.claude/skills/skill-creator/scripts/__init__.py create mode 100755 third_party/zeroclaw/.claude/skills/skill-creator/scripts/aggregate_benchmark.py create mode 100755 third_party/zeroclaw/.claude/skills/skill-creator/scripts/generate_report.py create mode 100755 third_party/zeroclaw/.claude/skills/skill-creator/scripts/improve_description.py create mode 100755 third_party/zeroclaw/.claude/skills/skill-creator/scripts/package_skill.py create mode 100755 third_party/zeroclaw/.claude/skills/skill-creator/scripts/quick_validate.py create mode 100755 third_party/zeroclaw/.claude/skills/skill-creator/scripts/run_eval.py create mode 100755 third_party/zeroclaw/.claude/skills/skill-creator/scripts/run_loop.py create mode 100644 third_party/zeroclaw/.claude/skills/skill-creator/scripts/utils.py create mode 100644 third_party/zeroclaw/.claude/skills/zeroclaw/SKILL.md create mode 100644 third_party/zeroclaw/.claude/skills/zeroclaw/evals/evals.json create mode 100644 third_party/zeroclaw/.claude/skills/zeroclaw/references/cli-reference.md create mode 100644 third_party/zeroclaw/.claude/skills/zeroclaw/references/rest-api.md create mode 100644 third_party/zeroclaw/.coderabbit.yaml create mode 100644 third_party/zeroclaw/.dockerignore create mode 100644 third_party/zeroclaw/.editorconfig create mode 100644 third_party/zeroclaw/.env.example create mode 100644 third_party/zeroclaw/.envrc create mode 100644 third_party/zeroclaw/.gemini/style-guide.md create mode 100644 third_party/zeroclaw/.gitattributes create mode 100755 third_party/zeroclaw/.githooks/pre-commit create mode 100755 third_party/zeroclaw/.githooks/pre-push create mode 100644 third_party/zeroclaw/.github/CODEOWNERS create mode 100644 third_party/zeroclaw/.github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 third_party/zeroclaw/.github/ISSUE_TEMPLATE/config.yml create mode 100644 third_party/zeroclaw/.github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 third_party/zeroclaw/.github/actionlint.yaml create mode 100644 third_party/zeroclaw/.github/assets/show-tool-calls-after.png create mode 100644 third_party/zeroclaw/.github/assets/show-tool-calls-before.png create mode 100644 third_party/zeroclaw/.github/codeql/codeql-config.yml create mode 100644 third_party/zeroclaw/.github/dependabot.yml create mode 100644 third_party/zeroclaw/.github/label-policy.json create mode 100644 third_party/zeroclaw/.github/labeler.yml create mode 100644 third_party/zeroclaw/.github/pull_request_template.md create mode 100644 third_party/zeroclaw/.github/workflows/README.md create mode 100644 third_party/zeroclaw/.github/workflows/checks-on-pr.yml create mode 100644 third_party/zeroclaw/.github/workflows/ci-run.yml create mode 100644 third_party/zeroclaw/.github/workflows/cross-platform-build-manual.yml create mode 100644 third_party/zeroclaw/.github/workflows/discord-release.yml create mode 100644 third_party/zeroclaw/.github/workflows/master-branch-flow.md create mode 100644 third_party/zeroclaw/.github/workflows/pr-path-labeler.yml create mode 100644 third_party/zeroclaw/.github/workflows/pub-aur.yml create mode 100644 third_party/zeroclaw/.github/workflows/pub-homebrew-core.yml create mode 100644 third_party/zeroclaw/.github/workflows/pub-scoop.yml create mode 100644 third_party/zeroclaw/.github/workflows/publish-crates-auto.yml create mode 100644 third_party/zeroclaw/.github/workflows/publish-crates.yml create mode 100644 third_party/zeroclaw/.github/workflows/release-beta-on-push.yml create mode 100644 third_party/zeroclaw/.github/workflows/release-stable-manual.yml create mode 100644 third_party/zeroclaw/.github/workflows/tweet-release.yml create mode 100644 third_party/zeroclaw/.gitignore create mode 100644 third_party/zeroclaw/.markdownlint-cli2.yaml create mode 100644 third_party/zeroclaw/.vscode/extensions.json create mode 100644 third_party/zeroclaw/.vscode/launch.json create mode 100644 third_party/zeroclaw/.vscode/settings.json create mode 100644 third_party/zeroclaw/.vscode/tasks.json create mode 100644 third_party/zeroclaw/AGENTS.md create mode 100644 third_party/zeroclaw/CHANGELOG.md create mode 100644 third_party/zeroclaw/CLAUDE.md create mode 100644 third_party/zeroclaw/CODE_OF_CONDUCT.md create mode 100644 third_party/zeroclaw/CONTRIBUTING.md create mode 100644 third_party/zeroclaw/Cargo.lock create mode 100644 third_party/zeroclaw/Cargo.toml create mode 100644 third_party/zeroclaw/Dockerfile create mode 100644 third_party/zeroclaw/Dockerfile.ci create mode 100644 third_party/zeroclaw/Dockerfile.debian create mode 100644 third_party/zeroclaw/Dockerfile.debian.ci create mode 100644 third_party/zeroclaw/Justfile create mode 100644 third_party/zeroclaw/LICENSE-APACHE create mode 100644 third_party/zeroclaw/LICENSE-MIT create mode 100644 third_party/zeroclaw/NOTICE create mode 100644 third_party/zeroclaw/README.ar.md create mode 100644 third_party/zeroclaw/README.bn.md create mode 100644 third_party/zeroclaw/README.cs.md create mode 100644 third_party/zeroclaw/README.da.md create mode 100644 third_party/zeroclaw/README.de.md create mode 100644 third_party/zeroclaw/README.el.md create mode 100644 third_party/zeroclaw/README.es.md create mode 100644 third_party/zeroclaw/README.fi.md create mode 100644 third_party/zeroclaw/README.fr.md create mode 100644 third_party/zeroclaw/README.he.md create mode 100644 third_party/zeroclaw/README.hi.md create mode 100644 third_party/zeroclaw/README.hu.md create mode 100644 third_party/zeroclaw/README.id.md create mode 100644 third_party/zeroclaw/README.it.md create mode 100644 third_party/zeroclaw/README.ja.md create mode 100644 third_party/zeroclaw/README.ko.md create mode 100644 third_party/zeroclaw/README.md create mode 100644 third_party/zeroclaw/README.nb.md create mode 100644 third_party/zeroclaw/README.nl.md create mode 100644 third_party/zeroclaw/README.pl.md create mode 100644 third_party/zeroclaw/README.pt.md create mode 100644 third_party/zeroclaw/README.ro.md create mode 100644 third_party/zeroclaw/README.ru.md create mode 100644 third_party/zeroclaw/README.sv.md create mode 100644 third_party/zeroclaw/README.th.md create mode 100644 third_party/zeroclaw/README.tl.md create mode 100644 third_party/zeroclaw/README.tr.md create mode 100644 third_party/zeroclaw/README.uk.md create mode 100644 third_party/zeroclaw/README.ur.md create mode 100644 third_party/zeroclaw/README.vi.md create mode 100644 third_party/zeroclaw/README.zh-CN.md create mode 100644 third_party/zeroclaw/SECURITY.md create mode 100644 third_party/zeroclaw/VENDORED_FROM.md create mode 100644 third_party/zeroclaw/apps/tauri/Cargo.toml create mode 100644 third_party/zeroclaw/apps/tauri/build.rs create mode 100644 third_party/zeroclaw/apps/tauri/capabilities/default.json create mode 100644 third_party/zeroclaw/apps/tauri/capabilities/desktop.json create mode 100644 third_party/zeroclaw/apps/tauri/capabilities/mobile.json create mode 100644 third_party/zeroclaw/apps/tauri/gen/android/.gitkeep create mode 100644 third_party/zeroclaw/apps/tauri/gen/apple/.gitkeep create mode 100644 third_party/zeroclaw/apps/tauri/icons/.gitkeep create mode 100644 third_party/zeroclaw/apps/tauri/icons/128x128.png create mode 100644 third_party/zeroclaw/apps/tauri/icons/32x32.png create mode 100644 third_party/zeroclaw/apps/tauri/icons/icon.icns create mode 100644 third_party/zeroclaw/apps/tauri/icons/icon.ico create mode 100644 third_party/zeroclaw/apps/tauri/icons/icon.svg create mode 100644 third_party/zeroclaw/apps/tauri/icons/tray-disconnected.png create mode 100644 third_party/zeroclaw/apps/tauri/icons/tray-error.png create mode 100644 third_party/zeroclaw/apps/tauri/icons/tray-idle.png create mode 100644 third_party/zeroclaw/apps/tauri/icons/tray-working.png create mode 100644 third_party/zeroclaw/apps/tauri/src/commands/agent.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/commands/channels.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/commands/gateway.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/commands/mod.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/commands/pairing.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/gateway_client.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/health.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/lib.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/main.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/mobile.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/state.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/tray/events.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/tray/icon.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/tray/menu.rs create mode 100644 third_party/zeroclaw/apps/tauri/src/tray/mod.rs create mode 100644 third_party/zeroclaw/apps/tauri/tauri.conf.json create mode 100644 third_party/zeroclaw/benches/agent_benchmarks.rs create mode 100644 third_party/zeroclaw/build.rs create mode 100644 third_party/zeroclaw/clippy.toml create mode 100644 third_party/zeroclaw/crates/aardvark-sys/Cargo.toml create mode 100644 third_party/zeroclaw/crates/aardvark-sys/build.rs create mode 100644 third_party/zeroclaw/crates/aardvark-sys/src/lib.rs create mode 100644 third_party/zeroclaw/crates/aardvark-sys/vendor/aardvark.h create mode 100644 third_party/zeroclaw/crates/aardvark-sys/vendor/aardvark.so create mode 100644 third_party/zeroclaw/crates/robot-kit/Cargo.toml create mode 100644 third_party/zeroclaw/crates/robot-kit/PI5_SETUP.md create mode 100644 third_party/zeroclaw/crates/robot-kit/README.md create mode 100644 third_party/zeroclaw/crates/robot-kit/SOUL.md create mode 100644 third_party/zeroclaw/crates/robot-kit/robot.toml create mode 100644 third_party/zeroclaw/crates/robot-kit/src/config.rs create mode 100644 third_party/zeroclaw/crates/robot-kit/src/drive.rs create mode 100644 third_party/zeroclaw/crates/robot-kit/src/emote.rs create mode 100644 third_party/zeroclaw/crates/robot-kit/src/lib.rs create mode 100644 third_party/zeroclaw/crates/robot-kit/src/listen.rs create mode 100644 third_party/zeroclaw/crates/robot-kit/src/look.rs create mode 100644 third_party/zeroclaw/crates/robot-kit/src/safety.rs create mode 100644 third_party/zeroclaw/crates/robot-kit/src/sense.rs create mode 100644 third_party/zeroclaw/crates/robot-kit/src/speak.rs create mode 100644 third_party/zeroclaw/crates/robot-kit/src/tests.rs create mode 100644 third_party/zeroclaw/crates/robot-kit/src/traits.rs create mode 100644 third_party/zeroclaw/deny.toml create mode 100644 third_party/zeroclaw/dev/README.md create mode 100755 third_party/zeroclaw/dev/ci.sh create mode 100644 third_party/zeroclaw/dev/ci/Dockerfile create mode 100755 third_party/zeroclaw/dev/cli.sh create mode 100644 third_party/zeroclaw/dev/config.template.toml create mode 100644 third_party/zeroclaw/dev/docker-compose.ci.yml create mode 100644 third_party/zeroclaw/dev/docker-compose.yml create mode 100755 third_party/zeroclaw/dev/recompute_contributor_tiers.sh create mode 100644 third_party/zeroclaw/dev/sandbox/Dockerfile create mode 100755 third_party/zeroclaw/dev/test-termux-release.sh create mode 100644 third_party/zeroclaw/dist/aur/.SRCINFO create mode 100644 third_party/zeroclaw/dist/aur/PKGBUILD create mode 100644 third_party/zeroclaw/dist/scoop/zeroclaw.json create mode 100644 third_party/zeroclaw/docker-compose.yml create mode 100644 third_party/zeroclaw/docs/README.ar.md create mode 100644 third_party/zeroclaw/docs/README.bn.md create mode 100644 third_party/zeroclaw/docs/README.cs.md create mode 100644 third_party/zeroclaw/docs/README.da.md create mode 100644 third_party/zeroclaw/docs/README.de.md create mode 100644 third_party/zeroclaw/docs/README.el.md create mode 100644 third_party/zeroclaw/docs/README.es.md create mode 100644 third_party/zeroclaw/docs/README.fi.md create mode 100644 third_party/zeroclaw/docs/README.fr.md create mode 100644 third_party/zeroclaw/docs/README.he.md create mode 100644 third_party/zeroclaw/docs/README.hi.md create mode 100644 third_party/zeroclaw/docs/README.hu.md create mode 100644 third_party/zeroclaw/docs/README.id.md create mode 100644 third_party/zeroclaw/docs/README.it.md create mode 100644 third_party/zeroclaw/docs/README.ja.md create mode 100644 third_party/zeroclaw/docs/README.ko.md create mode 100644 third_party/zeroclaw/docs/README.md create mode 100644 third_party/zeroclaw/docs/README.nb.md create mode 100644 third_party/zeroclaw/docs/README.nl.md create mode 100644 third_party/zeroclaw/docs/README.pl.md create mode 100644 third_party/zeroclaw/docs/README.pt.md create mode 100644 third_party/zeroclaw/docs/README.ro.md create mode 100644 third_party/zeroclaw/docs/README.ru.md create mode 100644 third_party/zeroclaw/docs/README.sv.md create mode 100644 third_party/zeroclaw/docs/README.th.md create mode 100644 third_party/zeroclaw/docs/README.tl.md create mode 100644 third_party/zeroclaw/docs/README.tr.md create mode 100644 third_party/zeroclaw/docs/README.uk.md create mode 100644 third_party/zeroclaw/docs/README.ur.md create mode 100644 third_party/zeroclaw/docs/README.vi.md create mode 100644 third_party/zeroclaw/docs/README.zh-CN.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.ar.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.bn.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.cs.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.da.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.de.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.el.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.es.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.fi.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.fr.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.he.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.hi.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.hu.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.id.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.it.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.ja.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.ko.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.nb.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.nl.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.pl.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.pt.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.ro.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.ru.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.sv.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.th.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.tl.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.tr.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.uk.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.ur.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.vi.md create mode 100644 third_party/zeroclaw/docs/SUMMARY.zh-CN.md create mode 100644 third_party/zeroclaw/docs/aardvark-integration.md create mode 100644 third_party/zeroclaw/docs/architecture/adr-004-tool-shared-state-ownership.md create mode 100644 third_party/zeroclaw/docs/assets/Hardware_architecture.jpg create mode 100644 third_party/zeroclaw/docs/assets/architecture-diagrams.md create mode 100644 third_party/zeroclaw/docs/assets/architecture.svg create mode 100644 third_party/zeroclaw/docs/assets/zeroclaw-banner.png create mode 100644 third_party/zeroclaw/docs/assets/zeroclaw-comparison.jpeg create mode 100644 third_party/zeroclaw/docs/assets/zeroclaw-trans.png create mode 100644 third_party/zeroclaw/docs/assets/zeroclaw.png create mode 100644 third_party/zeroclaw/docs/browser-setup.md create mode 100644 third_party/zeroclaw/docs/contributing/README.md create mode 100644 third_party/zeroclaw/docs/contributing/actions-source-policy.md create mode 100644 third_party/zeroclaw/docs/contributing/adding-boards-and-tools.md create mode 100644 third_party/zeroclaw/docs/contributing/cargo-slicer-speedup.md create mode 100644 third_party/zeroclaw/docs/contributing/change-playbooks.md create mode 100644 third_party/zeroclaw/docs/contributing/ci-map.md create mode 100644 third_party/zeroclaw/docs/contributing/cla.md create mode 100644 third_party/zeroclaw/docs/contributing/custom-providers.md create mode 100644 third_party/zeroclaw/docs/contributing/doc-template.md create mode 100644 third_party/zeroclaw/docs/contributing/docs-contract.md create mode 100644 third_party/zeroclaw/docs/contributing/extension-examples.md create mode 100644 third_party/zeroclaw/docs/contributing/label-registry.md create mode 100644 third_party/zeroclaw/docs/contributing/langgraph-integration.md create mode 100644 third_party/zeroclaw/docs/contributing/pr-discipline.md create mode 100644 third_party/zeroclaw/docs/contributing/pr-workflow.md create mode 100644 third_party/zeroclaw/docs/contributing/release-process.md create mode 100644 third_party/zeroclaw/docs/contributing/reviewer-playbook.md create mode 100644 third_party/zeroclaw/docs/contributing/testing-telegram.md create mode 100644 third_party/zeroclaw/docs/contributing/testing.md create mode 100644 third_party/zeroclaw/docs/hardware/README.md create mode 100644 third_party/zeroclaw/docs/hardware/android-setup.md create mode 100644 third_party/zeroclaw/docs/hardware/arduino-uno-q-setup.md create mode 100644 third_party/zeroclaw/docs/hardware/datasheets/arduino-uno.md create mode 100644 third_party/zeroclaw/docs/hardware/datasheets/esp32.md create mode 100644 third_party/zeroclaw/docs/hardware/datasheets/nucleo-f401re.md create mode 100644 third_party/zeroclaw/docs/hardware/hardware-peripherals-design.md create mode 100644 third_party/zeroclaw/docs/hardware/nucleo-setup.md create mode 100644 third_party/zeroclaw/docs/i18n/README.md create mode 100644 third_party/zeroclaw/docs/i18n/ar/README.md create mode 100644 third_party/zeroclaw/docs/i18n/ar/SUMMARY.md create mode 100644 third_party/zeroclaw/docs/i18n/bn/README.md create mode 100644 third_party/zeroclaw/docs/i18n/bn/SUMMARY.md create mode 100644 third_party/zeroclaw/docs/i18n/de/README.md create mode 100644 third_party/zeroclaw/docs/i18n/de/SUMMARY.md create mode 100644 third_party/zeroclaw/docs/i18n/hi/README.md create mode 100644 third_party/zeroclaw/docs/i18n/hi/SUMMARY.md create mode 100644 third_party/zeroclaw/docs/i18n/ko/README.md create mode 100644 third_party/zeroclaw/docs/i18n/ko/SUMMARY.md create mode 100644 third_party/zeroclaw/docs/i18n/tl/README.md create mode 100644 third_party/zeroclaw/docs/i18n/tl/SUMMARY.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/README.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/actions-source-policy.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/adding-boards-and-tools.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/cargo-slicer-speedup.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/change-playbooks.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/ci-map.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/cla.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/custom-providers.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/doc-template.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/docs-contract.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/extension-examples.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/langgraph-integration.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/pr-discipline.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/pr-workflow.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/release-process.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/reviewer-playbook.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/testing-telegram.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/contributing/testing.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/hardware/README.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/hardware/android-setup.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/hardware/arduino-uno-q-setup.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/hardware/datasheets/arduino-uno.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/hardware/datasheets/esp32.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/hardware/datasheets/nucleo-f401re.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/hardware/hardware-peripherals-design.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/hardware/nucleo-setup.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/maintainers/README.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/maintainers/docs-inventory.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/maintainers/i18n-coverage.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/maintainers/project-triage-snapshot-2026-02-18.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/maintainers/refactor-candidates.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/maintainers/repo-map.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/maintainers/structure-README.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/maintainers/trademark.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/ops/README.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/ops/network-deployment.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/ops/operations-runbook.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/ops/proxy-agent-playbook.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/ops/resource-limits.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/ops/troubleshooting.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/reference/README.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/reference/api/channels-reference.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/reference/api/config-reference.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/reference/api/providers-reference.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/reference/cli/commands-reference.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/reference/sop/README.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/reference/sop/connectivity.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/reference/sop/cookbook.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/reference/sop/observability.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/reference/sop/syntax.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/security/README.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/security/agnostic-security.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/security/audit-logging.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/security/frictionless-security.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/security/matrix-e2ee-guide.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/security/sandboxing.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/security/security-roadmap.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/setup-guides/README.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/setup-guides/macos-update-uninstall.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/setup-guides/mattermost-setup.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/setup-guides/nextcloud-talk-setup.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/setup-guides/one-click-bootstrap.zh-CN.md create mode 100644 third_party/zeroclaw/docs/i18n/zh-CN/setup-guides/zai-glm-setup.zh-CN.md create mode 100644 third_party/zeroclaw/docs/maintainers/README.md create mode 100644 third_party/zeroclaw/docs/maintainers/docs-inventory.md create mode 100644 third_party/zeroclaw/docs/maintainers/i18n-coverage.md create mode 100644 third_party/zeroclaw/docs/maintainers/project-triage-snapshot-2026-02-18.md create mode 100644 third_party/zeroclaw/docs/maintainers/refactor-candidates.md create mode 100644 third_party/zeroclaw/docs/maintainers/repo-map.md create mode 100644 third_party/zeroclaw/docs/maintainers/structure-README.md create mode 100644 third_party/zeroclaw/docs/maintainers/trademark.md create mode 100644 third_party/zeroclaw/docs/openai-temperature-compatibility.md create mode 100644 third_party/zeroclaw/docs/ops/README.md create mode 100644 third_party/zeroclaw/docs/ops/network-deployment.md create mode 100644 third_party/zeroclaw/docs/ops/operations-runbook.md create mode 100644 third_party/zeroclaw/docs/ops/proxy-agent-playbook.md create mode 100644 third_party/zeroclaw/docs/ops/resource-limits.md create mode 100644 third_party/zeroclaw/docs/ops/troubleshooting.md create mode 100644 third_party/zeroclaw/docs/ops/troubleshooting.vi.md create mode 100644 third_party/zeroclaw/docs/reference/README.md create mode 100644 third_party/zeroclaw/docs/reference/api/channels-reference.md create mode 100644 third_party/zeroclaw/docs/reference/api/config-reference.md create mode 100644 third_party/zeroclaw/docs/reference/api/config-reference.vi.md create mode 100644 third_party/zeroclaw/docs/reference/api/providers-reference.md create mode 100644 third_party/zeroclaw/docs/reference/cli/commands-reference.md create mode 100644 third_party/zeroclaw/docs/reference/cli/commands-reference.vi.md create mode 100644 third_party/zeroclaw/docs/reference/sop/README.md create mode 100644 third_party/zeroclaw/docs/reference/sop/connectivity.md create mode 100644 third_party/zeroclaw/docs/reference/sop/cookbook.md create mode 100644 third_party/zeroclaw/docs/reference/sop/observability.md create mode 100644 third_party/zeroclaw/docs/reference/sop/syntax.md create mode 100644 third_party/zeroclaw/docs/security/README.md create mode 100644 third_party/zeroclaw/docs/security/agnostic-security.md create mode 100644 third_party/zeroclaw/docs/security/audit-logging.md create mode 100644 third_party/zeroclaw/docs/security/frictionless-security.md create mode 100644 third_party/zeroclaw/docs/security/matrix-e2ee-guide.md create mode 100644 third_party/zeroclaw/docs/security/sandboxing.md create mode 100644 third_party/zeroclaw/docs/security/security-roadmap.md create mode 100644 third_party/zeroclaw/docs/setup-guides/README.md create mode 100644 third_party/zeroclaw/docs/setup-guides/README.vi.md create mode 100644 third_party/zeroclaw/docs/setup-guides/macos-update-uninstall.md create mode 100644 third_party/zeroclaw/docs/setup-guides/mattermost-setup.md create mode 100644 third_party/zeroclaw/docs/setup-guides/nextcloud-talk-setup.md create mode 100644 third_party/zeroclaw/docs/setup-guides/one-click-bootstrap.md create mode 100644 third_party/zeroclaw/docs/setup-guides/one-click-bootstrap.vi.md create mode 100644 third_party/zeroclaw/docs/setup-guides/windows-setup.md create mode 100644 third_party/zeroclaw/docs/setup-guides/zai-glm-setup.md create mode 100644 third_party/zeroclaw/docs/superpowers/specs/2026-03-13-linkedin-tool-design.md create mode 100644 third_party/zeroclaw/docs/superpowers/specs/2026-03-19-google-workspace-operation-allowlist.md create mode 100644 third_party/zeroclaw/docs/vi/README.md create mode 100644 third_party/zeroclaw/docs/vi/actions-source-policy.md create mode 100644 third_party/zeroclaw/docs/vi/adding-boards-and-tools.md create mode 100644 third_party/zeroclaw/docs/vi/agnostic-security.md create mode 100644 third_party/zeroclaw/docs/vi/arduino-uno-q-setup.md create mode 100644 third_party/zeroclaw/docs/vi/audit-logging.md create mode 100644 third_party/zeroclaw/docs/vi/channels-reference.md create mode 100644 third_party/zeroclaw/docs/vi/ci-map.md create mode 100644 third_party/zeroclaw/docs/vi/commands-reference.md create mode 100644 third_party/zeroclaw/docs/vi/config-reference.md create mode 100644 third_party/zeroclaw/docs/vi/contributing/README.md create mode 100644 third_party/zeroclaw/docs/vi/custom-providers.md create mode 100644 third_party/zeroclaw/docs/vi/datasheets/arduino-uno.md create mode 100644 third_party/zeroclaw/docs/vi/datasheets/esp32.md create mode 100644 third_party/zeroclaw/docs/vi/datasheets/nucleo-f401re.md create mode 100644 third_party/zeroclaw/docs/vi/frictionless-security.md create mode 100644 third_party/zeroclaw/docs/vi/getting-started/README.md create mode 100644 third_party/zeroclaw/docs/vi/hardware-peripherals-design.md create mode 100644 third_party/zeroclaw/docs/vi/hardware/README.md create mode 100644 third_party/zeroclaw/docs/vi/langgraph-integration.md create mode 100644 third_party/zeroclaw/docs/vi/matrix-e2ee-guide.md create mode 100644 third_party/zeroclaw/docs/vi/mattermost-setup.md create mode 100644 third_party/zeroclaw/docs/vi/network-deployment.md create mode 100644 third_party/zeroclaw/docs/vi/nucleo-setup.md create mode 100644 third_party/zeroclaw/docs/vi/one-click-bootstrap.md create mode 100644 third_party/zeroclaw/docs/vi/operations-runbook.md create mode 100644 third_party/zeroclaw/docs/vi/operations/README.md create mode 100644 third_party/zeroclaw/docs/vi/pr-workflow.md create mode 100644 third_party/zeroclaw/docs/vi/project/README.md create mode 100644 third_party/zeroclaw/docs/vi/providers-reference.md create mode 100644 third_party/zeroclaw/docs/vi/proxy-agent-playbook.md create mode 100644 third_party/zeroclaw/docs/vi/reference/README.md create mode 100644 third_party/zeroclaw/docs/vi/release-process.md create mode 100644 third_party/zeroclaw/docs/vi/resource-limits.md create mode 100644 third_party/zeroclaw/docs/vi/reviewer-playbook.md create mode 100644 third_party/zeroclaw/docs/vi/sandboxing.md create mode 100644 third_party/zeroclaw/docs/vi/security-roadmap.md create mode 100644 third_party/zeroclaw/docs/vi/security/README.md create mode 100644 third_party/zeroclaw/docs/vi/troubleshooting.md create mode 100644 third_party/zeroclaw/docs/vi/zai-glm-setup.md create mode 100644 third_party/zeroclaw/examples/hardware/aardvark/HARDWARE_aardvark_snippet.md create mode 100644 third_party/zeroclaw/examples/hardware/aardvark/devices/aardvark0.md.example create mode 100644 third_party/zeroclaw/examples/hardware/aardvark/skills/i2c.md create mode 100644 third_party/zeroclaw/firmware/arduino/arduino.ino create mode 100644 third_party/zeroclaw/firmware/esp32-ui/.cargo/config.toml create mode 100644 third_party/zeroclaw/firmware/esp32-ui/Cargo.toml create mode 100644 third_party/zeroclaw/firmware/esp32-ui/README.md create mode 100644 third_party/zeroclaw/firmware/esp32-ui/build.rs create mode 100644 third_party/zeroclaw/firmware/esp32-ui/src/main.rs create mode 100644 third_party/zeroclaw/firmware/esp32-ui/ui/main.slint create mode 100644 third_party/zeroclaw/firmware/esp32/.cargo/config.toml create mode 100644 third_party/zeroclaw/firmware/esp32/Cargo.lock create mode 100644 third_party/zeroclaw/firmware/esp32/Cargo.toml create mode 100644 third_party/zeroclaw/firmware/esp32/README.md create mode 100644 third_party/zeroclaw/firmware/esp32/SETUP.md create mode 100644 third_party/zeroclaw/firmware/esp32/build.rs create mode 100644 third_party/zeroclaw/firmware/esp32/rust-toolchain.toml create mode 100644 third_party/zeroclaw/firmware/esp32/src/main.rs create mode 100644 third_party/zeroclaw/firmware/nucleo/Cargo.lock create mode 100644 third_party/zeroclaw/firmware/nucleo/Cargo.toml create mode 100644 third_party/zeroclaw/firmware/nucleo/src/main.rs create mode 100644 third_party/zeroclaw/firmware/pico/main.py create mode 100644 third_party/zeroclaw/firmware/pico/zeroclaw-pico.uf2 create mode 100644 third_party/zeroclaw/firmware/uno-q-bridge/app.yaml create mode 100644 third_party/zeroclaw/firmware/uno-q-bridge/python/main.py create mode 100644 third_party/zeroclaw/firmware/uno-q-bridge/python/requirements.txt create mode 100644 third_party/zeroclaw/firmware/uno-q-bridge/sketch/sketch.ino create mode 100644 third_party/zeroclaw/firmware/uno-q-bridge/sketch/sketch.yaml create mode 100644 third_party/zeroclaw/firmware/zeroclaw-nucleo/.cargo/config.toml create mode 100644 third_party/zeroclaw/flake.lock create mode 100644 third_party/zeroclaw/flake.nix create mode 100644 third_party/zeroclaw/fuzz/Cargo.toml create mode 100644 third_party/zeroclaw/fuzz/fuzz_targets/fuzz_command_validation.rs create mode 100644 third_party/zeroclaw/fuzz/fuzz_targets/fuzz_config_parse.rs create mode 100644 third_party/zeroclaw/fuzz/fuzz_targets/fuzz_provider_response.rs create mode 100644 third_party/zeroclaw/fuzz/fuzz_targets/fuzz_tool_params.rs create mode 100644 third_party/zeroclaw/fuzz/fuzz_targets/fuzz_webhook_payload.rs create mode 100755 third_party/zeroclaw/install.sh create mode 100644 third_party/zeroclaw/python/README.md create mode 100644 third_party/zeroclaw/python/README.vi.md create mode 100644 third_party/zeroclaw/python/pyproject.toml create mode 100644 third_party/zeroclaw/python/tests/__init__.py create mode 100644 third_party/zeroclaw/python/tests/test_tools.py create mode 100644 third_party/zeroclaw/python/zeroclaw_tools/__init__.py create mode 100644 third_party/zeroclaw/python/zeroclaw_tools/__main__.py create mode 100644 third_party/zeroclaw/python/zeroclaw_tools/agent.py create mode 100644 third_party/zeroclaw/python/zeroclaw_tools/integrations/__init__.py create mode 100644 third_party/zeroclaw/python/zeroclaw_tools/integrations/discord_bot.py create mode 100644 third_party/zeroclaw/python/zeroclaw_tools/tools/__init__.py create mode 100644 third_party/zeroclaw/python/zeroclaw_tools/tools/base.py create mode 100644 third_party/zeroclaw/python/zeroclaw_tools/tools/file.py create mode 100644 third_party/zeroclaw/python/zeroclaw_tools/tools/memory.py create mode 100644 third_party/zeroclaw/python/zeroclaw_tools/tools/shell.py create mode 100644 third_party/zeroclaw/python/zeroclaw_tools/tools/web.py create mode 100644 third_party/zeroclaw/rustfmt.toml create mode 100644 third_party/zeroclaw/scripts/99-act-led.rules create mode 100644 third_party/zeroclaw/scripts/README.md create mode 100755 third_party/zeroclaw/scripts/browser/start-browser.sh create mode 100755 third_party/zeroclaw/scripts/browser/start-vnc.sh create mode 100755 third_party/zeroclaw/scripts/browser/stop-vnc.sh create mode 100755 third_party/zeroclaw/scripts/ci/check_binary_size.sh create mode 100755 third_party/zeroclaw/scripts/ci/collect_changed_links.py create mode 100755 third_party/zeroclaw/scripts/ci/docs_links_gate.sh create mode 100755 third_party/zeroclaw/scripts/ci/docs_quality_gate.sh create mode 100644 third_party/zeroclaw/scripts/ci/fetch_actions_data.py create mode 100755 third_party/zeroclaw/scripts/ci/rust_quality_gate.sh create mode 100755 third_party/zeroclaw/scripts/ci/rust_strict_delta_gate.sh create mode 100755 third_party/zeroclaw/scripts/deploy-rpi.sh create mode 100755 third_party/zeroclaw/scripts/release/cut_release_tag.sh create mode 100644 third_party/zeroclaw/scripts/rpi-config.toml create mode 100644 third_party/zeroclaw/scripts/zeroclaw.service create mode 100644 third_party/zeroclaw/setup.bat create mode 100644 third_party/zeroclaw/skills/browser/SKILL.md create mode 100644 third_party/zeroclaw/skills/browser/TEST.sh create mode 100644 third_party/zeroclaw/src/agent/agent.rs create mode 100644 third_party/zeroclaw/src/agent/classifier.rs create mode 100644 third_party/zeroclaw/src/agent/context_analyzer.rs create mode 100644 third_party/zeroclaw/src/agent/context_compressor.rs create mode 100644 third_party/zeroclaw/src/agent/dispatcher.rs create mode 100644 third_party/zeroclaw/src/agent/eval.rs create mode 100644 third_party/zeroclaw/src/agent/history_pruner.rs create mode 100644 third_party/zeroclaw/src/agent/loop_.rs create mode 100644 third_party/zeroclaw/src/agent/loop_detector.rs create mode 100644 third_party/zeroclaw/src/agent/memory_loader.rs create mode 100644 third_party/zeroclaw/src/agent/mod.rs create mode 100644 third_party/zeroclaw/src/agent/personality.rs create mode 100644 third_party/zeroclaw/src/agent/prompt.rs create mode 100644 third_party/zeroclaw/src/agent/tests.rs create mode 100644 third_party/zeroclaw/src/agent/thinking.rs create mode 100644 third_party/zeroclaw/src/approval/mod.rs create mode 100644 third_party/zeroclaw/src/auth/anthropic_token.rs create mode 100644 third_party/zeroclaw/src/auth/gemini_oauth.rs create mode 100644 third_party/zeroclaw/src/auth/mod.rs create mode 100644 third_party/zeroclaw/src/auth/oauth_common.rs create mode 100644 third_party/zeroclaw/src/auth/openai_oauth.rs create mode 100644 third_party/zeroclaw/src/auth/profiles.rs create mode 100644 third_party/zeroclaw/src/channels/acp_server.rs create mode 100644 third_party/zeroclaw/src/channels/bluesky.rs create mode 100644 third_party/zeroclaw/src/channels/clawdtalk.rs create mode 100644 third_party/zeroclaw/src/channels/cli.rs create mode 100644 third_party/zeroclaw/src/channels/dingtalk.rs create mode 100644 third_party/zeroclaw/src/channels/discord.rs create mode 100644 third_party/zeroclaw/src/channels/discord_history.rs create mode 100644 third_party/zeroclaw/src/channels/email_channel.rs create mode 100644 third_party/zeroclaw/src/channels/gmail_push.rs create mode 100644 third_party/zeroclaw/src/channels/imessage.rs create mode 100644 third_party/zeroclaw/src/channels/irc.rs create mode 100644 third_party/zeroclaw/src/channels/lark.rs create mode 100644 third_party/zeroclaw/src/channels/link_enricher.rs create mode 100644 third_party/zeroclaw/src/channels/linq.rs create mode 100644 third_party/zeroclaw/src/channels/matrix.rs create mode 100644 third_party/zeroclaw/src/channels/mattermost.rs create mode 100644 third_party/zeroclaw/src/channels/media_pipeline.rs create mode 100644 third_party/zeroclaw/src/channels/mochat.rs create mode 100644 third_party/zeroclaw/src/channels/mod.rs create mode 100644 third_party/zeroclaw/src/channels/mqtt.rs create mode 100644 third_party/zeroclaw/src/channels/nextcloud_talk.rs create mode 100644 third_party/zeroclaw/src/channels/nostr.rs create mode 100644 third_party/zeroclaw/src/channels/notion.rs create mode 100644 third_party/zeroclaw/src/channels/qq.rs create mode 100644 third_party/zeroclaw/src/channels/reddit.rs create mode 100644 third_party/zeroclaw/src/channels/session_backend.rs create mode 100644 third_party/zeroclaw/src/channels/session_sqlite.rs create mode 100644 third_party/zeroclaw/src/channels/session_store.rs create mode 100644 third_party/zeroclaw/src/channels/signal.rs create mode 100644 third_party/zeroclaw/src/channels/slack.rs create mode 100644 third_party/zeroclaw/src/channels/telegram.rs create mode 100644 third_party/zeroclaw/src/channels/traits.rs create mode 100644 third_party/zeroclaw/src/channels/transcription.rs create mode 100644 third_party/zeroclaw/src/channels/tts.rs create mode 100644 third_party/zeroclaw/src/channels/twitter.rs create mode 100644 third_party/zeroclaw/src/channels/voice_call.rs create mode 100644 third_party/zeroclaw/src/channels/voice_wake.rs create mode 100644 third_party/zeroclaw/src/channels/wati.rs create mode 100644 third_party/zeroclaw/src/channels/webhook.rs create mode 100644 third_party/zeroclaw/src/channels/wecom.rs create mode 100644 third_party/zeroclaw/src/channels/whatsapp.rs create mode 100644 third_party/zeroclaw/src/channels/whatsapp_storage.rs create mode 100644 third_party/zeroclaw/src/channels/whatsapp_web.rs create mode 100644 third_party/zeroclaw/src/cli_input.rs create mode 100644 third_party/zeroclaw/src/commands/mod.rs create mode 100644 third_party/zeroclaw/src/commands/self_test.rs create mode 100644 third_party/zeroclaw/src/commands/update.rs create mode 100644 third_party/zeroclaw/src/config/mod.rs create mode 100644 third_party/zeroclaw/src/config/schema.rs create mode 100644 third_party/zeroclaw/src/config/traits.rs create mode 100644 third_party/zeroclaw/src/config/workspace.rs create mode 100644 third_party/zeroclaw/src/cost/mod.rs create mode 100644 third_party/zeroclaw/src/cost/tracker.rs create mode 100644 third_party/zeroclaw/src/cost/types.rs create mode 100644 third_party/zeroclaw/src/cron/mod.rs create mode 100644 third_party/zeroclaw/src/cron/schedule.rs create mode 100644 third_party/zeroclaw/src/cron/scheduler.rs create mode 100644 third_party/zeroclaw/src/cron/store.rs create mode 100644 third_party/zeroclaw/src/cron/types.rs create mode 100644 third_party/zeroclaw/src/daemon/mod.rs create mode 100644 third_party/zeroclaw/src/doctor/mod.rs create mode 100644 third_party/zeroclaw/src/gateway/api.rs create mode 100644 third_party/zeroclaw/src/gateway/api_pairing.rs create mode 100644 third_party/zeroclaw/src/gateway/api_plugins.rs create mode 100644 third_party/zeroclaw/src/gateway/api_webauthn.rs create mode 100644 third_party/zeroclaw/src/gateway/canvas.rs create mode 100644 third_party/zeroclaw/src/gateway/hardware_context.rs create mode 100644 third_party/zeroclaw/src/gateway/mod.rs create mode 100644 third_party/zeroclaw/src/gateway/nodes.rs create mode 100644 third_party/zeroclaw/src/gateway/sse.rs create mode 100644 third_party/zeroclaw/src/gateway/static_files.rs create mode 100644 third_party/zeroclaw/src/gateway/tls.rs create mode 100644 third_party/zeroclaw/src/gateway/ws.rs create mode 100644 third_party/zeroclaw/src/hands/mod.rs create mode 100644 third_party/zeroclaw/src/hands/types.rs create mode 100644 third_party/zeroclaw/src/hardware/aardvark.rs create mode 100644 third_party/zeroclaw/src/hardware/aardvark_tools.rs create mode 100644 third_party/zeroclaw/src/hardware/datasheet.rs create mode 100644 third_party/zeroclaw/src/hardware/device.rs create mode 100644 third_party/zeroclaw/src/hardware/discover.rs create mode 100644 third_party/zeroclaw/src/hardware/gpio.rs create mode 100644 third_party/zeroclaw/src/hardware/introspect.rs create mode 100644 third_party/zeroclaw/src/hardware/loader.rs create mode 100644 third_party/zeroclaw/src/hardware/manifest.rs create mode 100644 third_party/zeroclaw/src/hardware/mod.rs create mode 100644 third_party/zeroclaw/src/hardware/pico_code.rs create mode 100644 third_party/zeroclaw/src/hardware/pico_flash.rs create mode 100644 third_party/zeroclaw/src/hardware/protocol.rs create mode 100644 third_party/zeroclaw/src/hardware/registry.rs create mode 100644 third_party/zeroclaw/src/hardware/rpi.rs create mode 100644 third_party/zeroclaw/src/hardware/serial.rs create mode 100644 third_party/zeroclaw/src/hardware/subprocess.rs create mode 100644 third_party/zeroclaw/src/hardware/tool_registry.rs create mode 100644 third_party/zeroclaw/src/hardware/transport.rs create mode 100644 third_party/zeroclaw/src/hardware/uf2.rs create mode 100644 third_party/zeroclaw/src/health/mod.rs create mode 100644 third_party/zeroclaw/src/heartbeat/engine.rs create mode 100644 third_party/zeroclaw/src/heartbeat/mod.rs create mode 100644 third_party/zeroclaw/src/heartbeat/store.rs create mode 100644 third_party/zeroclaw/src/hooks/builtin/command_logger.rs create mode 100644 third_party/zeroclaw/src/hooks/builtin/mod.rs create mode 100644 third_party/zeroclaw/src/hooks/builtin/webhook_audit.rs create mode 100644 third_party/zeroclaw/src/hooks/mod.rs create mode 100644 third_party/zeroclaw/src/hooks/runner.rs create mode 100644 third_party/zeroclaw/src/hooks/traits.rs create mode 100644 third_party/zeroclaw/src/i18n.rs create mode 100644 third_party/zeroclaw/src/identity.rs create mode 100644 third_party/zeroclaw/src/integrations/mod.rs create mode 100644 third_party/zeroclaw/src/integrations/registry.rs create mode 100644 third_party/zeroclaw/src/lib.rs create mode 100644 third_party/zeroclaw/src/main.rs create mode 100644 third_party/zeroclaw/src/memory/audit.rs create mode 100644 third_party/zeroclaw/src/memory/backend.rs create mode 100644 third_party/zeroclaw/src/memory/battle_tests.rs create mode 100644 third_party/zeroclaw/src/memory/chunker.rs create mode 100644 third_party/zeroclaw/src/memory/cli.rs create mode 100644 third_party/zeroclaw/src/memory/conflict.rs create mode 100644 third_party/zeroclaw/src/memory/consolidation.rs create mode 100644 third_party/zeroclaw/src/memory/decay.rs create mode 100644 third_party/zeroclaw/src/memory/embeddings.rs create mode 100644 third_party/zeroclaw/src/memory/hygiene.rs create mode 100644 third_party/zeroclaw/src/memory/importance.rs create mode 100644 third_party/zeroclaw/src/memory/knowledge_graph.rs create mode 100644 third_party/zeroclaw/src/memory/lucid.rs create mode 100644 third_party/zeroclaw/src/memory/markdown.rs create mode 100644 third_party/zeroclaw/src/memory/mod.rs create mode 100644 third_party/zeroclaw/src/memory/none.rs create mode 100644 third_party/zeroclaw/src/memory/policy.rs create mode 100644 third_party/zeroclaw/src/memory/qdrant.rs create mode 100644 third_party/zeroclaw/src/memory/response_cache.rs create mode 100644 third_party/zeroclaw/src/memory/retrieval.rs create mode 100644 third_party/zeroclaw/src/memory/snapshot.rs create mode 100644 third_party/zeroclaw/src/memory/sqlite.rs create mode 100644 third_party/zeroclaw/src/memory/traits.rs create mode 100644 third_party/zeroclaw/src/memory/vector.rs create mode 100644 third_party/zeroclaw/src/migration.rs create mode 100644 third_party/zeroclaw/src/multimodal.rs create mode 100644 third_party/zeroclaw/src/nodes/mod.rs create mode 100644 third_party/zeroclaw/src/nodes/transport.rs create mode 100644 third_party/zeroclaw/src/observability/dora.rs create mode 100644 third_party/zeroclaw/src/observability/log.rs create mode 100644 third_party/zeroclaw/src/observability/mod.rs create mode 100644 third_party/zeroclaw/src/observability/multi.rs create mode 100644 third_party/zeroclaw/src/observability/noop.rs create mode 100644 third_party/zeroclaw/src/observability/otel.rs create mode 100644 third_party/zeroclaw/src/observability/prometheus.rs create mode 100644 third_party/zeroclaw/src/observability/runtime_trace.rs create mode 100644 third_party/zeroclaw/src/observability/traits.rs create mode 100644 third_party/zeroclaw/src/observability/verbose.rs create mode 100644 third_party/zeroclaw/src/onboard/mod.rs create mode 100644 third_party/zeroclaw/src/onboard/wizard.rs create mode 100644 third_party/zeroclaw/src/peripherals/arduino_flash.rs create mode 100644 third_party/zeroclaw/src/peripherals/arduino_upload.rs create mode 100644 third_party/zeroclaw/src/peripherals/capabilities_tool.rs create mode 100644 third_party/zeroclaw/src/peripherals/mod.rs create mode 100644 third_party/zeroclaw/src/peripherals/nucleo_flash.rs create mode 100644 third_party/zeroclaw/src/peripherals/rpi.rs create mode 100644 third_party/zeroclaw/src/peripherals/serial.rs create mode 100644 third_party/zeroclaw/src/peripherals/traits.rs create mode 100644 third_party/zeroclaw/src/peripherals/uno_q_bridge.rs create mode 100644 third_party/zeroclaw/src/peripherals/uno_q_setup.rs create mode 100644 third_party/zeroclaw/src/plugins/error.rs create mode 100644 third_party/zeroclaw/src/plugins/host.rs create mode 100644 third_party/zeroclaw/src/plugins/mod.rs create mode 100644 third_party/zeroclaw/src/plugins/signature.rs create mode 100644 third_party/zeroclaw/src/plugins/wasm_channel.rs create mode 100644 third_party/zeroclaw/src/plugins/wasm_tool.rs create mode 100644 third_party/zeroclaw/src/providers/anthropic.rs create mode 100644 third_party/zeroclaw/src/providers/azure_openai.rs create mode 100644 third_party/zeroclaw/src/providers/bedrock.rs create mode 100644 third_party/zeroclaw/src/providers/claude_code.rs create mode 100644 third_party/zeroclaw/src/providers/compatible.rs create mode 100644 third_party/zeroclaw/src/providers/copilot.rs create mode 100644 third_party/zeroclaw/src/providers/gemini.rs create mode 100644 third_party/zeroclaw/src/providers/gemini_cli.rs create mode 100644 third_party/zeroclaw/src/providers/glm.rs create mode 100644 third_party/zeroclaw/src/providers/kilocli.rs create mode 100644 third_party/zeroclaw/src/providers/mod.rs create mode 100644 third_party/zeroclaw/src/providers/ollama.rs create mode 100644 third_party/zeroclaw/src/providers/openai.rs create mode 100644 third_party/zeroclaw/src/providers/openai_codex.rs create mode 100644 third_party/zeroclaw/src/providers/openrouter.rs create mode 100644 third_party/zeroclaw/src/providers/reliable.rs create mode 100644 third_party/zeroclaw/src/providers/router.rs create mode 100644 third_party/zeroclaw/src/providers/telnyx.rs create mode 100644 third_party/zeroclaw/src/providers/traits.rs create mode 100644 third_party/zeroclaw/src/rag/mod.rs create mode 100644 third_party/zeroclaw/src/routines/engine.rs create mode 100644 third_party/zeroclaw/src/routines/event_matcher.rs create mode 100644 third_party/zeroclaw/src/routines/mod.rs create mode 100644 third_party/zeroclaw/src/runtime/docker.rs create mode 100644 third_party/zeroclaw/src/runtime/mod.rs create mode 100644 third_party/zeroclaw/src/runtime/native.rs create mode 100644 third_party/zeroclaw/src/runtime/traits.rs create mode 100644 third_party/zeroclaw/src/runtime/wasm.rs create mode 100644 third_party/zeroclaw/src/security/audit.rs create mode 100644 third_party/zeroclaw/src/security/bubblewrap.rs create mode 100644 third_party/zeroclaw/src/security/detect.rs create mode 100644 third_party/zeroclaw/src/security/docker.rs create mode 100644 third_party/zeroclaw/src/security/domain_matcher.rs create mode 100644 third_party/zeroclaw/src/security/estop.rs create mode 100644 third_party/zeroclaw/src/security/firejail.rs create mode 100644 third_party/zeroclaw/src/security/iam_policy.rs create mode 100644 third_party/zeroclaw/src/security/landlock.rs create mode 100644 third_party/zeroclaw/src/security/leak_detector.rs create mode 100644 third_party/zeroclaw/src/security/mod.rs create mode 100644 third_party/zeroclaw/src/security/nevis.rs create mode 100644 third_party/zeroclaw/src/security/otp.rs create mode 100644 third_party/zeroclaw/src/security/pairing.rs create mode 100644 third_party/zeroclaw/src/security/playbook.rs create mode 100644 third_party/zeroclaw/src/security/policy.rs create mode 100644 third_party/zeroclaw/src/security/prompt_guard.rs create mode 100644 third_party/zeroclaw/src/security/seatbelt.rs create mode 100644 third_party/zeroclaw/src/security/secrets.rs create mode 100644 third_party/zeroclaw/src/security/traits.rs create mode 100644 third_party/zeroclaw/src/security/vulnerability.rs create mode 100644 third_party/zeroclaw/src/security/webauthn.rs create mode 100644 third_party/zeroclaw/src/security/workspace_boundary.rs create mode 100644 third_party/zeroclaw/src/service/mod.rs create mode 100644 third_party/zeroclaw/src/skillforge/evaluate.rs create mode 100644 third_party/zeroclaw/src/skillforge/integrate.rs create mode 100644 third_party/zeroclaw/src/skillforge/mod.rs create mode 100644 third_party/zeroclaw/src/skillforge/scout.rs create mode 100644 third_party/zeroclaw/src/skills/audit.rs create mode 100644 third_party/zeroclaw/src/skills/creator.rs create mode 100644 third_party/zeroclaw/src/skills/improver.rs create mode 100644 third_party/zeroclaw/src/skills/mod.rs create mode 100644 third_party/zeroclaw/src/skills/symlink_tests.rs create mode 100644 third_party/zeroclaw/src/skills/testing.rs create mode 100644 third_party/zeroclaw/src/sop/audit.rs create mode 100644 third_party/zeroclaw/src/sop/condition.rs create mode 100644 third_party/zeroclaw/src/sop/dispatch.rs create mode 100644 third_party/zeroclaw/src/sop/engine.rs create mode 100644 third_party/zeroclaw/src/sop/metrics.rs create mode 100644 third_party/zeroclaw/src/sop/mod.rs create mode 100644 third_party/zeroclaw/src/sop/types.rs create mode 100644 third_party/zeroclaw/src/tools/ask_user.rs create mode 100644 third_party/zeroclaw/src/tools/backup_tool.rs create mode 100644 third_party/zeroclaw/src/tools/browser.rs create mode 100644 third_party/zeroclaw/src/tools/browser_delegate.rs create mode 100644 third_party/zeroclaw/src/tools/browser_open.rs create mode 100644 third_party/zeroclaw/src/tools/calculator.rs create mode 100644 third_party/zeroclaw/src/tools/canvas.rs create mode 100644 third_party/zeroclaw/src/tools/claude_code.rs create mode 100644 third_party/zeroclaw/src/tools/claude_code_runner.rs create mode 100644 third_party/zeroclaw/src/tools/cli_discovery.rs create mode 100644 third_party/zeroclaw/src/tools/cloud_ops.rs create mode 100644 third_party/zeroclaw/src/tools/cloud_patterns.rs create mode 100644 third_party/zeroclaw/src/tools/codex_cli.rs create mode 100644 third_party/zeroclaw/src/tools/composio.rs create mode 100644 third_party/zeroclaw/src/tools/content_search.rs create mode 100644 third_party/zeroclaw/src/tools/cron_add.rs create mode 100644 third_party/zeroclaw/src/tools/cron_list.rs create mode 100644 third_party/zeroclaw/src/tools/cron_remove.rs create mode 100644 third_party/zeroclaw/src/tools/cron_run.rs create mode 100644 third_party/zeroclaw/src/tools/cron_runs.rs create mode 100644 third_party/zeroclaw/src/tools/cron_update.rs create mode 100644 third_party/zeroclaw/src/tools/data_management.rs create mode 100644 third_party/zeroclaw/src/tools/delegate.rs create mode 100644 third_party/zeroclaw/src/tools/discord_search.rs create mode 100644 third_party/zeroclaw/src/tools/escalate.rs create mode 100644 third_party/zeroclaw/src/tools/file_edit.rs create mode 100644 third_party/zeroclaw/src/tools/file_read.rs create mode 100644 third_party/zeroclaw/src/tools/file_write.rs create mode 100644 third_party/zeroclaw/src/tools/gemini_cli.rs create mode 100644 third_party/zeroclaw/src/tools/git_operations.rs create mode 100644 third_party/zeroclaw/src/tools/glob_search.rs create mode 100644 third_party/zeroclaw/src/tools/google_workspace.rs create mode 100644 third_party/zeroclaw/src/tools/hardware_board_info.rs create mode 100644 third_party/zeroclaw/src/tools/hardware_memory_map.rs create mode 100644 third_party/zeroclaw/src/tools/hardware_memory_read.rs create mode 100644 third_party/zeroclaw/src/tools/http_request.rs create mode 100644 third_party/zeroclaw/src/tools/image_gen.rs create mode 100644 third_party/zeroclaw/src/tools/image_info.rs create mode 100644 third_party/zeroclaw/src/tools/jira_tool.rs create mode 100644 third_party/zeroclaw/src/tools/knowledge_tool.rs create mode 100644 third_party/zeroclaw/src/tools/linkedin.rs create mode 100644 third_party/zeroclaw/src/tools/linkedin_client.rs create mode 100644 third_party/zeroclaw/src/tools/llm_task.rs create mode 100644 third_party/zeroclaw/src/tools/mcp_client.rs create mode 100644 third_party/zeroclaw/src/tools/mcp_deferred.rs create mode 100644 third_party/zeroclaw/src/tools/mcp_protocol.rs create mode 100644 third_party/zeroclaw/src/tools/mcp_tool.rs create mode 100644 third_party/zeroclaw/src/tools/mcp_transport.rs create mode 100644 third_party/zeroclaw/src/tools/memory_export.rs create mode 100644 third_party/zeroclaw/src/tools/memory_forget.rs create mode 100644 third_party/zeroclaw/src/tools/memory_purge.rs create mode 100644 third_party/zeroclaw/src/tools/memory_recall.rs create mode 100644 third_party/zeroclaw/src/tools/memory_store.rs create mode 100644 third_party/zeroclaw/src/tools/microsoft365/auth.rs create mode 100644 third_party/zeroclaw/src/tools/microsoft365/graph_client.rs create mode 100644 third_party/zeroclaw/src/tools/microsoft365/mod.rs create mode 100644 third_party/zeroclaw/src/tools/microsoft365/types.rs create mode 100644 third_party/zeroclaw/src/tools/mod.rs create mode 100644 third_party/zeroclaw/src/tools/model_routing_config.rs create mode 100644 third_party/zeroclaw/src/tools/model_switch.rs create mode 100644 third_party/zeroclaw/src/tools/node_capabilities.rs create mode 100644 third_party/zeroclaw/src/tools/node_tool.rs create mode 100644 third_party/zeroclaw/src/tools/notion_tool.rs create mode 100644 third_party/zeroclaw/src/tools/opencode_cli.rs create mode 100644 third_party/zeroclaw/src/tools/pdf_read.rs create mode 100644 third_party/zeroclaw/src/tools/pipeline.rs create mode 100644 third_party/zeroclaw/src/tools/poll.rs create mode 100644 third_party/zeroclaw/src/tools/project_intel.rs create mode 100644 third_party/zeroclaw/src/tools/proxy_config.rs create mode 100644 third_party/zeroclaw/src/tools/pushover.rs create mode 100644 third_party/zeroclaw/src/tools/reaction.rs create mode 100644 third_party/zeroclaw/src/tools/read_skill.rs create mode 100644 third_party/zeroclaw/src/tools/report_template_tool.rs create mode 100644 third_party/zeroclaw/src/tools/report_templates.rs create mode 100644 third_party/zeroclaw/src/tools/schedule.rs create mode 100644 third_party/zeroclaw/src/tools/schema.rs create mode 100644 third_party/zeroclaw/src/tools/screenshot.rs create mode 100644 third_party/zeroclaw/src/tools/security_ops.rs create mode 100644 third_party/zeroclaw/src/tools/sessions.rs create mode 100644 third_party/zeroclaw/src/tools/shell.rs create mode 100644 third_party/zeroclaw/src/tools/skill_http.rs create mode 100644 third_party/zeroclaw/src/tools/skill_tool.rs create mode 100644 third_party/zeroclaw/src/tools/sop_advance.rs create mode 100644 third_party/zeroclaw/src/tools/sop_approve.rs create mode 100644 third_party/zeroclaw/src/tools/sop_execute.rs create mode 100644 third_party/zeroclaw/src/tools/sop_list.rs create mode 100644 third_party/zeroclaw/src/tools/sop_status.rs create mode 100644 third_party/zeroclaw/src/tools/swarm.rs create mode 100644 third_party/zeroclaw/src/tools/text_browser.rs create mode 100644 third_party/zeroclaw/src/tools/tool_search.rs create mode 100644 third_party/zeroclaw/src/tools/traits.rs create mode 100644 third_party/zeroclaw/src/tools/verifiable_intent.rs create mode 100644 third_party/zeroclaw/src/tools/weather_tool.rs create mode 100644 third_party/zeroclaw/src/tools/web_fetch.rs create mode 100644 third_party/zeroclaw/src/tools/web_search_provider_routing.rs create mode 100644 third_party/zeroclaw/src/tools/web_search_tool.rs create mode 100644 third_party/zeroclaw/src/tools/workspace_tool.rs create mode 100644 third_party/zeroclaw/src/trust/mod.rs create mode 100644 third_party/zeroclaw/src/trust/tests.rs create mode 100644 third_party/zeroclaw/src/trust/types.rs create mode 100644 third_party/zeroclaw/src/tunnel/cloudflare.rs create mode 100644 third_party/zeroclaw/src/tunnel/custom.rs create mode 100644 third_party/zeroclaw/src/tunnel/mod.rs create mode 100644 third_party/zeroclaw/src/tunnel/ngrok.rs create mode 100644 third_party/zeroclaw/src/tunnel/none.rs create mode 100644 third_party/zeroclaw/src/tunnel/openvpn.rs create mode 100644 third_party/zeroclaw/src/tunnel/pinggy.rs create mode 100644 third_party/zeroclaw/src/tunnel/tailscale.rs create mode 100644 third_party/zeroclaw/src/util.rs create mode 100644 third_party/zeroclaw/src/verifiable_intent/crypto.rs create mode 100644 third_party/zeroclaw/src/verifiable_intent/error.rs create mode 100644 third_party/zeroclaw/src/verifiable_intent/issuance.rs create mode 100644 third_party/zeroclaw/src/verifiable_intent/mod.rs create mode 100644 third_party/zeroclaw/src/verifiable_intent/types.rs create mode 100644 third_party/zeroclaw/src/verifiable_intent/verification.rs create mode 100644 third_party/zeroclaw/taplo.toml create mode 100644 third_party/zeroclaw/tests/component/config_persistence.rs create mode 100644 third_party/zeroclaw/tests/component/config_schema.rs create mode 100644 third_party/zeroclaw/tests/component/dockerignore_test.rs create mode 100644 third_party/zeroclaw/tests/component/gateway.rs create mode 100644 third_party/zeroclaw/tests/component/gemini_capabilities.rs create mode 100644 third_party/zeroclaw/tests/component/mod.rs create mode 100644 third_party/zeroclaw/tests/component/otel_dependency_feature_regression.rs create mode 100644 third_party/zeroclaw/tests/component/provider_resolution.rs create mode 100644 third_party/zeroclaw/tests/component/provider_schema.rs create mode 100644 third_party/zeroclaw/tests/component/reply_target_field_regression.rs create mode 100644 third_party/zeroclaw/tests/component/security.rs create mode 100644 third_party/zeroclaw/tests/component/whatsapp_webhook_security.rs create mode 100644 third_party/zeroclaw/tests/fixtures/hello.mp3 create mode 100644 third_party/zeroclaw/tests/fixtures/test_document.pdf create mode 100644 third_party/zeroclaw/tests/fixtures/test_photo.jpg create mode 100644 third_party/zeroclaw/tests/fixtures/traces/multi_tool_chain.json create mode 100644 third_party/zeroclaw/tests/fixtures/traces/single_tool_echo.json create mode 100644 third_party/zeroclaw/tests/fixtures/traces/smoke_greeting.json create mode 100644 third_party/zeroclaw/tests/integration/agent.rs create mode 100644 third_party/zeroclaw/tests/integration/agent_robustness.rs create mode 100644 third_party/zeroclaw/tests/integration/backup_cron_scheduling.rs create mode 100644 third_party/zeroclaw/tests/integration/channel_matrix.rs create mode 100644 third_party/zeroclaw/tests/integration/channel_routing.rs create mode 100644 third_party/zeroclaw/tests/integration/hooks.rs create mode 100644 third_party/zeroclaw/tests/integration/memory_comparison.rs create mode 100644 third_party/zeroclaw/tests/integration/memory_restart.rs create mode 100644 third_party/zeroclaw/tests/integration/mod.rs create mode 100644 third_party/zeroclaw/tests/integration/report_template_tool_test.rs create mode 100644 third_party/zeroclaw/tests/integration/telegram_attachment_fallback.rs create mode 100644 third_party/zeroclaw/tests/integration/telegram_finalize_draft.rs create mode 100644 third_party/zeroclaw/tests/live/gemini_fallback_oauth_refresh.rs create mode 100644 third_party/zeroclaw/tests/live/mod.rs create mode 100644 third_party/zeroclaw/tests/live/openai_codex_vision_e2e.rs create mode 100644 third_party/zeroclaw/tests/live/providers.rs create mode 100755 third_party/zeroclaw/tests/manual/telegram/generate_test_messages.py create mode 100755 third_party/zeroclaw/tests/manual/telegram/quick_test.sh create mode 100755 third_party/zeroclaw/tests/manual/telegram/test_telegram_integration.sh create mode 100644 third_party/zeroclaw/tests/manual/telegram/testing-telegram.md create mode 100755 third_party/zeroclaw/tests/manual/test_dockerignore.sh create mode 100644 third_party/zeroclaw/tests/manual/tmux/onboard_wrapper.sh create mode 100644 third_party/zeroclaw/tests/manual/tmux/test_onboard_provider_input_paths.sh create mode 100644 third_party/zeroclaw/tests/support/assertions.rs create mode 100644 third_party/zeroclaw/tests/support/helpers.rs create mode 100644 third_party/zeroclaw/tests/support/mock_channel.rs create mode 100644 third_party/zeroclaw/tests/support/mock_provider.rs create mode 100644 third_party/zeroclaw/tests/support/mock_tools.rs create mode 100644 third_party/zeroclaw/tests/support/mod.rs create mode 100644 third_party/zeroclaw/tests/support/trace.rs create mode 100644 third_party/zeroclaw/tests/system/full_stack.rs create mode 100644 third_party/zeroclaw/tests/system/mod.rs create mode 100644 third_party/zeroclaw/tests/test_component.rs create mode 100644 third_party/zeroclaw/tests/test_integration.rs create mode 100644 third_party/zeroclaw/tests/test_live.rs create mode 100644 third_party/zeroclaw/tests/test_system.rs create mode 100644 third_party/zeroclaw/tool_descriptions/ar.toml create mode 100644 third_party/zeroclaw/tool_descriptions/bn.toml create mode 100644 third_party/zeroclaw/tool_descriptions/cs.toml create mode 100644 third_party/zeroclaw/tool_descriptions/da.toml create mode 100644 third_party/zeroclaw/tool_descriptions/de.toml create mode 100644 third_party/zeroclaw/tool_descriptions/el.toml create mode 100644 third_party/zeroclaw/tool_descriptions/en.toml create mode 100644 third_party/zeroclaw/tool_descriptions/es.toml create mode 100644 third_party/zeroclaw/tool_descriptions/fi.toml create mode 100644 third_party/zeroclaw/tool_descriptions/fr.toml create mode 100644 third_party/zeroclaw/tool_descriptions/he.toml create mode 100644 third_party/zeroclaw/tool_descriptions/hi.toml create mode 100644 third_party/zeroclaw/tool_descriptions/hu.toml create mode 100644 third_party/zeroclaw/tool_descriptions/id.toml create mode 100644 third_party/zeroclaw/tool_descriptions/it.toml create mode 100644 third_party/zeroclaw/tool_descriptions/ja.toml create mode 100644 third_party/zeroclaw/tool_descriptions/ko.toml create mode 100644 third_party/zeroclaw/tool_descriptions/nb.toml create mode 100644 third_party/zeroclaw/tool_descriptions/nl.toml create mode 100644 third_party/zeroclaw/tool_descriptions/pl.toml create mode 100644 third_party/zeroclaw/tool_descriptions/pt.toml create mode 100644 third_party/zeroclaw/tool_descriptions/ro.toml create mode 100644 third_party/zeroclaw/tool_descriptions/ru.toml create mode 100644 third_party/zeroclaw/tool_descriptions/sv.toml create mode 100644 third_party/zeroclaw/tool_descriptions/th.toml create mode 100644 third_party/zeroclaw/tool_descriptions/tl.toml create mode 100644 third_party/zeroclaw/tool_descriptions/tr.toml create mode 100644 third_party/zeroclaw/tool_descriptions/uk.toml create mode 100644 third_party/zeroclaw/tool_descriptions/ur.toml create mode 100644 third_party/zeroclaw/tool_descriptions/vi.toml create mode 100644 third_party/zeroclaw/tool_descriptions/zh-CN.toml create mode 100644 third_party/zeroclaw/web/.gitignore create mode 100644 third_party/zeroclaw/web/index.html create mode 100644 third_party/zeroclaw/web/package-lock.json create mode 100644 third_party/zeroclaw/web/package.json create mode 100644 third_party/zeroclaw/web/public/logo.png create mode 100644 third_party/zeroclaw/web/src/App.tsx create mode 100644 third_party/zeroclaw/web/src/components/SettingsModal.tsx create mode 100644 third_party/zeroclaw/web/src/components/layout/Header.tsx create mode 100644 third_party/zeroclaw/web/src/components/layout/Layout.tsx create mode 100644 third_party/zeroclaw/web/src/components/layout/Sidebar.tsx create mode 100644 third_party/zeroclaw/web/src/contexts/ThemeContext.tsx create mode 100644 third_party/zeroclaw/web/src/contexts/ThemeContextDef.ts create mode 100644 third_party/zeroclaw/web/src/contexts/colorThemes.ts create mode 100644 third_party/zeroclaw/web/src/contexts/fontLoader.ts create mode 100644 third_party/zeroclaw/web/src/contexts/themeStorage.ts create mode 100644 third_party/zeroclaw/web/src/hooks/useApi.ts create mode 100644 third_party/zeroclaw/web/src/hooks/useAuth.ts create mode 100644 third_party/zeroclaw/web/src/hooks/useDevices.ts create mode 100644 third_party/zeroclaw/web/src/hooks/useDraft.ts create mode 100644 third_party/zeroclaw/web/src/hooks/useSSE.ts create mode 100644 third_party/zeroclaw/web/src/hooks/useTheme.ts create mode 100644 third_party/zeroclaw/web/src/hooks/useWebSocket.ts create mode 100644 third_party/zeroclaw/web/src/index.css create mode 100644 third_party/zeroclaw/web/src/lib/api.ts create mode 100644 third_party/zeroclaw/web/src/lib/auth.ts create mode 100644 third_party/zeroclaw/web/src/lib/basePath.ts create mode 100644 third_party/zeroclaw/web/src/lib/i18n.ts create mode 100644 third_party/zeroclaw/web/src/lib/sse.ts create mode 100644 third_party/zeroclaw/web/src/lib/tauri.ts create mode 100644 third_party/zeroclaw/web/src/lib/uuid.ts create mode 100644 third_party/zeroclaw/web/src/lib/ws.ts create mode 100644 third_party/zeroclaw/web/src/main.tsx create mode 100644 third_party/zeroclaw/web/src/pages/AgentChat.tsx create mode 100644 third_party/zeroclaw/web/src/pages/Canvas.tsx create mode 100644 third_party/zeroclaw/web/src/pages/Config.tsx create mode 100644 third_party/zeroclaw/web/src/pages/Cost.tsx create mode 100644 third_party/zeroclaw/web/src/pages/Cron.tsx create mode 100644 third_party/zeroclaw/web/src/pages/Dashboard.tsx create mode 100644 third_party/zeroclaw/web/src/pages/Doctor.tsx create mode 100644 third_party/zeroclaw/web/src/pages/Integrations.tsx create mode 100644 third_party/zeroclaw/web/src/pages/Logs.tsx create mode 100644 third_party/zeroclaw/web/src/pages/Memory.tsx create mode 100644 third_party/zeroclaw/web/src/pages/Pairing.tsx create mode 100644 third_party/zeroclaw/web/src/pages/Tools.tsx create mode 100644 third_party/zeroclaw/web/src/types/api.ts create mode 100644 third_party/zeroclaw/web/src/vite-env.d.ts create mode 100644 third_party/zeroclaw/web/tsconfig.app.json create mode 100644 third_party/zeroclaw/web/tsconfig.json create mode 100644 third_party/zeroclaw/web/tsconfig.node.json create mode 100644 third_party/zeroclaw/web/vite.config.ts create mode 100644 tools/browser_smoke/fake_deepseek_server.mjs create mode 100644 tools/browser_smoke/fake_deepseek_server.test.mjs create mode 100644 tools/browser_smoke/run_deepseek_browser_smoke.mjs diff --git a/Cargo.lock b/Cargo.lock index 84678ee..0169227 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,18 +2,299 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aardvark-sys" +version = "0.1.0" +dependencies = [ + "libloading", + "thiserror 2.0.18", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + [[package]] name = "anyhow" version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +[[package]] +name = "ar_archive_writer" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b" +dependencies = [ + "object", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-compression" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" +dependencies = [ + "compression-codecs", + "compression-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-imap" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a78dceaba06f029d8f4d7df20addd4b7370a30206e3926267ecda2915b0f3f66" +dependencies = [ + "async-channel 2.5.0", + "async-compression", + "base64", + "bytes", + "chrono", + "futures", + "imap-proto", + "log", + "nom 7.1.3", + "pin-project", + "pin-utils", + "self_cell", + "stop-token", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-lc-rs" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa7e52a4c5c547c741610a2c6f123f3881e409b714cd27e6798ef020c514f0a" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "axum" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" +dependencies = [ + "axum-core", + "axum-macros", + "base64", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite 0.28.0", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "base64" version = "0.22.1" @@ -41,6 +322,18 @@ version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.11.1" @@ -54,6 +347,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] @@ -69,6 +364,191 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20 0.9.1", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "chrono-tz" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" +dependencies = [ + "chrono", + "phf", +] + +[[package]] +name = "chumsky" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9" +dependencies = [ + "hashbrown 0.14.5", + "stacker", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "clap" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_complete" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19c9f1dde76b736e3681f28cec9d5a61299cbaae0fce80a68e43724ad56031eb" +dependencies = [ + "clap", +] + +[[package]] +name = "clap_derive" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cmake" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +dependencies = [ + "cc", +] + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "compression-codecs" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +dependencies = [ + "compression-core", + "flate2", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +dependencies = [ + "encode_unicode", + "libc", + "unicode-width", + "windows-sys 0.61.2", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -78,6 +558,41 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "cron" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5877d3fbf742507b66bc2a1945106bd30dd8504019d596901ddd012a4dd01740" +dependencies = [ + "chrono", + "once_cell", + "winnow 0.6.26", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + [[package]] name = "crypto-common" version = "0.1.7" @@ -85,9 +600,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "dialoguer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" +dependencies = [ + "console", + "fuzzy-matcher", + "shell-words", + "tempfile", + "zeroize", +] + [[package]] name = "digest" version = "0.10.7" @@ -99,6 +634,36 @@ dependencies = [ "subtle", ] +[[package]] +name = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -110,18 +675,149 @@ dependencies = [ "syn", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "email-encoding" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6" +dependencies = [ + "base64", + "memchr", +] + +[[package]] +name = "email_address" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.1", + "pin-project-lite", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "filetime" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +dependencies = [ + "cfg-if", + "libc", + "libredox", +] + [[package]] name = "find-msvc-tools" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "foldhash" version = "0.1.5" @@ -137,6 +833,27 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.32" @@ -153,12 +870,34 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "futures-sink" version = "0.3.32" @@ -177,8 +916,10 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ + "futures-channel", "futures-core", "futures-io", + "futures-macro", "futures-sink", "futures-task", "memchr", @@ -186,6 +927,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -232,10 +982,46 @@ dependencies = [ "cfg-if", "libc", "r-efi 6.0.0", + "rand_core 0.10.0", "wasip2", "wasip3", ] +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "h2" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + [[package]] name = "hashbrown" version = "0.15.5" @@ -251,6 +1037,26 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +[[package]] +name = "hashify" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "149e3ea90eb5a26ad354cfe3cb7f7401b9329032d0235f2687d03a35f30e5d4c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "heck" version = "0.5.0" @@ -272,6 +1078,17 @@ dependencies = [ "digest", ] +[[package]] +name = "hostname" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd" +dependencies = [ + "cfg-if", + "libc", + "windows-link", +] + [[package]] name = "http" version = "1.4.0" @@ -311,6 +1128,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "hyper" version = "1.8.1" @@ -321,9 +1144,11 @@ dependencies = [ "bytes", "futures-channel", "futures-core", + "h2", "http", "http-body", "httparse", + "httpdate", "itoa", "pin-project-lite", "pin-utils", @@ -346,7 +1171,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots", + "webpki-roots 1.0.6", ] [[package]] @@ -372,6 +1197,30 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "2.1.1" @@ -480,6 +1329,30 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "imap-proto" +version = "0.16.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1f9b30846c3d04371159ef3a0413ce7c1ae0a8c619cd255c60b3d902553f22" +dependencies = [ + "nom 7.1.3", +] + [[package]] name = "indexmap" version = "2.13.0" @@ -492,6 +1365,28 @@ dependencies = [ "serde_core", ] +[[package]] +name = "indicatif" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +dependencies = [ + "console", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "ipnet" version = "2.12.0" @@ -508,12 +1403,28 @@ dependencies = [ "serde", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + [[package]] name = "itoa" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + [[package]] name = "js-sys" version = "0.3.91" @@ -524,24 +1435,102 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "leb128fmt" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" +[[package]] +name = "lettre" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e13e10e8818f8b2a60f52cb127041d388b89f3a96a62be9ceaffa22262fef7f" +dependencies = [ + "base64", + "chumsky", + "email-encoding", + "email_address", + "fastrand", + "httpdate", + "idna", + "mime", + "nom 8.0.0", + "percent-encoding", + "quoted_printable", + "rustls", + "socket2", + "tokio", + "url", + "webpki-roots 1.0.6", +] + [[package]] name = "libc" version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libredox" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +dependencies = [ + "bitflags", + "libc", + "plain", + "redox_syscall 0.7.3", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + [[package]] name = "litemap" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.29" @@ -554,12 +1543,68 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +[[package]] +name = "mail-parser" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82a3d6522697593ba4c683e0a6ee5a40fee93bc1a525e3cc6eeb3da11fd8897" +dependencies = [ + "hashify", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + [[package]] name = "memchr" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + [[package]] name = "mio" version = "1.1.1" @@ -571,18 +1616,165 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "nanohtml2text" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec1bc47d34ae756616f387c11fd0595f86f2cc7e6473bde9e3ded30cb902a1" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + [[package]] name = "percent-encoding" version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "phf" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "pin-project-lite" version = "0.2.17" @@ -595,6 +1787,48 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + [[package]] name = "potential_utf" version = "0.1.4" @@ -632,6 +1866,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "psm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8" +dependencies = [ + "ar_archive_writer", + "cc", +] + +[[package]] +name = "pxfm" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" + [[package]] name = "quinn" version = "0.11.9" @@ -661,7 +1911,7 @@ dependencies = [ "bytes", "getrandom 0.3.4", "lru-slab", - "rand", + "rand 0.9.2", "ring", "rustc-hash", "rustls", @@ -696,6 +1946,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "quoted_printable" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478e0585659a122aa407eb7e3c0e1fa51b1d8a870038bd29f0cf4a8551eea972" + [[package]] name = "r-efi" version = "5.3.0" @@ -715,7 +1971,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha", - "rand_core", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20 0.10.0", + "getrandom 0.4.2", + "rand_core 0.10.0", ] [[package]] @@ -725,7 +1992,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", ] [[package]] @@ -737,6 +2013,90 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + [[package]] name = "reqwest" version = "0.12.28" @@ -756,6 +2116,7 @@ dependencies = [ "hyper-util", "js-sys", "log", + "mime_guess", "percent-encoding", "pin-project-lite", "quinn", @@ -767,14 +2128,16 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-rustls", + "tokio-util", "tower", "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", + "wasm-streams", "web-sys", - "webpki-roots", + "webpki-roots 1.0.6", ] [[package]] @@ -791,18 +2154,81 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rusqlite" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" +dependencies = [ + "bitflags", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rust-embed" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rustc-hash" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + [[package]] name = "rustls" version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ + "aws-lc-rs", + "log", "once_cell", "ring", "rustls-pki-types", @@ -811,6 +2237,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "rustls-pki-types" version = "1.14.0" @@ -827,6 +2262,7 @@ version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -844,6 +2280,52 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + [[package]] name = "semver" version = "1.0.27" @@ -880,6 +2362,17 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "serde_json" version = "1.0.149" @@ -893,6 +2386,26 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_spanned" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876ac351060d4f882bb1032b6369eb0aef79ad9df1ea8bc404874d8cc3d0cd98" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -909,6 +2422,10 @@ dependencies = [ name = "sgclaw" version = "0.1.0" dependencies = [ + "anyhow", + "async-trait", + "chrono", + "futures-util", "hex", "hmac", "reqwest", @@ -916,7 +2433,20 @@ dependencies = [ "serde_json", "sha2", "thiserror 1.0.69", + "tokio", "uuid", + "zeroclawlabs", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", ] [[package]] @@ -926,16 +2456,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shell-words" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" + +[[package]] +name = "shellexpand" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32824fab5e16e6c4d86dc1ba84489390419a39f97699852b66480bb87d297ed8" +dependencies = [ + "dirs", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + [[package]] name = "slab" version = "0.4.12" @@ -964,6 +2540,38 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "stacker" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d74a23609d509411d10e2176dc2a4346e3b4aea2e7b1869f19fdedbc71c013" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.52.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "stop-token" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af91f480ee899ab2d9f8435bfdfc14d08a5754bd9d3fef1f1a1c23336aad6c8b" +dependencies = [ + "async-channel 1.9.0", + "cfg-if", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.6.1" @@ -1001,6 +2609,30 @@ dependencies = [ "syn", ] +[[package]] +name = "tar" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -1041,6 +2673,15 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + [[package]] name = "tinystr" version = "0.8.2" @@ -1076,10 +2717,23 @@ dependencies = [ "libc", "mio", "pin-project-lite", + "signal-hook-registry", "socket2", + "tokio-macros", "windows-sys 0.61.2", ] +[[package]] +name = "tokio-macros" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tokio-rustls" version = "0.26.4" @@ -1090,6 +2744,110 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-socks" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" +dependencies = [ + "either", + "futures-util", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite 0.28.0", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite 0.29.0", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8195ca05e4eb728f4ba94f3e3291661320af739c4e43779cbdfae82ab239fcc" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow 1.0.0", +] + +[[package]] +name = "toml_datetime" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" +dependencies = [ + "winnow 1.0.0", +] + +[[package]] +name = "toml_writer" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed" + [[package]] name = "tower" version = "0.5.3" @@ -1116,8 +2874,10 @@ dependencies = [ "futures-util", "http", "http-body", + "http-body-util", "iri-string", "pin-project-lite", + "tokio", "tower", "tower-layer", "tower-service", @@ -1154,30 +2914,115 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "thread_local", + "tracing", + "tracing-core", +] + [[package]] name = "try-lock" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.2", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.2", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", +] + +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + [[package]] name = "typenum" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "untrusted" version = "0.9.0" @@ -1196,12 +3041,30 @@ dependencies = [ "serde", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8_iter" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "1.22.0" @@ -1213,12 +3076,28 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -1333,6 +3212,19 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wasmparser" version = "0.244.0" @@ -1365,6 +3257,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.6", +] + [[package]] name = "webpki-roots" version = "1.0.6" @@ -1374,12 +3275,83 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "which" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459" +dependencies = [ + "libc", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -1389,6 +3361,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.60.2" @@ -1536,6 +3517,21 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +[[package]] +name = "winnow" +version = "0.6.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" + [[package]] name = "wit-bindgen" version = "0.51.0" @@ -1630,6 +3626,16 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + [[package]] name = "yoke" version = "0.8.1" @@ -1653,6 +3659,78 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroclawlabs" +version = "0.6.3" +dependencies = [ + "aardvark-sys", + "anyhow", + "async-imap", + "async-trait", + "axum", + "base64", + "chacha20poly1305", + "chrono", + "chrono-tz", + "clap", + "clap_complete", + "console", + "cron", + "dialoguer", + "directories", + "flate2", + "futures-util", + "glob", + "hex", + "hmac", + "hostname", + "http-body-util", + "hyper", + "hyper-util", + "image", + "indicatif", + "lettre", + "libc", + "mail-parser", + "mime_guess", + "nanohtml2text", + "parking_lot", + "portable-atomic", + "rand 0.10.0", + "regex", + "reqwest", + "ring", + "rusqlite", + "rust-embed", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "schemars", + "serde", + "serde_json", + "sha2", + "shellexpand", + "tar", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tokio-rustls", + "tokio-socks", + "tokio-stream", + "tokio-tungstenite 0.29.0", + "tokio-util", + "toml", + "tower", + "tower-http", + "tracing", + "tracing-subscriber", + "urlencoding", + "uuid", + "webpki-roots 1.0.6", + "which", + "zip", +] + [[package]] name = "zerocopy" version = "0.8.47" @@ -1733,8 +3811,36 @@ dependencies = [ "syn", ] +[[package]] +name = "zip" +version = "8.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7756d0206d058333667493c4014f545f4b9603c4330ccd6d9b3f86dcab59f7d9" +dependencies = [ + "crc32fast", + "flate2", + "indexmap", + "memchr", + "typed-path", +] + [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + +[[package]] +name = "zune-jpeg" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7a1c0af6e5d8d1363f4994b7a091ccf963d8b694f7da5b0b9cceb82da2c0a6" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml index 45db771..3155d9b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,10 @@ version = "0.1.0" edition = "2021" [dependencies] +anyhow = "1" +async-trait = "0.1" +chrono = { version = "0.4", default-features = false, features = ["clock"] } +futures-util = "0.3" hex = "0.4" hmac = "0.12" reqwest = { version = "0.12", default-features = false, features = ["blocking", "json", "rustls-tls"] } @@ -11,4 +15,6 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" sha2 = "0.10" thiserror = "1" +tokio = { version = "1", default-features = false, features = ["rt-multi-thread", "macros"] } uuid = { version = "1", features = ["v4"] } +zeroclaw = { package = "zeroclawlabs", path = "third_party/zeroclaw", default-features = false } diff --git a/README.md b/README.md index 7c6cc1d..c217aa5 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,26 @@ sgClaw 项目仓库。 cargo test cargo test --test planner_test -q cargo test --test agent_runtime_test -q +node --test tools/browser_smoke/fake_deepseek_server.test.mjs +node tools/browser_smoke/run_deepseek_browser_smoke.mjs cargo run bash frontend/sgClaw验证/serve.sh ``` + +## 浏览器侧 DeepSeek smoke + +在已经可用的 SuperRPA 浏览器构建目录上,可以通过下面的组合验证浏览器侧 `sgclaw` 是否真的走了 ZeroClaw/DeepSeek compat runtime,而不是回退到本地 planner: + +```bash +python3 /home/zyl/projects/superRpa/src/chrome/browser/superrpa/sgclaw/build_sgclaw.py \ + --manifest-path /home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/Cargo.toml \ + --out /home/zyl/projects/superRpa/src/out/KylinRelease/sgclaw + +node tools/browser_smoke/run_deepseek_browser_smoke.mjs +``` + +该 wrapper 会: +- 启动本地 fake DeepSeek 服务 +- 注入 `DEEPSEEK_API_KEY` / `DEEPSEEK_BASE_URL` / `DEEPSEEK_MODEL` +- 调用现有 `/home/zyl/projects/superRpa/src/chrome/browser/superrpa/sgclaw/sgclaw_chat_smoke.mjs` +- 在 smoke 通过后,再额外确认 fake 服务确实收到了百度和知乎两组 provider 请求 diff --git a/docs/plans/2026-03-26-deepseek-browser-smoke-plan.md b/docs/plans/2026-03-26-deepseek-browser-smoke-plan.md new file mode 100644 index 0000000..2cc2977 --- /dev/null +++ b/docs/plans/2026-03-26-deepseek-browser-smoke-plan.md @@ -0,0 +1,134 @@ +# DeepSeek Browser Smoke Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** Add a repo-local verification path that exercises the browser-delivered `sgclaw` binary through the ZeroClaw/DeepSeek compat runtime without requiring a real DeepSeek account. + +**Architecture:** Keep the existing SuperRPA browser smoke script unchanged. Add a small sgClaw-owned helper module that behaves like a fake OpenAI-compatible DeepSeek server and a runner script that starts that server, injects `DEEPSEEK_*` into the browser process environment, and delegates the actual browser/UI verification to the existing `sgclaw_chat_smoke.mjs`. + +**Tech Stack:** Node.js ESM, Node built-in `node:test`, local HTTP server, Chromium `build_sgclaw.py`, existing SuperRPA `sgclaw_chat_smoke.mjs`. + +### Task 1: Add Fake DeepSeek Response Planner + +**Files:** +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/tools/browser_smoke/fake_deepseek_server.mjs` +- Test: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/tools/browser_smoke/fake_deepseek_server.test.mjs` + +**Step 1: Write the failing test** + +Add `node:test` coverage that proves the fake server planner: +- returns Baidu tool calls for `打开百度搜索天气` +- returns Zhihu navigate tool calls for `打开知乎搜索天气` +- returns final summaries matching the existing smoke script expectations +- rejects unsupported instructions clearly + +**Step 2: Run test to verify it fails** + +Run: +```bash +node --test tools/browser_smoke/fake_deepseek_server.test.mjs +``` + +Expected: FAIL because the helper module does not exist yet. + +**Step 3: Implement the minimal helper** + +The helper should: +- inspect the latest user message / tool-result phase +- emit OpenAI-compatible `choices[0].message.tool_calls` for the first round +- emit `choices[0].message.content` for the second round +- keep summaries identical to the current smoke assertions + +**Step 4: Run test to verify it passes** + +Run: +```bash +node --test tools/browser_smoke/fake_deepseek_server.test.mjs +``` + +Expected: PASS + +### Task 2: Add DeepSeek Smoke Wrapper Script + +**Files:** +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/tools/browser_smoke/run_deepseek_browser_smoke.mjs` +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/README.md` + +**Step 1: Write the failing wrapper expectation** + +Add a small test or dry-run seam in the helper test that proves the wrapper environment includes: +- `DEEPSEEK_API_KEY` +- `DEEPSEEK_BASE_URL` +- `DEEPSEEK_MODEL` + +and points at the fake local server. + +**Step 2: Run the targeted test to verify it fails** + +Run: +```bash +node --test tools/browser_smoke/fake_deepseek_server.test.mjs +``` + +Expected: FAIL because no wrapper/env builder exists yet. + +**Step 3: Implement the wrapper** + +The wrapper should: +- start the fake DeepSeek server +- invoke: +```bash +node /home/zyl/projects/superRpa/src/chrome/browser/superrpa/sgclaw/sgclaw_chat_smoke.mjs +``` +- inject `DEEPSEEK_*` into the child environment +- print the child stdout/stderr through +- stop the fake server on exit + +**Step 4: Run the targeted test to verify it passes** + +Run: +```bash +node --test tools/browser_smoke/fake_deepseek_server.test.mjs +``` + +Expected: PASS + +### Task 3: Verify the Browser-Delivered DeepSeek Path + +**Files:** +- Verify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/tools/browser_smoke/*` +- Verify: `/home/zyl/projects/superRpa/src/chrome/browser/superrpa/sgclaw/build_sgclaw.py` + +**Step 1: Build the browser-delivered binary from the worktree** + +Run: +```bash +python3 /home/zyl/projects/superRpa/src/chrome/browser/superrpa/sgclaw/build_sgclaw.py \ + --manifest-path /home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/Cargo.toml \ + --out /home/zyl/projects/superRpa/src/out/KylinRelease/sgclaw +``` + +Expected: PASS + +**Step 2: Run the DeepSeek smoke wrapper** + +Run: +```bash +node tools/browser_smoke/run_deepseek_browser_smoke.mjs +``` + +Expected: +- existing browser smoke passes +- `sgclaw` is forced down the compat runtime path through `DEEPSEEK_*` +- Baidu and Zhihu tasks still complete + +**Step 3: Re-run full Rust tests to guard against regressions** + +Run: +```bash +python3 /home/zyl/projects/superRpa/src/tools/crates/run_cargo.py test \ + --manifest-path /home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/Cargo.toml \ + --tests +``` + +Expected: PASS diff --git a/docs/plans/2026-03-26-zeroclaw-core-refactor-plan.md b/docs/plans/2026-03-26-zeroclaw-core-refactor-plan.md new file mode 100644 index 0000000..7aa0e4e --- /dev/null +++ b/docs/plans/2026-03-26-zeroclaw-core-refactor-plan.md @@ -0,0 +1,274 @@ +# ZeroClaw Core Refactor Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** Rebuild `sgClaw` on top of vendored ZeroClaw core while preserving the existing SuperRPA browser pipe protocol, `FunctionsUI` bridge names, and `sgclaw` binary contract. + +**Architecture:** Keep `sgclaw` as the compatibility shell and replace its current minimal runtime with a ZeroClaw-based core adapter. Vendor the upstream ZeroClaw workspace into this repository for reproducible builds, then build a `compat` layer that translates `submit_task` / `task_complete` / log events to and from ZeroClaw agent, memory, cron, and tool abstractions. Do not integrate the upstream ZeroClaw gateway in this phase; the future standalone gateway will reuse the same vendored core through a separate entrypoint. + +**Tech Stack:** Rust workspace, vendored upstream ZeroClaw (`zeroclawlabs`), current sgClaw pipe protocol and browser tool, DeepSeek via ZeroClaw provider routing, SQLite memory backends, Chromium `run_cargo.py` build flow. + +### Task 1: Vendor ZeroClaw Upstream Snapshot + +**Files:** +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/third_party/zeroclaw/**` +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/third_party/zeroclaw/VENDORED_FROM.md` +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/.gitignore` + +**Step 1: Copy the upstream snapshot into the repo** + +Source: +```bash +/home/zyl/Downloads/zeroclaw-master.zip +``` + +Destination: +```bash +/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/third_party/zeroclaw +``` + +Strip the top-level `zeroclaw-master/` folder so the vendored directory itself is the workspace root. + +**Step 2: Record provenance** + +Write `third_party/zeroclaw/VENDORED_FROM.md` with: +- upstream repo URL +- upstream default branch (`master`) +- source ZIP filename +- vendoring date +- a note that this copy is used to guarantee offline/reproducible browser builds + +**Step 3: Verify the vendor tree exists** + +Run: +```bash +find third_party/zeroclaw -maxdepth 2 -name Cargo.toml -o -name README.md +``` + +Expected: upstream workspace files are present. + +### Task 2: Convert sgClaw into a ZeroClaw-Backed Workspace Shell + +**Files:** +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/Cargo.toml` +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/lib.rs` +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/main.rs` +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/compat/mod.rs` + +**Step 1: Add the vendored ZeroClaw dependency** + +Use a local path dependency: +```toml +zeroclaw = { package = "zeroclawlabs", path = "third_party/zeroclaw" } +tokio = { version = "1", features = ["rt-multi-thread", "macros"] } +``` + +Do not use a git dependency. Browser builds must not depend on network access. + +**Step 2: Preserve the root crate identity** + +Keep: +- package name `sgclaw` +- binary name `sgclaw` +- current manifest path used by SuperRPA browser build scripts + +This avoids breaking `/home/zyl/projects/superRpa/src/chrome/browser/superrpa/sgclaw/build_sgclaw.py`. + +**Step 3: Route the process entrypoint through the compatibility layer** + +`src/lib.rs` should keep: +- current handshake +- current `BrowserPipeTool` +- current message loop + +But delegate task execution to `compat::runtime`, not directly to the current thin planner/runtime path. + +### Task 3: Introduce the sgClaw Compatibility Layer + +**Files:** +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/compat/runtime.rs` +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/compat/browser_tool_adapter.rs` +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/compat/config_adapter.rs` +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/compat/event_bridge.rs` +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/compat/memory_adapter.rs` +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/agent/mod.rs` + +**Step 1: Define the boundary** + +`compat::runtime` owns: +- creating the ZeroClaw config/provider/runtime/memory/tool registry +- executing a task from a browser `submit_task` +- translating ZeroClaw progress into current `AgentMessage::LogEntry` +- returning the final summary string for current `task_complete` + +`compat::event_bridge` owns all formatting decisions for: +- `[info] ...` +- `[error] ...` +- final summary propagation + +**Step 2: Keep the browser protocol unchanged** + +Do not change these wire-level contracts: +- `BrowserMessage::SubmitTask` +- `AgentMessage::TaskComplete` +- `AgentMessage::LogEntry` +- `init/init_ack` + +The browser side must not need a corresponding protocol change. + +**Step 3: Retire direct planner ownership from the main path** + +`src/agent/mod.rs` should stop owning the main task intelligence flow. The current rule-based planner can remain only as: +- transitional fallback, or +- deterministic test fixture + +It must no longer be the primary execution engine. + +### Task 4: Adapt BrowserPipeTool into a ZeroClaw Tool + +**Files:** +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/compat/browser_tool_adapter.rs` +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/pipe/browser_tool.rs` +- Test: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/tests/compat_browser_tool_test.rs` + +**Step 1: Write the failing adapter test** + +Add a focused test that proves: +- a ZeroClaw tool invocation can issue `navigate`, `type`, `click`, `getText` +- domain validation still flows through current MAC/rules enforcement +- returned observation data includes browser response payload and AOM snapshot + +**Step 2: Verify RED** + +Run: +```bash +python3 /home/zyl/projects/superRpa/src/tools/crates/run_cargo.py test \ + --manifest-path /home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/Cargo.toml \ + --test compat_browser_tool_test +``` + +Expected: fail because the adapter does not exist yet. + +**Step 3: Implement the adapter** + +Wrap current `BrowserPipeTool` behind ZeroClaw’s async `Tool` trait: +- tool name should stay stable and sgClaw-specific, for example `browser_action` +- schema should only expose the currently supported safe actions +- `ToolResult` should include serialized `data`, `aom_snapshot`, `timing` + +### Task 5: Build the DeepSeek-Backed ZeroClaw Runtime Path + +**Files:** +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/tests/compat_runtime_test.rs` +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/compat/runtime.rs` +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/compat/config_adapter.rs` +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/config/settings.rs` + +**Step 1: Write the failing runtime test** + +Add a compatibility runtime test that proves: +- when `DEEPSEEK_API_KEY` is configured, sgClaw uses the ZeroClaw provider path +- the runtime can execute a simple mocked `browser_action` sequence +- the final result is returned as current sgClaw `task_complete` + +Use a fake provider or deterministic ZeroClaw test seam for RED/GREEN speed. + +**Step 2: Verify RED** + +Run: +```bash +python3 /home/zyl/projects/superRpa/src/tools/crates/run_cargo.py test \ + --manifest-path /home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/Cargo.toml \ + --test compat_runtime_test +``` + +Expected: fail because the compatibility runtime is not wired yet. + +**Step 3: Implement DeepSeek mapping** + +Map current sgClaw env/config into ZeroClaw provider config: +- `DEEPSEEK_API_KEY` +- `DEEPSEEK_BASE_URL` +- `DEEPSEEK_MODEL` + +DeepSeek should be treated as OpenAI-compatible routing under ZeroClaw, not via the old local `DeepSeekProvider`. + +### Task 6: Introduce Memory and Cron Through the Compatibility Core + +**Files:** +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/compat/config_adapter.rs` +- Modify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/src/compat/memory_adapter.rs` +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/tests/compat_memory_test.rs` +- Create: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/tests/compat_cron_test.rs` + +**Step 1: Memory** + +Configure a workspace-local ZeroClaw memory backend suitable for browser embedding: +- default to SQLite +- keep storage under sgClaw-owned data path +- avoid enabling unrelated gateway/channel storage + +**Step 2: Cron** + +Expose ZeroClaw cron internally, but do not yet bind it to browser UI. +This phase only requires: +- creating validated agent jobs +- listing/running due jobs in tests + +The future standalone gateway will surface management UI for cron. + +### Task 7: Verification and Browser Integration + +**Files:** +- Verify: `/home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/tests/*.rs` +- Verify: `/home/zyl/projects/superRpa/src/chrome/browser/superrpa/sgclaw/build_sgclaw.py` +- Verify: `/home/zyl/projects/superRpa/src/chrome/browser/superrpa/sgclaw/sgclaw_chat_smoke.mjs` + +**Step 1: Run the full Rust test baseline** + +Run: +```bash +python3 /home/zyl/projects/superRpa/src/tools/crates/run_cargo.py test \ + --manifest-path /home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/Cargo.toml \ + --tests +``` + +Expected: current protocol/tool/planner compatibility tests still pass or are consciously replaced with equivalent compat tests. + +**Step 2: Build the browser-delivered binary from the worktree** + +Run: +```bash +python3 /home/zyl/projects/superRpa/src/chrome/browser/superrpa/sgclaw/build_sgclaw.py \ + --manifest-path /home/zyl/projects/sgClaw/claw/.worktrees/zeroclaw-core-refactor/Cargo.toml \ + --out /home/zyl/projects/superRpa/src/out/KylinRelease/sgclaw +``` + +Expected: the compatibility-shell binary is produced at the same output path as today. + +**Step 3: Run browser smoke** + +Run: +```bash +node /home/zyl/projects/superRpa/src/chrome/browser/superrpa/sgclaw/sgclaw_chat_smoke.mjs +``` + +Expected: +- browser protocol still starts and stops correctly +- Baidu task still succeeds +- Zhihu task still succeeds +- no browser-side API/bridge changes are required + +### Non-Goals for This Refactor + +- Do not replace the current SuperRPA browser protocol with ZeroClaw gateway protocols. +- Do not expose the upstream ZeroClaw web dashboard inside FunctionsUI. +- Do not ship the standalone gateway in this phase. +- Do not migrate browser-side code to a new transport. + +### Phase 2 After This Refactor + +After this compatibility refactor is stable: +- add a separate `gateway` crate or binary that uses the same vendored ZeroClaw core +- expose memory/cron/agent management there +- keep browser-side `sgclaw` as a thin local execution shell diff --git a/resources/rules.json b/resources/rules.json index c2e9905..dce381e 100644 --- a/resources/rules.json +++ b/resources/rules.json @@ -1,13 +1,15 @@ { "version": "1.0", - "demo_only_domains": ["baidu.com", "www.baidu.com"], + "demo_only_domains": ["baidu.com", "www.baidu.com", "zhihu.com", "www.zhihu.com"], "domains": { "allowed": [ "oa.example.com", "erp.example.com", "hr.example.com", "baidu.com", - "www.baidu.com" + "www.baidu.com", + "zhihu.com", + "www.zhihu.com" ] }, "pipe_actions": { diff --git a/src/agent/mod.rs b/src/agent/mod.rs index 0ad5e0d..8d2186e 100644 --- a/src/agent/mod.rs +++ b/src/agent/mod.rs @@ -1,7 +1,9 @@ pub mod planner; pub mod runtime; -use crate::llm::DeepSeekProvider; +use std::path::PathBuf; + +use crate::config::DeepSeekSettings; use crate::pipe::{AgentMessage, BrowserMessage, BrowserPipeTool, PipeError, Transport}; pub fn execute_task( @@ -34,19 +36,19 @@ pub fn execute_task( Ok(plan.summary) } -pub fn handle_browser_message( +pub fn handle_browser_message( transport: &T, browser_tool: &BrowserPipeTool, message: BrowserMessage, ) -> Result<(), PipeError> { match message { BrowserMessage::SubmitTask { instruction } => { - let completion = match DeepSeekProvider::from_env() { - Ok(provider) => match runtime::execute_task_with_provider( + let completion = match DeepSeekSettings::from_env() { + Ok(_) => match crate::compat::runtime::execute_task( transport, - browser_tool, - &provider, + browser_tool.clone(), &instruction, + &std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")), ) { Ok(summary) => AgentMessage::TaskComplete { success: true, diff --git a/src/agent/planner.rs b/src/agent/planner.rs index 9337001..9558198 100644 --- a/src/agent/planner.rs +++ b/src/agent/planner.rs @@ -1,3 +1,4 @@ +use reqwest::Url; use serde_json::{json, Value}; use thiserror::Error; @@ -7,6 +8,8 @@ const BAIDU_URL: &str = "https://www.baidu.com"; const BAIDU_DOMAIN: &str = "www.baidu.com"; const BAIDU_INPUT_SELECTOR: &str = "#kw"; const BAIDU_SEARCH_BUTTON_SELECTOR: &str = "#su"; +const ZHIHU_URL: &str = "https://www.zhihu.com/search"; +const ZHIHU_DOMAIN: &str = "www.zhihu.com"; #[derive(Debug, Clone, PartialEq)] pub struct PlannedStep { @@ -32,17 +35,38 @@ pub enum PlannerError { pub fn plan_instruction(instruction: &str) -> Result { let trimmed = instruction.trim(); - let query = trimmed - .strip_prefix("打开百度搜索") - .or_else(|| trimmed.strip_prefix("打开百度并搜索")) - .ok_or_else(|| PlannerError::UnsupportedInstruction(trimmed.to_string()))? - .trim(); + if let Some(query) = extract_query(trimmed, &["打开百度搜索", "打开百度并搜索"])? { + return Ok(plan_baidu_search(query)); + } + if let Some(query) = extract_query(trimmed, &["打开知乎搜索", "打开知乎并搜索"])? { + return Ok(plan_zhihu_search(query)); + } + + Err(PlannerError::UnsupportedInstruction(trimmed.to_string())) +} + +fn extract_query<'a>( + instruction: &'a str, + prefixes: &[&str], +) -> Result, PlannerError> { + let Some(query) = prefixes + .iter() + .find_map(|prefix| instruction.strip_prefix(prefix)) + else { + return Ok(None); + }; + + let query = query.trim(); if query.is_empty() { return Err(PlannerError::MissingQuery); } - Ok(TaskPlan { + Ok(Some(query)) +} + +fn plan_baidu_search(query: &str) -> TaskPlan { + TaskPlan { summary: format!("已在百度搜索{query}"), steps: vec![ PlannedStep { @@ -68,5 +92,21 @@ pub fn plan_instruction(instruction: &str) -> Result { log_message: format!("click {BAIDU_SEARCH_BUTTON_SELECTOR}"), }, ], - }) + } +} + +fn plan_zhihu_search(query: &str) -> TaskPlan { + let url = Url::parse_with_params(ZHIHU_URL, &[("type", "content"), ("q", query)]) + .expect("valid Zhihu search URL"); + let url: String = url.into(); + + TaskPlan { + summary: format!("已在知乎搜索{query}"), + steps: vec![PlannedStep { + action: Action::Navigate, + params: json!({ "url": url }), + expected_domain: ZHIHU_DOMAIN.to_string(), + log_message: format!("navigate {url}"), + }], + } } diff --git a/src/compat/browser_tool_adapter.rs b/src/compat/browser_tool_adapter.rs new file mode 100644 index 0000000..1be4837 --- /dev/null +++ b/src/compat/browser_tool_adapter.rs @@ -0,0 +1,156 @@ +use async_trait::async_trait; +use serde_json::{json, Map, Value}; +use zeroclaw::tools::{Tool, ToolResult}; + +use crate::pipe::{Action, BrowserPipeTool, Transport}; + +pub const BROWSER_ACTION_TOOL_NAME: &str = "browser_action"; + +pub struct ZeroClawBrowserTool { + browser_tool: BrowserPipeTool, +} + +impl ZeroClawBrowserTool { + pub fn new(browser_tool: BrowserPipeTool) -> Self { + Self { browser_tool } + } +} + +#[async_trait] +impl Tool for ZeroClawBrowserTool { + fn name(&self) -> &str { + BROWSER_ACTION_TOOL_NAME + } + + fn description(&self) -> &str { + "Execute browser actions in SuperRPA through the existing sgClaw pipe protocol." + } + + fn parameters_schema(&self) -> Value { + json!({ + "type": "object", + "required": ["action", "expected_domain"], + "properties": { + "action": { + "type": "string", + "enum": ["click", "type", "navigate", "getText"] + }, + "expected_domain": { + "type": "string" + }, + "selector": { + "type": "string" + }, + "text": { + "type": "string" + }, + "url": { + "type": "string" + }, + "clear_first": { + "type": "boolean" + } + } + }) + } + + async fn execute(&self, args: Value) -> anyhow::Result { + let request = match parse_browser_action_request(args) { + Ok(request) => request, + Err(err) => return Ok(failed_tool_result(err.to_string())), + }; + + let result = match self.browser_tool.invoke( + request.action, + request.params, + &request.expected_domain, + ) { + Ok(result) => result, + Err(err) => return Ok(failed_tool_result(err.to_string())), + }; + + let output = serde_json::to_string(&json!({ + "seq": result.seq, + "success": result.success, + "data": result.data, + "aom_snapshot": result.aom_snapshot, + "timing": result.timing + }))?; + + Ok(ToolResult { + success: result.success, + output, + error: (!result.success).then(|| "browser action returned success=false".to_string()), + }) + } +} + +struct BrowserActionRequest { + action: Action, + expected_domain: String, + params: Value, +} + +fn parse_browser_action_request(args: Value) -> Result { + let mut args = match args { + Value::Object(args) => args, + other => { + return Err(BrowserActionAdapterError::InvalidArguments(format!( + "expected object arguments, got {other}" + ))) + } + }; + + let action_name = take_required_string(&mut args, "action")?; + let expected_domain = take_required_string(&mut args, "expected_domain")?; + let action = parse_action(&action_name)?; + + Ok(BrowserActionRequest { + action, + expected_domain, + params: Value::Object(args), + }) +} + +fn parse_action(action_name: &str) -> Result { + match action_name { + "click" => Ok(Action::Click), + "type" => Ok(Action::Type), + "navigate" => Ok(Action::Navigate), + "getText" => Ok(Action::GetText), + other => Err(BrowserActionAdapterError::UnsupportedAction( + other.to_string(), + )), + } +} + +fn take_required_string( + args: &mut Map, + key: &'static str, +) -> Result { + match args.remove(key) { + Some(Value::String(value)) if !value.trim().is_empty() => Ok(value), + Some(other) => Err(BrowserActionAdapterError::InvalidArguments(format!( + "{key} must be a non-empty string, got {other}" + ))), + None => Err(BrowserActionAdapterError::MissingField(key)), + } +} + +fn failed_tool_result(error: String) -> ToolResult { + ToolResult { + success: false, + output: String::new(), + error: Some(error), + } +} + +#[derive(Debug, thiserror::Error)] +enum BrowserActionAdapterError { + #[error("unsupported action: {0}")] + UnsupportedAction(String), + #[error("missing required field: {0}")] + MissingField(&'static str), + #[error("invalid tool arguments: {0}")] + InvalidArguments(String), +} diff --git a/src/compat/config_adapter.rs b/src/compat/config_adapter.rs new file mode 100644 index 0000000..be6fda1 --- /dev/null +++ b/src/compat/config_adapter.rs @@ -0,0 +1,38 @@ +use std::path::{Path, PathBuf}; + +use zeroclaw::Config as ZeroClawConfig; + +use crate::compat::cron_adapter::configure_embedded_cron; +use crate::compat::memory_adapter::configure_embedded_memory; +use crate::config::DeepSeekSettings; + +const SGCLAW_ZEROCLAW_WORKSPACE_DIR: &str = ".sgclaw-zeroclaw-workspace"; + +pub fn build_zeroclaw_config(workspace_root: &Path) -> Result { + let settings = DeepSeekSettings::from_env()?; + Ok(build_zeroclaw_config_from_settings( + workspace_root, + &settings, + )) +} + +pub fn build_zeroclaw_config_from_settings( + workspace_root: &Path, + settings: &DeepSeekSettings, +) -> ZeroClawConfig { + let workspace_dir = zeroclaw_workspace_dir(workspace_root); + let mut config = ZeroClawConfig::default(); + config.workspace_dir = workspace_dir.clone(); + config.config_path = workspace_dir.join("config.toml"); + config.default_provider = Some("deepseek".to_string()); + config.default_model = Some(settings.model.clone()); + config.api_key = Some(settings.api_key.clone()); + config.api_url = Some(settings.base_url.clone()); + configure_embedded_memory(&mut config); + configure_embedded_cron(&mut config); + config +} + +pub fn zeroclaw_workspace_dir(workspace_root: &Path) -> PathBuf { + workspace_root.join(SGCLAW_ZEROCLAW_WORKSPACE_DIR) +} diff --git a/src/compat/cron_adapter.rs b/src/compat/cron_adapter.rs new file mode 100644 index 0000000..2ba9ab8 --- /dev/null +++ b/src/compat/cron_adapter.rs @@ -0,0 +1,98 @@ +use std::future::Future; + +use chrono::{DateTime, Utc}; +use zeroclaw::config::Config as ZeroClawConfig; +use zeroclaw::cron::{self, CronJob, CronRun, JobType, Schedule, SessionTarget}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CronExecutionResult { + pub job_id: String, + pub success: bool, + pub output: String, +} + +pub fn configure_embedded_cron(config: &mut ZeroClawConfig) { + config.cron.enabled = true; + config.cron.catch_up_on_startup = false; + config.scheduler.enabled = false; + config.scheduler.max_concurrent = 1; + config.scheduler.max_tasks = config.scheduler.max_tasks.max(1); +} + +pub fn add_agent_job( + config: &ZeroClawConfig, + name: Option, + schedule: Schedule, + prompt: &str, + allowed_tools: Option>, +) -> anyhow::Result { + cron::add_agent_job( + config, + name, + schedule, + prompt, + SessionTarget::Isolated, + None, + None, + false, + allowed_tools, + ) +} + +pub fn list_jobs(config: &ZeroClawConfig) -> anyhow::Result> { + cron::list_jobs(config) +} + +pub fn list_runs( + config: &ZeroClawConfig, + job_id: &str, + limit: usize, +) -> anyhow::Result> { + cron::list_runs(config, job_id, limit) +} + +pub async fn run_due_jobs( + config: &ZeroClawConfig, + now: DateTime, + mut runner: F, +) -> anyhow::Result> +where + F: FnMut(&CronJob) -> Fut, + Fut: Future>, +{ + let jobs = cron::due_jobs(config, now)?; + let mut results = Vec::with_capacity(jobs.len()); + + for job in jobs { + if !matches!(job.job_type, JobType::Agent) { + anyhow::bail!("unsupported cron job type in sgclaw compat: {:?}", job.job_type); + } + + let started_at = Utc::now(); + let (success, output) = match runner(&job).await { + Ok(output) => (true, output), + Err(err) => (false, err.to_string()), + }; + let finished_at = Utc::now(); + let duration_ms = (finished_at - started_at).num_milliseconds(); + + cron::record_run( + config, + &job.id, + started_at, + finished_at, + if success { "ok" } else { "error" }, + Some(&output), + duration_ms, + )?; + cron::reschedule_after_run(config, &job, success, &output)?; + + results.push(CronExecutionResult { + job_id: job.id, + success, + output, + }); + } + + Ok(results) +} diff --git a/src/compat/event_bridge.rs b/src/compat/event_bridge.rs new file mode 100644 index 0000000..c2cc5c8 --- /dev/null +++ b/src/compat/event_bridge.rs @@ -0,0 +1,63 @@ +use serde_json::Value; +use zeroclaw::agent::TurnEvent; + +use crate::pipe::AgentMessage; + +pub fn log_entry_for_turn_event(event: &TurnEvent) -> Option { + match event { + TurnEvent::ToolCall { name, args } => Some(AgentMessage::LogEntry { + level: "info".to_string(), + message: format_tool_call(name, args), + }), + TurnEvent::ToolResult { output, .. } if is_tool_error(output) => Some(AgentMessage::LogEntry { + level: "error".to_string(), + message: output.trim_start_matches("Error: ").to_string(), + }), + _ => None, + } +} + +fn format_tool_call(name: &str, args: &Value) -> String { + if name != "browser_action" { + return format!("call {name}"); + } + + let action = args + .get("action") + .and_then(Value::as_str) + .unwrap_or("unknown"); + + match action { + "navigate" => { + let url = args.get("url").and_then(Value::as_str).unwrap_or(""); + format!("navigate {url}") + } + "type" => { + let text = args.get("text").and_then(Value::as_str).unwrap_or(""); + let selector = args + .get("selector") + .and_then(Value::as_str) + .unwrap_or(""); + format!("type {text} into {selector}") + } + "click" => { + let selector = args + .get("selector") + .and_then(Value::as_str) + .unwrap_or(""); + format!("click {selector}") + } + "getText" => { + let selector = args + .get("selector") + .and_then(Value::as_str) + .unwrap_or(""); + format!("getText {selector}") + } + other => format!("browser_action {other}"), + } +} + +fn is_tool_error(output: &str) -> bool { + output.starts_with("Error:") +} diff --git a/src/compat/memory_adapter.rs b/src/compat/memory_adapter.rs new file mode 100644 index 0000000..2d05314 --- /dev/null +++ b/src/compat/memory_adapter.rs @@ -0,0 +1,30 @@ +use std::path::{Path, PathBuf}; + +use zeroclaw::config::Config as ZeroClawConfig; +use zeroclaw::memory::{self, Memory}; + +pub fn configure_embedded_memory(config: &mut ZeroClawConfig) { + config.memory.backend = "sqlite".to_string(); + config.memory.embedding_provider = "none".to_string(); + config.memory.response_cache_enabled = false; + config.memory.snapshot_enabled = false; + config.memory.snapshot_on_hygiene = false; + + config.storage.provider.config.provider.clear(); + config.storage.provider.config.db_url = None; + config.storage.provider.config.connect_timeout_secs = None; +} + +pub fn build_memory(config: &ZeroClawConfig) -> anyhow::Result> { + memory::create_memory_with_storage_and_routes( + &config.memory, + &config.embedding_routes, + Some(&config.storage.provider.config), + &config.workspace_dir, + config.api_key.as_deref(), + ) +} + +pub fn brain_db_path(workspace_dir: &Path) -> PathBuf { + workspace_dir.join("memory").join("brain.db") +} diff --git a/src/compat/mod.rs b/src/compat/mod.rs new file mode 100644 index 0000000..62b22bb --- /dev/null +++ b/src/compat/mod.rs @@ -0,0 +1,6 @@ +pub mod browser_tool_adapter; +pub mod config_adapter; +pub mod cron_adapter; +pub mod event_bridge; +pub mod memory_adapter; +pub mod runtime; diff --git a/src/compat/runtime.rs b/src/compat/runtime.rs new file mode 100644 index 0000000..5015293 --- /dev/null +++ b/src/compat/runtime.rs @@ -0,0 +1,197 @@ +use std::path::Path; +use std::sync::Arc; + +use async_trait::async_trait; +use futures_util::{stream, StreamExt}; +use zeroclaw::agent::dispatcher::NativeToolDispatcher; +use zeroclaw::agent::{Agent, TurnEvent}; +use zeroclaw::config::Config as ZeroClawConfig; +use zeroclaw::observability::{NoopObserver, Observer}; +use zeroclaw::providers::{ + self, ChatMessage, ChatRequest, ChatResponse, Provider, +}; +use zeroclaw::providers::traits::{ + ProviderCapabilities, StreamEvent, StreamOptions, StreamResult, +}; + +use crate::compat::browser_tool_adapter::{ZeroClawBrowserTool, BROWSER_ACTION_TOOL_NAME}; +use crate::compat::config_adapter::build_zeroclaw_config; +use crate::compat::event_bridge::log_entry_for_turn_event; +use crate::compat::memory_adapter::build_memory; +use crate::pipe::{BrowserPipeTool, PipeError, Transport}; + +pub fn execute_task( + transport: &T, + browser_tool: BrowserPipeTool, + instruction: &str, + workspace_root: &Path, +) -> Result { + let config = build_zeroclaw_config(workspace_root) + .map_err(|err| PipeError::Protocol(err.to_string()))?; + let provider = build_provider(&config)?; + let runtime = tokio::runtime::Runtime::new() + .map_err(|err| PipeError::Protocol(format!("failed to create tokio runtime: {err}")))?; + + runtime.block_on(execute_task_with_provider( + transport, + browser_tool, + provider, + instruction, + config, + )) +} + +pub async fn execute_task_with_provider( + transport: &T, + browser_tool: BrowserPipeTool, + provider: Box, + instruction: &str, + config: ZeroClawConfig, +) -> Result { + let mut agent = build_agent(browser_tool, provider, &config)?; + let (event_tx, mut event_rx) = tokio::sync::mpsc::channel::(32); + let instruction = instruction.to_string(); + + let task = tokio::spawn(async move { agent.turn_streamed(&instruction, event_tx).await }); + + while let Some(event) = event_rx.recv().await { + if let Some(log_entry) = log_entry_for_turn_event(&event) { + transport.send(&log_entry)?; + } + } + + task.await + .map_err(|err| PipeError::Protocol(format!("zeroclaw task join failed: {err}")))? + .map_err(|err| PipeError::Protocol(err.to_string())) +} + +fn build_agent( + browser_tool: BrowserPipeTool, + provider: Box, + config: &ZeroClawConfig, +) -> Result { + let memory = build_memory(config).map_err(map_anyhow_to_pipe_error)?; + let observer: Arc = Arc::new(NoopObserver); + let tools: Vec> = + vec![Box::new(ZeroClawBrowserTool::new(browser_tool))]; + + Agent::builder() + .provider(provider) + .tools(tools) + .memory(Arc::from(memory)) + .observer(observer) + .tool_dispatcher(Box::new(NativeToolDispatcher)) + .config(config.agent.clone()) + .model_name( + config + .default_model + .clone() + .unwrap_or_else(|| "deepseek-chat".to_string()), + ) + .temperature(config.default_temperature) + .workspace_dir(config.workspace_dir.clone()) + .allowed_tools(Some(vec![BROWSER_ACTION_TOOL_NAME.to_string()])) + .build() + .map_err(map_anyhow_to_pipe_error) +} + +fn build_provider(config: &ZeroClawConfig) -> Result, PipeError> { + let provider_name = config.default_provider.as_deref().unwrap_or("deepseek"); + let model_name = config + .default_model + .as_deref() + .unwrap_or("deepseek-chat"); + let runtime_options = providers::provider_runtime_options_from_config(config); + let resolved_provider_name = if provider_name == "deepseek" { + config + .api_url + .as_deref() + .map(str::trim) + .filter(|url| !url.is_empty()) + .map(|url| format!("custom:{url}")) + .unwrap_or_else(|| provider_name.to_string()) + } else { + provider_name.to_string() + }; + let provider = providers::create_routed_provider_with_options( + &resolved_provider_name, + config.api_key.as_deref(), + config.api_url.as_deref(), + &config.reliability, + &config.model_routes, + model_name, + &runtime_options, + ) + .map_err(map_anyhow_to_pipe_error)?; + + Ok(Box::new(NonStreamingProvider::new(provider))) +} + +fn map_anyhow_to_pipe_error(err: anyhow::Error) -> PipeError { + PipeError::Protocol(err.to_string()) +} + +struct NonStreamingProvider { + inner: Box, +} + +impl NonStreamingProvider { + fn new(inner: Box) -> Self { + Self { inner } + } +} + +#[async_trait] +impl Provider for NonStreamingProvider { + fn capabilities(&self) -> ProviderCapabilities { + self.inner.capabilities() + } + + async fn chat_with_system( + &self, + system_prompt: Option<&str>, + message: &str, + model: &str, + temperature: f64, + ) -> anyhow::Result { + self.inner + .chat_with_system(system_prompt, message, model, temperature) + .await + } + + async fn chat_with_history( + &self, + messages: &[ChatMessage], + model: &str, + temperature: f64, + ) -> anyhow::Result { + self.inner.chat_with_history(messages, model, temperature).await + } + + async fn chat( + &self, + request: ChatRequest<'_>, + model: &str, + temperature: f64, + ) -> anyhow::Result { + self.inner.chat(request, model, temperature).await + } + + fn supports_streaming(&self) -> bool { + false + } + + fn supports_streaming_tool_events(&self) -> bool { + false + } + + fn stream_chat( + &self, + _request: ChatRequest<'_>, + _model: &str, + _temperature: f64, + _options: StreamOptions, + ) -> stream::BoxStream<'static, StreamResult> { + stream::empty().boxed() + } +} diff --git a/src/lib.rs b/src/lib.rs index cd4c829..fe35d98 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ pub mod agent; +pub mod compat; pub mod config; pub mod llm; pub mod pipe; diff --git a/src/pipe/browser_tool.rs b/src/pipe/browser_tool.rs index b2464be..12210f5 100644 --- a/src/pipe/browser_tool.rs +++ b/src/pipe/browser_tool.rs @@ -21,17 +21,29 @@ pub struct BrowserPipeTool { transport: Arc, mac_policy: MacPolicy, session_key: Vec, - next_seq: AtomicU64, + next_seq: Arc, response_timeout: Duration, } +impl Clone for BrowserPipeTool { + fn clone(&self) -> Self { + Self { + transport: self.transport.clone(), + mac_policy: self.mac_policy.clone(), + session_key: self.session_key.clone(), + next_seq: self.next_seq.clone(), + response_timeout: self.response_timeout, + } + } +} + impl BrowserPipeTool { pub fn new(transport: Arc, mac_policy: MacPolicy, session_key: Vec) -> Self { Self { transport, mac_policy, session_key, - next_seq: AtomicU64::new(1), + next_seq: Arc::new(AtomicU64::new(1)), response_timeout: Duration::from_secs(30), } } diff --git a/tests/browser_tool_test.rs b/tests/browser_tool_test.rs index f43241d..25a07f0 100644 --- a/tests/browser_tool_test.rs +++ b/tests/browser_tool_test.rs @@ -1,5 +1,6 @@ mod common; +use std::path::PathBuf; use std::sync::Arc; use std::time::Duration; @@ -82,3 +83,13 @@ fn browser_tool_rejects_action_when_mac_policy_blocks_it() { assert!(err.to_string().contains("action is not allowed")); } + +#[test] +fn default_rules_allow_zhihu_navigation() { + let rules_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("resources") + .join("rules.json"); + let policy = MacPolicy::load_from_path(rules_path).unwrap(); + + policy.validate(&Action::Navigate, "www.zhihu.com").unwrap(); +} diff --git a/tests/compat_browser_tool_test.rs b/tests/compat_browser_tool_test.rs new file mode 100644 index 0000000..5b4e5ab --- /dev/null +++ b/tests/compat_browser_tool_test.rs @@ -0,0 +1,203 @@ +mod common; + +use std::sync::Arc; +use std::time::Duration; + +use common::MockTransport; +use serde_json::{json, Value}; +use sgclaw::security::MacPolicy; +use sgclaw::{ + compat::browser_tool_adapter::ZeroClawBrowserTool, + pipe::{Action, AgentMessage, BrowserMessage, BrowserPipeTool, Timing}, +}; +use zeroclaw::tools::Tool; + +fn test_policy() -> MacPolicy { + MacPolicy::from_json_str( + r#"{ + "version": "1.0", + "domains": { "allowed": ["www.baidu.com"] }, + "pipe_actions": { + "allowed": ["click", "type", "navigate", "getText"], + "blocked": ["eval", "executeJsInPage"] + } + }"#, + ) + .unwrap() +} + +fn build_adapter(messages: Vec) -> (Arc, ZeroClawBrowserTool) { + let transport = Arc::new(MockTransport::new(messages)); + let browser_tool = BrowserPipeTool::new( + transport.clone(), + test_policy(), + vec![1, 2, 3, 4, 5, 6, 7, 8], + ) + .with_response_timeout(Duration::from_secs(1)); + + (transport, ZeroClawBrowserTool::new(browser_tool)) +} + +#[test] +fn zeroclaw_browser_tool_schema_exposes_only_supported_safe_actions() { + let (_, tool) = build_adapter(vec![]); + let schema = tool.parameters_schema(); + + assert_eq!(tool.name(), "browser_action"); + assert_eq!( + schema["properties"]["action"]["enum"], + json!(["click", "type", "navigate", "getText"]) + ); + assert_eq!(schema["required"], json!(["action", "expected_domain"])); +} + +#[tokio::test] +async fn zeroclaw_browser_tool_executes_supported_actions_and_returns_observation_payload() { + let (transport, tool) = build_adapter(vec![ + BrowserMessage::Response { + seq: 1, + success: true, + data: json!({ "navigated": true }), + aom_snapshot: vec![], + timing: Timing { + queue_ms: 1, + exec_ms: 11, + }, + }, + BrowserMessage::Response { + seq: 2, + success: true, + data: json!({ "typed": true }), + aom_snapshot: vec![], + timing: Timing { + queue_ms: 2, + exec_ms: 12, + }, + }, + BrowserMessage::Response { + seq: 3, + success: true, + data: json!({ "clicked": true }), + aom_snapshot: vec![], + timing: Timing { + queue_ms: 3, + exec_ms: 13, + }, + }, + BrowserMessage::Response { + seq: 4, + success: true, + data: json!({ "text": "天气" }), + aom_snapshot: vec![json!({ + "role": "textbox", + "name": "百度一下" + })], + timing: Timing { + queue_ms: 4, + exec_ms: 14, + }, + }, + ]); + + let navigate = tool + .execute(json!({ + "action": "navigate", + "expected_domain": "www.baidu.com", + "url": "https://www.baidu.com" + })) + .await + .unwrap(); + let type_text = tool + .execute(json!({ + "action": "type", + "expected_domain": "www.baidu.com", + "selector": "#kw", + "text": "天气", + "clear_first": true + })) + .await + .unwrap(); + let click = tool + .execute(json!({ + "action": "click", + "expected_domain": "www.baidu.com", + "selector": "#su" + })) + .await + .unwrap(); + let get_text = tool + .execute(json!({ + "action": "getText", + "expected_domain": "www.baidu.com", + "selector": "#content_left" + })) + .await + .unwrap(); + + let navigate_output: Value = serde_json::from_str(&navigate.output).unwrap(); + let get_text_output: Value = serde_json::from_str(&get_text.output).unwrap(); + let sent = transport.sent_messages(); + + assert!(navigate.success); + assert!(type_text.success); + assert!(click.success); + assert!(get_text.success); + assert_eq!(navigate_output["data"], json!({ "navigated": true })); + assert_eq!(get_text_output["data"], json!({ "text": "天气" })); + assert_eq!( + get_text_output["aom_snapshot"], + json!([{ "role": "textbox", "name": "百度一下" }]) + ); + assert_eq!( + get_text_output["timing"], + json!({ + "queue_ms": 4, + "exec_ms": 14 + }) + ); + assert!(matches!( + &sent[0], + AgentMessage::Command { seq, action, .. } + if *seq == 1 && action == &Action::Navigate + )); + assert!(matches!( + &sent[1], + AgentMessage::Command { seq, action, .. } + if *seq == 2 && action == &Action::Type + )); + assert!(matches!( + &sent[2], + AgentMessage::Command { seq, action, .. } + if *seq == 3 && action == &Action::Click + )); + assert!(matches!( + &sent[3], + AgentMessage::Command { seq, action, .. } + if *seq == 4 && action == &Action::GetText + )); +} + +#[tokio::test] +async fn zeroclaw_browser_tool_keeps_domain_validation_in_mac_policy() { + let (transport, tool) = build_adapter(vec![]); + + let result = tool + .execute(json!({ + "action": "navigate", + "expected_domain": "www.zhihu.com", + "url": "https://www.zhihu.com" + })) + .await + .unwrap(); + + assert!(!result.success); + assert!(result.output.is_empty()); + assert_eq!(transport.sent_messages().len(), 0); + assert!( + result + .error + .as_deref() + .unwrap() + .contains("domain is not allowed") + ); +} diff --git a/tests/compat_config_test.rs b/tests/compat_config_test.rs new file mode 100644 index 0000000..3a7042a --- /dev/null +++ b/tests/compat_config_test.rs @@ -0,0 +1,55 @@ +use std::path::Path; +use std::sync::{Mutex, OnceLock}; + +use sgclaw::compat::config_adapter::{ + build_zeroclaw_config, + build_zeroclaw_config_from_settings, + zeroclaw_workspace_dir, +}; +use sgclaw::config::DeepSeekSettings; + +fn env_lock() -> &'static Mutex<()> { + static LOCK: OnceLock> = OnceLock::new(); + LOCK.get_or_init(|| Mutex::new(())) +} + +#[test] +fn zeroclaw_config_adapter_maps_deepseek_env_to_zeroclaw_config() { + let _guard = env_lock().lock().unwrap(); + std::env::set_var("DEEPSEEK_API_KEY", "deepseek-test-key"); + std::env::set_var("DEEPSEEK_BASE_URL", "https://api.deepseek.com"); + std::env::set_var("DEEPSEEK_MODEL", "deepseek-chat"); + + let config = build_zeroclaw_config(Path::new("/tmp/sgclaw")).unwrap(); + + assert_eq!(config.default_provider.as_deref(), Some("deepseek")); + assert_eq!(config.default_model.as_deref(), Some("deepseek-chat")); + assert_eq!(config.api_key.as_deref(), Some("deepseek-test-key")); + assert_eq!(config.api_url.as_deref(), Some("https://api.deepseek.com")); + assert_eq!( + config.workspace_dir, + Path::new("/tmp/sgclaw/.sgclaw-zeroclaw-workspace") + ); + assert_eq!( + config.config_path, + Path::new("/tmp/sgclaw/.sgclaw-zeroclaw-workspace/config.toml") + ); +} + +#[test] +fn zeroclaw_config_adapter_uses_deterministic_workspace_dir() { + let settings = DeepSeekSettings { + api_key: "key".to_string(), + base_url: "https://proxy.example.com/v1".to_string(), + model: "deepseek-reasoner".to_string(), + }; + + let workspace_dir = zeroclaw_workspace_dir(Path::new("/var/lib/sgclaw")); + let config = build_zeroclaw_config_from_settings(Path::new("/var/lib/sgclaw"), &settings); + + assert_eq!(workspace_dir, Path::new("/var/lib/sgclaw/.sgclaw-zeroclaw-workspace")); + assert_eq!(config.workspace_dir, workspace_dir); + assert_eq!(config.default_provider.as_deref(), Some("deepseek")); + assert_eq!(config.default_model.as_deref(), Some("deepseek-reasoner")); + assert_eq!(config.api_url.as_deref(), Some("https://proxy.example.com/v1")); +} diff --git a/tests/compat_cron_test.rs b/tests/compat_cron_test.rs new file mode 100644 index 0000000..4e96e02 --- /dev/null +++ b/tests/compat_cron_test.rs @@ -0,0 +1,63 @@ +use std::path::{Path, PathBuf}; + +use chrono::Duration; +use sgclaw::compat::config_adapter::build_zeroclaw_config_from_settings; +use sgclaw::config::DeepSeekSettings; +use zeroclaw::cron::Schedule; + +fn workspace_root(label: &str) -> PathBuf { + let root = std::env::temp_dir().join(format!("{label}-{}", uuid::Uuid::new_v4())); + std::fs::create_dir_all(&root).unwrap(); + root +} + +#[tokio::test] +async fn compat_cron_adapter_creates_lists_and_runs_due_agent_jobs() { + let settings = DeepSeekSettings { + api_key: "key".to_string(), + base_url: "https://api.deepseek.com".to_string(), + model: "deepseek-chat".to_string(), + }; + let workspace_root = workspace_root("sgclaw-cron"); + let config = build_zeroclaw_config_from_settings(Path::new(&workspace_root), &settings); + + assert!(config.cron.enabled); + assert!(!config.cron.catch_up_on_startup); + assert!(!config.scheduler.enabled); + + let created = sgclaw::compat::cron_adapter::add_agent_job( + &config, + Some("search-weather".to_string()), + Schedule::Every { every_ms: 1 }, + "打开百度搜索天气", + Some(vec!["browser_action".to_string()]), + ) + .unwrap(); + + let listed = sgclaw::compat::cron_adapter::list_jobs(&config).unwrap(); + assert_eq!(listed.len(), 1); + assert_eq!(listed[0].id, created.id); + assert_eq!(listed[0].prompt.as_deref(), Some("打开百度搜索天气")); + + let results = sgclaw::compat::cron_adapter::run_due_jobs( + &config, + created.next_run + Duration::milliseconds(1), + |job| { + let output = format!("ran {}", job.prompt.as_deref().unwrap_or_default()); + async move { Ok::(output) } + }, + ) + .await + .unwrap(); + + let runs = sgclaw::compat::cron_adapter::list_runs(&config, &created.id, 10).unwrap(); + let updated = sgclaw::compat::cron_adapter::list_jobs(&config).unwrap(); + + assert_eq!(results.len(), 1); + assert!(results[0].success); + assert_eq!(results[0].job_id, created.id); + assert_eq!(runs.len(), 1); + assert_eq!(runs[0].status, "ok"); + assert!(updated[0].last_status.as_deref() == Some("ok")); + assert!(updated[0].next_run > created.next_run); +} diff --git a/tests/compat_memory_test.rs b/tests/compat_memory_test.rs new file mode 100644 index 0000000..c4efed0 --- /dev/null +++ b/tests/compat_memory_test.rs @@ -0,0 +1,42 @@ +use std::path::{Path, PathBuf}; + +use sgclaw::compat::config_adapter::build_zeroclaw_config_from_settings; +use sgclaw::config::DeepSeekSettings; +use zeroclaw::memory::MemoryCategory; + +fn workspace_root(label: &str) -> PathBuf { + let root = std::env::temp_dir().join(format!("{label}-{}", uuid::Uuid::new_v4())); + std::fs::create_dir_all(&root).unwrap(); + root +} + +#[tokio::test] +async fn compat_memory_adapter_uses_workspace_local_sqlite_backend() { + let settings = DeepSeekSettings { + api_key: "key".to_string(), + base_url: "https://api.deepseek.com".to_string(), + model: "deepseek-chat".to_string(), + }; + let workspace_root = workspace_root("sgclaw-memory"); + let config = build_zeroclaw_config_from_settings(Path::new(&workspace_root), &settings); + + assert_eq!(config.memory.backend, "sqlite"); + assert_eq!(config.memory.embedding_provider, "none"); + assert!(!config.memory.response_cache_enabled); + assert!(!config.memory.snapshot_enabled); + assert!(config.storage.provider.config.provider.is_empty()); + + let memory = sgclaw::compat::memory_adapter::build_memory(&config).unwrap(); + memory + .store( + "weather", + "remember today's weather workflow", + MemoryCategory::Conversation, + None, + ) + .await + .unwrap(); + + assert_eq!(memory.count().await.unwrap(), 1); + assert!(sgclaw::compat::memory_adapter::brain_db_path(&config.workspace_dir).exists()); +} diff --git a/tests/compat_runtime_test.rs b/tests/compat_runtime_test.rs new file mode 100644 index 0000000..0851434 --- /dev/null +++ b/tests/compat_runtime_test.rs @@ -0,0 +1,334 @@ +mod common; + +use std::io::{Read, Write}; +use std::net::TcpListener; +use std::path::PathBuf; +use std::sync::{Arc, Mutex, OnceLock}; +use std::thread; +use std::time::Duration; + +use common::MockTransport; +use serde_json::{json, Value}; +use sgclaw::agent::handle_browser_message; +use sgclaw::compat::runtime::execute_task; +use sgclaw::pipe::{Action, AgentMessage, BrowserMessage, BrowserPipeTool, Timing}; +use sgclaw::security::MacPolicy; +use uuid::Uuid; + +fn env_lock() -> &'static Mutex<()> { + static LOCK: OnceLock> = OnceLock::new(); + LOCK.get_or_init(|| Mutex::new(())) +} + +fn test_policy() -> MacPolicy { + MacPolicy::from_json_str( + r#"{ + "version": "1.0", + "domains": { "allowed": ["www.baidu.com"] }, + "pipe_actions": { + "allowed": ["click", "type", "navigate", "getText"], + "blocked": [] + } + }"#, + ) + .unwrap() +} + +fn temp_workspace_root() -> PathBuf { + let root = std::env::temp_dir().join(format!("sgclaw-compat-runtime-{}", Uuid::new_v4())); + std::fs::create_dir_all(&root).unwrap(); + root +} + +fn start_fake_deepseek_server( + responses: Vec, +) -> (String, Arc>>, thread::JoinHandle<()>) { + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + listener.set_nonblocking(true).unwrap(); + let address = format!("http://{}", listener.local_addr().unwrap()); + let requests = Arc::new(Mutex::new(Vec::new())); + let request_log = requests.clone(); + + let handle = thread::spawn(move || { + for response in responses { + let deadline = std::time::Instant::now() + Duration::from_secs(5); + let (mut stream, _) = loop { + match listener.accept() { + Ok(pair) => break pair, + Err(err) if err.kind() == std::io::ErrorKind::WouldBlock => { + assert!( + std::time::Instant::now() < deadline, + "timed out waiting for provider request" + ); + thread::sleep(Duration::from_millis(10)); + } + Err(err) => panic!("failed to accept provider request: {err}"), + } + }; + let body = read_http_json_body(&mut stream); + request_log.lock().unwrap().push(body); + + let payload = response.to_string(); + let reply = format!( + "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}", + payload.as_bytes().len(), + payload + ); + stream.write_all(reply.as_bytes()).unwrap(); + stream.flush().unwrap(); + } + }); + + (address, requests, handle) +} + +fn read_http_json_body(stream: &mut impl Read) -> Value { + let mut buffer = Vec::new(); + let mut headers_end = None; + + while headers_end.is_none() { + let mut chunk = [0_u8; 1024]; + let bytes = stream.read(&mut chunk).unwrap(); + assert!(bytes > 0, "unexpected EOF while reading headers"); + buffer.extend_from_slice(&chunk[..bytes]); + headers_end = buffer.windows(4).position(|window| window == b"\r\n\r\n"); + } + + let headers_end = headers_end.unwrap() + 4; + let headers = String::from_utf8(buffer[..headers_end].to_vec()).unwrap(); + let content_length = headers + .lines() + .find_map(|line| { + let (name, value) = line.split_once(':')?; + name.eq_ignore_ascii_case("content-length") + .then(|| value.trim().parse::().unwrap()) + }) + .unwrap(); + + while buffer.len() < headers_end + content_length { + let mut chunk = vec![0_u8; content_length]; + let bytes = stream.read(&mut chunk).unwrap(); + assert!(bytes > 0, "unexpected EOF while reading body"); + buffer.extend_from_slice(&chunk[..bytes]); + } + + serde_json::from_slice(&buffer[headers_end..headers_end + content_length]).unwrap() +} + +#[test] +fn compat_runtime_uses_zeroclaw_provider_path_and_executes_browser_actions() { + let _guard = env_lock().lock().unwrap_or_else(|err| err.into_inner()); + + let first_response = json!({ + "choices": [{ + "message": { + "content": "", + "tool_calls": [ + { + "id": "call_1", + "type": "function", + "function": { + "name": "browser_action", + "arguments": serde_json::to_string(&json!({ + "action": "navigate", + "expected_domain": "www.baidu.com", + "url": "https://www.baidu.com" + })).unwrap() + } + }, + { + "id": "call_2", + "type": "function", + "function": { + "name": "browser_action", + "arguments": serde_json::to_string(&json!({ + "action": "type", + "expected_domain": "www.baidu.com", + "selector": "#kw", + "text": "天气", + "clear_first": true + })).unwrap() + } + } + ] + } + }], + "usage": { + "prompt_tokens": 12, + "completion_tokens": 7 + } + }); + let second_response = json!({ + "choices": [{ + "message": { + "content": "已通过 ZeroClaw 执行任务: 打开百度搜索天气" + } + }], + "usage": { + "prompt_tokens": 15, + "completion_tokens": 8 + } + }); + let (base_url, requests, server_handle) = + start_fake_deepseek_server(vec![first_response, second_response]); + + std::env::set_var("DEEPSEEK_API_KEY", "deepseek-test-key"); + std::env::set_var("DEEPSEEK_BASE_URL", base_url); + std::env::set_var("DEEPSEEK_MODEL", "deepseek-chat"); + + let workspace_root = temp_workspace_root(); + let transport = Arc::new(MockTransport::new(vec![ + BrowserMessage::Response { + seq: 1, + success: true, + data: json!({ "navigated": true }), + aom_snapshot: vec![], + timing: Timing { + queue_ms: 1, + exec_ms: 10, + }, + }, + BrowserMessage::Response { + seq: 2, + success: true, + data: json!({ "typed": true }), + aom_snapshot: vec![], + timing: Timing { + queue_ms: 1, + exec_ms: 11, + }, + }, + ])); + let browser_tool = BrowserPipeTool::new( + transport.clone(), + test_policy(), + vec![1, 2, 3, 4, 5, 6, 7, 8], + ) + .with_response_timeout(Duration::from_secs(1)); + + let summary = execute_task( + transport.as_ref(), + browser_tool, + "打开百度搜索天气", + &workspace_root, + ) + .unwrap(); + server_handle.join().unwrap(); + + let request_bodies = requests.lock().unwrap().clone(); + let sent = transport.sent_messages(); + + assert_eq!(summary, "已通过 ZeroClaw 执行任务: 打开百度搜索天气"); + assert_eq!(request_bodies.len(), 2); + assert_eq!(request_bodies[0]["model"], json!("deepseek-chat")); + assert_eq!( + request_bodies[0]["tools"][0]["function"]["name"], + json!("browser_action") + ); + assert!(request_bodies[1].to_string().contains("tool_call_id")); + assert!(sent.iter().any(|message| { + matches!( + message, + AgentMessage::LogEntry { level, message } + if level == "info" && message == "navigate https://www.baidu.com" + ) + })); + assert!(sent.iter().any(|message| { + matches!( + message, + AgentMessage::LogEntry { level, message } + if level == "info" && message == "type 天气 into #kw" + ) + })); + assert!(sent.iter().any(|message| { + matches!( + message, + AgentMessage::Command { action, .. } if action == &Action::Navigate + ) + })); + assert!(sent.iter().any(|message| { + matches!( + message, + AgentMessage::Command { action, .. } if action == &Action::Type + ) + })); +} + +#[test] +fn handle_browser_message_uses_compat_runtime_summary_when_deepseek_env_is_set() { + let _guard = env_lock().lock().unwrap_or_else(|err| err.into_inner()); + + let first_response = json!({ + "choices": [{ + "message": { + "content": "", + "tool_calls": [{ + "id": "call_1", + "type": "function", + "function": { + "name": "browser_action", + "arguments": serde_json::to_string(&json!({ + "action": "navigate", + "expected_domain": "www.baidu.com", + "url": "https://www.baidu.com" + })).unwrap() + } + }] + } + }] + }); + let second_response = json!({ + "choices": [{ + "message": { + "content": "来自 ZeroClaw runtime" + } + }] + }); + let (base_url, _, server_handle) = start_fake_deepseek_server(vec![first_response, second_response]); + + std::env::set_var("DEEPSEEK_API_KEY", "deepseek-test-key"); + std::env::set_var("DEEPSEEK_BASE_URL", base_url); + std::env::set_var("DEEPSEEK_MODEL", "deepseek-chat"); + + let workspace_root = temp_workspace_root(); + let original_dir = std::env::current_dir().unwrap(); + std::env::set_current_dir(&workspace_root).unwrap(); + + let transport = Arc::new(MockTransport::new(vec![BrowserMessage::Response { + seq: 1, + success: true, + data: json!({ "navigated": true }), + aom_snapshot: vec![], + timing: Timing { + queue_ms: 1, + exec_ms: 10, + }, + }])); + let browser_tool = BrowserPipeTool::new( + transport.clone(), + test_policy(), + vec![1, 2, 3, 4, 5, 6, 7, 8], + ) + .with_response_timeout(Duration::from_secs(1)); + + handle_browser_message( + transport.as_ref(), + &browser_tool, + BrowserMessage::SubmitTask { + instruction: "打开百度搜索天气".to_string(), + }, + ) + .unwrap(); + server_handle.join().unwrap(); + std::env::set_current_dir(original_dir).unwrap(); + + let sent = transport.sent_messages(); + + assert!(sent.iter().any(|message| { + matches!( + message, + AgentMessage::TaskComplete { success, summary } + if *success && summary == "来自 ZeroClaw runtime" + ) + })); +} diff --git a/tests/planner_test.rs b/tests/planner_test.rs index 9dc2f69..b275cd7 100644 --- a/tests/planner_test.rs +++ b/tests/planner_test.rs @@ -30,6 +30,24 @@ fn planner_supports_baidu_search_variant_with_conjunction() { assert_eq!(plan.steps[1].params["text"], "电网调度"); } +#[test] +fn planner_supports_zhihu_search_instruction_with_direct_search_url() { + let plan = plan_instruction("打开知乎搜索天气").unwrap(); + + assert_eq!(plan.summary, "已在知乎搜索天气"); + assert_eq!(plan.steps.len(), 1); + assert_eq!(plan.steps[0].action, Action::Navigate); + assert_eq!( + plan.steps[0].params, + json!({ "url": "https://www.zhihu.com/search?type=content&q=%E5%A4%A9%E6%B0%94" }) + ); + assert_eq!(plan.steps[0].expected_domain, "www.zhihu.com"); + assert_eq!( + plan.steps[0].log_message, + "navigate https://www.zhihu.com/search?type=content&q=%E5%A4%A9%E6%B0%94" + ); +} + #[test] fn planner_rejects_unrelated_instruction() { let err = plan_instruction("打开谷歌搜索天气").unwrap_err(); diff --git a/third_party/zeroclaw/.cargo/audit.toml b/third_party/zeroclaw/.cargo/audit.toml new file mode 100644 index 0000000..c078002 --- /dev/null +++ b/third_party/zeroclaw/.cargo/audit.toml @@ -0,0 +1,12 @@ +# cargo-audit configuration +# https://rustsec.org/ + +[advisories] +ignore = [ + # wasmtime vulns via extism 1.13.0 — no upstream fix; plugins feature-gated + "RUSTSEC-2026-0006", # wasmtime f64.copysign segfault on x86-64 + "RUSTSEC-2026-0020", # WASI guest-controlled resource exhaustion + "RUSTSEC-2026-0021", # WASI http fields panic + # instant crate unmaintained — transitive dep via nostr; no upstream fix + "RUSTSEC-2024-0384", +] diff --git a/third_party/zeroclaw/.cargo/config.toml b/third_party/zeroclaw/.cargo/config.toml new file mode 100644 index 0000000..279ce43 --- /dev/null +++ b/third_party/zeroclaw/.cargo/config.toml @@ -0,0 +1,13 @@ +[target.x86_64-unknown-linux-musl] +rustflags = ["-C", "link-arg=-static"] + +[target.aarch64-unknown-linux-musl] +rustflags = ["-C", "link-arg=-static", "-C", "link-arg=-Wl,-z,stack-size=8388608"] + +# Android targets (NDK toolchain) +[target.armv7-linux-androideabi] +linker = "armv7a-linux-androideabi21-clang" + +[target.aarch64-linux-android] +linker = "aarch64-linux-android21-clang" +rustflags = ["-C", "link-arg=-Wl,-z,stack-size=8388608"] diff --git a/third_party/zeroclaw/.claude/skills/github-issue/SKILL.md b/third_party/zeroclaw/.claude/skills/github-issue/SKILL.md new file mode 100644 index 0000000..2f793ca --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/github-issue/SKILL.md @@ -0,0 +1,133 @@ +# Skill: github-issue + +File a structured GitHub issue (bug report or feature request) for ZeroClaw interactively from Claude Code. + +## When to Use + +Trigger when the user wants to file a GitHub issue, report a bug, or request a feature for ZeroClaw. Keywords: "file issue", "report bug", "feature request", "open issue", "create issue", "github issue". + +## Instructions + +You are filing a GitHub issue against the ZeroClaw repository using structured issue forms. Follow this workflow exactly. + +### Step 1: Detect Issue Type and Read the Template + +Determine from the user's message whether this is a **bug report** or **feature request**. +- If unclear, use AskUserQuestion to ask: "Is this a bug report or a feature request?" + +Then read the corresponding issue template to understand the required fields: + +- Bug report: `.github/ISSUE_TEMPLATE/bug_report.yml` +- Feature request: `.github/ISSUE_TEMPLATE/feature_request.yml` + +Parse the YAML to extract: +- The `title` prefix (e.g. `[Bug]: `, `[Feature]: `) +- The `labels` array +- Each field in the `body` array: its `type` (dropdown, textarea, input, checkboxes, markdown), `id`, `attributes.label`, `attributes.options` (for dropdowns), `attributes.description`, `attributes.placeholder`, and `validations.required` + +This is the source of truth for what fields exist, what they're called, what options are available, and which are required. Do not assume or hardcode any field names or options — always derive them from the template file. + +### Step 2: Auto-Gather Context + +Before asking the user anything, silently gather environment and repo context: + +```bash +# Git context +git log --oneline -5 +git status --short +git diff --stat HEAD~1 2>/dev/null + +# For bug reports — environment detection +uname -s -r -m # OS info +sw_vers 2>/dev/null # macOS version +rustc --version 2>/dev/null # Rust version +cargo metadata --format-version=1 --no-deps 2>/dev/null | jq -r '.packages[] | select(.name=="zeroclaw") | .version' 2>/dev/null # ZeroClaw version +git rev-parse --short HEAD # commit SHA fallback +``` + +Also read recently changed files to infer the affected component and architecture impact. + +### Step 3: Pre-Fill and Present the Form + +Using the parsed template fields and gathered context, draft values for ALL fields from the template: + +- **dropdown** fields: select the most likely option from `attributes.options` based on context. For dropdowns where you're uncertain, note your best guess and flag it for the user. +- **textarea** fields: draft content based on the user's description, git context, and the field's `attributes.description`/`attributes.placeholder` for guidance on what's expected. +- **input** fields: fill with auto-detected values (versions, OS) or draft from user context. +- **checkboxes** fields: auto-check all items (the skill itself ensures compliance with the stated checks). +- **markdown** fields: skip these — they're informational headers, not form inputs. +- **optional fields** (where `validations.required` is false): fill if there's enough context, otherwise note "(optional — not enough context to fill)". + +Present the complete draft to the user in a clean readable format: + +``` +## Issue Draft: [Bug]: / [Feature]: <title> +**Labels**: <from template> + +### <Field Label> +<proposed value or selection> + +### <Field Label> +<proposed value> +... +``` + +Use AskUserQuestion to ask the user to review: +- "Here's the pre-filled issue. Please review and let me know what to change, or say 'submit' to file it." + +If the user requests changes, update the draft and re-present. Iterate until the user approves. + +### Step 4: Scope Guard + +Before final submission, analyze the collected content for scope creep: +- Does the bug report describe multiple independent defects? +- Does the feature request bundle unrelated changes? + +If multi-concept issues are detected: +1. Inform the user: "This issue appears to cover multiple distinct topics. Focused, single-concept issues are strongly preferred and more likely to be accepted." +2. Break down the distinct groups found. +3. Offer to file separate issues for each group, reusing shared context (environment, etc.). +4. Let the user decide: proceed as-is or split. + +### Step 5: Construct Issue Body + +Build the issue body as markdown sections matching GitHub's form-field rendering format. GitHub renders form-submitted issues with `### <Field Label>` sections, so use that exact structure. + +For each non-markdown field from the template, in order: + +```markdown +### <attributes.label> + +<value> +``` + +For optional fields with no content, use `_No response_` as the value (this matches GitHub's native rendering for empty optional fields). + +For checkbox fields, render each option as: +```markdown +- [X] <option label text> +``` + +### Step 6: Final Preview and Submit + +Show the final constructed issue (title + labels + full body) for one last confirmation. + +Then submit using a HEREDOC for the body to preserve formatting: + +```bash +gh issue create --title "<title prefix><user title>" --label "<label1>,<label2>" --body "$(cat <<'ISSUE_EOF' +<body content> +ISSUE_EOF +)" +``` + +Return the resulting issue URL to the user. + +### Important Rules + +- **Always read the template file** — never assume field names, options, or structure. The templates are the source of truth and may change over time. +- **Never include personal/sensitive data** in the issue. Redact secrets, tokens, emails, real names. +- **Use neutral project-scoped placeholders** per ZeroClaw's privacy contract. +- **One concept per issue** — enforce the scope guard. +- **Auto-detect, don't guess** — use real command output for environment fields. +- **Match GitHub's rendering** — use `### Field Label` sections so issues look consistent whether filed via web UI or this skill. diff --git a/third_party/zeroclaw/.claude/skills/github-pr/SKILL.md b/third_party/zeroclaw/.claude/skills/github-pr/SKILL.md new file mode 100644 index 0000000..e14be55 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/github-pr/SKILL.md @@ -0,0 +1,209 @@ +# Skill: github-pr + +Open or update a GitHub Pull Request for ZeroClaw. Handles creating new PRs with a fully filled-out template body, and updating existing PRs (title, body sections, labels, comments). Use this skill whenever the user wants to open a PR, create a pull request, update a PR, edit PR description, add labels to a PR, or sync a PR after new commits — even if they don't say "PR" explicitly (e.g., "submit this for review", "push and open for merge"). + +## Instructions + +This skill supports two modes: **Open** (create a new PR) and **Update** (edit an existing PR). Detect the mode from context — if there's already an open PR for the current branch and the user didn't say "open a new PR", default to update mode. + +The PR template at `.github/pull_request_template.md` is the source of truth for the PR body structure. Read it every time — never assume or hardcode section names, fields, or their order. The template may change over time and the skill should always reflect its current state. + +--- + +## Shared: Read the PR Template + +Before opening or updating a PR body, read `.github/pull_request_template.md` and parse it to understand: + +- The `## ` section headers (these are the top-level sections of the PR body) +- The bullet points, fields, and prompts within each section +- Which sections are marked `(required)` vs optional/recommended +- Any inline formatting conventions (backtick options, Yes/No fields, etc.) + +This parsed structure drives how you fill, present, and edit the PR body. + +--- + +## Mode: Open a New PR + +### Step 1: Gather Context + +Collect information to pre-fill the PR body. Run these in parallel: + +```bash +# Branch and commit context +git branch --show-current +git log master..HEAD --oneline +git diff master...HEAD --stat + +# Check if branch is pushed +git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null + +# Environment (for validation evidence) +rustc --version 2>/dev/null +``` + +Also review the changed files and commit messages to understand the nature of the change (bug fix, feature, refactor, docs, chore, etc.) and which subsystems are affected. + +### Step 2: Pre-Fill the Template + +Using the parsed template structure and gathered context, draft a complete PR body: + +- For each `## ` section from the template, fill in the bullet points and fields based on context from the commits, diff, and changed files. +- Use the field descriptions and placeholder text in the template as guidance for what each field expects. +- For Yes/No fields, infer from the diff (e.g., if no files in `src/security/` changed, security impact is likely all No). +- For required sections, always provide a substantive answer. For optional sections, fill if there's enough context, otherwise leave the template prompts in place. +- Draft a conventional commit-style PR title based on the changes (e.g., `feat(provider): add retry budget override`, `fix(channel): handle disconnect gracefully`, `chore(ci): update workflow targets`). + +### Step 3: Present Draft for Review + +Show the user the complete draft: + +``` +## PR Draft: <title> +**Branch**: <head> -> master +**Labels**: <suggested labels> + +<full body with all sections filled> +``` + +Ask the user to review: "Here's the pre-filled PR. Review and let me know what to change, or say 'submit' to open it." + +Iterate on changes until the user approves. + +### Step 4: Push and Create + +1. If the branch isn't pushed yet, push it: + ```bash + git push -u origin <branch> + ``` + +2. Create the PR using a HEREDOC for the body: + ```bash + gh pr create --title "<title>" --base master --body "$(cat <<'PR_BODY_EOF' + <full body> + PR_BODY_EOF + )" + ``` + +3. If labels were agreed on, add them: + ```bash + gh pr edit <number> --add-label "<label1>,<label2>" + ``` + +4. Return the PR URL to the user. + +--- + +## Mode: Update an Existing PR + +### Step 1: Identify the PR + +1. **If a PR number or URL is given**: use that directly. +2. **If on a branch with an open PR**: auto-detect: + ```bash + gh pr view --json number,title,body,labels,state,author,url,headRefName 2>/dev/null + ``` +3. **If neither**: ask the user for the PR number. + +Verify the current user is the PR author: +```bash +CURRENT_USER=$(gh api user --jq '.login') +PR_AUTHOR=$(gh pr view <number> --json author --jq '.author.login') +``` +If not the author, stop and inform the user. + +### Step 2: Fetch Current State + +```bash +gh pr view <number> --json number,title,body,labels,state,baseRefName,headRefName,url,author,reviewDecision,statusCheckRollup,commits +``` + +Display a summary: +``` +## PR #<number>: <title> +**State**: <open/closed/merged> +**Branch**: <head> -> <base> +**Labels**: <label list> +**Checks**: <pass/fail/pending> +**URL**: <url> +``` + +### Step 3: Determine What to Update + +Support these operations: + +| Operation | How | +|---|---| +| **Edit title** | `gh pr edit <number> --title "<new title>"` | +| **Edit full body** | `gh pr edit <number> --body "<new body>"` | +| **Add labels** | `gh pr edit <number> --add-label "<label1>,<label2>"` | +| **Remove labels** | `gh pr edit <number> --remove-label "<label1>"` | +| **Edit specific section** | Parse body by `## ` headers, modify target section, re-submit full body | +| **Add a comment** | `gh pr comment <number> --body "<comment>"` | +| **Link an issue** | Edit the linked-issue section in the body | +| **Smart update after new commits** | Re-analyze and suggest section updates | + +### Step 4: Handle Body Section Edits + +When editing a specific section: + +1. Parse the current PR body into sections by `## ` headers +2. Match the user's request to the corresponding section from the template +3. Show the current content of that section and the proposed replacement +4. On confirmation, modify only that section, reconstruct the full body, and submit + +### Step 5: Smart Update After New Commits + +When the user wants to sync the PR description after pushing new changes: + +1. Identify new commits: + ```bash + gh pr view <number> --json commits --jq '.commits[].messageHeadline' + git log <base>..<head> --oneline + git diff <base>...<head> --stat + ``` + +2. Re-read the PR template. Analyze which sections are now stale based on the new changes — use the template's section names and field descriptions to identify what needs updating rather than relying on hardcoded assumptions. + +3. Present proposed updates section-by-section and confirm before applying. + +### Step 6: Apply Updates + +For title/label changes, use direct `gh pr edit` flags. + +For body edits, use a HEREDOC: +```bash +gh pr edit <number> --body "$(cat <<'PR_BODY_EOF' +<full updated body> +PR_BODY_EOF +)" +``` + +For comments: +```bash +gh pr comment <number> --body "$(cat <<'COMMENT_EOF' +<comment text> +COMMENT_EOF +)" +``` + +### Step 7: Confirm + +Fetch and display the updated state: +```bash +gh pr view <number> --json number,title,labels,url +``` + +Return the PR URL. + +--- + +## Important Rules + +- **Always read `.github/pull_request_template.md`** before filling or editing a PR body. Never assume section names, fields, or structure — derive everything from the template. It's the source of truth and may change. +- **For updates, only modify requested sections.** Preserve everything else exactly as-is. +- **Always show diffs before applying body edits.** Present current vs proposed for each changed section. +- **Never include personal/sensitive data** in PR content per ZeroClaw's privacy contract. +- **For label changes**, only use labels that exist in the repository. Check with `gh label list` if unsure. +- **Fetch the latest body before editing** to avoid clobbering concurrent changes. +- **For new PRs**, push the branch before creating (with `-u` to set upstream tracking). diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/LICENSE.txt b/third_party/zeroclaw/.claude/skills/skill-creator/LICENSE.txt new file mode 100644 index 0000000..7a4a3ea --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/SKILL.md b/third_party/zeroclaw/.claude/skills/skill-creator/SKILL.md new file mode 100644 index 0000000..65b3a40 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/SKILL.md @@ -0,0 +1,485 @@ +--- +name: skill-creator +description: Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. +--- + +# Skill Creator + +A skill for creating new skills and iteratively improving them. + +At a high level, the process of creating a skill goes like this: + +- Decide what you want the skill to do and roughly how it should do it +- Write a draft of the skill +- Create a few test prompts and run claude-with-access-to-the-skill on them +- Help the user evaluate the results both qualitatively and quantitatively + - While the runs happen in the background, draft some quantitative evals if there aren't any (if there are some, you can either use as is or modify if you feel something needs to change about them). Then explain them to the user (or if they already existed, explain the ones that already exist) + - Use the `eval-viewer/generate_review.py` script to show the user the results for them to look at, and also let them look at the quantitative metrics +- Rewrite the skill based on feedback from the user's evaluation of the results (and also if there are any glaring flaws that become apparent from the quantitative benchmarks) +- Repeat until you're satisfied +- Expand the test set and try again at larger scale + +Your job when using this skill is to figure out where the user is in this process and then jump in and help them progress through these stages. So for instance, maybe they're like "I want to make a skill for X". You can help narrow down what they mean, write a draft, write the test cases, figure out how they want to evaluate, run all the prompts, and repeat. + +On the other hand, maybe they already have a draft of the skill. In this case you can go straight to the eval/iterate part of the loop. + +Of course, you should always be flexible and if the user is like "I don't need to run a bunch of evaluations, just vibe with me", you can do that instead. + +Then after the skill is done (but again, the order is flexible), you can also run the skill description improver, which we have a whole separate script for, to optimize the triggering of the skill. + +Cool? Cool. + +## Communicating with the user + +The skill creator is liable to be used by people across a wide range of familiarity with coding jargon. If you haven't heard (and how could you, it's only very recently that it started), there's a trend now where the power of Claude is inspiring plumbers to open up their terminals, parents and grandparents to google "how to install npm". On the other hand, the bulk of users are probably fairly computer-literate. + +So please pay attention to context cues to understand how to phrase your communication! In the default case, just to give you some idea: + +- "evaluation" and "benchmark" are borderline, but OK +- for "JSON" and "assertion" you want to see serious cues from the user that they know what those things are before using them without explaining them + +It's OK to briefly explain terms if you're in doubt, and feel free to clarify terms with a short definition if you're unsure if the user will get it. + +--- + +## Creating a skill + +### Capture Intent + +Start by understanding the user's intent. The current conversation might already contain a workflow the user wants to capture (e.g., they say "turn this into a skill"). If so, extract answers from the conversation history first — the tools used, the sequence of steps, corrections the user made, input/output formats observed. The user may need to fill the gaps, and should confirm before proceeding to the next step. + +1. What should this skill enable Claude to do? +2. When should this skill trigger? (what user phrases/contexts) +3. What's the expected output format? +4. Should we set up test cases to verify the skill works? Skills with objectively verifiable outputs (file transforms, data extraction, code generation, fixed workflow steps) benefit from test cases. Skills with subjective outputs (writing style, art) often don't need them. Suggest the appropriate default based on the skill type, but let the user decide. + +### Interview and Research + +Proactively ask questions about edge cases, input/output formats, example files, success criteria, and dependencies. Wait to write test prompts until you've got this part ironed out. + +Check available MCPs - if useful for research (searching docs, finding similar skills, looking up best practices), research in parallel via subagents if available, otherwise inline. Come prepared with context to reduce burden on the user. + +### Write the SKILL.md + +Based on the user interview, fill in these components: + +- **name**: Skill identifier +- **description**: When to trigger, what it does. This is the primary triggering mechanism - include both what the skill does AND specific contexts for when to use it. All "when to use" info goes here, not in the body. Note: currently Claude has a tendency to "undertrigger" skills -- to not use them when they'd be useful. To combat this, please make the skill descriptions a little bit "pushy". So for instance, instead of "How to build a simple fast dashboard to display internal Anthropic data.", you might write "How to build a simple fast dashboard to display internal Anthropic data. Make sure to use this skill whenever the user mentions dashboards, data visualization, internal metrics, or wants to display any kind of company data, even if they don't explicitly ask for a 'dashboard.'" +- **compatibility**: Required tools, dependencies (optional, rarely needed) +- **the rest of the skill :)** + +### Skill Writing Guide + +#### Anatomy of a Skill + +``` +skill-name/ +├── SKILL.md (required) +│ ├── YAML frontmatter (name, description required) +│ └── Markdown instructions +└── Bundled Resources (optional) + ├── scripts/ - Executable code for deterministic/repetitive tasks + ├── references/ - Docs loaded into context as needed + └── assets/ - Files used in output (templates, icons, fonts) +``` + +#### Progressive Disclosure + +Skills use a three-level loading system: +1. **Metadata** (name + description) - Always in context (~100 words) +2. **SKILL.md body** - In context whenever skill triggers (<500 lines ideal) +3. **Bundled resources** - As needed (unlimited, scripts can execute without loading) + +These word counts are approximate and you can feel free to go longer if needed. + +**Key patterns:** +- Keep SKILL.md under 500 lines; if you're approaching this limit, add an additional layer of hierarchy along with clear pointers about where the model using the skill should go next to follow up. +- Reference files clearly from SKILL.md with guidance on when to read them +- For large reference files (>300 lines), include a table of contents + +**Domain organization**: When a skill supports multiple domains/frameworks, organize by variant: +``` +cloud-deploy/ +├── SKILL.md (workflow + selection) +└── references/ + ├── aws.md + ├── gcp.md + └── azure.md +``` +Claude reads only the relevant reference file. + +#### Principle of Lack of Surprise + +This goes without saying, but skills must not contain malware, exploit code, or any content that could compromise system security. A skill's contents should not surprise the user in their intent if described. Don't go along with requests to create misleading skills or skills designed to facilitate unauthorized access, data exfiltration, or other malicious activities. Things like a "roleplay as an XYZ" are OK though. + +#### Writing Patterns + +Prefer using the imperative form in instructions. + +**Defining output formats** - You can do it like this: +```markdown +## Report structure +ALWAYS use this exact template: +# [Title] +## Executive summary +## Key findings +## Recommendations +``` + +**Examples pattern** - It's useful to include examples. You can format them like this (but if "Input" and "Output" are in the examples you might want to deviate a little): +```markdown +## Commit message format +**Example 1:** +Input: Added user authentication with JWT tokens +Output: feat(auth): implement JWT-based authentication +``` + +### Writing Style + +Try to explain to the model why things are important in lieu of heavy-handed musty MUSTs. Use theory of mind and try to make the skill general and not super-narrow to specific examples. Start by writing a draft and then look at it with fresh eyes and improve it. + +### Test Cases + +After writing the skill draft, come up with 2-3 realistic test prompts — the kind of thing a real user would actually say. Share them with the user: [you don't have to use this exact language] "Here are a few test cases I'd like to try. Do these look right, or do you want to add more?" Then run them. + +Save test cases to `evals/evals.json`. Don't write assertions yet — just the prompts. You'll draft assertions in the next step while the runs are in progress. + +```json +{ + "skill_name": "example-skill", + "evals": [ + { + "id": 1, + "prompt": "User's task prompt", + "expected_output": "Description of expected result", + "files": [] + } + ] +} +``` + +See `references/schemas.md` for the full schema (including the `assertions` field, which you'll add later). + +## Running and evaluating test cases + +This section is one continuous sequence — don't stop partway through. Do NOT use `/skill-test` or any other testing skill. + +Put results in `<skill-name>-workspace/` as a sibling to the skill directory. Within the workspace, organize results by iteration (`iteration-1/`, `iteration-2/`, etc.) and within that, each test case gets a directory (`eval-0/`, `eval-1/`, etc.). Don't create all of this upfront — just create directories as you go. + +### Step 1: Spawn all runs (with-skill AND baseline) in the same turn + +For each test case, spawn two subagents in the same turn — one with the skill, one without. This is important: don't spawn the with-skill runs first and then come back for baselines later. Launch everything at once so it all finishes around the same time. + +**With-skill run:** + +``` +Execute this task: +- Skill path: <path-to-skill> +- Task: <eval prompt> +- Input files: <eval files if any, or "none"> +- Save outputs to: <workspace>/iteration-<N>/eval-<ID>/with_skill/outputs/ +- Outputs to save: <what the user cares about — e.g., "the .docx file", "the final CSV"> +``` + +**Baseline run** (same prompt, but the baseline depends on context): +- **Creating a new skill**: no skill at all. Same prompt, no skill path, save to `without_skill/outputs/`. +- **Improving an existing skill**: the old version. Before editing, snapshot the skill (`cp -r <skill-path> <workspace>/skill-snapshot/`), then point the baseline subagent at the snapshot. Save to `old_skill/outputs/`. + +Write an `eval_metadata.json` for each test case (assertions can be empty for now). Give each eval a descriptive name based on what it's testing — not just "eval-0". Use this name for the directory too. If this iteration uses new or modified eval prompts, create these files for each new eval directory — don't assume they carry over from previous iterations. + +```json +{ + "eval_id": 0, + "eval_name": "descriptive-name-here", + "prompt": "The user's task prompt", + "assertions": [] +} +``` + +### Step 2: While runs are in progress, draft assertions + +Don't just wait for the runs to finish — you can use this time productively. Draft quantitative assertions for each test case and explain them to the user. If assertions already exist in `evals/evals.json`, review them and explain what they check. + +Good assertions are objectively verifiable and have descriptive names — they should read clearly in the benchmark viewer so someone glancing at the results immediately understands what each one checks. Subjective skills (writing style, design quality) are better evaluated qualitatively — don't force assertions onto things that need human judgment. + +Update the `eval_metadata.json` files and `evals/evals.json` with the assertions once drafted. Also explain to the user what they'll see in the viewer — both the qualitative outputs and the quantitative benchmark. + +### Step 3: As runs complete, capture timing data + +When each subagent task completes, you receive a notification containing `total_tokens` and `duration_ms`. Save this data immediately to `timing.json` in the run directory: + +```json +{ + "total_tokens": 84852, + "duration_ms": 23332, + "total_duration_seconds": 23.3 +} +``` + +This is the only opportunity to capture this data — it comes through the task notification and isn't persisted elsewhere. Process each notification as it arrives rather than trying to batch them. + +### Step 4: Grade, aggregate, and launch the viewer + +Once all runs are done: + +1. **Grade each run** — spawn a grader subagent (or grade inline) that reads `agents/grader.md` and evaluates each assertion against the outputs. Save results to `grading.json` in each run directory. The grading.json expectations array must use the fields `text`, `passed`, and `evidence` (not `name`/`met`/`details` or other variants) — the viewer depends on these exact field names. For assertions that can be checked programmatically, write and run a script rather than eyeballing it — scripts are faster, more reliable, and can be reused across iterations. + +2. **Aggregate into benchmark** — run the aggregation script from the skill-creator directory: + ```bash + python -m scripts.aggregate_benchmark <workspace>/iteration-N --skill-name <name> + ``` + This produces `benchmark.json` and `benchmark.md` with pass_rate, time, and tokens for each configuration, with mean ± stddev and the delta. If generating benchmark.json manually, see `references/schemas.md` for the exact schema the viewer expects. +Put each with_skill version before its baseline counterpart. + +3. **Do an analyst pass** — read the benchmark data and surface patterns the aggregate stats might hide. See `agents/analyzer.md` (the "Analyzing Benchmark Results" section) for what to look for — things like assertions that always pass regardless of skill (non-discriminating), high-variance evals (possibly flaky), and time/token tradeoffs. + +4. **Launch the viewer** with both qualitative outputs and quantitative data: + ```bash + nohup python <skill-creator-path>/eval-viewer/generate_review.py \ + <workspace>/iteration-N \ + --skill-name "my-skill" \ + --benchmark <workspace>/iteration-N/benchmark.json \ + > /dev/null 2>&1 & + VIEWER_PID=$! + ``` + For iteration 2+, also pass `--previous-workspace <workspace>/iteration-<N-1>`. + + **Cowork / headless environments:** If `webbrowser.open()` is not available or the environment has no display, use `--static <output_path>` to write a standalone HTML file instead of starting a server. Feedback will be downloaded as a `feedback.json` file when the user clicks "Submit All Reviews". After download, copy `feedback.json` into the workspace directory for the next iteration to pick up. + +Note: please use generate_review.py to create the viewer; there's no need to write custom HTML. + +5. **Tell the user** something like: "I've opened the results in your browser. There are two tabs — 'Outputs' lets you click through each test case and leave feedback, 'Benchmark' shows the quantitative comparison. When you're done, come back here and let me know." + +### What the user sees in the viewer + +The "Outputs" tab shows one test case at a time: +- **Prompt**: the task that was given +- **Output**: the files the skill produced, rendered inline where possible +- **Previous Output** (iteration 2+): collapsed section showing last iteration's output +- **Formal Grades** (if grading was run): collapsed section showing assertion pass/fail +- **Feedback**: a textbox that auto-saves as they type +- **Previous Feedback** (iteration 2+): their comments from last time, shown below the textbox + +The "Benchmark" tab shows the stats summary: pass rates, timing, and token usage for each configuration, with per-eval breakdowns and analyst observations. + +Navigation is via prev/next buttons or arrow keys. When done, they click "Submit All Reviews" which saves all feedback to `feedback.json`. + +### Step 5: Read the feedback + +When the user tells you they're done, read `feedback.json`: + +```json +{ + "reviews": [ + {"run_id": "eval-0-with_skill", "feedback": "the chart is missing axis labels", "timestamp": "..."}, + {"run_id": "eval-1-with_skill", "feedback": "", "timestamp": "..."}, + {"run_id": "eval-2-with_skill", "feedback": "perfect, love this", "timestamp": "..."} + ], + "status": "complete" +} +``` + +Empty feedback means the user thought it was fine. Focus your improvements on the test cases where the user had specific complaints. + +Kill the viewer server when you're done with it: + +```bash +kill $VIEWER_PID 2>/dev/null +``` + +--- + +## Improving the skill + +This is the heart of the loop. You've run the test cases, the user has reviewed the results, and now you need to make the skill better based on their feedback. + +### How to think about improvements + +1. **Generalize from the feedback.** The big picture thing that's happening here is that we're trying to create skills that can be used a million times (maybe literally, maybe even more who knows) across many different prompts. Here you and the user are iterating on only a few examples over and over again because it helps move faster. The user knows these examples in and out and it's quick for them to assess new outputs. But if the skill you and the user are codeveloping works only for those examples, it's useless. Rather than put in fiddly overfitty changes, or oppressively constrictive MUSTs, if there's some stubborn issue, you might try branching out and using different metaphors, or recommending different patterns of working. It's relatively cheap to try and maybe you'll land on something great. + +2. **Keep the prompt lean.** Remove things that aren't pulling their weight. Make sure to read the transcripts, not just the final outputs — if it looks like the skill is making the model waste a bunch of time doing things that are unproductive, you can try getting rid of the parts of the skill that are making it do that and seeing what happens. + +3. **Explain the why.** Try hard to explain the **why** behind everything you're asking the model to do. Today's LLMs are *smart*. They have good theory of mind and when given a good harness can go beyond rote instructions and really make things happen. Even if the feedback from the user is terse or frustrated, try to actually understand the task and why the user is writing what they wrote, and what they actually wrote, and then transmit this understanding into the instructions. If you find yourself writing ALWAYS or NEVER in all caps, or using super rigid structures, that's a yellow flag — if possible, reframe and explain the reasoning so that the model understands why the thing you're asking for is important. That's a more humane, powerful, and effective approach. + +4. **Look for repeated work across test cases.** Read the transcripts from the test runs and notice if the subagents all independently wrote similar helper scripts or took the same multi-step approach to something. If all 3 test cases resulted in the subagent writing a `create_docx.py` or a `build_chart.py`, that's a strong signal the skill should bundle that script. Write it once, put it in `scripts/`, and tell the skill to use it. This saves every future invocation from reinventing the wheel. + +This task is pretty important (we are trying to create billions a year in economic value here!) and your thinking time is not the blocker; take your time and really mull things over. I'd suggest writing a draft revision and then looking at it anew and making improvements. Really do your best to get into the head of the user and understand what they want and need. + +### The iteration loop + +After improving the skill: + +1. Apply your improvements to the skill +2. Rerun all test cases into a new `iteration-<N+1>/` directory, including baseline runs. If you're creating a new skill, the baseline is always `without_skill` (no skill) — that stays the same across iterations. If you're improving an existing skill, use your judgment on what makes sense as the baseline: the original version the user came in with, or the previous iteration. +3. Launch the reviewer with `--previous-workspace` pointing at the previous iteration +4. Wait for the user to review and tell you they're done +5. Read the new feedback, improve again, repeat + +Keep going until: +- The user says they're happy +- The feedback is all empty (everything looks good) +- You're not making meaningful progress + +--- + +## Advanced: Blind comparison + +For situations where you want a more rigorous comparison between two versions of a skill (e.g., the user asks "is the new version actually better?"), there's a blind comparison system. Read `agents/comparator.md` and `agents/analyzer.md` for the details. The basic idea is: give two outputs to an independent agent without telling it which is which, and let it judge quality. Then analyze why the winner won. + +This is optional, requires subagents, and most users won't need it. The human review loop is usually sufficient. + +--- + +## Description Optimization + +The description field in SKILL.md frontmatter is the primary mechanism that determines whether Claude invokes a skill. After creating or improving a skill, offer to optimize the description for better triggering accuracy. + +### Step 1: Generate trigger eval queries + +Create 20 eval queries — a mix of should-trigger and should-not-trigger. Save as JSON: + +```json +[ + {"query": "the user prompt", "should_trigger": true}, + {"query": "another prompt", "should_trigger": false} +] +``` + +The queries must be realistic and something a Claude Code or Claude.ai user would actually type. Not abstract requests, but requests that are concrete and specific and have a good amount of detail. For instance, file paths, personal context about the user's job or situation, column names and values, company names, URLs. A little bit of backstory. Some might be in lowercase or contain abbreviations or typos or casual speech. Use a mix of different lengths, and focus on edge cases rather than making them clear-cut (the user will get a chance to sign off on them). + +Bad: `"Format this data"`, `"Extract text from PDF"`, `"Create a chart"` + +Good: `"ok so my boss just sent me this xlsx file (its in my downloads, called something like 'Q4 sales final FINAL v2.xlsx') and she wants me to add a column that shows the profit margin as a percentage. The revenue is in column C and costs are in column D i think"` + +For the **should-trigger** queries (8-10), think about coverage. You want different phrasings of the same intent — some formal, some casual. Include cases where the user doesn't explicitly name the skill or file type but clearly needs it. Throw in some uncommon use cases and cases where this skill competes with another but should win. + +For the **should-not-trigger** queries (8-10), the most valuable ones are the near-misses — queries that share keywords or concepts with the skill but actually need something different. Think adjacent domains, ambiguous phrasing where a naive keyword match would trigger but shouldn't, and cases where the query touches on something the skill does but in a context where another tool is more appropriate. + +The key thing to avoid: don't make should-not-trigger queries obviously irrelevant. "Write a fibonacci function" as a negative test for a PDF skill is too easy — it doesn't test anything. The negative cases should be genuinely tricky. + +### Step 2: Review with user + +Present the eval set to the user for review using the HTML template: + +1. Read the template from `assets/eval_review.html` +2. Replace the placeholders: + - `__EVAL_DATA_PLACEHOLDER__` → the JSON array of eval items (no quotes around it — it's a JS variable assignment) + - `__SKILL_NAME_PLACEHOLDER__` → the skill's name + - `__SKILL_DESCRIPTION_PLACEHOLDER__` → the skill's current description +3. Write to a temp file (e.g., `/tmp/eval_review_<skill-name>.html`) and open it: `open /tmp/eval_review_<skill-name>.html` +4. The user can edit queries, toggle should-trigger, add/remove entries, then click "Export Eval Set" +5. The file downloads to `~/Downloads/eval_set.json` — check the Downloads folder for the most recent version in case there are multiple (e.g., `eval_set (1).json`) + +This step matters — bad eval queries lead to bad descriptions. + +### Step 3: Run the optimization loop + +Tell the user: "This will take some time — I'll run the optimization loop in the background and check on it periodically." + +Save the eval set to the workspace, then run in the background: + +```bash +python -m scripts.run_loop \ + --eval-set <path-to-trigger-eval.json> \ + --skill-path <path-to-skill> \ + --model <model-id-powering-this-session> \ + --max-iterations 5 \ + --verbose +``` + +Use the model ID from your system prompt (the one powering the current session) so the triggering test matches what the user actually experiences. + +While it runs, periodically tail the output to give the user updates on which iteration it's on and what the scores look like. + +This handles the full optimization loop automatically. It splits the eval set into 60% train and 40% held-out test, evaluates the current description (running each query 3 times to get a reliable trigger rate), then calls Claude to propose improvements based on what failed. It re-evaluates each new description on both train and test, iterating up to 5 times. When it's done, it opens an HTML report in the browser showing the results per iteration and returns JSON with `best_description` — selected by test score rather than train score to avoid overfitting. + +### How skill triggering works + +Understanding the triggering mechanism helps design better eval queries. Skills appear in Claude's `available_skills` list with their name + description, and Claude decides whether to consult a skill based on that description. The important thing to know is that Claude only consults skills for tasks it can't easily handle on its own — simple, one-step queries like "read this PDF" may not trigger a skill even if the description matches perfectly, because Claude can handle them directly with basic tools. Complex, multi-step, or specialized queries reliably trigger skills when the description matches. + +This means your eval queries should be substantive enough that Claude would actually benefit from consulting a skill. Simple queries like "read file X" are poor test cases — they won't trigger skills regardless of description quality. + +### Step 4: Apply the result + +Take `best_description` from the JSON output and update the skill's SKILL.md frontmatter. Show the user before/after and report the scores. + +--- + +### Package and Present (only if `present_files` tool is available) + +Check whether you have access to the `present_files` tool. If you don't, skip this step. If you do, package the skill and present the .skill file to the user: + +```bash +python -m scripts.package_skill <path/to/skill-folder> +``` + +After packaging, direct the user to the resulting `.skill` file path so they can install it. + +--- + +## Claude.ai-specific instructions + +In Claude.ai, the core workflow is the same (draft → test → review → improve → repeat), but because Claude.ai doesn't have subagents, some mechanics change. Here's what to adapt: + +**Running test cases**: No subagents means no parallel execution. For each test case, read the skill's SKILL.md, then follow its instructions to accomplish the test prompt yourself. Do them one at a time. This is less rigorous than independent subagents (you wrote the skill and you're also running it, so you have full context), but it's a useful sanity check — and the human review step compensates. Skip the baseline runs — just use the skill to complete the task as requested. + +**Reviewing results**: If you can't open a browser (e.g., Claude.ai's VM has no display, or you're on a remote server), skip the browser reviewer entirely. Instead, present results directly in the conversation. For each test case, show the prompt and the output. If the output is a file the user needs to see (like a .docx or .xlsx), save it to the filesystem and tell them where it is so they can download and inspect it. Ask for feedback inline: "How does this look? Anything you'd change?" + +**Benchmarking**: Skip the quantitative benchmarking — it relies on baseline comparisons which aren't meaningful without subagents. Focus on qualitative feedback from the user. + +**The iteration loop**: Same as before — improve the skill, rerun the test cases, ask for feedback — just without the browser reviewer in the middle. You can still organize results into iteration directories on the filesystem if you have one. + +**Description optimization**: This section requires the `claude` CLI tool (specifically `claude -p`) which is only available in Claude Code. Skip it if you're on Claude.ai. + +**Blind comparison**: Requires subagents. Skip it. + +**Packaging**: The `package_skill.py` script works anywhere with Python and a filesystem. On Claude.ai, you can run it and the user can download the resulting `.skill` file. + +**Updating an existing skill**: The user might be asking you to update an existing skill, not create a new one. In this case: +- **Preserve the original name.** Note the skill's directory name and `name` frontmatter field -- use them unchanged. E.g., if the installed skill is `research-helper`, output `research-helper.skill` (not `research-helper-v2`). +- **Copy to a writeable location before editing.** The installed skill path may be read-only. Copy to `/tmp/skill-name/`, edit there, and package from the copy. +- **If packaging manually, stage in `/tmp/` first**, then copy to the output directory -- direct writes may fail due to permissions. + +--- + +## Cowork-Specific Instructions + +If you're in Cowork, the main things to know are: + +- You have subagents, so the main workflow (spawn test cases in parallel, run baselines, grade, etc.) all works. (However, if you run into severe problems with timeouts, it's OK to run the test prompts in series rather than parallel.) +- You don't have a browser or display, so when generating the eval viewer, use `--static <output_path>` to write a standalone HTML file instead of starting a server. Then proffer a link that the user can click to open the HTML in their browser. +- For whatever reason, the Cowork setup seems to disincline Claude from generating the eval viewer after running the tests, so just to reiterate: whether you're in Cowork or in Claude Code, after running tests, you should always generate the eval viewer for the human to look at examples before revising the skill yourself and trying to make corrections, using `generate_review.py` (not writing your own boutique html code). Sorry in advance but I'm gonna go all caps here: GENERATE THE EVAL VIEWER *BEFORE* evaluating inputs yourself. You want to get them in front of the human ASAP! +- Feedback works differently: since there's no running server, the viewer's "Submit All Reviews" button will download `feedback.json` as a file. You can then read it from there (you may have to request access first). +- Packaging works — `package_skill.py` just needs Python and a filesystem. +- Description optimization (`run_loop.py` / `run_eval.py`) should work in Cowork just fine since it uses `claude -p` via subprocess, not a browser, but please save it until you've fully finished making the skill and the user agrees it's in good shape. +- **Updating an existing skill**: The user might be asking you to update an existing skill, not create a new one. Follow the update guidance in the claude.ai section above. + +--- + +## Reference files + +The agents/ directory contains instructions for specialized subagents. Read them when you need to spawn the relevant subagent. + +- `agents/grader.md` — How to evaluate assertions against outputs +- `agents/comparator.md` — How to do blind A/B comparison between two outputs +- `agents/analyzer.md` — How to analyze why one version beat another + +The references/ directory has additional documentation: +- `references/schemas.md` — JSON structures for evals.json, grading.json, etc. + +--- + +Repeating one more time the core loop here for emphasis: + +- Figure out what the skill is about +- Draft or edit the skill +- Run claude-with-access-to-the-skill on test prompts +- With the user, evaluate the outputs: + - Create benchmark.json and run `eval-viewer/generate_review.py` to help the user review them + - Run quantitative evals +- Repeat until you and the user are satisfied +- Package the final skill and return it to the user. + +Please add steps to your TodoList, if you have such a thing, to make sure you don't forget. If you're in Cowork, please specifically put "Create evals JSON and run `eval-viewer/generate_review.py` so human can review test cases" in your TodoList to make sure it happens. + +Good luck! diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/agents/analyzer.md b/third_party/zeroclaw/.claude/skills/skill-creator/agents/analyzer.md new file mode 100644 index 0000000..14e41d6 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/agents/analyzer.md @@ -0,0 +1,274 @@ +# Post-hoc Analyzer Agent + +Analyze blind comparison results to understand WHY the winner won and generate improvement suggestions. + +## Role + +After the blind comparator determines a winner, the Post-hoc Analyzer "unblids" the results by examining the skills and transcripts. The goal is to extract actionable insights: what made the winner better, and how can the loser be improved? + +## Inputs + +You receive these parameters in your prompt: + +- **winner**: "A" or "B" (from blind comparison) +- **winner_skill_path**: Path to the skill that produced the winning output +- **winner_transcript_path**: Path to the execution transcript for the winner +- **loser_skill_path**: Path to the skill that produced the losing output +- **loser_transcript_path**: Path to the execution transcript for the loser +- **comparison_result_path**: Path to the blind comparator's output JSON +- **output_path**: Where to save the analysis results + +## Process + +### Step 1: Read Comparison Result + +1. Read the blind comparator's output at comparison_result_path +2. Note the winning side (A or B), the reasoning, and any scores +3. Understand what the comparator valued in the winning output + +### Step 2: Read Both Skills + +1. Read the winner skill's SKILL.md and key referenced files +2. Read the loser skill's SKILL.md and key referenced files +3. Identify structural differences: + - Instructions clarity and specificity + - Script/tool usage patterns + - Example coverage + - Edge case handling + +### Step 3: Read Both Transcripts + +1. Read the winner's transcript +2. Read the loser's transcript +3. Compare execution patterns: + - How closely did each follow their skill's instructions? + - What tools were used differently? + - Where did the loser diverge from optimal behavior? + - Did either encounter errors or make recovery attempts? + +### Step 4: Analyze Instruction Following + +For each transcript, evaluate: +- Did the agent follow the skill's explicit instructions? +- Did the agent use the skill's provided tools/scripts? +- Were there missed opportunities to leverage skill content? +- Did the agent add unnecessary steps not in the skill? + +Score instruction following 1-10 and note specific issues. + +### Step 5: Identify Winner Strengths + +Determine what made the winner better: +- Clearer instructions that led to better behavior? +- Better scripts/tools that produced better output? +- More comprehensive examples that guided edge cases? +- Better error handling guidance? + +Be specific. Quote from skills/transcripts where relevant. + +### Step 6: Identify Loser Weaknesses + +Determine what held the loser back: +- Ambiguous instructions that led to suboptimal choices? +- Missing tools/scripts that forced workarounds? +- Gaps in edge case coverage? +- Poor error handling that caused failures? + +### Step 7: Generate Improvement Suggestions + +Based on the analysis, produce actionable suggestions for improving the loser skill: +- Specific instruction changes to make +- Tools/scripts to add or modify +- Examples to include +- Edge cases to address + +Prioritize by impact. Focus on changes that would have changed the outcome. + +### Step 8: Write Analysis Results + +Save structured analysis to `{output_path}`. + +## Output Format + +Write a JSON file with this structure: + +```json +{ + "comparison_summary": { + "winner": "A", + "winner_skill": "path/to/winner/skill", + "loser_skill": "path/to/loser/skill", + "comparator_reasoning": "Brief summary of why comparator chose winner" + }, + "winner_strengths": [ + "Clear step-by-step instructions for handling multi-page documents", + "Included validation script that caught formatting errors", + "Explicit guidance on fallback behavior when OCR fails" + ], + "loser_weaknesses": [ + "Vague instruction 'process the document appropriately' led to inconsistent behavior", + "No script for validation, agent had to improvise and made errors", + "No guidance on OCR failure, agent gave up instead of trying alternatives" + ], + "instruction_following": { + "winner": { + "score": 9, + "issues": [ + "Minor: skipped optional logging step" + ] + }, + "loser": { + "score": 6, + "issues": [ + "Did not use the skill's formatting template", + "Invented own approach instead of following step 3", + "Missed the 'always validate output' instruction" + ] + } + }, + "improvement_suggestions": [ + { + "priority": "high", + "category": "instructions", + "suggestion": "Replace 'process the document appropriately' with explicit steps: 1) Extract text, 2) Identify sections, 3) Format per template", + "expected_impact": "Would eliminate ambiguity that caused inconsistent behavior" + }, + { + "priority": "high", + "category": "tools", + "suggestion": "Add validate_output.py script similar to winner skill's validation approach", + "expected_impact": "Would catch formatting errors before final output" + }, + { + "priority": "medium", + "category": "error_handling", + "suggestion": "Add fallback instructions: 'If OCR fails, try: 1) different resolution, 2) image preprocessing, 3) manual extraction'", + "expected_impact": "Would prevent early failure on difficult documents" + } + ], + "transcript_insights": { + "winner_execution_pattern": "Read skill -> Followed 5-step process -> Used validation script -> Fixed 2 issues -> Produced output", + "loser_execution_pattern": "Read skill -> Unclear on approach -> Tried 3 different methods -> No validation -> Output had errors" + } +} +``` + +## Guidelines + +- **Be specific**: Quote from skills and transcripts, don't just say "instructions were unclear" +- **Be actionable**: Suggestions should be concrete changes, not vague advice +- **Focus on skill improvements**: The goal is to improve the losing skill, not critique the agent +- **Prioritize by impact**: Which changes would most likely have changed the outcome? +- **Consider causation**: Did the skill weakness actually cause the worse output, or is it incidental? +- **Stay objective**: Analyze what happened, don't editorialize +- **Think about generalization**: Would this improvement help on other evals too? + +## Categories for Suggestions + +Use these categories to organize improvement suggestions: + +| Category | Description | +|----------|-------------| +| `instructions` | Changes to the skill's prose instructions | +| `tools` | Scripts, templates, or utilities to add/modify | +| `examples` | Example inputs/outputs to include | +| `error_handling` | Guidance for handling failures | +| `structure` | Reorganization of skill content | +| `references` | External docs or resources to add | + +## Priority Levels + +- **high**: Would likely change the outcome of this comparison +- **medium**: Would improve quality but may not change win/loss +- **low**: Nice to have, marginal improvement + +--- + +# Analyzing Benchmark Results + +When analyzing benchmark results, the analyzer's purpose is to **surface patterns and anomalies** across multiple runs, not suggest skill improvements. + +## Role + +Review all benchmark run results and generate freeform notes that help the user understand skill performance. Focus on patterns that wouldn't be visible from aggregate metrics alone. + +## Inputs + +You receive these parameters in your prompt: + +- **benchmark_data_path**: Path to the in-progress benchmark.json with all run results +- **skill_path**: Path to the skill being benchmarked +- **output_path**: Where to save the notes (as JSON array of strings) + +## Process + +### Step 1: Read Benchmark Data + +1. Read the benchmark.json containing all run results +2. Note the configurations tested (with_skill, without_skill) +3. Understand the run_summary aggregates already calculated + +### Step 2: Analyze Per-Assertion Patterns + +For each expectation across all runs: +- Does it **always pass** in both configurations? (may not differentiate skill value) +- Does it **always fail** in both configurations? (may be broken or beyond capability) +- Does it **always pass with skill but fail without**? (skill clearly adds value here) +- Does it **always fail with skill but pass without**? (skill may be hurting) +- Is it **highly variable**? (flaky expectation or non-deterministic behavior) + +### Step 3: Analyze Cross-Eval Patterns + +Look for patterns across evals: +- Are certain eval types consistently harder/easier? +- Do some evals show high variance while others are stable? +- Are there surprising results that contradict expectations? + +### Step 4: Analyze Metrics Patterns + +Look at time_seconds, tokens, tool_calls: +- Does the skill significantly increase execution time? +- Is there high variance in resource usage? +- Are there outlier runs that skew the aggregates? + +### Step 5: Generate Notes + +Write freeform observations as a list of strings. Each note should: +- State a specific observation +- Be grounded in the data (not speculation) +- Help the user understand something the aggregate metrics don't show + +Examples: +- "Assertion 'Output is a PDF file' passes 100% in both configurations - may not differentiate skill value" +- "Eval 3 shows high variance (50% ± 40%) - run 2 had an unusual failure that may be flaky" +- "Without-skill runs consistently fail on table extraction expectations (0% pass rate)" +- "Skill adds 13s average execution time but improves pass rate by 50%" +- "Token usage is 80% higher with skill, primarily due to script output parsing" +- "All 3 without-skill runs for eval 1 produced empty output" + +### Step 6: Write Notes + +Save notes to `{output_path}` as a JSON array of strings: + +```json +[ + "Assertion 'Output is a PDF file' passes 100% in both configurations - may not differentiate skill value", + "Eval 3 shows high variance (50% ± 40%) - run 2 had an unusual failure", + "Without-skill runs consistently fail on table extraction expectations", + "Skill adds 13s average execution time but improves pass rate by 50%" +] +``` + +## Guidelines + +**DO:** +- Report what you observe in the data +- Be specific about which evals, expectations, or runs you're referring to +- Note patterns that aggregate metrics would hide +- Provide context that helps interpret the numbers + +**DO NOT:** +- Suggest improvements to the skill (that's for the improvement step, not benchmarking) +- Make subjective quality judgments ("the output was good/bad") +- Speculate about causes without evidence +- Repeat information already in the run_summary aggregates diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/agents/comparator.md b/third_party/zeroclaw/.claude/skills/skill-creator/agents/comparator.md new file mode 100644 index 0000000..80e00eb --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/agents/comparator.md @@ -0,0 +1,202 @@ +# Blind Comparator Agent + +Compare two outputs WITHOUT knowing which skill produced them. + +## Role + +The Blind Comparator judges which output better accomplishes the eval task. You receive two outputs labeled A and B, but you do NOT know which skill produced which. This prevents bias toward a particular skill or approach. + +Your judgment is based purely on output quality and task completion. + +## Inputs + +You receive these parameters in your prompt: + +- **output_a_path**: Path to the first output file or directory +- **output_b_path**: Path to the second output file or directory +- **eval_prompt**: The original task/prompt that was executed +- **expectations**: List of expectations to check (optional - may be empty) + +## Process + +### Step 1: Read Both Outputs + +1. Examine output A (file or directory) +2. Examine output B (file or directory) +3. Note the type, structure, and content of each +4. If outputs are directories, examine all relevant files inside + +### Step 2: Understand the Task + +1. Read the eval_prompt carefully +2. Identify what the task requires: + - What should be produced? + - What qualities matter (accuracy, completeness, format)? + - What would distinguish a good output from a poor one? + +### Step 3: Generate Evaluation Rubric + +Based on the task, generate a rubric with two dimensions: + +**Content Rubric** (what the output contains): +| Criterion | 1 (Poor) | 3 (Acceptable) | 5 (Excellent) | +|-----------|----------|----------------|---------------| +| Correctness | Major errors | Minor errors | Fully correct | +| Completeness | Missing key elements | Mostly complete | All elements present | +| Accuracy | Significant inaccuracies | Minor inaccuracies | Accurate throughout | + +**Structure Rubric** (how the output is organized): +| Criterion | 1 (Poor) | 3 (Acceptable) | 5 (Excellent) | +|-----------|----------|----------------|---------------| +| Organization | Disorganized | Reasonably organized | Clear, logical structure | +| Formatting | Inconsistent/broken | Mostly consistent | Professional, polished | +| Usability | Difficult to use | Usable with effort | Easy to use | + +Adapt criteria to the specific task. For example: +- PDF form → "Field alignment", "Text readability", "Data placement" +- Document → "Section structure", "Heading hierarchy", "Paragraph flow" +- Data output → "Schema correctness", "Data types", "Completeness" + +### Step 4: Evaluate Each Output Against the Rubric + +For each output (A and B): + +1. **Score each criterion** on the rubric (1-5 scale) +2. **Calculate dimension totals**: Content score, Structure score +3. **Calculate overall score**: Average of dimension scores, scaled to 1-10 + +### Step 5: Check Assertions (if provided) + +If expectations are provided: + +1. Check each expectation against output A +2. Check each expectation against output B +3. Count pass rates for each output +4. Use expectation scores as secondary evidence (not the primary decision factor) + +### Step 6: Determine the Winner + +Compare A and B based on (in priority order): + +1. **Primary**: Overall rubric score (content + structure) +2. **Secondary**: Assertion pass rates (if applicable) +3. **Tiebreaker**: If truly equal, declare a TIE + +Be decisive - ties should be rare. One output is usually better, even if marginally. + +### Step 7: Write Comparison Results + +Save results to a JSON file at the path specified (or `comparison.json` if not specified). + +## Output Format + +Write a JSON file with this structure: + +```json +{ + "winner": "A", + "reasoning": "Output A provides a complete solution with proper formatting and all required fields. Output B is missing the date field and has formatting inconsistencies.", + "rubric": { + "A": { + "content": { + "correctness": 5, + "completeness": 5, + "accuracy": 4 + }, + "structure": { + "organization": 4, + "formatting": 5, + "usability": 4 + }, + "content_score": 4.7, + "structure_score": 4.3, + "overall_score": 9.0 + }, + "B": { + "content": { + "correctness": 3, + "completeness": 2, + "accuracy": 3 + }, + "structure": { + "organization": 3, + "formatting": 2, + "usability": 3 + }, + "content_score": 2.7, + "structure_score": 2.7, + "overall_score": 5.4 + } + }, + "output_quality": { + "A": { + "score": 9, + "strengths": ["Complete solution", "Well-formatted", "All fields present"], + "weaknesses": ["Minor style inconsistency in header"] + }, + "B": { + "score": 5, + "strengths": ["Readable output", "Correct basic structure"], + "weaknesses": ["Missing date field", "Formatting inconsistencies", "Partial data extraction"] + } + }, + "expectation_results": { + "A": { + "passed": 4, + "total": 5, + "pass_rate": 0.80, + "details": [ + {"text": "Output includes name", "passed": true}, + {"text": "Output includes date", "passed": true}, + {"text": "Format is PDF", "passed": true}, + {"text": "Contains signature", "passed": false}, + {"text": "Readable text", "passed": true} + ] + }, + "B": { + "passed": 3, + "total": 5, + "pass_rate": 0.60, + "details": [ + {"text": "Output includes name", "passed": true}, + {"text": "Output includes date", "passed": false}, + {"text": "Format is PDF", "passed": true}, + {"text": "Contains signature", "passed": false}, + {"text": "Readable text", "passed": true} + ] + } + } +} +``` + +If no expectations were provided, omit the `expectation_results` field entirely. + +## Field Descriptions + +- **winner**: "A", "B", or "TIE" +- **reasoning**: Clear explanation of why the winner was chosen (or why it's a tie) +- **rubric**: Structured rubric evaluation for each output + - **content**: Scores for content criteria (correctness, completeness, accuracy) + - **structure**: Scores for structure criteria (organization, formatting, usability) + - **content_score**: Average of content criteria (1-5) + - **structure_score**: Average of structure criteria (1-5) + - **overall_score**: Combined score scaled to 1-10 +- **output_quality**: Summary quality assessment + - **score**: 1-10 rating (should match rubric overall_score) + - **strengths**: List of positive aspects + - **weaknesses**: List of issues or shortcomings +- **expectation_results**: (Only if expectations provided) + - **passed**: Number of expectations that passed + - **total**: Total number of expectations + - **pass_rate**: Fraction passed (0.0 to 1.0) + - **details**: Individual expectation results + +## Guidelines + +- **Stay blind**: DO NOT try to infer which skill produced which output. Judge purely on output quality. +- **Be specific**: Cite specific examples when explaining strengths and weaknesses. +- **Be decisive**: Choose a winner unless outputs are genuinely equivalent. +- **Output quality first**: Assertion scores are secondary to overall task completion. +- **Be objective**: Don't favor outputs based on style preferences; focus on correctness and completeness. +- **Explain your reasoning**: The reasoning field should make it clear why you chose the winner. +- **Handle edge cases**: If both outputs fail, pick the one that fails less badly. If both are excellent, pick the one that's marginally better. diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/agents/grader.md b/third_party/zeroclaw/.claude/skills/skill-creator/agents/grader.md new file mode 100644 index 0000000..558ab05 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/agents/grader.md @@ -0,0 +1,223 @@ +# Grader Agent + +Evaluate expectations against an execution transcript and outputs. + +## Role + +The Grader reviews a transcript and output files, then determines whether each expectation passes or fails. Provide clear evidence for each judgment. + +You have two jobs: grade the outputs, and critique the evals themselves. A passing grade on a weak assertion is worse than useless — it creates false confidence. When you notice an assertion that's trivially satisfied, or an important outcome that no assertion checks, say so. + +## Inputs + +You receive these parameters in your prompt: + +- **expectations**: List of expectations to evaluate (strings) +- **transcript_path**: Path to the execution transcript (markdown file) +- **outputs_dir**: Directory containing output files from execution + +## Process + +### Step 1: Read the Transcript + +1. Read the transcript file completely +2. Note the eval prompt, execution steps, and final result +3. Identify any issues or errors documented + +### Step 2: Examine Output Files + +1. List files in outputs_dir +2. Read/examine each file relevant to the expectations. If outputs aren't plain text, use the inspection tools provided in your prompt — don't rely solely on what the transcript says the executor produced. +3. Note contents, structure, and quality + +### Step 3: Evaluate Each Assertion + +For each expectation: + +1. **Search for evidence** in the transcript and outputs +2. **Determine verdict**: + - **PASS**: Clear evidence the expectation is true AND the evidence reflects genuine task completion, not just surface-level compliance + - **FAIL**: No evidence, or evidence contradicts the expectation, or the evidence is superficial (e.g., correct filename but empty/wrong content) +3. **Cite the evidence**: Quote the specific text or describe what you found + +### Step 4: Extract and Verify Claims + +Beyond the predefined expectations, extract implicit claims from the outputs and verify them: + +1. **Extract claims** from the transcript and outputs: + - Factual statements ("The form has 12 fields") + - Process claims ("Used pypdf to fill the form") + - Quality claims ("All fields were filled correctly") + +2. **Verify each claim**: + - **Factual claims**: Can be checked against the outputs or external sources + - **Process claims**: Can be verified from the transcript + - **Quality claims**: Evaluate whether the claim is justified + +3. **Flag unverifiable claims**: Note claims that cannot be verified with available information + +This catches issues that predefined expectations might miss. + +### Step 5: Read User Notes + +If `{outputs_dir}/user_notes.md` exists: +1. Read it and note any uncertainties or issues flagged by the executor +2. Include relevant concerns in the grading output +3. These may reveal problems even when expectations pass + +### Step 6: Critique the Evals + +After grading, consider whether the evals themselves could be improved. Only surface suggestions when there's a clear gap. + +Good suggestions test meaningful outcomes — assertions that are hard to satisfy without actually doing the work correctly. Think about what makes an assertion *discriminating*: it passes when the skill genuinely succeeds and fails when it doesn't. + +Suggestions worth raising: +- An assertion that passed but would also pass for a clearly wrong output (e.g., checking filename existence but not file content) +- An important outcome you observed — good or bad — that no assertion covers at all +- An assertion that can't actually be verified from the available outputs + +Keep the bar high. The goal is to flag things the eval author would say "good catch" about, not to nitpick every assertion. + +### Step 7: Write Grading Results + +Save results to `{outputs_dir}/../grading.json` (sibling to outputs_dir). + +## Grading Criteria + +**PASS when**: +- The transcript or outputs clearly demonstrate the expectation is true +- Specific evidence can be cited +- The evidence reflects genuine substance, not just surface compliance (e.g., a file exists AND contains correct content, not just the right filename) + +**FAIL when**: +- No evidence found for the expectation +- Evidence contradicts the expectation +- The expectation cannot be verified from available information +- The evidence is superficial — the assertion is technically satisfied but the underlying task outcome is wrong or incomplete +- The output appears to meet the assertion by coincidence rather than by actually doing the work + +**When uncertain**: The burden of proof to pass is on the expectation. + +### Step 8: Read Executor Metrics and Timing + +1. If `{outputs_dir}/metrics.json` exists, read it and include in grading output +2. If `{outputs_dir}/../timing.json` exists, read it and include timing data + +## Output Format + +Write a JSON file with this structure: + +```json +{ + "expectations": [ + { + "text": "The output includes the name 'John Smith'", + "passed": true, + "evidence": "Found in transcript Step 3: 'Extracted names: John Smith, Sarah Johnson'" + }, + { + "text": "The spreadsheet has a SUM formula in cell B10", + "passed": false, + "evidence": "No spreadsheet was created. The output was a text file." + }, + { + "text": "The assistant used the skill's OCR script", + "passed": true, + "evidence": "Transcript Step 2 shows: 'Tool: Bash - python ocr_script.py image.png'" + } + ], + "summary": { + "passed": 2, + "failed": 1, + "total": 3, + "pass_rate": 0.67 + }, + "execution_metrics": { + "tool_calls": { + "Read": 5, + "Write": 2, + "Bash": 8 + }, + "total_tool_calls": 15, + "total_steps": 6, + "errors_encountered": 0, + "output_chars": 12450, + "transcript_chars": 3200 + }, + "timing": { + "executor_duration_seconds": 165.0, + "grader_duration_seconds": 26.0, + "total_duration_seconds": 191.0 + }, + "claims": [ + { + "claim": "The form has 12 fillable fields", + "type": "factual", + "verified": true, + "evidence": "Counted 12 fields in field_info.json" + }, + { + "claim": "All required fields were populated", + "type": "quality", + "verified": false, + "evidence": "Reference section was left blank despite data being available" + } + ], + "user_notes_summary": { + "uncertainties": ["Used 2023 data, may be stale"], + "needs_review": [], + "workarounds": ["Fell back to text overlay for non-fillable fields"] + }, + "eval_feedback": { + "suggestions": [ + { + "assertion": "The output includes the name 'John Smith'", + "reason": "A hallucinated document that mentions the name would also pass — consider checking it appears as the primary contact with matching phone and email from the input" + }, + { + "reason": "No assertion checks whether the extracted phone numbers match the input — I observed incorrect numbers in the output that went uncaught" + } + ], + "overall": "Assertions check presence but not correctness. Consider adding content verification." + } +} +``` + +## Field Descriptions + +- **expectations**: Array of graded expectations + - **text**: The original expectation text + - **passed**: Boolean - true if expectation passes + - **evidence**: Specific quote or description supporting the verdict +- **summary**: Aggregate statistics + - **passed**: Count of passed expectations + - **failed**: Count of failed expectations + - **total**: Total expectations evaluated + - **pass_rate**: Fraction passed (0.0 to 1.0) +- **execution_metrics**: Copied from executor's metrics.json (if available) + - **output_chars**: Total character count of output files (proxy for tokens) + - **transcript_chars**: Character count of transcript +- **timing**: Wall clock timing from timing.json (if available) + - **executor_duration_seconds**: Time spent in executor subagent + - **total_duration_seconds**: Total elapsed time for the run +- **claims**: Extracted and verified claims from the output + - **claim**: The statement being verified + - **type**: "factual", "process", or "quality" + - **verified**: Boolean - whether the claim holds + - **evidence**: Supporting or contradicting evidence +- **user_notes_summary**: Issues flagged by the executor + - **uncertainties**: Things the executor wasn't sure about + - **needs_review**: Items requiring human attention + - **workarounds**: Places where the skill didn't work as expected +- **eval_feedback**: Improvement suggestions for the evals (only when warranted) + - **suggestions**: List of concrete suggestions, each with a `reason` and optionally an `assertion` it relates to + - **overall**: Brief assessment — can be "No suggestions, evals look solid" if nothing to flag + +## Guidelines + +- **Be objective**: Base verdicts on evidence, not assumptions +- **Be specific**: Quote the exact text that supports your verdict +- **Be thorough**: Check both transcript and output files +- **Be consistent**: Apply the same standard to each expectation +- **Explain failures**: Make it clear why evidence was insufficient +- **No partial credit**: Each expectation is pass or fail, not partial diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/assets/eval_review.html b/third_party/zeroclaw/.claude/skills/skill-creator/assets/eval_review.html new file mode 100644 index 0000000..938ff32 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/assets/eval_review.html @@ -0,0 +1,146 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Eval Set Review - __SKILL_NAME_PLACEHOLDER__ + + + + + + +

Eval Set Review: __SKILL_NAME_PLACEHOLDER__

+

Current description: __SKILL_DESCRIPTION_PLACEHOLDER__

+ +
+ + +
+ + + + + + + + + + +
QueryShould TriggerActions
+ +

+ + + + diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/eval-viewer/generate_review.py b/third_party/zeroclaw/.claude/skills/skill-creator/eval-viewer/generate_review.py new file mode 100644 index 0000000..7fa5978 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/eval-viewer/generate_review.py @@ -0,0 +1,471 @@ +#!/usr/bin/env python3 +"""Generate and serve a review page for eval results. + +Reads the workspace directory, discovers runs (directories with outputs/), +embeds all output data into a self-contained HTML page, and serves it via +a tiny HTTP server. Feedback auto-saves to feedback.json in the workspace. + +Usage: + python generate_review.py [--port PORT] [--skill-name NAME] + python generate_review.py --previous-feedback /path/to/old/feedback.json + +No dependencies beyond the Python stdlib are required. +""" + +import argparse +import base64 +import json +import mimetypes +import os +import re +import signal +import subprocess +import sys +import time +import webbrowser +from functools import partial +from http.server import HTTPServer, BaseHTTPRequestHandler +from pathlib import Path + +# Files to exclude from output listings +METADATA_FILES = {"transcript.md", "user_notes.md", "metrics.json"} + +# Extensions we render as inline text +TEXT_EXTENSIONS = { + ".txt", ".md", ".json", ".csv", ".py", ".js", ".ts", ".tsx", ".jsx", + ".yaml", ".yml", ".xml", ".html", ".css", ".sh", ".rb", ".go", ".rs", + ".java", ".c", ".cpp", ".h", ".hpp", ".sql", ".r", ".toml", +} + +# Extensions we render as inline images +IMAGE_EXTENSIONS = {".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp"} + +# MIME type overrides for common types +MIME_OVERRIDES = { + ".svg": "image/svg+xml", + ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", +} + + +def get_mime_type(path: Path) -> str: + ext = path.suffix.lower() + if ext in MIME_OVERRIDES: + return MIME_OVERRIDES[ext] + mime, _ = mimetypes.guess_type(str(path)) + return mime or "application/octet-stream" + + +def find_runs(workspace: Path) -> list[dict]: + """Recursively find directories that contain an outputs/ subdirectory.""" + runs: list[dict] = [] + _find_runs_recursive(workspace, workspace, runs) + runs.sort(key=lambda r: (r.get("eval_id", float("inf")), r["id"])) + return runs + + +def _find_runs_recursive(root: Path, current: Path, runs: list[dict]) -> None: + if not current.is_dir(): + return + + outputs_dir = current / "outputs" + if outputs_dir.is_dir(): + run = build_run(root, current) + if run: + runs.append(run) + return + + skip = {"node_modules", ".git", "__pycache__", "skill", "inputs"} + for child in sorted(current.iterdir()): + if child.is_dir() and child.name not in skip: + _find_runs_recursive(root, child, runs) + + +def build_run(root: Path, run_dir: Path) -> dict | None: + """Build a run dict with prompt, outputs, and grading data.""" + prompt = "" + eval_id = None + + # Try eval_metadata.json + for candidate in [run_dir / "eval_metadata.json", run_dir.parent / "eval_metadata.json"]: + if candidate.exists(): + try: + metadata = json.loads(candidate.read_text()) + prompt = metadata.get("prompt", "") + eval_id = metadata.get("eval_id") + except (json.JSONDecodeError, OSError): + pass + if prompt: + break + + # Fall back to transcript.md + if not prompt: + for candidate in [run_dir / "transcript.md", run_dir / "outputs" / "transcript.md"]: + if candidate.exists(): + try: + text = candidate.read_text() + match = re.search(r"## Eval Prompt\n\n([\s\S]*?)(?=\n##|$)", text) + if match: + prompt = match.group(1).strip() + except OSError: + pass + if prompt: + break + + if not prompt: + prompt = "(No prompt found)" + + run_id = str(run_dir.relative_to(root)).replace("/", "-").replace("\\", "-") + + # Collect output files + outputs_dir = run_dir / "outputs" + output_files: list[dict] = [] + if outputs_dir.is_dir(): + for f in sorted(outputs_dir.iterdir()): + if f.is_file() and f.name not in METADATA_FILES: + output_files.append(embed_file(f)) + + # Load grading if present + grading = None + for candidate in [run_dir / "grading.json", run_dir.parent / "grading.json"]: + if candidate.exists(): + try: + grading = json.loads(candidate.read_text()) + except (json.JSONDecodeError, OSError): + pass + if grading: + break + + return { + "id": run_id, + "prompt": prompt, + "eval_id": eval_id, + "outputs": output_files, + "grading": grading, + } + + +def embed_file(path: Path) -> dict: + """Read a file and return an embedded representation.""" + ext = path.suffix.lower() + mime = get_mime_type(path) + + if ext in TEXT_EXTENSIONS: + try: + content = path.read_text(errors="replace") + except OSError: + content = "(Error reading file)" + return { + "name": path.name, + "type": "text", + "content": content, + } + elif ext in IMAGE_EXTENSIONS: + try: + raw = path.read_bytes() + b64 = base64.b64encode(raw).decode("ascii") + except OSError: + return {"name": path.name, "type": "error", "content": "(Error reading file)"} + return { + "name": path.name, + "type": "image", + "mime": mime, + "data_uri": f"data:{mime};base64,{b64}", + } + elif ext == ".pdf": + try: + raw = path.read_bytes() + b64 = base64.b64encode(raw).decode("ascii") + except OSError: + return {"name": path.name, "type": "error", "content": "(Error reading file)"} + return { + "name": path.name, + "type": "pdf", + "data_uri": f"data:{mime};base64,{b64}", + } + elif ext == ".xlsx": + try: + raw = path.read_bytes() + b64 = base64.b64encode(raw).decode("ascii") + except OSError: + return {"name": path.name, "type": "error", "content": "(Error reading file)"} + return { + "name": path.name, + "type": "xlsx", + "data_b64": b64, + } + else: + # Binary / unknown — base64 download link + try: + raw = path.read_bytes() + b64 = base64.b64encode(raw).decode("ascii") + except OSError: + return {"name": path.name, "type": "error", "content": "(Error reading file)"} + return { + "name": path.name, + "type": "binary", + "mime": mime, + "data_uri": f"data:{mime};base64,{b64}", + } + + +def load_previous_iteration(workspace: Path) -> dict[str, dict]: + """Load previous iteration's feedback and outputs. + + Returns a map of run_id -> {"feedback": str, "outputs": list[dict]}. + """ + result: dict[str, dict] = {} + + # Load feedback + feedback_map: dict[str, str] = {} + feedback_path = workspace / "feedback.json" + if feedback_path.exists(): + try: + data = json.loads(feedback_path.read_text()) + feedback_map = { + r["run_id"]: r["feedback"] + for r in data.get("reviews", []) + if r.get("feedback", "").strip() + } + except (json.JSONDecodeError, OSError, KeyError): + pass + + # Load runs (to get outputs) + prev_runs = find_runs(workspace) + for run in prev_runs: + result[run["id"]] = { + "feedback": feedback_map.get(run["id"], ""), + "outputs": run.get("outputs", []), + } + + # Also add feedback for run_ids that had feedback but no matching run + for run_id, fb in feedback_map.items(): + if run_id not in result: + result[run_id] = {"feedback": fb, "outputs": []} + + return result + + +def generate_html( + runs: list[dict], + skill_name: str, + previous: dict[str, dict] | None = None, + benchmark: dict | None = None, +) -> str: + """Generate the complete standalone HTML page with embedded data.""" + template_path = Path(__file__).parent / "viewer.html" + template = template_path.read_text() + + # Build previous_feedback and previous_outputs maps for the template + previous_feedback: dict[str, str] = {} + previous_outputs: dict[str, list[dict]] = {} + if previous: + for run_id, data in previous.items(): + if data.get("feedback"): + previous_feedback[run_id] = data["feedback"] + if data.get("outputs"): + previous_outputs[run_id] = data["outputs"] + + embedded = { + "skill_name": skill_name, + "runs": runs, + "previous_feedback": previous_feedback, + "previous_outputs": previous_outputs, + } + if benchmark: + embedded["benchmark"] = benchmark + + data_json = json.dumps(embedded) + + return template.replace("/*__EMBEDDED_DATA__*/", f"const EMBEDDED_DATA = {data_json};") + + +# --------------------------------------------------------------------------- +# HTTP server (stdlib only, zero dependencies) +# --------------------------------------------------------------------------- + +def _kill_port(port: int) -> None: + """Kill any process listening on the given port.""" + try: + result = subprocess.run( + ["lsof", "-ti", f":{port}"], + capture_output=True, text=True, timeout=5, + ) + for pid_str in result.stdout.strip().split("\n"): + if pid_str.strip(): + try: + os.kill(int(pid_str.strip()), signal.SIGTERM) + except (ProcessLookupError, ValueError): + pass + if result.stdout.strip(): + time.sleep(0.5) + except subprocess.TimeoutExpired: + pass + except FileNotFoundError: + print("Note: lsof not found, cannot check if port is in use", file=sys.stderr) + +class ReviewHandler(BaseHTTPRequestHandler): + """Serves the review HTML and handles feedback saves. + + Regenerates the HTML on each page load so that refreshing the browser + picks up new eval outputs without restarting the server. + """ + + def __init__( + self, + workspace: Path, + skill_name: str, + feedback_path: Path, + previous: dict[str, dict], + benchmark_path: Path | None, + *args, + **kwargs, + ): + self.workspace = workspace + self.skill_name = skill_name + self.feedback_path = feedback_path + self.previous = previous + self.benchmark_path = benchmark_path + super().__init__(*args, **kwargs) + + def do_GET(self) -> None: + if self.path == "/" or self.path == "/index.html": + # Regenerate HTML on each request (re-scans workspace for new outputs) + runs = find_runs(self.workspace) + benchmark = None + if self.benchmark_path and self.benchmark_path.exists(): + try: + benchmark = json.loads(self.benchmark_path.read_text()) + except (json.JSONDecodeError, OSError): + pass + html = generate_html(runs, self.skill_name, self.previous, benchmark) + content = html.encode("utf-8") + self.send_response(200) + self.send_header("Content-Type", "text/html; charset=utf-8") + self.send_header("Content-Length", str(len(content))) + self.end_headers() + self.wfile.write(content) + elif self.path == "/api/feedback": + data = b"{}" + if self.feedback_path.exists(): + data = self.feedback_path.read_bytes() + self.send_response(200) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(data))) + self.end_headers() + self.wfile.write(data) + else: + self.send_error(404) + + def do_POST(self) -> None: + if self.path == "/api/feedback": + length = int(self.headers.get("Content-Length", 0)) + body = self.rfile.read(length) + try: + data = json.loads(body) + if not isinstance(data, dict) or "reviews" not in data: + raise ValueError("Expected JSON object with 'reviews' key") + self.feedback_path.write_text(json.dumps(data, indent=2) + "\n") + resp = b'{"ok":true}' + self.send_response(200) + except (json.JSONDecodeError, OSError, ValueError) as e: + resp = json.dumps({"error": str(e)}).encode() + self.send_response(500) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(resp))) + self.end_headers() + self.wfile.write(resp) + else: + self.send_error(404) + + def log_message(self, format: str, *args: object) -> None: + # Suppress request logging to keep terminal clean + pass + + +def main() -> None: + parser = argparse.ArgumentParser(description="Generate and serve eval review") + parser.add_argument("workspace", type=Path, help="Path to workspace directory") + parser.add_argument("--port", "-p", type=int, default=3117, help="Server port (default: 3117)") + parser.add_argument("--skill-name", "-n", type=str, default=None, help="Skill name for header") + parser.add_argument( + "--previous-workspace", type=Path, default=None, + help="Path to previous iteration's workspace (shows old outputs and feedback as context)", + ) + parser.add_argument( + "--benchmark", type=Path, default=None, + help="Path to benchmark.json to show in the Benchmark tab", + ) + parser.add_argument( + "--static", "-s", type=Path, default=None, + help="Write standalone HTML to this path instead of starting a server", + ) + args = parser.parse_args() + + workspace = args.workspace.resolve() + if not workspace.is_dir(): + print(f"Error: {workspace} is not a directory", file=sys.stderr) + sys.exit(1) + + runs = find_runs(workspace) + if not runs: + print(f"No runs found in {workspace}", file=sys.stderr) + sys.exit(1) + + skill_name = args.skill_name or workspace.name.replace("-workspace", "") + feedback_path = workspace / "feedback.json" + + previous: dict[str, dict] = {} + if args.previous_workspace: + previous = load_previous_iteration(args.previous_workspace.resolve()) + + benchmark_path = args.benchmark.resolve() if args.benchmark else None + benchmark = None + if benchmark_path and benchmark_path.exists(): + try: + benchmark = json.loads(benchmark_path.read_text()) + except (json.JSONDecodeError, OSError): + pass + + if args.static: + html = generate_html(runs, skill_name, previous, benchmark) + args.static.parent.mkdir(parents=True, exist_ok=True) + args.static.write_text(html) + print(f"\n Static viewer written to: {args.static}\n") + sys.exit(0) + + # Kill any existing process on the target port + port = args.port + _kill_port(port) + handler = partial(ReviewHandler, workspace, skill_name, feedback_path, previous, benchmark_path) + try: + server = HTTPServer(("127.0.0.1", port), handler) + except OSError: + # Port still in use after kill attempt — find a free one + server = HTTPServer(("127.0.0.1", 0), handler) + port = server.server_address[1] + + url = f"http://localhost:{port}" + print(f"\n Eval Viewer") + print(f" ─────────────────────────────────") + print(f" URL: {url}") + print(f" Workspace: {workspace}") + print(f" Feedback: {feedback_path}") + if previous: + print(f" Previous: {args.previous_workspace} ({len(previous)} runs)") + if benchmark_path: + print(f" Benchmark: {benchmark_path}") + print(f"\n Press Ctrl+C to stop.\n") + + webbrowser.open(url) + + try: + server.serve_forever() + except KeyboardInterrupt: + print("\nStopped.") + server.server_close() + + +if __name__ == "__main__": + main() diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/eval-viewer/viewer.html b/third_party/zeroclaw/.claude/skills/skill-creator/eval-viewer/viewer.html new file mode 100644 index 0000000..6d8e963 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/eval-viewer/viewer.html @@ -0,0 +1,1325 @@ + + + + + + Eval Review + + + + + + + +
+
+
+

Eval Review:

+
Review each output and leave feedback below. Navigate with arrow keys or buttons. When done, copy feedback and paste into Claude Code.
+
+
+
+ + + + + +
+
+ +
+
Prompt
+
+
+
+
+ + +
+
Output
+
+
No output files found
+
+
+ + + + + + + + +
+
Your Feedback
+
+ + + +
+
+
+ + +
+ + +
+
+
No benchmark data available. Run a benchmark to see quantitative results here.
+
+
+
+ + +
+
+

Review Complete

+

Your feedback has been saved. Go back to your Claude Code session and tell Claude you're done reviewing.

+
+ +
+
+
+ + +
+ + + + diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/references/schemas.md b/third_party/zeroclaw/.claude/skills/skill-creator/references/schemas.md new file mode 100644 index 0000000..b6eeaa2 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/references/schemas.md @@ -0,0 +1,430 @@ +# JSON Schemas + +This document defines the JSON schemas used by skill-creator. + +--- + +## evals.json + +Defines the evals for a skill. Located at `evals/evals.json` within the skill directory. + +```json +{ + "skill_name": "example-skill", + "evals": [ + { + "id": 1, + "prompt": "User's example prompt", + "expected_output": "Description of expected result", + "files": ["evals/files/sample1.pdf"], + "expectations": [ + "The output includes X", + "The skill used script Y" + ] + } + ] +} +``` + +**Fields:** +- `skill_name`: Name matching the skill's frontmatter +- `evals[].id`: Unique integer identifier +- `evals[].prompt`: The task to execute +- `evals[].expected_output`: Human-readable description of success +- `evals[].files`: Optional list of input file paths (relative to skill root) +- `evals[].expectations`: List of verifiable statements + +--- + +## history.json + +Tracks version progression in Improve mode. Located at workspace root. + +```json +{ + "started_at": "2026-01-15T10:30:00Z", + "skill_name": "pdf", + "current_best": "v2", + "iterations": [ + { + "version": "v0", + "parent": null, + "expectation_pass_rate": 0.65, + "grading_result": "baseline", + "is_current_best": false + }, + { + "version": "v1", + "parent": "v0", + "expectation_pass_rate": 0.75, + "grading_result": "won", + "is_current_best": false + }, + { + "version": "v2", + "parent": "v1", + "expectation_pass_rate": 0.85, + "grading_result": "won", + "is_current_best": true + } + ] +} +``` + +**Fields:** +- `started_at`: ISO timestamp of when improvement started +- `skill_name`: Name of the skill being improved +- `current_best`: Version identifier of the best performer +- `iterations[].version`: Version identifier (v0, v1, ...) +- `iterations[].parent`: Parent version this was derived from +- `iterations[].expectation_pass_rate`: Pass rate from grading +- `iterations[].grading_result`: "baseline", "won", "lost", or "tie" +- `iterations[].is_current_best`: Whether this is the current best version + +--- + +## grading.json + +Output from the grader agent. Located at `/grading.json`. + +```json +{ + "expectations": [ + { + "text": "The output includes the name 'John Smith'", + "passed": true, + "evidence": "Found in transcript Step 3: 'Extracted names: John Smith, Sarah Johnson'" + }, + { + "text": "The spreadsheet has a SUM formula in cell B10", + "passed": false, + "evidence": "No spreadsheet was created. The output was a text file." + } + ], + "summary": { + "passed": 2, + "failed": 1, + "total": 3, + "pass_rate": 0.67 + }, + "execution_metrics": { + "tool_calls": { + "Read": 5, + "Write": 2, + "Bash": 8 + }, + "total_tool_calls": 15, + "total_steps": 6, + "errors_encountered": 0, + "output_chars": 12450, + "transcript_chars": 3200 + }, + "timing": { + "executor_duration_seconds": 165.0, + "grader_duration_seconds": 26.0, + "total_duration_seconds": 191.0 + }, + "claims": [ + { + "claim": "The form has 12 fillable fields", + "type": "factual", + "verified": true, + "evidence": "Counted 12 fields in field_info.json" + } + ], + "user_notes_summary": { + "uncertainties": ["Used 2023 data, may be stale"], + "needs_review": [], + "workarounds": ["Fell back to text overlay for non-fillable fields"] + }, + "eval_feedback": { + "suggestions": [ + { + "assertion": "The output includes the name 'John Smith'", + "reason": "A hallucinated document that mentions the name would also pass" + } + ], + "overall": "Assertions check presence but not correctness." + } +} +``` + +**Fields:** +- `expectations[]`: Graded expectations with evidence +- `summary`: Aggregate pass/fail counts +- `execution_metrics`: Tool usage and output size (from executor's metrics.json) +- `timing`: Wall clock timing (from timing.json) +- `claims`: Extracted and verified claims from the output +- `user_notes_summary`: Issues flagged by the executor +- `eval_feedback`: (optional) Improvement suggestions for the evals, only present when the grader identifies issues worth raising + +--- + +## metrics.json + +Output from the executor agent. Located at `/outputs/metrics.json`. + +```json +{ + "tool_calls": { + "Read": 5, + "Write": 2, + "Bash": 8, + "Edit": 1, + "Glob": 2, + "Grep": 0 + }, + "total_tool_calls": 18, + "total_steps": 6, + "files_created": ["filled_form.pdf", "field_values.json"], + "errors_encountered": 0, + "output_chars": 12450, + "transcript_chars": 3200 +} +``` + +**Fields:** +- `tool_calls`: Count per tool type +- `total_tool_calls`: Sum of all tool calls +- `total_steps`: Number of major execution steps +- `files_created`: List of output files created +- `errors_encountered`: Number of errors during execution +- `output_chars`: Total character count of output files +- `transcript_chars`: Character count of transcript + +--- + +## timing.json + +Wall clock timing for a run. Located at `/timing.json`. + +**How to capture:** When a subagent task completes, the task notification includes `total_tokens` and `duration_ms`. Save these immediately — they are not persisted anywhere else and cannot be recovered after the fact. + +```json +{ + "total_tokens": 84852, + "duration_ms": 23332, + "total_duration_seconds": 23.3, + "executor_start": "2026-01-15T10:30:00Z", + "executor_end": "2026-01-15T10:32:45Z", + "executor_duration_seconds": 165.0, + "grader_start": "2026-01-15T10:32:46Z", + "grader_end": "2026-01-15T10:33:12Z", + "grader_duration_seconds": 26.0 +} +``` + +--- + +## benchmark.json + +Output from Benchmark mode. Located at `benchmarks//benchmark.json`. + +```json +{ + "metadata": { + "skill_name": "pdf", + "skill_path": "/path/to/pdf", + "executor_model": "claude-sonnet-4-20250514", + "analyzer_model": "most-capable-model", + "timestamp": "2026-01-15T10:30:00Z", + "evals_run": [1, 2, 3], + "runs_per_configuration": 3 + }, + + "runs": [ + { + "eval_id": 1, + "eval_name": "Ocean", + "configuration": "with_skill", + "run_number": 1, + "result": { + "pass_rate": 0.85, + "passed": 6, + "failed": 1, + "total": 7, + "time_seconds": 42.5, + "tokens": 3800, + "tool_calls": 18, + "errors": 0 + }, + "expectations": [ + {"text": "...", "passed": true, "evidence": "..."} + ], + "notes": [ + "Used 2023 data, may be stale", + "Fell back to text overlay for non-fillable fields" + ] + } + ], + + "run_summary": { + "with_skill": { + "pass_rate": {"mean": 0.85, "stddev": 0.05, "min": 0.80, "max": 0.90}, + "time_seconds": {"mean": 45.0, "stddev": 12.0, "min": 32.0, "max": 58.0}, + "tokens": {"mean": 3800, "stddev": 400, "min": 3200, "max": 4100} + }, + "without_skill": { + "pass_rate": {"mean": 0.35, "stddev": 0.08, "min": 0.28, "max": 0.45}, + "time_seconds": {"mean": 32.0, "stddev": 8.0, "min": 24.0, "max": 42.0}, + "tokens": {"mean": 2100, "stddev": 300, "min": 1800, "max": 2500} + }, + "delta": { + "pass_rate": "+0.50", + "time_seconds": "+13.0", + "tokens": "+1700" + } + }, + + "notes": [ + "Assertion 'Output is a PDF file' passes 100% in both configurations - may not differentiate skill value", + "Eval 3 shows high variance (50% ± 40%) - may be flaky or model-dependent", + "Without-skill runs consistently fail on table extraction expectations", + "Skill adds 13s average execution time but improves pass rate by 50%" + ] +} +``` + +**Fields:** +- `metadata`: Information about the benchmark run + - `skill_name`: Name of the skill + - `timestamp`: When the benchmark was run + - `evals_run`: List of eval names or IDs + - `runs_per_configuration`: Number of runs per config (e.g. 3) +- `runs[]`: Individual run results + - `eval_id`: Numeric eval identifier + - `eval_name`: Human-readable eval name (used as section header in the viewer) + - `configuration`: Must be `"with_skill"` or `"without_skill"` (the viewer uses this exact string for grouping and color coding) + - `run_number`: Integer run number (1, 2, 3...) + - `result`: Nested object with `pass_rate`, `passed`, `total`, `time_seconds`, `tokens`, `errors` +- `run_summary`: Statistical aggregates per configuration + - `with_skill` / `without_skill`: Each contains `pass_rate`, `time_seconds`, `tokens` objects with `mean` and `stddev` fields + - `delta`: Difference strings like `"+0.50"`, `"+13.0"`, `"+1700"` +- `notes`: Freeform observations from the analyzer + +**Important:** The viewer reads these field names exactly. Using `config` instead of `configuration`, or putting `pass_rate` at the top level of a run instead of nested under `result`, will cause the viewer to show empty/zero values. Always reference this schema when generating benchmark.json manually. + +--- + +## comparison.json + +Output from blind comparator. Located at `/comparison-N.json`. + +```json +{ + "winner": "A", + "reasoning": "Output A provides a complete solution with proper formatting and all required fields. Output B is missing the date field and has formatting inconsistencies.", + "rubric": { + "A": { + "content": { + "correctness": 5, + "completeness": 5, + "accuracy": 4 + }, + "structure": { + "organization": 4, + "formatting": 5, + "usability": 4 + }, + "content_score": 4.7, + "structure_score": 4.3, + "overall_score": 9.0 + }, + "B": { + "content": { + "correctness": 3, + "completeness": 2, + "accuracy": 3 + }, + "structure": { + "organization": 3, + "formatting": 2, + "usability": 3 + }, + "content_score": 2.7, + "structure_score": 2.7, + "overall_score": 5.4 + } + }, + "output_quality": { + "A": { + "score": 9, + "strengths": ["Complete solution", "Well-formatted", "All fields present"], + "weaknesses": ["Minor style inconsistency in header"] + }, + "B": { + "score": 5, + "strengths": ["Readable output", "Correct basic structure"], + "weaknesses": ["Missing date field", "Formatting inconsistencies", "Partial data extraction"] + } + }, + "expectation_results": { + "A": { + "passed": 4, + "total": 5, + "pass_rate": 0.80, + "details": [ + {"text": "Output includes name", "passed": true} + ] + }, + "B": { + "passed": 3, + "total": 5, + "pass_rate": 0.60, + "details": [ + {"text": "Output includes name", "passed": true} + ] + } + } +} +``` + +--- + +## analysis.json + +Output from post-hoc analyzer. Located at `/analysis.json`. + +```json +{ + "comparison_summary": { + "winner": "A", + "winner_skill": "path/to/winner/skill", + "loser_skill": "path/to/loser/skill", + "comparator_reasoning": "Brief summary of why comparator chose winner" + }, + "winner_strengths": [ + "Clear step-by-step instructions for handling multi-page documents", + "Included validation script that caught formatting errors" + ], + "loser_weaknesses": [ + "Vague instruction 'process the document appropriately' led to inconsistent behavior", + "No script for validation, agent had to improvise" + ], + "instruction_following": { + "winner": { + "score": 9, + "issues": ["Minor: skipped optional logging step"] + }, + "loser": { + "score": 6, + "issues": [ + "Did not use the skill's formatting template", + "Invented own approach instead of following step 3" + ] + } + }, + "improvement_suggestions": [ + { + "priority": "high", + "category": "instructions", + "suggestion": "Replace 'process the document appropriately' with explicit steps", + "expected_impact": "Would eliminate ambiguity that caused inconsistent behavior" + } + ], + "transcript_insights": { + "winner_execution_pattern": "Read skill -> Followed 5-step process -> Used validation script", + "loser_execution_pattern": "Read skill -> Unclear on approach -> Tried 3 different methods" + } +} +``` diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/scripts/__init__.py b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/scripts/aggregate_benchmark.py b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/aggregate_benchmark.py new file mode 100755 index 0000000..3e66e8c --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/aggregate_benchmark.py @@ -0,0 +1,401 @@ +#!/usr/bin/env python3 +""" +Aggregate individual run results into benchmark summary statistics. + +Reads grading.json files from run directories and produces: +- run_summary with mean, stddev, min, max for each metric +- delta between with_skill and without_skill configurations + +Usage: + python aggregate_benchmark.py + +Example: + python aggregate_benchmark.py benchmarks/2026-01-15T10-30-00/ + +The script supports two directory layouts: + + Workspace layout (from skill-creator iterations): + / + └── eval-N/ + ├── with_skill/ + │ ├── run-1/grading.json + │ └── run-2/grading.json + └── without_skill/ + ├── run-1/grading.json + └── run-2/grading.json + + Legacy layout (with runs/ subdirectory): + / + └── runs/ + └── eval-N/ + ├── with_skill/ + │ └── run-1/grading.json + └── without_skill/ + └── run-1/grading.json +""" + +import argparse +import json +import math +import sys +from datetime import datetime, timezone +from pathlib import Path + + +def calculate_stats(values: list[float]) -> dict: + """Calculate mean, stddev, min, max for a list of values.""" + if not values: + return {"mean": 0.0, "stddev": 0.0, "min": 0.0, "max": 0.0} + + n = len(values) + mean = sum(values) / n + + if n > 1: + variance = sum((x - mean) ** 2 for x in values) / (n - 1) + stddev = math.sqrt(variance) + else: + stddev = 0.0 + + return { + "mean": round(mean, 4), + "stddev": round(stddev, 4), + "min": round(min(values), 4), + "max": round(max(values), 4) + } + + +def load_run_results(benchmark_dir: Path) -> dict: + """ + Load all run results from a benchmark directory. + + Returns dict keyed by config name (e.g. "with_skill"/"without_skill", + or "new_skill"/"old_skill"), each containing a list of run results. + """ + # Support both layouts: eval dirs directly under benchmark_dir, or under runs/ + runs_dir = benchmark_dir / "runs" + if runs_dir.exists(): + search_dir = runs_dir + elif list(benchmark_dir.glob("eval-*")): + search_dir = benchmark_dir + else: + print(f"No eval directories found in {benchmark_dir} or {benchmark_dir / 'runs'}") + return {} + + results: dict[str, list] = {} + + for eval_idx, eval_dir in enumerate(sorted(search_dir.glob("eval-*"))): + metadata_path = eval_dir / "eval_metadata.json" + if metadata_path.exists(): + try: + with open(metadata_path) as mf: + eval_id = json.load(mf).get("eval_id", eval_idx) + except (json.JSONDecodeError, OSError): + eval_id = eval_idx + else: + try: + eval_id = int(eval_dir.name.split("-")[1]) + except ValueError: + eval_id = eval_idx + + # Discover config directories dynamically rather than hardcoding names + for config_dir in sorted(eval_dir.iterdir()): + if not config_dir.is_dir(): + continue + # Skip non-config directories (inputs, outputs, etc.) + if not list(config_dir.glob("run-*")): + continue + config = config_dir.name + if config not in results: + results[config] = [] + + for run_dir in sorted(config_dir.glob("run-*")): + run_number = int(run_dir.name.split("-")[1]) + grading_file = run_dir / "grading.json" + + if not grading_file.exists(): + print(f"Warning: grading.json not found in {run_dir}") + continue + + try: + with open(grading_file) as f: + grading = json.load(f) + except json.JSONDecodeError as e: + print(f"Warning: Invalid JSON in {grading_file}: {e}") + continue + + # Extract metrics + result = { + "eval_id": eval_id, + "run_number": run_number, + "pass_rate": grading.get("summary", {}).get("pass_rate", 0.0), + "passed": grading.get("summary", {}).get("passed", 0), + "failed": grading.get("summary", {}).get("failed", 0), + "total": grading.get("summary", {}).get("total", 0), + } + + # Extract timing — check grading.json first, then sibling timing.json + timing = grading.get("timing", {}) + result["time_seconds"] = timing.get("total_duration_seconds", 0.0) + timing_file = run_dir / "timing.json" + if result["time_seconds"] == 0.0 and timing_file.exists(): + try: + with open(timing_file) as tf: + timing_data = json.load(tf) + result["time_seconds"] = timing_data.get("total_duration_seconds", 0.0) + result["tokens"] = timing_data.get("total_tokens", 0) + except json.JSONDecodeError: + pass + + # Extract metrics if available + metrics = grading.get("execution_metrics", {}) + result["tool_calls"] = metrics.get("total_tool_calls", 0) + if not result.get("tokens"): + result["tokens"] = metrics.get("output_chars", 0) + result["errors"] = metrics.get("errors_encountered", 0) + + # Extract expectations — viewer requires fields: text, passed, evidence + raw_expectations = grading.get("expectations", []) + for exp in raw_expectations: + if "text" not in exp or "passed" not in exp: + print(f"Warning: expectation in {grading_file} missing required fields (text, passed, evidence): {exp}") + result["expectations"] = raw_expectations + + # Extract notes from user_notes_summary + notes_summary = grading.get("user_notes_summary", {}) + notes = [] + notes.extend(notes_summary.get("uncertainties", [])) + notes.extend(notes_summary.get("needs_review", [])) + notes.extend(notes_summary.get("workarounds", [])) + result["notes"] = notes + + results[config].append(result) + + return results + + +def aggregate_results(results: dict) -> dict: + """ + Aggregate run results into summary statistics. + + Returns run_summary with stats for each configuration and delta. + """ + run_summary = {} + configs = list(results.keys()) + + for config in configs: + runs = results.get(config, []) + + if not runs: + run_summary[config] = { + "pass_rate": {"mean": 0.0, "stddev": 0.0, "min": 0.0, "max": 0.0}, + "time_seconds": {"mean": 0.0, "stddev": 0.0, "min": 0.0, "max": 0.0}, + "tokens": {"mean": 0, "stddev": 0, "min": 0, "max": 0} + } + continue + + pass_rates = [r["pass_rate"] for r in runs] + times = [r["time_seconds"] for r in runs] + tokens = [r.get("tokens", 0) for r in runs] + + run_summary[config] = { + "pass_rate": calculate_stats(pass_rates), + "time_seconds": calculate_stats(times), + "tokens": calculate_stats(tokens) + } + + # Calculate delta between the first two configs (if two exist) + if len(configs) >= 2: + primary = run_summary.get(configs[0], {}) + baseline = run_summary.get(configs[1], {}) + else: + primary = run_summary.get(configs[0], {}) if configs else {} + baseline = {} + + delta_pass_rate = primary.get("pass_rate", {}).get("mean", 0) - baseline.get("pass_rate", {}).get("mean", 0) + delta_time = primary.get("time_seconds", {}).get("mean", 0) - baseline.get("time_seconds", {}).get("mean", 0) + delta_tokens = primary.get("tokens", {}).get("mean", 0) - baseline.get("tokens", {}).get("mean", 0) + + run_summary["delta"] = { + "pass_rate": f"{delta_pass_rate:+.2f}", + "time_seconds": f"{delta_time:+.1f}", + "tokens": f"{delta_tokens:+.0f}" + } + + return run_summary + + +def generate_benchmark(benchmark_dir: Path, skill_name: str = "", skill_path: str = "") -> dict: + """ + Generate complete benchmark.json from run results. + """ + results = load_run_results(benchmark_dir) + run_summary = aggregate_results(results) + + # Build runs array for benchmark.json + runs = [] + for config in results: + for result in results[config]: + runs.append({ + "eval_id": result["eval_id"], + "configuration": config, + "run_number": result["run_number"], + "result": { + "pass_rate": result["pass_rate"], + "passed": result["passed"], + "failed": result["failed"], + "total": result["total"], + "time_seconds": result["time_seconds"], + "tokens": result.get("tokens", 0), + "tool_calls": result.get("tool_calls", 0), + "errors": result.get("errors", 0) + }, + "expectations": result["expectations"], + "notes": result["notes"] + }) + + # Determine eval IDs from results + eval_ids = sorted(set( + r["eval_id"] + for config in results.values() + for r in config + )) + + benchmark = { + "metadata": { + "skill_name": skill_name or "", + "skill_path": skill_path or "", + "executor_model": "", + "analyzer_model": "", + "timestamp": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), + "evals_run": eval_ids, + "runs_per_configuration": 3 + }, + "runs": runs, + "run_summary": run_summary, + "notes": [] # To be filled by analyzer + } + + return benchmark + + +def generate_markdown(benchmark: dict) -> str: + """Generate human-readable benchmark.md from benchmark data.""" + metadata = benchmark["metadata"] + run_summary = benchmark["run_summary"] + + # Determine config names (excluding "delta") + configs = [k for k in run_summary if k != "delta"] + config_a = configs[0] if len(configs) >= 1 else "config_a" + config_b = configs[1] if len(configs) >= 2 else "config_b" + label_a = config_a.replace("_", " ").title() + label_b = config_b.replace("_", " ").title() + + lines = [ + f"# Skill Benchmark: {metadata['skill_name']}", + "", + f"**Model**: {metadata['executor_model']}", + f"**Date**: {metadata['timestamp']}", + f"**Evals**: {', '.join(map(str, metadata['evals_run']))} ({metadata['runs_per_configuration']} runs each per configuration)", + "", + "## Summary", + "", + f"| Metric | {label_a} | {label_b} | Delta |", + "|--------|------------|---------------|-------|", + ] + + a_summary = run_summary.get(config_a, {}) + b_summary = run_summary.get(config_b, {}) + delta = run_summary.get("delta", {}) + + # Format pass rate + a_pr = a_summary.get("pass_rate", {}) + b_pr = b_summary.get("pass_rate", {}) + lines.append(f"| Pass Rate | {a_pr.get('mean', 0)*100:.0f}% ± {a_pr.get('stddev', 0)*100:.0f}% | {b_pr.get('mean', 0)*100:.0f}% ± {b_pr.get('stddev', 0)*100:.0f}% | {delta.get('pass_rate', '—')} |") + + # Format time + a_time = a_summary.get("time_seconds", {}) + b_time = b_summary.get("time_seconds", {}) + lines.append(f"| Time | {a_time.get('mean', 0):.1f}s ± {a_time.get('stddev', 0):.1f}s | {b_time.get('mean', 0):.1f}s ± {b_time.get('stddev', 0):.1f}s | {delta.get('time_seconds', '—')}s |") + + # Format tokens + a_tokens = a_summary.get("tokens", {}) + b_tokens = b_summary.get("tokens", {}) + lines.append(f"| Tokens | {a_tokens.get('mean', 0):.0f} ± {a_tokens.get('stddev', 0):.0f} | {b_tokens.get('mean', 0):.0f} ± {b_tokens.get('stddev', 0):.0f} | {delta.get('tokens', '—')} |") + + # Notes section + if benchmark.get("notes"): + lines.extend([ + "", + "## Notes", + "" + ]) + for note in benchmark["notes"]: + lines.append(f"- {note}") + + return "\n".join(lines) + + +def main(): + parser = argparse.ArgumentParser( + description="Aggregate benchmark run results into summary statistics" + ) + parser.add_argument( + "benchmark_dir", + type=Path, + help="Path to the benchmark directory" + ) + parser.add_argument( + "--skill-name", + default="", + help="Name of the skill being benchmarked" + ) + parser.add_argument( + "--skill-path", + default="", + help="Path to the skill being benchmarked" + ) + parser.add_argument( + "--output", "-o", + type=Path, + help="Output path for benchmark.json (default: /benchmark.json)" + ) + + args = parser.parse_args() + + if not args.benchmark_dir.exists(): + print(f"Directory not found: {args.benchmark_dir}") + sys.exit(1) + + # Generate benchmark + benchmark = generate_benchmark(args.benchmark_dir, args.skill_name, args.skill_path) + + # Determine output paths + output_json = args.output or (args.benchmark_dir / "benchmark.json") + output_md = output_json.with_suffix(".md") + + # Write benchmark.json + with open(output_json, "w") as f: + json.dump(benchmark, f, indent=2) + print(f"Generated: {output_json}") + + # Write benchmark.md + markdown = generate_markdown(benchmark) + with open(output_md, "w") as f: + f.write(markdown) + print(f"Generated: {output_md}") + + # Print summary + run_summary = benchmark["run_summary"] + configs = [k for k in run_summary if k != "delta"] + delta = run_summary.get("delta", {}) + + print(f"\nSummary:") + for config in configs: + pr = run_summary[config]["pass_rate"]["mean"] + label = config.replace("_", " ").title() + print(f" {label}: {pr*100:.1f}% pass rate") + print(f" Delta: {delta.get('pass_rate', '—')}") + + +if __name__ == "__main__": + main() diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/scripts/generate_report.py b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/generate_report.py new file mode 100755 index 0000000..959e30a --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/generate_report.py @@ -0,0 +1,326 @@ +#!/usr/bin/env python3 +"""Generate an HTML report from run_loop.py output. + +Takes the JSON output from run_loop.py and generates a visual HTML report +showing each description attempt with check/x for each test case. +Distinguishes between train and test queries. +""" + +import argparse +import html +import json +import sys +from pathlib import Path + + +def generate_html(data: dict, auto_refresh: bool = False, skill_name: str = "") -> str: + """Generate HTML report from loop output data. If auto_refresh is True, adds a meta refresh tag.""" + history = data.get("history", []) + holdout = data.get("holdout", 0) + title_prefix = html.escape(skill_name + " \u2014 ") if skill_name else "" + + # Get all unique queries from train and test sets, with should_trigger info + train_queries: list[dict] = [] + test_queries: list[dict] = [] + if history: + for r in history[0].get("train_results", history[0].get("results", [])): + train_queries.append({"query": r["query"], "should_trigger": r.get("should_trigger", True)}) + if history[0].get("test_results"): + for r in history[0].get("test_results", []): + test_queries.append({"query": r["query"], "should_trigger": r.get("should_trigger", True)}) + + refresh_tag = ' \n' if auto_refresh else "" + + html_parts = [""" + + + +""" + refresh_tag + """ """ + title_prefix + """Skill Description Optimization + + + + + + +

""" + title_prefix + """Skill Description Optimization

+
+ Optimizing your skill's description. This page updates automatically as Claude tests different versions of your skill's description. Each row is an iteration — a new description attempt. The columns show test queries: green checkmarks mean the skill triggered correctly (or correctly didn't trigger), red crosses mean it got it wrong. The "Train" score shows performance on queries used to improve the description; the "Test" score shows performance on held-out queries the optimizer hasn't seen. When it's done, Claude will apply the best-performing description to your skill. +
+"""] + + # Summary section + best_test_score = data.get('best_test_score') + best_train_score = data.get('best_train_score') + html_parts.append(f""" +
+

Original: {html.escape(data.get('original_description', 'N/A'))}

+

Best: {html.escape(data.get('best_description', 'N/A'))}

+

Best Score: {data.get('best_score', 'N/A')} {'(test)' if best_test_score else '(train)'}

+

Iterations: {data.get('iterations_run', 0)} | Train: {data.get('train_size', '?')} | Test: {data.get('test_size', '?')}

+
+""") + + # Legend + html_parts.append(""" +
+ Query columns: + Should trigger + Should NOT trigger + Train + Test +
+""") + + # Table header + html_parts.append(""" +
+ + + + + + + +""") + + # Add column headers for train queries + for qinfo in train_queries: + polarity = "positive-col" if qinfo["should_trigger"] else "negative-col" + html_parts.append(f' \n') + + # Add column headers for test queries (different color) + for qinfo in test_queries: + polarity = "positive-col" if qinfo["should_trigger"] else "negative-col" + html_parts.append(f' \n') + + html_parts.append(""" + + +""") + + # Find best iteration for highlighting + if test_queries: + best_iter = max(history, key=lambda h: h.get("test_passed") or 0).get("iteration") + else: + best_iter = max(history, key=lambda h: h.get("train_passed", h.get("passed", 0))).get("iteration") + + # Add rows for each iteration + for h in history: + iteration = h.get("iteration", "?") + train_passed = h.get("train_passed", h.get("passed", 0)) + train_total = h.get("train_total", h.get("total", 0)) + test_passed = h.get("test_passed") + test_total = h.get("test_total") + description = h.get("description", "") + train_results = h.get("train_results", h.get("results", [])) + test_results = h.get("test_results", []) + + # Create lookups for results by query + train_by_query = {r["query"]: r for r in train_results} + test_by_query = {r["query"]: r for r in test_results} if test_results else {} + + # Compute aggregate correct/total runs across all retries + def aggregate_runs(results: list[dict]) -> tuple[int, int]: + correct = 0 + total = 0 + for r in results: + runs = r.get("runs", 0) + triggers = r.get("triggers", 0) + total += runs + if r.get("should_trigger", True): + correct += triggers + else: + correct += runs - triggers + return correct, total + + train_correct, train_runs = aggregate_runs(train_results) + test_correct, test_runs = aggregate_runs(test_results) + + # Determine score classes + def score_class(correct: int, total: int) -> str: + if total > 0: + ratio = correct / total + if ratio >= 0.8: + return "score-good" + elif ratio >= 0.5: + return "score-ok" + return "score-bad" + + train_class = score_class(train_correct, train_runs) + test_class = score_class(test_correct, test_runs) + + row_class = "best-row" if iteration == best_iter else "" + + html_parts.append(f""" + + + + +""") + + # Add result for each train query + for qinfo in train_queries: + r = train_by_query.get(qinfo["query"], {}) + did_pass = r.get("pass", False) + triggers = r.get("triggers", 0) + runs = r.get("runs", 0) + + icon = "✓" if did_pass else "✗" + css_class = "pass" if did_pass else "fail" + + html_parts.append(f' \n') + + # Add result for each test query (with different background) + for qinfo in test_queries: + r = test_by_query.get(qinfo["query"], {}) + did_pass = r.get("pass", False) + triggers = r.get("triggers", 0) + runs = r.get("runs", 0) + + icon = "✓" if did_pass else "✗" + css_class = "pass" if did_pass else "fail" + + html_parts.append(f' \n') + + html_parts.append(" \n") + + html_parts.append(""" +
IterTrainTestDescription{html.escape(qinfo["query"])}{html.escape(qinfo["query"])}
{iteration}{train_correct}/{train_runs}{test_correct}/{test_runs}{html.escape(description)}{icon}{triggers}/{runs}{icon}{triggers}/{runs}
+
+""") + + html_parts.append(""" + + +""") + + return "".join(html_parts) + + +def main(): + parser = argparse.ArgumentParser(description="Generate HTML report from run_loop output") + parser.add_argument("input", help="Path to JSON output from run_loop.py (or - for stdin)") + parser.add_argument("-o", "--output", default=None, help="Output HTML file (default: stdout)") + parser.add_argument("--skill-name", default="", help="Skill name to include in the report title") + args = parser.parse_args() + + if args.input == "-": + data = json.load(sys.stdin) + else: + data = json.loads(Path(args.input).read_text()) + + html_output = generate_html(data, skill_name=args.skill_name) + + if args.output: + Path(args.output).write_text(html_output) + print(f"Report written to {args.output}", file=sys.stderr) + else: + print(html_output) + + +if __name__ == "__main__": + main() diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/scripts/improve_description.py b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/improve_description.py new file mode 100755 index 0000000..06bcec7 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/improve_description.py @@ -0,0 +1,247 @@ +#!/usr/bin/env python3 +"""Improve a skill description based on eval results. + +Takes eval results (from run_eval.py) and generates an improved description +by calling `claude -p` as a subprocess (same auth pattern as run_eval.py — +uses the session's Claude Code auth, no separate ANTHROPIC_API_KEY needed). +""" + +import argparse +import json +import os +import re +import subprocess +import sys +from pathlib import Path + +from scripts.utils import parse_skill_md + + +def _call_claude(prompt: str, model: str | None, timeout: int = 300) -> str: + """Run `claude -p` with the prompt on stdin and return the text response. + + Prompt goes over stdin (not argv) because it embeds the full SKILL.md + body and can easily exceed comfortable argv length. + """ + cmd = ["claude", "-p", "--output-format", "text"] + if model: + cmd.extend(["--model", model]) + + # Remove CLAUDECODE env var to allow nesting claude -p inside a + # Claude Code session. The guard is for interactive terminal conflicts; + # programmatic subprocess usage is safe. Same pattern as run_eval.py. + env = {k: v for k, v in os.environ.items() if k != "CLAUDECODE"} + + result = subprocess.run( + cmd, + input=prompt, + capture_output=True, + text=True, + env=env, + timeout=timeout, + ) + if result.returncode != 0: + raise RuntimeError( + f"claude -p exited {result.returncode}\nstderr: {result.stderr}" + ) + return result.stdout + + +def improve_description( + skill_name: str, + skill_content: str, + current_description: str, + eval_results: dict, + history: list[dict], + model: str, + test_results: dict | None = None, + log_dir: Path | None = None, + iteration: int | None = None, +) -> str: + """Call Claude to improve the description based on eval results.""" + failed_triggers = [ + r for r in eval_results["results"] + if r["should_trigger"] and not r["pass"] + ] + false_triggers = [ + r for r in eval_results["results"] + if not r["should_trigger"] and not r["pass"] + ] + + # Build scores summary + train_score = f"{eval_results['summary']['passed']}/{eval_results['summary']['total']}" + if test_results: + test_score = f"{test_results['summary']['passed']}/{test_results['summary']['total']}" + scores_summary = f"Train: {train_score}, Test: {test_score}" + else: + scores_summary = f"Train: {train_score}" + + prompt = f"""You are optimizing a skill description for a Claude Code skill called "{skill_name}". A "skill" is sort of like a prompt, but with progressive disclosure -- there's a title and description that Claude sees when deciding whether to use the skill, and then if it does use the skill, it reads the .md file which has lots more details and potentially links to other resources in the skill folder like helper files and scripts and additional documentation or examples. + +The description appears in Claude's "available_skills" list. When a user sends a query, Claude decides whether to invoke the skill based solely on the title and on this description. Your goal is to write a description that triggers for relevant queries, and doesn't trigger for irrelevant ones. + +Here's the current description: + +"{current_description}" + + +Current scores ({scores_summary}): + +""" + if failed_triggers: + prompt += "FAILED TO TRIGGER (should have triggered but didn't):\n" + for r in failed_triggers: + prompt += f' - "{r["query"]}" (triggered {r["triggers"]}/{r["runs"]} times)\n' + prompt += "\n" + + if false_triggers: + prompt += "FALSE TRIGGERS (triggered but shouldn't have):\n" + for r in false_triggers: + prompt += f' - "{r["query"]}" (triggered {r["triggers"]}/{r["runs"]} times)\n' + prompt += "\n" + + if history: + prompt += "PREVIOUS ATTEMPTS (do NOT repeat these — try something structurally different):\n\n" + for h in history: + train_s = f"{h.get('train_passed', h.get('passed', 0))}/{h.get('train_total', h.get('total', 0))}" + test_s = f"{h.get('test_passed', '?')}/{h.get('test_total', '?')}" if h.get('test_passed') is not None else None + score_str = f"train={train_s}" + (f", test={test_s}" if test_s else "") + prompt += f'\n' + prompt += f'Description: "{h["description"]}"\n' + if "results" in h: + prompt += "Train results:\n" + for r in h["results"]: + status = "PASS" if r["pass"] else "FAIL" + prompt += f' [{status}] "{r["query"][:80]}" (triggered {r["triggers"]}/{r["runs"]})\n' + if h.get("note"): + prompt += f'Note: {h["note"]}\n' + prompt += "\n\n" + + prompt += f""" + +Skill content (for context on what the skill does): + +{skill_content} + + +Based on the failures, write a new and improved description that is more likely to trigger correctly. When I say "based on the failures", it's a bit of a tricky line to walk because we don't want to overfit to the specific cases you're seeing. So what I DON'T want you to do is produce an ever-expanding list of specific queries that this skill should or shouldn't trigger for. Instead, try to generalize from the failures to broader categories of user intent and situations where this skill would be useful or not useful. The reason for this is twofold: + +1. Avoid overfitting +2. The list might get loooong and it's injected into ALL queries and there might be a lot of skills, so we don't want to blow too much space on any given description. + +Concretely, your description should not be more than about 100-200 words, even if that comes at the cost of accuracy. There is a hard limit of 1024 characters — descriptions over that will be truncated, so stay comfortably under it. + +Here are some tips that we've found to work well in writing these descriptions: +- The skill should be phrased in the imperative -- "Use this skill for" rather than "this skill does" +- The skill description should focus on the user's intent, what they are trying to achieve, vs. the implementation details of how the skill works. +- The description competes with other skills for Claude's attention — make it distinctive and immediately recognizable. +- If you're getting lots of failures after repeated attempts, change things up. Try different sentence structures or wordings. + +I'd encourage you to be creative and mix up the style in different iterations since you'll have multiple opportunities to try different approaches and we'll just grab the highest-scoring one at the end. + +Please respond with only the new description text in tags, nothing else.""" + + text = _call_claude(prompt, model) + + match = re.search(r"(.*?)", text, re.DOTALL) + description = match.group(1).strip().strip('"') if match else text.strip().strip('"') + + transcript: dict = { + "iteration": iteration, + "prompt": prompt, + "response": text, + "parsed_description": description, + "char_count": len(description), + "over_limit": len(description) > 1024, + } + + # Safety net: the prompt already states the 1024-char hard limit, but if + # the model blew past it anyway, make one fresh single-turn call that + # quotes the too-long version and asks for a shorter rewrite. (The old + # SDK path did this as a true multi-turn; `claude -p` is one-shot, so we + # inline the prior output into the new prompt instead.) + if len(description) > 1024: + shorten_prompt = ( + f"{prompt}\n\n" + f"---\n\n" + f"A previous attempt produced this description, which at " + f"{len(description)} characters is over the 1024-character hard limit:\n\n" + f'"{description}"\n\n' + f"Rewrite it to be under 1024 characters while keeping the most " + f"important trigger words and intent coverage. Respond with only " + f"the new description in tags." + ) + shorten_text = _call_claude(shorten_prompt, model) + match = re.search(r"(.*?)", shorten_text, re.DOTALL) + shortened = match.group(1).strip().strip('"') if match else shorten_text.strip().strip('"') + + transcript["rewrite_prompt"] = shorten_prompt + transcript["rewrite_response"] = shorten_text + transcript["rewrite_description"] = shortened + transcript["rewrite_char_count"] = len(shortened) + description = shortened + + transcript["final_description"] = description + + if log_dir: + log_dir.mkdir(parents=True, exist_ok=True) + log_file = log_dir / f"improve_iter_{iteration or 'unknown'}.json" + log_file.write_text(json.dumps(transcript, indent=2)) + + return description + + +def main(): + parser = argparse.ArgumentParser(description="Improve a skill description based on eval results") + parser.add_argument("--eval-results", required=True, help="Path to eval results JSON (from run_eval.py)") + parser.add_argument("--skill-path", required=True, help="Path to skill directory") + parser.add_argument("--history", default=None, help="Path to history JSON (previous attempts)") + parser.add_argument("--model", required=True, help="Model for improvement") + parser.add_argument("--verbose", action="store_true", help="Print thinking to stderr") + args = parser.parse_args() + + skill_path = Path(args.skill_path) + if not (skill_path / "SKILL.md").exists(): + print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) + sys.exit(1) + + eval_results = json.loads(Path(args.eval_results).read_text()) + history = [] + if args.history: + history = json.loads(Path(args.history).read_text()) + + name, _, content = parse_skill_md(skill_path) + current_description = eval_results["description"] + + if args.verbose: + print(f"Current: {current_description}", file=sys.stderr) + print(f"Score: {eval_results['summary']['passed']}/{eval_results['summary']['total']}", file=sys.stderr) + + new_description = improve_description( + skill_name=name, + skill_content=content, + current_description=current_description, + eval_results=eval_results, + history=history, + model=args.model, + ) + + if args.verbose: + print(f"Improved: {new_description}", file=sys.stderr) + + # Output as JSON with both the new description and updated history + output = { + "description": new_description, + "history": history + [{ + "description": current_description, + "passed": eval_results["summary"]["passed"], + "failed": eval_results["summary"]["failed"], + "total": eval_results["summary"]["total"], + "results": eval_results["results"], + }], + } + print(json.dumps(output, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/scripts/package_skill.py b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/package_skill.py new file mode 100755 index 0000000..f48eac4 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/package_skill.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +""" +Skill Packager - Creates a distributable .skill file of a skill folder + +Usage: + python utils/package_skill.py [output-directory] + +Example: + python utils/package_skill.py skills/public/my-skill + python utils/package_skill.py skills/public/my-skill ./dist +""" + +import fnmatch +import sys +import zipfile +from pathlib import Path +from scripts.quick_validate import validate_skill + +# Patterns to exclude when packaging skills. +EXCLUDE_DIRS = {"__pycache__", "node_modules"} +EXCLUDE_GLOBS = {"*.pyc"} +EXCLUDE_FILES = {".DS_Store"} +# Directories excluded only at the skill root (not when nested deeper). +ROOT_EXCLUDE_DIRS = {"evals"} + + +def should_exclude(rel_path: Path) -> bool: + """Check if a path should be excluded from packaging.""" + parts = rel_path.parts + if any(part in EXCLUDE_DIRS for part in parts): + return True + # rel_path is relative to skill_path.parent, so parts[0] is the skill + # folder name and parts[1] (if present) is the first subdir. + if len(parts) > 1 and parts[1] in ROOT_EXCLUDE_DIRS: + return True + name = rel_path.name + if name in EXCLUDE_FILES: + return True + return any(fnmatch.fnmatch(name, pat) for pat in EXCLUDE_GLOBS) + + +def package_skill(skill_path, output_dir=None): + """ + Package a skill folder into a .skill file. + + Args: + skill_path: Path to the skill folder + output_dir: Optional output directory for the .skill file (defaults to current directory) + + Returns: + Path to the created .skill file, or None if error + """ + skill_path = Path(skill_path).resolve() + + # Validate skill folder exists + if not skill_path.exists(): + print(f"❌ Error: Skill folder not found: {skill_path}") + return None + + if not skill_path.is_dir(): + print(f"❌ Error: Path is not a directory: {skill_path}") + return None + + # Validate SKILL.md exists + skill_md = skill_path / "SKILL.md" + if not skill_md.exists(): + print(f"❌ Error: SKILL.md not found in {skill_path}") + return None + + # Run validation before packaging + print("🔍 Validating skill...") + valid, message = validate_skill(skill_path) + if not valid: + print(f"❌ Validation failed: {message}") + print(" Please fix the validation errors before packaging.") + return None + print(f"✅ {message}\n") + + # Determine output location + skill_name = skill_path.name + if output_dir: + output_path = Path(output_dir).resolve() + output_path.mkdir(parents=True, exist_ok=True) + else: + output_path = Path.cwd() + + skill_filename = output_path / f"{skill_name}.skill" + + # Create the .skill file (zip format) + try: + with zipfile.ZipFile(skill_filename, 'w', zipfile.ZIP_DEFLATED) as zipf: + # Walk through the skill directory, excluding build artifacts + for file_path in skill_path.rglob('*'): + if not file_path.is_file(): + continue + arcname = file_path.relative_to(skill_path.parent) + if should_exclude(arcname): + print(f" Skipped: {arcname}") + continue + zipf.write(file_path, arcname) + print(f" Added: {arcname}") + + print(f"\n✅ Successfully packaged skill to: {skill_filename}") + return skill_filename + + except Exception as e: + print(f"❌ Error creating .skill file: {e}") + return None + + +def main(): + if len(sys.argv) < 2: + print("Usage: python utils/package_skill.py [output-directory]") + print("\nExample:") + print(" python utils/package_skill.py skills/public/my-skill") + print(" python utils/package_skill.py skills/public/my-skill ./dist") + sys.exit(1) + + skill_path = sys.argv[1] + output_dir = sys.argv[2] if len(sys.argv) > 2 else None + + print(f"📦 Packaging skill: {skill_path}") + if output_dir: + print(f" Output directory: {output_dir}") + print() + + result = package_skill(skill_path, output_dir) + + if result: + sys.exit(0) + else: + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/scripts/quick_validate.py b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/quick_validate.py new file mode 100755 index 0000000..ed8e1dd --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/quick_validate.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +""" +Quick validation script for skills - minimal version +""" + +import sys +import os +import re +import yaml +from pathlib import Path + +def validate_skill(skill_path): + """Basic validation of a skill""" + skill_path = Path(skill_path) + + # Check SKILL.md exists + skill_md = skill_path / 'SKILL.md' + if not skill_md.exists(): + return False, "SKILL.md not found" + + # Read and validate frontmatter + content = skill_md.read_text() + if not content.startswith('---'): + return False, "No YAML frontmatter found" + + # Extract frontmatter + match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL) + if not match: + return False, "Invalid frontmatter format" + + frontmatter_text = match.group(1) + + # Parse YAML frontmatter + try: + frontmatter = yaml.safe_load(frontmatter_text) + if not isinstance(frontmatter, dict): + return False, "Frontmatter must be a YAML dictionary" + except yaml.YAMLError as e: + return False, f"Invalid YAML in frontmatter: {e}" + + # Define allowed properties + ALLOWED_PROPERTIES = {'name', 'description', 'license', 'allowed-tools', 'metadata', 'compatibility'} + + # Check for unexpected properties (excluding nested keys under metadata) + unexpected_keys = set(frontmatter.keys()) - ALLOWED_PROPERTIES + if unexpected_keys: + return False, ( + f"Unexpected key(s) in SKILL.md frontmatter: {', '.join(sorted(unexpected_keys))}. " + f"Allowed properties are: {', '.join(sorted(ALLOWED_PROPERTIES))}" + ) + + # Check required fields + if 'name' not in frontmatter: + return False, "Missing 'name' in frontmatter" + if 'description' not in frontmatter: + return False, "Missing 'description' in frontmatter" + + # Extract name for validation + name = frontmatter.get('name', '') + if not isinstance(name, str): + return False, f"Name must be a string, got {type(name).__name__}" + name = name.strip() + if name: + # Check naming convention (kebab-case: lowercase with hyphens) + if not re.match(r'^[a-z0-9-]+$', name): + return False, f"Name '{name}' should be kebab-case (lowercase letters, digits, and hyphens only)" + if name.startswith('-') or name.endswith('-') or '--' in name: + return False, f"Name '{name}' cannot start/end with hyphen or contain consecutive hyphens" + # Check name length (max 64 characters per spec) + if len(name) > 64: + return False, f"Name is too long ({len(name)} characters). Maximum is 64 characters." + + # Extract and validate description + description = frontmatter.get('description', '') + if not isinstance(description, str): + return False, f"Description must be a string, got {type(description).__name__}" + description = description.strip() + if description: + # Check for angle brackets + if '<' in description or '>' in description: + return False, "Description cannot contain angle brackets (< or >)" + # Check description length (max 1024 characters per spec) + if len(description) > 1024: + return False, f"Description is too long ({len(description)} characters). Maximum is 1024 characters." + + # Validate compatibility field if present (optional) + compatibility = frontmatter.get('compatibility', '') + if compatibility: + if not isinstance(compatibility, str): + return False, f"Compatibility must be a string, got {type(compatibility).__name__}" + if len(compatibility) > 500: + return False, f"Compatibility is too long ({len(compatibility)} characters). Maximum is 500 characters." + + return True, "Skill is valid!" + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Usage: python quick_validate.py ") + sys.exit(1) + + valid, message = validate_skill(sys.argv[1]) + print(message) + sys.exit(0 if valid else 1) \ No newline at end of file diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/scripts/run_eval.py b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/run_eval.py new file mode 100755 index 0000000..e58c70b --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/run_eval.py @@ -0,0 +1,310 @@ +#!/usr/bin/env python3 +"""Run trigger evaluation for a skill description. + +Tests whether a skill's description causes Claude to trigger (read the skill) +for a set of queries. Outputs results as JSON. +""" + +import argparse +import json +import os +import select +import subprocess +import sys +import time +import uuid +from concurrent.futures import ProcessPoolExecutor, as_completed +from pathlib import Path + +from scripts.utils import parse_skill_md + + +def find_project_root() -> Path: + """Find the project root by walking up from cwd looking for .claude/. + + Mimics how Claude Code discovers its project root, so the command file + we create ends up where claude -p will look for it. + """ + current = Path.cwd() + for parent in [current, *current.parents]: + if (parent / ".claude").is_dir(): + return parent + return current + + +def run_single_query( + query: str, + skill_name: str, + skill_description: str, + timeout: int, + project_root: str, + model: str | None = None, +) -> bool: + """Run a single query and return whether the skill was triggered. + + Creates a command file in .claude/commands/ so it appears in Claude's + available_skills list, then runs `claude -p` with the raw query. + Uses --include-partial-messages to detect triggering early from + stream events (content_block_start) rather than waiting for the + full assistant message, which only arrives after tool execution. + """ + unique_id = uuid.uuid4().hex[:8] + clean_name = f"{skill_name}-skill-{unique_id}" + project_commands_dir = Path(project_root) / ".claude" / "commands" + command_file = project_commands_dir / f"{clean_name}.md" + + try: + project_commands_dir.mkdir(parents=True, exist_ok=True) + # Use YAML block scalar to avoid breaking on quotes in description + indented_desc = "\n ".join(skill_description.split("\n")) + command_content = ( + f"---\n" + f"description: |\n" + f" {indented_desc}\n" + f"---\n\n" + f"# {skill_name}\n\n" + f"This skill handles: {skill_description}\n" + ) + command_file.write_text(command_content) + + cmd = [ + "claude", + "-p", query, + "--output-format", "stream-json", + "--verbose", + "--include-partial-messages", + ] + if model: + cmd.extend(["--model", model]) + + # Remove CLAUDECODE env var to allow nesting claude -p inside a + # Claude Code session. The guard is for interactive terminal conflicts; + # programmatic subprocess usage is safe. + env = {k: v for k, v in os.environ.items() if k != "CLAUDECODE"} + + process = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + cwd=project_root, + env=env, + ) + + triggered = False + start_time = time.time() + buffer = "" + # Track state for stream event detection + pending_tool_name = None + accumulated_json = "" + + try: + while time.time() - start_time < timeout: + if process.poll() is not None: + remaining = process.stdout.read() + if remaining: + buffer += remaining.decode("utf-8", errors="replace") + break + + ready, _, _ = select.select([process.stdout], [], [], 1.0) + if not ready: + continue + + chunk = os.read(process.stdout.fileno(), 8192) + if not chunk: + break + buffer += chunk.decode("utf-8", errors="replace") + + while "\n" in buffer: + line, buffer = buffer.split("\n", 1) + line = line.strip() + if not line: + continue + + try: + event = json.loads(line) + except json.JSONDecodeError: + continue + + # Early detection via stream events + if event.get("type") == "stream_event": + se = event.get("event", {}) + se_type = se.get("type", "") + + if se_type == "content_block_start": + cb = se.get("content_block", {}) + if cb.get("type") == "tool_use": + tool_name = cb.get("name", "") + if tool_name in ("Skill", "Read"): + pending_tool_name = tool_name + accumulated_json = "" + else: + return False + + elif se_type == "content_block_delta" and pending_tool_name: + delta = se.get("delta", {}) + if delta.get("type") == "input_json_delta": + accumulated_json += delta.get("partial_json", "") + if clean_name in accumulated_json: + return True + + elif se_type in ("content_block_stop", "message_stop"): + if pending_tool_name: + return clean_name in accumulated_json + if se_type == "message_stop": + return False + + # Fallback: full assistant message + elif event.get("type") == "assistant": + message = event.get("message", {}) + for content_item in message.get("content", []): + if content_item.get("type") != "tool_use": + continue + tool_name = content_item.get("name", "") + tool_input = content_item.get("input", {}) + if tool_name == "Skill" and clean_name in tool_input.get("skill", ""): + triggered = True + elif tool_name == "Read" and clean_name in tool_input.get("file_path", ""): + triggered = True + return triggered + + elif event.get("type") == "result": + return triggered + finally: + # Clean up process on any exit path (return, exception, timeout) + if process.poll() is None: + process.kill() + process.wait() + + return triggered + finally: + if command_file.exists(): + command_file.unlink() + + +def run_eval( + eval_set: list[dict], + skill_name: str, + description: str, + num_workers: int, + timeout: int, + project_root: Path, + runs_per_query: int = 1, + trigger_threshold: float = 0.5, + model: str | None = None, +) -> dict: + """Run the full eval set and return results.""" + results = [] + + with ProcessPoolExecutor(max_workers=num_workers) as executor: + future_to_info = {} + for item in eval_set: + for run_idx in range(runs_per_query): + future = executor.submit( + run_single_query, + item["query"], + skill_name, + description, + timeout, + str(project_root), + model, + ) + future_to_info[future] = (item, run_idx) + + query_triggers: dict[str, list[bool]] = {} + query_items: dict[str, dict] = {} + for future in as_completed(future_to_info): + item, _ = future_to_info[future] + query = item["query"] + query_items[query] = item + if query not in query_triggers: + query_triggers[query] = [] + try: + query_triggers[query].append(future.result()) + except Exception as e: + print(f"Warning: query failed: {e}", file=sys.stderr) + query_triggers[query].append(False) + + for query, triggers in query_triggers.items(): + item = query_items[query] + trigger_rate = sum(triggers) / len(triggers) + should_trigger = item["should_trigger"] + if should_trigger: + did_pass = trigger_rate >= trigger_threshold + else: + did_pass = trigger_rate < trigger_threshold + results.append({ + "query": query, + "should_trigger": should_trigger, + "trigger_rate": trigger_rate, + "triggers": sum(triggers), + "runs": len(triggers), + "pass": did_pass, + }) + + passed = sum(1 for r in results if r["pass"]) + total = len(results) + + return { + "skill_name": skill_name, + "description": description, + "results": results, + "summary": { + "total": total, + "passed": passed, + "failed": total - passed, + }, + } + + +def main(): + parser = argparse.ArgumentParser(description="Run trigger evaluation for a skill description") + parser.add_argument("--eval-set", required=True, help="Path to eval set JSON file") + parser.add_argument("--skill-path", required=True, help="Path to skill directory") + parser.add_argument("--description", default=None, help="Override description to test") + parser.add_argument("--num-workers", type=int, default=10, help="Number of parallel workers") + parser.add_argument("--timeout", type=int, default=30, help="Timeout per query in seconds") + parser.add_argument("--runs-per-query", type=int, default=3, help="Number of runs per query") + parser.add_argument("--trigger-threshold", type=float, default=0.5, help="Trigger rate threshold") + parser.add_argument("--model", default=None, help="Model to use for claude -p (default: user's configured model)") + parser.add_argument("--verbose", action="store_true", help="Print progress to stderr") + args = parser.parse_args() + + eval_set = json.loads(Path(args.eval_set).read_text()) + skill_path = Path(args.skill_path) + + if not (skill_path / "SKILL.md").exists(): + print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) + sys.exit(1) + + name, original_description, content = parse_skill_md(skill_path) + description = args.description or original_description + project_root = find_project_root() + + if args.verbose: + print(f"Evaluating: {description}", file=sys.stderr) + + output = run_eval( + eval_set=eval_set, + skill_name=name, + description=description, + num_workers=args.num_workers, + timeout=args.timeout, + project_root=project_root, + runs_per_query=args.runs_per_query, + trigger_threshold=args.trigger_threshold, + model=args.model, + ) + + if args.verbose: + summary = output["summary"] + print(f"Results: {summary['passed']}/{summary['total']} passed", file=sys.stderr) + for r in output["results"]: + status = "PASS" if r["pass"] else "FAIL" + rate_str = f"{r['triggers']}/{r['runs']}" + print(f" [{status}] rate={rate_str} expected={r['should_trigger']}: {r['query'][:70]}", file=sys.stderr) + + print(json.dumps(output, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/scripts/run_loop.py b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/run_loop.py new file mode 100755 index 0000000..30a263d --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/run_loop.py @@ -0,0 +1,328 @@ +#!/usr/bin/env python3 +"""Run the eval + improve loop until all pass or max iterations reached. + +Combines run_eval.py and improve_description.py in a loop, tracking history +and returning the best description found. Supports train/test split to prevent +overfitting. +""" + +import argparse +import json +import random +import sys +import tempfile +import time +import webbrowser +from pathlib import Path + +from scripts.generate_report import generate_html +from scripts.improve_description import improve_description +from scripts.run_eval import find_project_root, run_eval +from scripts.utils import parse_skill_md + + +def split_eval_set(eval_set: list[dict], holdout: float, seed: int = 42) -> tuple[list[dict], list[dict]]: + """Split eval set into train and test sets, stratified by should_trigger.""" + random.seed(seed) + + # Separate by should_trigger + trigger = [e for e in eval_set if e["should_trigger"]] + no_trigger = [e for e in eval_set if not e["should_trigger"]] + + # Shuffle each group + random.shuffle(trigger) + random.shuffle(no_trigger) + + # Calculate split points + n_trigger_test = max(1, int(len(trigger) * holdout)) + n_no_trigger_test = max(1, int(len(no_trigger) * holdout)) + + # Split + test_set = trigger[:n_trigger_test] + no_trigger[:n_no_trigger_test] + train_set = trigger[n_trigger_test:] + no_trigger[n_no_trigger_test:] + + return train_set, test_set + + +def run_loop( + eval_set: list[dict], + skill_path: Path, + description_override: str | None, + num_workers: int, + timeout: int, + max_iterations: int, + runs_per_query: int, + trigger_threshold: float, + holdout: float, + model: str, + verbose: bool, + live_report_path: Path | None = None, + log_dir: Path | None = None, +) -> dict: + """Run the eval + improvement loop.""" + project_root = find_project_root() + name, original_description, content = parse_skill_md(skill_path) + current_description = description_override or original_description + + # Split into train/test if holdout > 0 + if holdout > 0: + train_set, test_set = split_eval_set(eval_set, holdout) + if verbose: + print(f"Split: {len(train_set)} train, {len(test_set)} test (holdout={holdout})", file=sys.stderr) + else: + train_set = eval_set + test_set = [] + + history = [] + exit_reason = "unknown" + + for iteration in range(1, max_iterations + 1): + if verbose: + print(f"\n{'='*60}", file=sys.stderr) + print(f"Iteration {iteration}/{max_iterations}", file=sys.stderr) + print(f"Description: {current_description}", file=sys.stderr) + print(f"{'='*60}", file=sys.stderr) + + # Evaluate train + test together in one batch for parallelism + all_queries = train_set + test_set + t0 = time.time() + all_results = run_eval( + eval_set=all_queries, + skill_name=name, + description=current_description, + num_workers=num_workers, + timeout=timeout, + project_root=project_root, + runs_per_query=runs_per_query, + trigger_threshold=trigger_threshold, + model=model, + ) + eval_elapsed = time.time() - t0 + + # Split results back into train/test by matching queries + train_queries_set = {q["query"] for q in train_set} + train_result_list = [r for r in all_results["results"] if r["query"] in train_queries_set] + test_result_list = [r for r in all_results["results"] if r["query"] not in train_queries_set] + + train_passed = sum(1 for r in train_result_list if r["pass"]) + train_total = len(train_result_list) + train_summary = {"passed": train_passed, "failed": train_total - train_passed, "total": train_total} + train_results = {"results": train_result_list, "summary": train_summary} + + if test_set: + test_passed = sum(1 for r in test_result_list if r["pass"]) + test_total = len(test_result_list) + test_summary = {"passed": test_passed, "failed": test_total - test_passed, "total": test_total} + test_results = {"results": test_result_list, "summary": test_summary} + else: + test_results = None + test_summary = None + + history.append({ + "iteration": iteration, + "description": current_description, + "train_passed": train_summary["passed"], + "train_failed": train_summary["failed"], + "train_total": train_summary["total"], + "train_results": train_results["results"], + "test_passed": test_summary["passed"] if test_summary else None, + "test_failed": test_summary["failed"] if test_summary else None, + "test_total": test_summary["total"] if test_summary else None, + "test_results": test_results["results"] if test_results else None, + # For backward compat with report generator + "passed": train_summary["passed"], + "failed": train_summary["failed"], + "total": train_summary["total"], + "results": train_results["results"], + }) + + # Write live report if path provided + if live_report_path: + partial_output = { + "original_description": original_description, + "best_description": current_description, + "best_score": "in progress", + "iterations_run": len(history), + "holdout": holdout, + "train_size": len(train_set), + "test_size": len(test_set), + "history": history, + } + live_report_path.write_text(generate_html(partial_output, auto_refresh=True, skill_name=name)) + + if verbose: + def print_eval_stats(label, results, elapsed): + pos = [r for r in results if r["should_trigger"]] + neg = [r for r in results if not r["should_trigger"]] + tp = sum(r["triggers"] for r in pos) + pos_runs = sum(r["runs"] for r in pos) + fn = pos_runs - tp + fp = sum(r["triggers"] for r in neg) + neg_runs = sum(r["runs"] for r in neg) + tn = neg_runs - fp + total = tp + tn + fp + fn + precision = tp / (tp + fp) if (tp + fp) > 0 else 1.0 + recall = tp / (tp + fn) if (tp + fn) > 0 else 1.0 + accuracy = (tp + tn) / total if total > 0 else 0.0 + print(f"{label}: {tp+tn}/{total} correct, precision={precision:.0%} recall={recall:.0%} accuracy={accuracy:.0%} ({elapsed:.1f}s)", file=sys.stderr) + for r in results: + status = "PASS" if r["pass"] else "FAIL" + rate_str = f"{r['triggers']}/{r['runs']}" + print(f" [{status}] rate={rate_str} expected={r['should_trigger']}: {r['query'][:60]}", file=sys.stderr) + + print_eval_stats("Train", train_results["results"], eval_elapsed) + if test_summary: + print_eval_stats("Test ", test_results["results"], 0) + + if train_summary["failed"] == 0: + exit_reason = f"all_passed (iteration {iteration})" + if verbose: + print(f"\nAll train queries passed on iteration {iteration}!", file=sys.stderr) + break + + if iteration == max_iterations: + exit_reason = f"max_iterations ({max_iterations})" + if verbose: + print(f"\nMax iterations reached ({max_iterations}).", file=sys.stderr) + break + + # Improve the description based on train results + if verbose: + print(f"\nImproving description...", file=sys.stderr) + + t0 = time.time() + # Strip test scores from history so improvement model can't see them + blinded_history = [ + {k: v for k, v in h.items() if not k.startswith("test_")} + for h in history + ] + new_description = improve_description( + skill_name=name, + skill_content=content, + current_description=current_description, + eval_results=train_results, + history=blinded_history, + model=model, + log_dir=log_dir, + iteration=iteration, + ) + improve_elapsed = time.time() - t0 + + if verbose: + print(f"Proposed ({improve_elapsed:.1f}s): {new_description}", file=sys.stderr) + + current_description = new_description + + # Find the best iteration by TEST score (or train if no test set) + if test_set: + best = max(history, key=lambda h: h["test_passed"] or 0) + best_score = f"{best['test_passed']}/{best['test_total']}" + else: + best = max(history, key=lambda h: h["train_passed"]) + best_score = f"{best['train_passed']}/{best['train_total']}" + + if verbose: + print(f"\nExit reason: {exit_reason}", file=sys.stderr) + print(f"Best score: {best_score} (iteration {best['iteration']})", file=sys.stderr) + + return { + "exit_reason": exit_reason, + "original_description": original_description, + "best_description": best["description"], + "best_score": best_score, + "best_train_score": f"{best['train_passed']}/{best['train_total']}", + "best_test_score": f"{best['test_passed']}/{best['test_total']}" if test_set else None, + "final_description": current_description, + "iterations_run": len(history), + "holdout": holdout, + "train_size": len(train_set), + "test_size": len(test_set), + "history": history, + } + + +def main(): + parser = argparse.ArgumentParser(description="Run eval + improve loop") + parser.add_argument("--eval-set", required=True, help="Path to eval set JSON file") + parser.add_argument("--skill-path", required=True, help="Path to skill directory") + parser.add_argument("--description", default=None, help="Override starting description") + parser.add_argument("--num-workers", type=int, default=10, help="Number of parallel workers") + parser.add_argument("--timeout", type=int, default=30, help="Timeout per query in seconds") + parser.add_argument("--max-iterations", type=int, default=5, help="Max improvement iterations") + parser.add_argument("--runs-per-query", type=int, default=3, help="Number of runs per query") + parser.add_argument("--trigger-threshold", type=float, default=0.5, help="Trigger rate threshold") + parser.add_argument("--holdout", type=float, default=0.4, help="Fraction of eval set to hold out for testing (0 to disable)") + parser.add_argument("--model", required=True, help="Model for improvement") + parser.add_argument("--verbose", action="store_true", help="Print progress to stderr") + parser.add_argument("--report", default="auto", help="Generate HTML report at this path (default: 'auto' for temp file, 'none' to disable)") + parser.add_argument("--results-dir", default=None, help="Save all outputs (results.json, report.html, log.txt) to a timestamped subdirectory here") + args = parser.parse_args() + + eval_set = json.loads(Path(args.eval_set).read_text()) + skill_path = Path(args.skill_path) + + if not (skill_path / "SKILL.md").exists(): + print(f"Error: No SKILL.md found at {skill_path}", file=sys.stderr) + sys.exit(1) + + name, _, _ = parse_skill_md(skill_path) + + # Set up live report path + if args.report != "none": + if args.report == "auto": + timestamp = time.strftime("%Y%m%d_%H%M%S") + live_report_path = Path(tempfile.gettempdir()) / f"skill_description_report_{skill_path.name}_{timestamp}.html" + else: + live_report_path = Path(args.report) + # Open the report immediately so the user can watch + live_report_path.write_text("

Starting optimization loop...

") + webbrowser.open(str(live_report_path)) + else: + live_report_path = None + + # Determine output directory (create before run_loop so logs can be written) + if args.results_dir: + timestamp = time.strftime("%Y-%m-%d_%H%M%S") + results_dir = Path(args.results_dir) / timestamp + results_dir.mkdir(parents=True, exist_ok=True) + else: + results_dir = None + + log_dir = results_dir / "logs" if results_dir else None + + output = run_loop( + eval_set=eval_set, + skill_path=skill_path, + description_override=args.description, + num_workers=args.num_workers, + timeout=args.timeout, + max_iterations=args.max_iterations, + runs_per_query=args.runs_per_query, + trigger_threshold=args.trigger_threshold, + holdout=args.holdout, + model=args.model, + verbose=args.verbose, + live_report_path=live_report_path, + log_dir=log_dir, + ) + + # Save JSON output + json_output = json.dumps(output, indent=2) + print(json_output) + if results_dir: + (results_dir / "results.json").write_text(json_output) + + # Write final HTML report (without auto-refresh) + if live_report_path: + live_report_path.write_text(generate_html(output, auto_refresh=False, skill_name=name)) + print(f"\nReport: {live_report_path}", file=sys.stderr) + + if results_dir and live_report_path: + (results_dir / "report.html").write_text(generate_html(output, auto_refresh=False, skill_name=name)) + + if results_dir: + print(f"Results saved to: {results_dir}", file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/third_party/zeroclaw/.claude/skills/skill-creator/scripts/utils.py b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/utils.py new file mode 100644 index 0000000..51b6a07 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/skill-creator/scripts/utils.py @@ -0,0 +1,47 @@ +"""Shared utilities for skill-creator scripts.""" + +from pathlib import Path + + + +def parse_skill_md(skill_path: Path) -> tuple[str, str, str]: + """Parse a SKILL.md file, returning (name, description, full_content).""" + content = (skill_path / "SKILL.md").read_text() + lines = content.split("\n") + + if lines[0].strip() != "---": + raise ValueError("SKILL.md missing frontmatter (no opening ---)") + + end_idx = None + for i, line in enumerate(lines[1:], start=1): + if line.strip() == "---": + end_idx = i + break + + if end_idx is None: + raise ValueError("SKILL.md missing frontmatter (no closing ---)") + + name = "" + description = "" + frontmatter_lines = lines[1:end_idx] + i = 0 + while i < len(frontmatter_lines): + line = frontmatter_lines[i] + if line.startswith("name:"): + name = line[len("name:"):].strip().strip('"').strip("'") + elif line.startswith("description:"): + value = line[len("description:"):].strip() + # Handle YAML multiline indicators (>, |, >-, |-) + if value in (">", "|", ">-", "|-"): + continuation_lines: list[str] = [] + i += 1 + while i < len(frontmatter_lines) and (frontmatter_lines[i].startswith(" ") or frontmatter_lines[i].startswith("\t")): + continuation_lines.append(frontmatter_lines[i].strip()) + i += 1 + description = " ".join(continuation_lines) + continue + else: + description = value.strip('"').strip("'") + i += 1 + + return name, description, content diff --git a/third_party/zeroclaw/.claude/skills/zeroclaw/SKILL.md b/third_party/zeroclaw/.claude/skills/zeroclaw/SKILL.md new file mode 100644 index 0000000..0ac4d13 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/zeroclaw/SKILL.md @@ -0,0 +1,285 @@ +--- +name: zeroclaw +description: "Help users operate and interact with their ZeroClaw agent instance — through both the CLI (`zeroclaw` commands) and the REST/WebSocket gateway API. Use this skill whenever the user wants to: send messages to ZeroClaw, manage memory or cron jobs, check system status, configure channels or providers, hit the gateway API, troubleshoot their ZeroClaw setup, build from source, or do anything involving the `zeroclaw` binary or its HTTP endpoints. Trigger this even if the user just says things like 'check my agent status', 'schedule a reminder', 'store this in memory', 'list my cron jobs', 'send a message to my bot', 'set up Telegram', 'build zeroclaw', or 'my bot is broken' — these are all ZeroClaw operations." +--- + +# ZeroClaw Skill + +You are helping a user operate their ZeroClaw agent instance. ZeroClaw is an autonomous agent runtime with a CLI and an HTTP/WebSocket gateway. + +Your job is to understand what the user wants to accomplish and then **execute it** — run the command, make the API call, report the result. Do not just show commands for the user to copy-paste. Actually run them via the Bash tool and tell the user what happened. The only exception is destructive operations (clearing all memory, estop kill-all) where you should confirm first. + +## Adaptive Expertise + +Pay attention to how the user talks. Someone who says "can you hit the webhook endpoint with a POST" is telling you they know what they're doing — be concise, skip explanations, just execute. Someone who says "how do I make my bot remember things" needs more context about what's happening under the hood. + +Signals of technical comfort: mentions specific endpoints, HTTP methods, JSON fields, talks about tokens/auth, uses CLI flags fluently, references config files directly. + +Signals of less familiarity: asks "what does X do", uses casual language about the bot/agent, describes goals rather than mechanisms ("I want it to check something every morning"). + +Default to a middle ground — brief explanation of what you're about to do, then do it. Dial up or down from there based on cues. + +## Discovery — Before You Act + +Before running any ZeroClaw operation, make sure you know where things are: + +1. **Find the binary.** Search in this order: + - `which zeroclaw` (PATH) + - The current project's build output: `./target/release/zeroclaw` or `./target/debug/zeroclaw` — this is the right choice when the user is working inside the ZeroClaw source tree and may have local changes + - Common install locations: `~/.cargo/bin/zeroclaw`, `~/Downloads/zeroclaw-bin/zeroclaw` + + If no binary is found anywhere, offer to build from source (see "Building from Source" below). If the user is a developer working on ZeroClaw itself, they'll likely want the local build — watch for cues like them editing source files, mentioning PRs, or being in the project directory. + +2. **Check if the gateway is running** (only needed for REST/WebSocket operations). A quick `curl -sf http://127.0.0.1:42617/health` tells you. If it's not running and the user wants REST access, let them know and offer to start it (`zeroclaw gateway` or `zeroclaw daemon`). + +3. **Check auth status.** If the gateway requires pairing (`require_pairing = true` is the default), REST calls need a bearer token. Run `zeroclaw status` to see the current state, or check `~/.zeroclaw/config.toml` for a stored token under `[gateway]`. + +Cache these findings for the conversation — don't re-discover every time. + +## Important: REPL Limitation + +`zeroclaw agent` (interactive REPL) requires interactive stdin, which doesn't work through the Bash tool. When the user wants to chat with their agent, use single-message mode instead: + +```bash +zeroclaw agent -m "the message" +``` + +Each `-m` invocation is independent (no conversation history between calls). If the user needs multi-turn conversation, let them know they can run `zeroclaw agent` directly in their terminal, or use the WebSocket endpoint for programmatic streaming. + +## First-Time Setup + +If the user hasn't set up ZeroClaw yet (no `~/.zeroclaw/config.toml` exists), guide them through onboarding: + +```bash +zeroclaw onboard # Quick mode — defaults to OpenRouter +zeroclaw onboard --provider anthropic # Use Anthropic directly +zeroclaw onboard # Guided wizard (default) +``` + +After onboarding, verify everything works: +```bash +zeroclaw status +zeroclaw doctor +``` + +If they already have a config but something is broken, `zeroclaw onboard --channels-only` repairs just the channel configuration without overwriting everything else. + +## Building from Source + +If the user wants to build ZeroClaw (or no binary is installed): + +```bash +cargo build --release +``` + +This produces `target/release/zeroclaw`. For faster iteration during development, `cargo build` (debug mode) is quicker but produces a slower binary at `target/debug/zeroclaw`. + +You can also run directly without a separate build step: +```bash +cargo run --release -- [args] +``` + +Before building, `cargo check` gives a quick compile validation without the full build. + +## Choosing CLI vs REST + +Both surfaces can do most things. Rules of thumb: + +- **CLI is simpler** for one-off operations from the terminal. It handles auth internally and formats output nicely. Prefer CLI when the user is working locally. +- **REST is needed** when the user is building an integration, scripting from another language, or accessing a remote ZeroClaw instance. Also needed for streaming (WebSocket, SSE). +- If unclear, **default to CLI** — it's less setup. + +## Core Operations + +### Sending Messages + +**CLI:** `zeroclaw agent -m "your message here"` — remember, always use `-m` mode, not bare `zeroclaw agent`. + +**REST:** +```bash +curl -X POST http://127.0.0.1:42617/webhook \ + -H "Authorization: Bearer " \ + -H "Content-Type: application/json" \ + -d '{"message": "your message here"}' +``` +Response: `{"response": "...", "model": "..."}` + +**WebSocket** (for streaming): connect to `ws://127.0.0.1:42617/ws/chat?token=`, send `{"type": "message", "content": "..."}`, receive `{"type": "done", "full_response": "..."}`. + +### System Status + +Run `zeroclaw status` to see provider, model, uptime, channels, memory backend. For deeper diagnostics: `zeroclaw doctor`. + +**REST:** `GET /api/status` (same info as JSON), `GET /health` (no auth, quick ok/not-ok). + +### Memory + +The CLI can list, get, and clear memories but **cannot store** them directly. To store a memory: +- Via agent: `zeroclaw agent -m "remember that my favorite color is blue"` +- Via REST: `POST /api/memory` with `{"key": "...", "content": "...", "category": "core"}` + +**CLI (read/delete):** +- `zeroclaw memory list` — list all entries +- `zeroclaw memory list --category core --limit 10` — filtered +- `zeroclaw memory get "key-name"` — get specific entry +- `zeroclaw memory stats` — usage statistics +- `zeroclaw memory clear --key "prefix" --yes` — delete entries (confirm with user first) + +**REST (full CRUD):** +- `GET /api/memory` — list all (optional: `?query=search+text&category=core`) +- `POST /api/memory` — store: `{"key": "...", "content": "...", "category": "core"}` +- `DELETE /api/memory/{key}` — delete entry + +Categories: `core`, `daily`, `conversation`, or any custom string. + +### Cron / Scheduling + +**CLI:** +- `zeroclaw cron list` — show all jobs +- `zeroclaw cron add '0 9 * * 1-5' 'Good morning' --tz America/New_York` — recurring +- `zeroclaw cron add-at '2026-03-11T10:00:00Z' 'Remind me'` — one-time at specific time +- `zeroclaw cron add-every 3600000 'Check health'` — interval in ms +- `zeroclaw cron once 30m 'Follow up'` — delay from now +- `zeroclaw cron pause ` / `zeroclaw cron resume ` / `zeroclaw cron remove ` + +**REST:** +- `GET /api/cron` — list jobs +- `POST /api/cron` — add: `{"name": "...", "schedule": "0 9 * * *", "command": "..."}` +- `DELETE /api/cron/{id}` — remove job + +### Tools + +Tools are used automatically by the agent during conversations (shell, file ops, memory, browser, HTTP, web search, git, etc. — 30+ tools gated by security policy). + +To see what's available: `GET /api/tools` (REST) lists all registered tools with descriptions and parameter schemas. + +### Configuration + +Edit `~/.zeroclaw/config.toml` directly, or re-run `zeroclaw onboard` to reconfigure. + +**REST:** +- `GET /api/config` — get current config (secrets masked as `***MASKED***`) +- `PUT /api/config` — update config (send raw TOML as body, 1MB limit) + +### Providers & Models + +- `zeroclaw providers` — list all supported providers +- `zeroclaw models list` — cached model catalog +- `zeroclaw models refresh --all` — refresh from providers +- `zeroclaw models set anthropic/claude-sonnet-4-6` — set default model + +Override per-message: `zeroclaw agent -p anthropic --model claude-sonnet-4-6 -m "hello"` + +### Real-Time Events (SSE) + +REST only — useful for building dashboards or monitoring: +```bash +curl -N -H "Authorization: Bearer " http://127.0.0.1:42617/api/events +``` +Streams JSON events: `llm_request`, `tool_call_start`, `tool_call`, `agent_start`, `agent_end`, `error`. + +### Cost Tracking + +`GET /api/cost` — returns session/daily/monthly costs, token counts, per-model breakdown. + +### Emergency Stop + +Confirm with the user before running any estop command — these are disruptive. + +- `zeroclaw estop --level kill-all` — stop everything +- `zeroclaw estop --level network-kill` — block all network +- `zeroclaw estop --level tool-freeze --tool shell` — freeze specific tool +- `zeroclaw estop status` — check current estop state +- `zeroclaw estop resume --network` — resume + +### Gateway Lifecycle + +- `zeroclaw gateway` — start HTTP gateway (foreground) +- `zeroclaw gateway -p 8080 --host 127.0.0.1` — custom bind +- `zeroclaw daemon` — start gateway + channels + scheduler + heartbeat +- `zeroclaw service install/start/stop/status/uninstall` — OS service management + +### Channels + +ZeroClaw supports 21 messaging channels. To add one, you need to edit `~/.zeroclaw/config.toml`. For example, to set up Telegram: + +```toml +[channels] +telegram = true + +[channels_config.telegram] +bot_token = "your-bot-token-from-botfather" +allowed_users = [123456789] +``` + +Then restart the daemon. Check channel health with `zeroclaw channels doctor`. + +For the full list of channels and their config fields, read `references/cli-reference.md` (Channels section). + +### Pairing (Authentication Setup) + +When `require_pairing = true` (default), REST clients need a bearer token: +```bash +curl -X POST http://127.0.0.1:42617/pair -H "X-Pairing-Code: " +``` +Response includes `{"token": "..."}` — save this for subsequent requests. + +## Common Workflows + +Here are multi-step sequences you're likely to need: + +**"Is my agent healthy?"** +1. Run `zeroclaw status` — check provider, model, channels +2. Run `zeroclaw doctor` — check connectivity, diagnose issues +3. If gateway needed: `curl -sf http://127.0.0.1:42617/health` + +**"Set up a new channel"** +1. Read the current config: `cat ~/.zeroclaw/config.toml` +2. Add the channel config (edit the TOML) +3. Restart: `zeroclaw service restart` (or restart daemon manually) +4. Verify: `zeroclaw channels doctor` + +**"Switch to a different model"** +1. Check available: `zeroclaw models list` +2. Set it: `zeroclaw models set ` +3. Verify: `zeroclaw status` +4. Test: `zeroclaw agent -m "hello, what model are you?"` + +## Gateway Defaults + +- **Port:** 42617 +- **Host:** 127.0.0.1 +- **Auth:** Pairing required (bearer token) +- **Rate limits:** 60 webhook requests/min, 10 pairing attempts/min +- **Body limit:** 64KB (1MB for config updates) +- **Timeout:** 30 seconds +- **Idempotency:** Optional `X-Idempotency-Key` header on `/webhook` (300s TTL) +- **Config location:** `~/.zeroclaw/config.toml` + +## Reference Files + +For the complete API specification with every endpoint, field, and edge case, read `references/rest-api.md`. + +For the full CLI command tree with all flags and options, read `references/cli-reference.md`. + +Only load these when you need precise details beyond what's in this file — for most operations, the quick references above are sufficient. + +## Troubleshooting + +**"zeroclaw: command not found"** — Binary not in PATH. Check `./target/release/zeroclaw`, `~/.cargo/bin/zeroclaw`, or build from source with `cargo build --release`. + +**"Connection refused" on REST calls** — Gateway isn't running. Start it with `zeroclaw gateway` or `zeroclaw daemon`. + +**"Unauthorized" (401/403)** — Bearer token is missing or invalid. Re-pair via `POST /pair` with the pairing code, or check `~/.zeroclaw/config.toml` for the stored token. + +**"LLM request failed" (500)** — Provider issue. Run `zeroclaw doctor` to check connectivity. Common causes: expired API key, provider outage, rate limiting on the provider side. + +**"Too many requests" (429)** — You're hitting ZeroClaw's rate limit. Back off — the response includes `retry_after` with the number of seconds to wait. + +**Agent not using tools / acting limited** — Check autonomy settings in config.toml under `[autonomy]`. `level = "read_only"` disables most tools. Try `level = "supervised"` or `level = "full"`. + +**Memory not persisting** — Check `[memory]` config. If `backend = "none"`, nothing is stored. Switch to `"sqlite"` or `"markdown"`. Also verify `auto_save = true`. + +**Channel not responding** — Run `zeroclaw channels doctor` for the specific channel. Common issues: expired bot token, wrong allowed_users list, channel not enabled in `[channels]`. + +Report errors to the user with context appropriate to their expertise level. For beginners, explain what went wrong and suggest the fix. For experts, just show the error and the fix. diff --git a/third_party/zeroclaw/.claude/skills/zeroclaw/evals/evals.json b/third_party/zeroclaw/.claude/skills/zeroclaw/evals/evals.json new file mode 100644 index 0000000..2e7ff79 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/zeroclaw/evals/evals.json @@ -0,0 +1,23 @@ +{ + "skill_name": "zeroclaw", + "evals": [ + { + "id": 0, + "prompt": "how do i make my bot remember my name", + "expected_output": "Executes a zeroclaw command to store a memory, explains what happened in beginner-friendly language", + "files": [] + }, + { + "id": 1, + "prompt": "I want to schedule a daily health check on my ZeroClaw instance every morning at 9am ET", + "expected_output": "Executes zeroclaw cron add with correct cron expression and timezone flag", + "files": [] + }, + { + "id": 2, + "prompt": "Set up a Python script that monitors my ZeroClaw agent's activity via SSE and logs tool calls to a file", + "expected_output": "Writes a Python script that connects to /api/events SSE endpoint with auth, filters for tool_call events, and logs to a file", + "files": [] + } + ] +} diff --git a/third_party/zeroclaw/.claude/skills/zeroclaw/references/cli-reference.md b/third_party/zeroclaw/.claude/skills/zeroclaw/references/cli-reference.md new file mode 100644 index 0000000..14a96a8 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/zeroclaw/references/cli-reference.md @@ -0,0 +1,277 @@ +# ZeroClaw CLI Reference + +Complete command reference for the `zeroclaw` binary. + +## Table of Contents + +1. [Agent](#agent) +2. [Onboarding](#onboarding) +3. [Status & Diagnostics](#status--diagnostics) +4. [Memory](#memory) +5. [Cron](#cron) +6. [Providers & Models](#providers--models) +7. [Gateway & Daemon](#gateway--daemon) +8. [Service Management](#service-management) +9. [Channels](#channels) +10. [Security & Emergency Stop](#security--emergency-stop) +11. [Hardware Peripherals](#hardware-peripherals) +12. [Skills](#skills) +13. [Shell Completions](#shell-completions) + +--- + +## Agent + +Interactive chat or single-message mode. + +```bash +zeroclaw agent # Interactive REPL +zeroclaw agent -m "Summarize today's logs" # Single message +zeroclaw agent -p anthropic --model claude-sonnet-4-6 # Override provider/model +zeroclaw agent -t 0.3 # Set temperature +zeroclaw agent --peripheral nucleo-f401re:/dev/ttyACM0 # Attach hardware +``` + +**Key flags:** +- `-m ` — single message mode (no REPL) +- `-p ` — override provider (openrouter, anthropic, openai, ollama) +- `--model ` — override model +- `-t ` — temperature (0.0–2.0) +- `--peripheral :` — attach hardware peripheral + +The agent has access to 30+ tools gated by security policy: shell, file_read, file_write, file_edit, glob_search, content_search, memory_store, memory_recall, memory_forget, browser, http_request, web_fetch, web_search, cron, delegate, git, and more. Max tool iterations defaults to 10. + +--- + +## Onboarding + +First-time setup or reconfiguration. + +```bash +zeroclaw onboard # Quick mode (default: openrouter) +zeroclaw onboard --provider anthropic # Quick mode with specific provider +zeroclaw onboard # Guided wizard (default) +zeroclaw onboard --memory sqlite # Set memory backend +zeroclaw onboard --force # Overwrite existing config +zeroclaw onboard --channels-only # Repair channels only +``` + +**Key flags:** +- `--provider ` — openrouter (default), anthropic, openai, ollama +- `--model ` — default model +- `--memory ` — sqlite, markdown, lucid, none +- `--force` — overwrite existing config.toml +- `--channels-only` — only repair channel configuration +- `--reinit` — start fresh (backs up existing config) + +Creates `~/.zeroclaw/config.toml` with `0600` permissions. + +--- + +## Status & Diagnostics + +```bash +zeroclaw status # System overview +zeroclaw doctor # Run all diagnostic checks +zeroclaw doctor models # Probe model connectivity +zeroclaw doctor traces # Query execution traces +``` + +--- + +## Memory + +```bash +zeroclaw memory list # List all entries +zeroclaw memory list --category core --limit 10 # Filtered list +zeroclaw memory get "some-key" # Get specific entry +zeroclaw memory stats # Usage statistics +zeroclaw memory clear --key "prefix" --yes # Delete entries (requires --yes) +``` + +**Key flags:** +- `--category ` — filter by category (core, daily, conversation, custom) +- `--limit ` — limit results +- `--key ` — key prefix for clear operations +- `--yes` — skip confirmation (required for clear) + +--- + +## Cron + +```bash +zeroclaw cron list # List all jobs +zeroclaw cron add '0 9 * * 1-5' 'Good morning' --tz America/New_York # Recurring (cron expr) +zeroclaw cron add-at '2026-03-11T10:00:00Z' 'Remind me about meeting' # One-time at specific time +zeroclaw cron add-every 3600000 'Check server health' # Interval in milliseconds +zeroclaw cron once 30m 'Follow up on that task' # Delay from now +zeroclaw cron pause # Pause job +zeroclaw cron resume # Resume job +zeroclaw cron remove # Delete job +``` + +**Subcommands:** +- `add ` — standard cron expression (5-field) +- `add-at ` — fire once at exact time +- `add-every ` — repeating interval +- `once ` — delay from now (e.g., `30m`, `2h`, `1d`) + +--- + +## Providers & Models + +```bash +zeroclaw providers # List all 40+ supported providers +zeroclaw models list # Show cached model catalog +zeroclaw models refresh --all # Refresh catalogs from all providers +zeroclaw models set anthropic/claude-sonnet-4-6 # Set default model +zeroclaw models status # Current model info +``` + +Model routing in config.toml: +```toml +[[model_routes]] +hint = "reasoning" +provider = "openrouter" +model = "anthropic/claude-sonnet-4-6" +``` + +--- + +## Gateway & Daemon + +```bash +zeroclaw gateway # Start HTTP gateway (foreground) +zeroclaw gateway -p 8080 --host 127.0.0.1 # Custom port/host + +zeroclaw daemon # Gateway + channels + scheduler + heartbeat +zeroclaw daemon -p 8080 --host 0.0.0.0 # Custom bind +``` + +**Gateway defaults:** +- Port: 42617 +- Host: 127.0.0.1 +- Pairing required: true +- Public bind allowed: false + +--- + +## Service Management + +OS service lifecycle (systemd on Linux, launchd on macOS). + +```bash +zeroclaw service install # Install as system service +zeroclaw service start # Start the service +zeroclaw service status # Check service status +zeroclaw service stop # Stop the service +zeroclaw service restart # Restart the service +zeroclaw service uninstall # Remove the service +``` + +**Logs:** +- macOS: `~/.zeroclaw/logs/daemon.stdout.log` +- Linux: `journalctl -u zeroclaw` + +--- + +## Channels + +Channels are configured in `config.toml` under `[channels]` and `[channels_config.*]`. + +```bash +zeroclaw channels list # List configured channels +zeroclaw channels doctor # Check channel health +``` + +Supported channels (21 total): Telegram, Discord, Slack, WhatsApp (Meta), WATI, Linq (iMessage/RCS/SMS), Email (IMAP/SMTP), IRC, Matrix, Nostr, Signal, Nextcloud Talk, and more. + +Channel config example (Telegram): +```toml +[channels] +telegram = true + +[channels_config.telegram] +bot_token = "..." +allowed_users = [123456789] +``` + +--- + +## Security & Emergency Stop + +```bash +zeroclaw estop --level kill-all # Stop everything +zeroclaw estop --level network-kill # Block all network access +zeroclaw estop --level domain-block --domain "*.example.com" # Block specific domains +zeroclaw estop --level tool-freeze --tool shell # Freeze specific tool +zeroclaw estop status # Check estop state +zeroclaw estop resume --network # Resume (may require OTP) +``` + +**Estop levels:** +- `kill-all` — nuclear option, stops all agent activity +- `network-kill` — blocks all outbound network +- `domain-block` — blocks specific domain patterns +- `tool-freeze` — freezes individual tools + +Autonomy config in config.toml: +```toml +[autonomy] +level = "supervised" # read_only | supervised | full +workspace_only = true +allowed_commands = ["git", "cargo", "python"] +forbidden_paths = ["/etc", "/root", "~/.ssh"] +max_actions_per_hour = 20 +max_cost_per_day_cents = 500 +``` + +--- + +## Hardware Peripherals + +```bash +zeroclaw hardware discover # Find USB devices +zeroclaw hardware introspect /dev/ttyACM0 # Probe device capabilities +zeroclaw peripheral list # List configured peripherals +zeroclaw peripheral add nucleo-f401re /dev/ttyACM0 # Add peripheral +zeroclaw peripheral flash-nucleo # Flash STM32 firmware +zeroclaw peripheral flash --port /dev/cu.usbmodem101 # Flash Arduino firmware +``` + +**Supported boards:** STM32 Nucleo-F401RE, Arduino Uno R4, Raspberry Pi GPIO, ESP32. + +Attach to agent session: `zeroclaw agent --peripheral nucleo-f401re:/dev/ttyACM0` + +--- + +## Skills + +```bash +zeroclaw skills list # List installed skills +zeroclaw skills install # Install a skill +zeroclaw skills audit # Audit installed skills +zeroclaw skills remove # Remove a skill +``` + +--- + +## Shell Completions + +```bash +zeroclaw completions zsh # Generate Zsh completions +zeroclaw completions bash # Generate Bash completions +zeroclaw completions fish # Generate Fish completions +``` + +--- + +## Config File + +Default location: `~/.zeroclaw/config.toml` + +Config resolution order (first match wins): +1. `ZEROCLAW_CONFIG_DIR` environment variable +2. `ZEROCLAW_WORKSPACE` environment variable +3. `~/.zeroclaw/active_workspace.toml` marker file +4. `~/.zeroclaw/config.toml` (default) diff --git a/third_party/zeroclaw/.claude/skills/zeroclaw/references/rest-api.md b/third_party/zeroclaw/.claude/skills/zeroclaw/references/rest-api.md new file mode 100644 index 0000000..662ec49 --- /dev/null +++ b/third_party/zeroclaw/.claude/skills/zeroclaw/references/rest-api.md @@ -0,0 +1,505 @@ +# ZeroClaw REST API Reference + +Complete endpoint reference for the ZeroClaw gateway HTTP API. + +## Table of Contents + +1. [Authentication](#authentication) +2. [Public Endpoints](#public-endpoints) +3. [Webhook](#webhook) +4. [WebSocket Chat](#websocket-chat) +5. [Status & Health](#status--health) +6. [Memory](#memory) +7. [Cron](#cron) +8. [Tools](#tools) +9. [Configuration](#configuration) +10. [Integrations](#integrations) +11. [Cost](#cost) +12. [Events (SSE)](#events-sse) +13. [Channel Webhooks](#channel-webhooks) +14. [Rate Limiting](#rate-limiting) +15. [Error Responses](#error-responses) + +--- + +## Authentication + +Three authentication mechanisms: + +### Bearer Token (Primary) +``` +Authorization: Bearer +``` +Obtained via `POST /pair`. Required for all `/api/*` endpoints when `require_pairing = true` (default). + +### Webhook Secret +``` +X-Webhook-Secret: +``` +Optional additional auth for `/webhook`. Server SHA-256 hashes and compares using constant-time comparison. + +### WebSocket Token +``` +ws://host:port/ws/chat?token= +``` +WebSocket connections pass the token as a query parameter (browsers can't set custom headers on WS handshake). + +--- + +## Public Endpoints + +### GET /health +No authentication required. + +**Response 200:** +```json +{ + "status": "ok", + "paired": true, + "require_pairing": true, + "runtime": {} +} +``` + +### GET /metrics +Prometheus text exposition format. + +**Response 200:** +``` +Content-Type: text/plain; version=0.0.4; charset=utf-8 +``` + +### POST /pair +Exchange a one-time pairing code for a bearer token. + +**Rate Limit:** Configurable per-minute limit per IP (default: 10/min). + +**Headers:** +- `X-Pairing-Code: ` (required) + +**Response 200 (success):** +```json +{ + "paired": true, + "persisted": true, + "token": "", + "message": "Save this token — use it as Authorization: Bearer " +} +``` + +**Response 200 (persistence failure):** +```json +{ + "paired": true, + "persisted": false, + "token": "", + "message": "Paired for this process, but failed to persist token to config.toml..." +} +``` + +**Response 403:** +```json +{"error": "Invalid pairing code"} +``` + +**Response 429:** +```json +{"error": "Too many pairing requests. Please retry later.", "retry_after": 60} +``` + +**Response 429 (lockout):** +```json +{"error": "Too many failed attempts. Try again in {lockout_secs}s.", "retry_after": 120} +``` + +--- + +## Webhook + +### POST /webhook +Send a message to the agent and receive a response. + +**Rate Limit:** Configurable per-minute limit per IP (default: 60/min). + +**Headers:** +- `Authorization: Bearer ` (if pairing enabled) +- `Content-Type: application/json` +- `X-Webhook-Secret: ` (optional) +- `X-Idempotency-Key: ` (optional) + +**Request Body:** +```json +{"message": "your prompt here"} +``` + +**Response 200:** +```json +{"response": "", "model": ""} +``` + +**Response 200 (duplicate — idempotency key match):** +```json +{"status": "duplicate", "idempotent": true, "message": "Request already processed for this idempotency key"} +``` + +**Response 401:** +```json +{"error": "Unauthorized — pair first via POST /pair, then send Authorization: Bearer "} +``` + +**Response 429:** +```json +{"error": "Too many webhook requests. Please retry later.", "retry_after": 60} +``` + +**Response 500:** +```json +{"error": "LLM request failed"} +``` + +### Idempotency +- Header: `X-Idempotency-Key: ` +- TTL: configurable, default 300 seconds +- Max tracked keys: configurable, default 10,000 +- Duplicate requests within TTL return `"status": "duplicate"` instead of re-processing + +--- + +## WebSocket Chat + +### GET /ws/chat?token= +Streaming agent chat over WebSocket. + +**Client → Server:** +```json +{"type": "message", "content": "Hello, what's the weather?"} +``` + +**Server → Client (complete response):** +```json +{"type": "done", "full_response": "The weather in San Francisco is sunny..."} +``` + +**Server → Client (error):** +```json +{"type": "error", "message": "Error message here"} +``` + +Ignore unknown message types. Invalid JSON triggers an error response. + +--- + +## Status & Health + +### GET /api/status +**Response 200:** +```json +{ + "provider": "openrouter", + "model": "anthropic/claude-sonnet-4", + "temperature": 0.7, + "uptime_seconds": 3600, + "gateway_port": 42617, + "locale": "en", + "memory_backend": "sqlite", + "paired": true, + "channels": { + "telegram": false, + "discord": true, + "slack": false + }, + "health": {} +} +``` + +### GET /api/health +Component health snapshot (requires auth). +```json +{"health": {}} +``` + +### GET or POST /api/doctor +Run system diagnostics. +```json +{ + "results": [ + {"name": "provider_connectivity", "severity": "ok", "message": "OpenRouter API reachable"} + ], + "summary": {"ok": 5, "warnings": 1, "errors": 0} +} +``` + +--- + +## Memory + +### GET /api/memory +List or search memory entries. + +**Query Parameters:** +- `query` (string, optional) — search text; triggers search mode +- `category` (string, optional) — filter by category + +**Response 200:** +```json +{ + "entries": [ + { + "key": "memory_key", + "content": "memory content", + "category": "core", + "timestamp": "2025-01-10T12:00:00Z" + } + ] +} +``` + +### POST /api/memory +Store a memory entry. + +**Request Body:** +```json +{ + "key": "unique_key", + "content": "memory content", + "category": "core" +} +``` +Category defaults to `"core"` if omitted. Other values: `daily`, `conversation`, or any custom string. + +**Response 200:** +```json +{"status": "ok"} +``` + +### DELETE /api/memory/{key} +Delete a memory entry. + +**Response 200:** +```json +{"status": "ok", "deleted": true} +``` + +--- + +## Cron + +### GET /api/cron +List all scheduled jobs. + +**Response 200:** +```json +{ + "jobs": [ + { + "id": "", + "name": "daily-backup", + "command": "backup.sh", + "next_run": "2025-01-10T15:00:00Z", + "last_run": "2025-01-09T15:00:00Z", + "last_status": "success", + "enabled": true + } + ] +} +``` + +### POST /api/cron +Add a new job. + +**Request Body:** +```json +{ + "name": "job-name", + "schedule": "0 9 * * *", + "command": "command to run" +} +``` + +**Response 200:** +```json +{ + "status": "ok", + "job": {"id": "", "name": "job-name", "command": "command to run", "enabled": true} +} +``` + +### DELETE /api/cron/{id} +Remove a job. + +**Response 200:** +```json +{"status": "ok"} +``` + +--- + +## Tools + +### GET /api/tools +List all registered tools with descriptions and parameter schemas. + +**Response 200:** +```json +{ + "tools": [ + {"name": "shell", "description": "Execute shell commands", "parameters": {}}, + {"name": "file_read", "description": "Read file contents", "parameters": {}} + ] +} +``` + +--- + +## Configuration + +### GET /api/config +Get current config. Secrets are masked as `***MASKED***`. + +**Response 200:** +```json +{"format": "toml", "content": ""} +``` + +### PUT /api/config +Update config from TOML body. Body limit: 1 MB. + +**Request Body:** Raw TOML text. + +**Response 200:** +```json +{"status": "ok"} +``` + +**Response 400:** +```json +{"error": "Invalid TOML:
"} +``` +or +```json +{"error": "Invalid config: "} +``` + +--- + +## Integrations + +### GET /api/integrations +List all integrations and their status. + +**Response 200:** +```json +{ + "integrations": [ + {"name": "openrouter", "description": "OpenRouter LLM provider", "category": "providers", "status": "ok"}, + {"name": "telegram", "description": "Telegram messaging channel", "category": "channels", "status": "configured"} + ] +} +``` + +--- + +## Cost + +### GET /api/cost +Cost tracking summary. + +**Response 200:** +```json +{ + "cost": { + "session_cost_usd": 1.50, + "daily_cost_usd": 5.00, + "monthly_cost_usd": 150.00, + "total_tokens": 50000, + "request_count": 25, + "by_model": {"anthropic/claude-sonnet-4": 1.50} + } +} +``` + +--- + +## Events (SSE) + +### GET /api/events +Server-Sent Events stream. Requires bearer token. + +**Content-Type:** `text/event-stream` + +**Event types:** + +| Type | Fields | Description | +|------|--------|-------------| +| `llm_request` | provider, model, timestamp | LLM call started | +| `tool_call_start` | tool, timestamp | Tool execution started | +| `tool_call` | tool, duration_ms, success, timestamp | Tool execution completed | +| `agent_start` | provider, model, timestamp | Agent loop started | +| `agent_end` | provider, model, duration_ms, tokens_used, cost_usd, timestamp | Agent loop completed | +| `error` | component, message, timestamp | Error occurred | + +**Example:** +```bash +curl -N -H "Authorization: Bearer " http://127.0.0.1:42617/api/events +``` + +--- + +## Channel Webhooks + +These are incoming webhook endpoints for specific messaging channels. They're set up automatically when channels are configured. + +### WhatsApp (Meta Cloud API) +- `GET /whatsapp` — verification (echoes `hub.challenge`) +- `POST /whatsapp` — incoming messages (signature verified via `X-Hub-Signature-256`) + +### WATI (WhatsApp Business) +- `GET /wati` — verification (echoes `challenge`) +- `POST /wati` — incoming messages + +### Linq (iMessage/RCS/SMS) +- `POST /linq` — incoming messages (signature verified via `X-Webhook-Signature` + `X-Webhook-Timestamp`) + +### Nextcloud Talk +- `POST /nextcloud-talk` — bot API webhook (signature verified via `X-Nextcloud-Talk-Signature`) + +--- + +## Rate Limiting + +Sliding window (60-second window), per client IP. + +| Endpoint | Default Limit | +|----------|--------------| +| `POST /pair` | 10/min | +| `POST /webhook` | 60/min | + +If `trust_forwarded_headers` is enabled, uses `X-Forwarded-For` for client IP. + +Max tracked keys: configurable (default: 10,000). + +--- + +## Error Responses + +**Standard format:** +```json +{"error": "Human-readable error message"} +``` + +**With retry info:** +```json +{"error": "...", "retry_after": 60} +``` + +**Status codes:** +| Code | Meaning | +|------|---------| +| 200 | Success | +| 400 | Invalid JSON, missing fields, invalid TOML | +| 401 | Invalid/missing bearer token or webhook secret | +| 403 | Pairing verification failed | +| 404 | Endpoint or channel not configured | +| 408 | Request timeout (30s) | +| 429 | Rate limited (check `retry_after`) | +| 500 | LLM error, database error, internal failure | diff --git a/third_party/zeroclaw/.coderabbit.yaml b/third_party/zeroclaw/.coderabbit.yaml new file mode 100644 index 0000000..0eae003 --- /dev/null +++ b/third_party/zeroclaw/.coderabbit.yaml @@ -0,0 +1,71 @@ +# CodeRabbit configuration for ZeroClaw +# Documentation: https://docs.coderabbit.ai/reference/configuration + +language: en-US +early_access: false + +# Enable tone control for reviews +reviews: + # Request changes workflow + request_changes_workflow: false + + # High level summary of the PR + high_level_summary: true + + # Generate sequence diagrams + sequence_diagrams: true + + # Auto-review configuration + auto_review: + enabled: true + # Only review PRs targeting these branches + base_branches: + - master + # Skip reviews for draft PRs or WIP + drafts: false + + # Poem feature toggle (must be a boolean, not an object) + poem: false + + # Reviewer suggestions + reviewer: + # Suggest reviewers based on blame data + enabled: true + # Automatically assign suggested reviewers + auto_assign: false + + # Enable finishing touches + finishing_touches: + # Generate docstrings + docstrings: + enabled: true + # Generate unit tests + unit_tests: + enabled: true + +# Tools configuration +tools: + # Rust-specific tools + cargo: + enabled: true + +# Chat configuration +chat: + auto_reply: true + +# Path filters - ignore generated files +path_filters: + - "!**/target/**" + - "!**/node_modules/**" + - "!**/.cargo/**" + - "!**/Cargo.lock" + +# Review instructions specific to Rust and this project +review_instructions: + - "Focus on Rust best practices and idiomatic code" + - "Check for security vulnerabilities in encryption/crypto code" + - "Ensure proper error handling with Result types" + - "Verify memory safety and avoid unnecessary clones" + - "Check for proper use of lifetimes and borrowing" + - "Ensure tests cover critical security paths" + - "Review configuration migration code carefully" diff --git a/third_party/zeroclaw/.dockerignore b/third_party/zeroclaw/.dockerignore new file mode 100644 index 0000000..1a1f149 --- /dev/null +++ b/third_party/zeroclaw/.dockerignore @@ -0,0 +1,71 @@ +# Git history (may contain old secrets) +.git +.gitignore +.githooks + +# Rust build artifacts (can be multiple GB) +target + +# Documentation and examples (not needed for runtime) +docs +examples +tests + +# Markdown files (README, CHANGELOG, etc.) +*.md + +# Images (unnecessary for build) +*.png +*.svg +*.jpg +*.jpeg +*.gif + +# SQLite databases (conversation history, cron jobs) +*.db +*.db-journal + +# macOS artifacts +.DS_Store +.AppleDouble +.LSOverride + +# CI/CD configs (not needed in image) +.github + +# Cargo deny config (lint tool, not runtime) +deny.toml + +# License file (not needed for runtime) +LICENSE + +# Temporary files +.tmp_* +*.tmp +*.bak +*.swp +*~ + +# IDE and editor configs +.idea +.vscode +*.iml + +# Windsurf workflows +.windsurf + +# Environment files (may contain secrets) +.env +.env.* +!.env.example + +# Coverage and profiling +*.profraw +*.profdata +coverage +lcov.info + +# Application and script directories (not needed for Docker runtime) +apps/ +python/ +scripts/ diff --git a/third_party/zeroclaw/.editorconfig b/third_party/zeroclaw/.editorconfig new file mode 100644 index 0000000..686f37c --- /dev/null +++ b/third_party/zeroclaw/.editorconfig @@ -0,0 +1,44 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +# All files +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +# Rust files - match rustfmt.toml +[*.rs] +indent_size = 4 +max_line_length = 100 + +# Markdown files +[*.md] +trim_trailing_whitespace = false +max_line_length = 80 + +# TOML files +[*.toml] +indent_size = 2 + +# YAML files +[*.{yml,yaml}] +indent_size = 2 + +# Python files +[*.py] +indent_size = 4 +max_line_length = 100 + +# Shell scripts +[*.{sh,bash}] +indent_size = 2 + +# JSON files +[*.json] +indent_size = 2 diff --git a/third_party/zeroclaw/.env.example b/third_party/zeroclaw/.env.example new file mode 100644 index 0000000..0e034a1 --- /dev/null +++ b/third_party/zeroclaw/.env.example @@ -0,0 +1,122 @@ +# ZeroClaw Environment Variables +# Copy this file to `.env` and fill in your local values. +# Never commit `.env` or any real secrets. + +# ── Core Runtime ────────────────────────────────────────────── +# Provider key resolution at runtime: +# 1) explicit key passed from config/CLI +# 2) provider-specific env var (OPENROUTER_API_KEY, OPENAI_API_KEY, ...) +# 3) generic fallback env vars below + +# Generic fallback API key (used when provider-specific key is absent) +API_KEY=your-api-key-here +# ZEROCLAW_API_KEY=your-api-key-here + +# Default provider/model (can be overridden by CLI flags) +PROVIDER=openrouter +# ZEROCLAW_PROVIDER=openrouter +# ZEROCLAW_MODEL=anthropic/claude-sonnet-4-6 +# ZEROCLAW_TEMPERATURE=0.7 + +# Workspace directory override +# ZEROCLAW_WORKSPACE=/path/to/workspace + +# Reasoning mode (enables extended thinking for supported models) +# ZEROCLAW_REASONING_ENABLED=false +# REASONING_ENABLED=false + +# ── Provider-Specific API Keys ──────────────────────────────── +# OpenRouter +# OPENROUTER_API_KEY=sk-or-v1-... + +# Anthropic +# ANTHROPIC_OAUTH_TOKEN=... +# ANTHROPIC_API_KEY=sk-ant-... + +# OpenAI / Gemini +# OPENAI_API_KEY=sk-... +# GEMINI_API_KEY=... +# GOOGLE_API_KEY=... + +# Other supported providers +# VENICE_API_KEY=... +# GROQ_API_KEY=... +# MISTRAL_API_KEY=... +# DEEPSEEK_API_KEY=... +# XAI_API_KEY=... +# TOGETHER_API_KEY=... +# FIREWORKS_API_KEY=... +# PERPLEXITY_API_KEY=... +# COHERE_API_KEY=... +# MOONSHOT_API_KEY=... +# GLM_API_KEY=... +# MINIMAX_OAUTH_TOKEN=... +# MINIMAX_API_KEY=... +# MINIMAX_OAUTH_REFRESH_TOKEN=... +# MINIMAX_OAUTH_REGION=global # optional: global|cn +# QIANFAN_API_KEY=... +# DASHSCOPE_API_KEY=... +# ZAI_API_KEY=... +# SYNTHETIC_API_KEY=... +# OPENCODE_API_KEY=... +# OPENCODE_GO_API_KEY=... +# VERCEL_API_KEY=... +# CLOUDFLARE_API_KEY=... + +# ── Gateway ────────────────────────────────────────────────── +# ZEROCLAW_GATEWAY_PORT=3000 +# ZEROCLAW_GATEWAY_HOST=127.0.0.1 +# ZEROCLAW_ALLOW_PUBLIC_BIND=false + +# ── Storage ───────────────────────────────────────────────── +# Backend override for persistent storage (default: sqlite) +# ZEROCLAW_STORAGE_PROVIDER=sqlite + +# ── Proxy ────────────────────────────────────────────────── +# Forward provider/service traffic through an HTTP(S) proxy. +# ZEROCLAW_PROXY_ENABLED=false +# ZEROCLAW_HTTP_PROXY=http://proxy.example.com:8080 +# ZEROCLAW_HTTPS_PROXY=http://proxy.example.com:8080 +# ZEROCLAW_ALL_PROXY=socks5://proxy.example.com:1080 +# ZEROCLAW_NO_PROXY=localhost,127.0.0.1 +# ZEROCLAW_PROXY_SCOPE=zeroclaw # environment|zeroclaw|services +# ZEROCLAW_PROXY_SERVICES=openai,anthropic + +# ── Optional Integrations ──────────────────────────────────── +# Pushover notifications (`pushover` tool) +# PUSHOVER_TOKEN=your-pushover-app-token +# PUSHOVER_USER_KEY=your-pushover-user-key + +# ── Docker Compose ─────────────────────────────────────────── +# Host port mapping (used by docker-compose.yml) +# HOST_PORT=3000 + +# ── Z.AI GLM Coding Plan ─────────────────────────────────────── +# Z.AI provides GLM models through OpenAI-compatible endpoints. +# API key format: id.secret (e.g., abc123.xyz789) +# +# Usage: +# zeroclaw onboard --provider zai --api-key YOUR_ZAI_API_KEY +# +# Or set the environment variable: +# ZAI_API_KEY=your-id.secret +# +# Common models: glm-5, glm-4.7, glm-4-plus, glm-4-flash +# See docs/zai-glm-setup.md for detailed configuration. + +# ── Web Search ──────────────────────────────────────────────── +# Web search tool for finding information on the internet. +# Enabled by default with DuckDuckGo (free, no API key required). +# +# WEB_SEARCH_ENABLED=true +# WEB_SEARCH_PROVIDER=duckduckgo +# WEB_SEARCH_MAX_RESULTS=5 +# WEB_SEARCH_TIMEOUT_SECS=15 +# +# Optional: Brave Search (requires API key from https://brave.com/search/api) +# WEB_SEARCH_PROVIDER=brave +# BRAVE_API_KEY=your-brave-search-api-key +# +# Optional: SearXNG (self-hosted, requires instance URL) +# WEB_SEARCH_PROVIDER=searxng +# SEARXNG_INSTANCE_URL=https://searx.example.com diff --git a/third_party/zeroclaw/.envrc b/third_party/zeroclaw/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/third_party/zeroclaw/.envrc @@ -0,0 +1 @@ +use flake diff --git a/third_party/zeroclaw/.gemini/style-guide.md b/third_party/zeroclaw/.gemini/style-guide.md new file mode 100644 index 0000000..013f3c1 --- /dev/null +++ b/third_party/zeroclaw/.gemini/style-guide.md @@ -0,0 +1,89 @@ +# ZeroClaw Code Style Guide + +This style guide provides instructions for Gemini Code Assist when reviewing pull requests for the ZeroClaw project. + +## Project Overview + +ZeroClaw is a Rust-based security-focused project that handles encryption, secrets management, and secure configuration. Code reviews should prioritize security, memory safety, and Rust best practices. + +## General Principles + +### Priority Levels + +- **CRITICAL**: Security vulnerabilities, memory safety issues, data leaks +- **HIGH**: Logic errors, incorrect error handling, API misuse +- **MEDIUM**: Code quality, performance concerns, non-idiomatic Rust +- **LOW**: Style issues, documentation improvements, minor refactoring + +## Rust-Specific Guidelines + +### Memory Safety + +1. **Borrowing and Lifetimes**: Verify proper use of borrowing and lifetime annotations +2. **Unsafe Code**: Flag any `unsafe` blocks for careful review - they should be minimal and well-justified +3. **Clone Usage**: Identify unnecessary `.clone()` calls that could be replaced with borrowing +4. **Memory Leaks**: Watch for potential memory leaks in long-running processes + +### Error Handling + +1. **Result Types**: All fallible operations should return `Result` types +2. **Error Propagation**: Use `?` operator for clean error propagation +3. **Custom Errors**: Ensure custom error types implement appropriate traits +4. **Panic**: Flag any uses of `panic!`, `unwrap()`, or `expect()` in production code + +### Security + +1. **Cryptography**: Review all crypto code for: + - Proper key generation and storage + - Secure random number generation + - No hardcoded secrets or keys + - Use of well-vetted crypto libraries + +2. **Secrets Management**: + - Secrets should never be logged + - Use secure memory wiping when appropriate + - Validate encryption/decryption implementations + +3. **Input Validation**: All external input must be validated + +### Code Quality + +1. **Documentation**: Public APIs should have doc comments with examples +2. **Tests**: Critical paths should have comprehensive test coverage +3. **Type Safety**: Prefer type-safe abstractions over primitive types +4. **Idiomatic Rust**: Follow Rust API guidelines and conventions + +## Project-Specific Rules + +### Configuration Management + +- Configuration migrations must be backward compatible +- Validate all configuration before applying +- Test migration paths from legacy to new formats + +### Dependencies + +- Prefer well-maintained crates with security audit history +- Avoid unnecessary dependencies +- Check for known vulnerabilities in dependencies + +## Review Focus Areas + +When reviewing PRs, pay special attention to: + +1. Changes in `src/security/` - highest security scrutiny +2. Configuration migration code - ensure data integrity +3. Error handling paths - verify all edge cases +4. Public API changes - check for breaking changes +5. Test coverage - ensure critical code is tested + +## Common Issues to Flag + +- Unhandled errors or generic error messages +- Missing input validation +- Hardcoded credentials or secrets +- Unsafe code without justification +- Missing documentation on public APIs +- Inadequate test coverage on security-critical code +- Performance issues (unnecessary allocations, inefficient algorithms) +- Breaking API changes without deprecation warnings diff --git a/third_party/zeroclaw/.gitattributes b/third_party/zeroclaw/.gitattributes new file mode 100644 index 0000000..1ec9135 --- /dev/null +++ b/third_party/zeroclaw/.gitattributes @@ -0,0 +1,61 @@ +# Git attributes for ZeroClaw +# https://git-scm.com/docs/gitattributes + +# Auto detect text files and perform LF normalization +* text=auto + +# Source code +*.rs text eol=lf linguist-language=Rust +*.toml text eol=lf linguist-language=TOML +*.py text eol=lf linguist-language=Python +*.js text eol=lf linguist-language=JavaScript +*.ts text eol=lf linguist-language=TypeScript +*.html text eol=lf linguist-language=HTML +*.css text eol=lf linguist-language=CSS +*.scss text eol=lf linguist-language=SCSS +*.json text eol=lf linguist-language=JSON +*.yaml text eol=lf linguist-language=YAML +*.yml text eol=lf linguist-language=YAML +*.md text eol=lf linguist-language=Markdown +*.sh text eol=lf linguist-language=Shell +*.bash text eol=lf linguist-language=Shell +*.ps1 text eol=crlf linguist-language=PowerShell + +# Documentation +*.txt text eol=lf +LICENSE* text eol=lf + +# Configuration files +.editorconfig text eol=lf +.gitattributes text eol=lf +.gitignore text eol=lf +.dockerignore text eol=lf + +# Rust-specific +Cargo.lock text eol=lf linguist-generated +Cargo.toml text eol=lf + +# Declare files that will always have CRLF line endings on checkout +*.sln text eol=crlf + +# Denote all files that are truly binary and should not be modified +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.svg text +*.wasm binary +*.woff binary +*.woff2 binary +*.ttf binary +*.eot binary +*.mp3 binary +*.mp4 binary +*.webm binary +*.zip binary +*.tar binary +*.gz binary +*.bz2 binary +*.7z binary +*.db binary diff --git a/third_party/zeroclaw/.githooks/pre-commit b/third_party/zeroclaw/.githooks/pre-commit new file mode 100755 index 0000000..d162ba3 --- /dev/null +++ b/third_party/zeroclaw/.githooks/pre-commit @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +if command -v gitleaks >/dev/null 2>&1; then + gitleaks protect --staged --redact +else + echo "warning: gitleaks not found; skipping staged secret scan" >&2 +fi diff --git a/third_party/zeroclaw/.githooks/pre-push b/third_party/zeroclaw/.githooks/pre-push new file mode 100755 index 0000000..f69e1cb --- /dev/null +++ b/third_party/zeroclaw/.githooks/pre-push @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +# +# pre-push hook — runs fmt, clippy, and tests before every push. +# Install: git config core.hooksPath .githooks +# Skip: git push --no-verify + +set -euo pipefail + +echo "==> pre-push: running rust quality gate..." +./scripts/ci/rust_quality_gate.sh || { + echo "FAIL: rust quality gate failed." + exit 1 +} + +if [ "${ZEROCLAW_STRICT_LINT:-0}" = "1" ]; then + echo "==> pre-push: running strict clippy warnings gate (ZEROCLAW_STRICT_LINT=1)..." + ./scripts/ci/rust_quality_gate.sh --strict || { + echo "FAIL: strict clippy warnings gate reported issues." + exit 1 + } +fi + +if [ "${ZEROCLAW_STRICT_DELTA_LINT:-0}" = "1" ]; then + echo "==> pre-push: running strict delta lint gate (ZEROCLAW_STRICT_DELTA_LINT=1)..." + ./scripts/ci/rust_strict_delta_gate.sh || { + echo "FAIL: strict delta lint gate reported issues." + exit 1 + } +fi + +if [ "${ZEROCLAW_DOCS_LINT:-0}" = "1" ]; then + echo "==> pre-push: running docs quality gate (ZEROCLAW_DOCS_LINT=1)..." + ./scripts/ci/docs_quality_gate.sh || { + echo "FAIL: docs quality gate reported issues." + exit 1 + } +fi + +if [ "${ZEROCLAW_DOCS_LINKS:-0}" = "1" ]; then + echo "==> pre-push: running docs links gate (ZEROCLAW_DOCS_LINKS=1)..." + ./scripts/ci/docs_links_gate.sh || { + echo "FAIL: docs links gate reported issues." + exit 1 + } +fi + +echo "==> pre-push: running tests..." +cargo test --locked || { + echo "FAIL: some tests did not pass." + exit 1 +} + +echo "==> pre-push: all checks passed." diff --git a/third_party/zeroclaw/.github/CODEOWNERS b/third_party/zeroclaw/.github/CODEOWNERS new file mode 100644 index 0000000..2e3322d --- /dev/null +++ b/third_party/zeroclaw/.github/CODEOWNERS @@ -0,0 +1,32 @@ +# Default owner for all files +* @theonlyhennygod @JordanTheJet @SimianAstronaut7 + +# Important functional modules +/src/agent/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/src/providers/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/src/channels/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/src/tools/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/src/gateway/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/src/runtime/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/src/memory/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/Cargo.toml @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/Cargo.lock @theonlyhennygod @JordanTheJet @SimianAstronaut7 + +# Security / tests / CI-CD ownership +/src/security/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/tests/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/.github/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/.github/workflows/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/.github/codeql/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/.github/dependabot.yml @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/SECURITY.md @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/docs/actions-source-policy.md @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/docs/ci-map.md @theonlyhennygod @JordanTheJet @SimianAstronaut7 + +# Docs & governance +/docs/** @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/AGENTS.md @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/CLAUDE.md @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/CONTRIBUTING.md @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/docs/pr-workflow.md @theonlyhennygod @JordanTheJet @SimianAstronaut7 +/docs/reviewer-playbook.md @theonlyhennygod @JordanTheJet @SimianAstronaut7 diff --git a/third_party/zeroclaw/.github/ISSUE_TEMPLATE/bug_report.yml b/third_party/zeroclaw/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..96f32c4 --- /dev/null +++ b/third_party/zeroclaw/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,138 @@ +name: Bug Report +description: Report a reproducible defect in ZeroClaw +title: "[Bug]: " +labels: + - bug +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to report a bug. + Please provide a minimal reproducible case so maintainers can triage quickly. + Do not include personal/sensitive data; redact and anonymize all logs/payloads. + + - type: dropdown + id: component + attributes: + label: Affected component + options: + - runtime/daemon + - provider + - channel + - memory + - security/sandbox + - tooling/ci + - docs + - unknown + validations: + required: true + + - type: dropdown + id: severity + attributes: + label: Severity + options: + - S0 - data loss / security risk + - S1 - workflow blocked + - S2 - degraded behavior + - S3 - minor issue + validations: + required: true + + - type: textarea + id: current + attributes: + label: Current behavior + description: What is happening now? + placeholder: The process exits with ... + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What should happen instead? + placeholder: The daemon should stay alive and ... + validations: + required: true + + - type: textarea + id: reproduce + attributes: + label: Steps to reproduce + description: Please provide exact commands/config. + placeholder: | + 1. zeroclaw onboard + 2. zeroclaw daemon + 3. Observe crash in logs + render: bash + validations: + required: true + + - type: textarea + id: impact + attributes: + label: Impact + description: Who is affected, how often, and practical consequences (optional but helps triage). + placeholder: | + Affected users: ... + Frequency: always/intermittent + Consequence: ... + validations: + required: false + + - type: textarea + id: logs + attributes: + label: Logs / stack traces + description: Paste relevant logs (redact secrets, personal identifiers, and sensitive data). + render: text + validations: + required: false + + - type: input + id: version + attributes: + label: ZeroClaw version + placeholder: v0.1.0 / commit SHA + validations: + required: true + + - type: input + id: rust + attributes: + label: Rust version + description: Required for runtime/build bugs; optional for docs/config issues. + placeholder: rustc 1.xx.x + validations: + required: false + + - type: input + id: os + attributes: + label: Operating system + placeholder: Ubuntu 24.04 / macOS 15 / Windows 11 + validations: + required: true + + - type: dropdown + id: regression + attributes: + label: Regression? + options: + - Unknown + - Yes, it worked before + - No, first-time setup + validations: + required: true + + - type: checkboxes + id: checks + attributes: + label: Pre-flight checks + options: + - label: I reproduced this on the latest master branch or latest release. + required: true + - label: I redacted secrets, tokens, and personal data from all submitted content. + required: true diff --git a/third_party/zeroclaw/.github/ISSUE_TEMPLATE/config.yml b/third_party/zeroclaw/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..f332500 --- /dev/null +++ b/third_party/zeroclaw/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: Security vulnerability report + url: https://github.com/zeroclaw-labs/zeroclaw/security/policy + about: Please report security vulnerabilities privately via SECURITY.md policy. + - name: Contribution guide + url: https://github.com/zeroclaw-labs/zeroclaw/blob/master/CONTRIBUTING.md + about: Please read contribution and PR requirements before opening an issue. + - name: PR workflow & reviewer expectations + url: https://github.com/zeroclaw-labs/zeroclaw/blob/master/docs/pr-workflow.md + about: Read risk-based PR tracks, CI gates, and merge criteria before filing feature requests. diff --git a/third_party/zeroclaw/.github/ISSUE_TEMPLATE/feature_request.yml b/third_party/zeroclaw/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..f1c07a1 --- /dev/null +++ b/third_party/zeroclaw/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,107 @@ +name: Feature Request +description: Propose an improvement or new capability +title: "[Feature]: " +labels: + - enhancement +body: + - type: markdown + attributes: + value: | + Thanks for sharing your idea. + Please focus on user value, constraints, and rollout safety. + Do not include personal/sensitive data; use neutral project-scoped placeholders. + + - type: input + id: summary + attributes: + label: Summary + description: One-line statement of the requested capability. + placeholder: Add a provider-level retry budget override for long-running channels. + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Problem statement + description: What user pain does this solve and why is current behavior insufficient? + placeholder: Teams operating in unstable networks cannot tune retries per provider... + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposed solution + description: Describe preferred behavior and interfaces. + placeholder: Add `[provider.retry]` config and enforce bounds in config validation. + validations: + required: true + + - type: textarea + id: non_goals + attributes: + label: Non-goals / out of scope + description: Clarify what should not be included in the first iteration (optional but helps scope discussion). + placeholder: No UI changes, no cross-provider dynamic adaptation in v1. + validations: + required: false + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: What alternatives did you evaluate? + placeholder: Keep current behavior, use wrapper scripts, etc. + validations: + required: false + + - type: textarea + id: acceptance + attributes: + label: Acceptance criteria + description: What outcomes would make this request complete? (optional — can be defined during triage) + placeholder: | + - Config key is documented and validated + - Runtime path uses configured retry budget + - Regression tests cover fallback and invalid config + validations: + required: false + + - type: textarea + id: architecture + attributes: + label: Architecture impact + description: Which subsystem(s) are affected? (optional — maintainers will assess during triage) + placeholder: providers/, channels/, memory/, runtime/, security/, docs/ ... + validations: + required: false + + - type: textarea + id: risk + attributes: + label: Risk and rollback + description: Main risk + how to disable/revert quickly (optional — can be defined during planning). + placeholder: Risk is ... rollback is ... + validations: + required: false + + - type: dropdown + id: breaking + attributes: + label: Breaking change? + options: + - "No" + - "Yes" + validations: + required: true + + - type: checkboxes + id: hygiene + attributes: + label: Data hygiene checks + options: + - label: I removed personal/sensitive data from examples, payloads, and logs. + required: true + - label: I used neutral, project-focused wording and placeholders. + required: true diff --git a/third_party/zeroclaw/.github/actionlint.yaml b/third_party/zeroclaw/.github/actionlint.yaml new file mode 100644 index 0000000..e11ceef --- /dev/null +++ b/third_party/zeroclaw/.github/actionlint.yaml @@ -0,0 +1,3 @@ +self-hosted-runner: + labels: + - blacksmith-2vcpu-ubuntu-2404 diff --git a/third_party/zeroclaw/.github/assets/show-tool-calls-after.png b/third_party/zeroclaw/.github/assets/show-tool-calls-after.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3f4451171976e67c2e8ed79d2178989322f619 GIT binary patch literal 85650 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 {1tAhJ?LBhz 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

%`17za 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 XTxi1Hrt{4(7W|QTE-R8DtmFDW9y`{{ literal 0 HcmV?d00001 diff --git a/third_party/zeroclaw/.github/assets/show-tool-calls-before.png b/third_party/zeroclaw/.github/assets/show-tool-calls-before.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0b4b3bbe605f9dc31479e728c0cd37a5cf2778 GIT binary patch literal 112731 zcmbTdWl&sC&^Nk)0Kr4>U?GA#!4?Yy2@oK-LvRQd+#$F_aF+lH?y|t*8r)e}d~tWT zd&vKJ?uWPDx*u*86o)x;x@UTNdb)qz6Y@n)5*y72m&F^0KXH@P=S_( zah4CjAN22^H0(hjoX*GJC-ICpWI!X9gSfhbrH!e%p}wU$h>wH&%MYuO|D#<4#KXfE zTKl6JXs0t*R(G&>G>|m5u`+hBbNy^??*KHbC`&N&g8t9;x$Z4sB(FeHVj{{ey1Vnv zE(DX;tw#rzvfS~fqUdkm7x?~gcp~yUpDuLzMx_Ggu5x-^wP4ZaL`cR>ATIJ${DT`S z(l5wUq^w8Lx=`8;CC|(xb3zX?TsOjBkc?`IKcn`4F8XZL z$N`S@?}@szH~N*HY9*^%=I>F3M9&ZTiCjHX`Sh1IZyRln@SD0-lKUeLB3qEcZvgrWr z06i|F9A2i00zBJI2M)nh!`>=j7BUPcTR?*p+TE=j91pB+)y-Se$km0fdGDFb<-}eY zOeyZYHobNKmOmZ*Jn&*Kn^`DFz-!hFVUT*iEoB&`4{<8lv=t$hYOB)DL3i*>g5pm?$v!Pp!v4ao3cb!3Qca#kuaik1VyV;reWwTchl9T61q- zx?|{6xId{PTTbO?`bU|Cei4wZKzZYDHVFVWIS?4eZ5|0yz?^NikYi2n3D%y9kQO$aPeX1>6tGuA|BFgG)#GO2ndE*t12hvF-oGrX{dx(Lytvy%WykP0JU{Db14uEao@5j~V-;eHlw7=o&-Uz7 z36od#{-x!-f12fflkk~D@Wi&7k1y$H5t(B&$NKp zi+I@YH(8UQGrysyFItL<5BZ!59h<#Rg;A}}+jyCt?E5XOExH|>5S1*p-NuJ3R5F~^ zz;+zx_^nC&+#NfI5g$$DsP%?*hqgOCLE+>s)GKA1lHaoen$S2em!Ma|aDL9IDe(?ORU{^3n!OA>JR|ipll0w~hzh!w&{y9%(HbKB1rm{*zP;v7C z94nO6W)U^_#qj3Ou-2drmEhotjn_wMw^Eacnikq0#QQA?an&Vb}viZ&V8XyeX>6wc_Umup4*3011*81ol-Sk>HoppNa zdT3#nc;jDsW?PyXIyt``1_<0;eiOZyXFJvM^nbyoGIf z1rzTD!H0)~iB*;>);6iLr7u5k_^%6`O})nmm8mcG=F#=uMFnPKSWM^yvL>0ye7M;( zy+7$9AD}^gaJ{7|rG&=<`emEj*_VNwA+#{E*OG5frpRGm?>+6X9+DL}S;ho3%ZzG^fH$Y|KdNTDQCf@mJVt*IHk)Mqe+n)!Mx4~C} zcj10-rUILhXYW^CHMxq4Mx6;6g(go~bDi49^WNShc5e!9=!T5lePIbfV*Gg7%_3*h zYQBhIQvG*iXzVzBQF+z(LGIcEnX@S}EVoihC%lIned+>@t2hm-fopqY;0fzsadOt$ z)b6DP#7#og%83@RKfkTknpx=?%g*k9JnjIGlbun#&Ua)^W2H5wo^DMUMM3B59S6ie zy>tDuUob8X>GWn%QjF}JolQC0EQY=k#>~8H^pB~u1I$_y*n+eH?7ItpUmLYafFfR& z)7T!^v9+Ow6tOPy4jUi>*9|~;+5CJH^r)BTi)~mjY{;YnNJR4oHm|H8984bnk~#S zi|iUbwbJ|746gK`Bx4&$HZ!f16w`GlAV4>AQ1$)}<-YgQt4OZI;HNj|^SE8f3~wp6 zsi}F-oG$kSrLT`Mznp)%LO4FWuZU|!;#40#r}8$>M9JFzaJ=2|GDX(G%-&&PC$RAP zp5JrP7w{uPSE=Z!1$*#!Rn!~{prM1ytq8+X1=Zii4kW_gB;;dojBTaLkDfx*OmJc0<{3CV z5dVe&PzkQ&)9Jz}f}$lmXym<)?4u_9?Gsj9Ip`pD?NrA6CYP5KZ1UEEr7h27-LS&t zTx;@3My_PW#9NxkmR-`uq<>&^*By#1ya>N>`nXC#U&3B#Q^j9?>GFp<3)}dzo{myMf;*P;0!Zm{LG#N-qwu|3!`t8fsAwa9 z#Ge96NI;ahY{8B6GsX3^si;s|yld2Reqw`eqUC@b$JFmyJAP$PtE6kk`S92ecCvhd zXF!3C$K=<8e@4*L1Z8>3Js-jV@R)#|qeG{NHzE_Sb8AHXNW zqols;nyxykFJL=MN7=Hs$)o@lmzrcL+34Ly_1Hl zw4N_*^f#2;RPd+2-Iw~Mmgth*;VU(_A{C!+PzAeNNWCTxxW3T&c%$v;2#9>XcPmbl zadU<}a$*-LMKYk=x`_5+Cb!HJx@~B=dZp3SG{3bvDep~P>iQIhwKF)8_|Vp`Wb)|O z0|zv#=P4(d(_1yI>(x&UK#&){tf)dTKN|JBP`h5zd3F4S=a4kTg0jnql)J?Il`U+U_PBX+qbB~8*M$RaBM?;`)VU6T z2*j7an+T<^XqlzDO{$f}0}i9y(cso3Uxs76@LL{BnLnmLU|>EQQ!+VLv#qqqx9tSo z5ln!eWHoy_XM2{`dTOPL?>LRLNTOZqO-G*1#?V7ty@FkZHopBicvl_Tt!bT8KF#T_ z?Di-WZd#F(8OMkwhRlyiwRy3u&x!=R$9;Z!CW2~RdIu~Tpd%rX~Hlv2vEu;fW= zbub?MqMEZe7Mb^`yWfmxQxb?+a2GvL+;RTID!Xo-8r62~I~?DHG7Gq@7PDE|?2kT#Rcv__v)`>3i*4V(g5<6GaJ65vam<*7K3coA_zqA0>gvkdo$ zhRrnnri%Ci@4bXPt`FR|u^6H@qEteFXgBD*#1IIyNgWgR^m6gvENwa+5hB#gOl$R#8d8a`o(@x?EnEhPU-sL`34~yI&{(AKQv$ti2UJ)}12x zIrrdW41VXxrl-PT$$v*a>{IeoU(1kxgbreFy_pmbKpBV1AQ9M)Ce_8iiyv?Bc;rq>zBo53(HJ?z+oDUapd2etjG3jpeb*JV@Y`z zOXnJ_;hy|sHoEIKQ_`V{rDCo?S;d|7qtseZHo0q=EQhQ`aKRmj>&vdm-n+IV#- zdwESFB{jT~49R16Tz>)JA6Qij?%|E?FaF%t1IoP!WAg zo!Cj`%h;N^cRZMUil$D-#A4`G1KM>tV@XVXxN)Juop<09Zn~qp5;yjExM47e;!M$* z<%Yo|3zY~0$RyA6RMtLf#3)s{?BUDLW-Bs2csPSE!pZvT@I1daDC7JwKH29vd8u6H z$R>!E)Aj+8L7*L9AY6~qMNVHEqo%%{K9ffcs1)q&zTubQNRKo4oskjo_lJHxWi9we zcS@$kx}pV7Sdx%4;6kMWScn~_%qKI_!D}l?CHCW}xI@6a)gN5T)Z5(tj?-XNFL%?5 zsE%bdW!fm|lJtgbT#V_{}zx3>X)-X$P*5ceJ! zfCuisw*S2saJ@0>>)YG?B)tYi2TlDv2>^!LaGpsC_*E}7u}I38Uu>ZJi46C|?jvUF zi`1Kpaaj_{!pf3Ec*0w^>^QGd7i+@OUNoD$sShzRbiTK;sE_ar;%MSzO4F^`2*se56HL$kZVPc@ z(tv!_avXX@uc*ah`}%}^qh>x2V`{qh!y%E&DKa-MnZ-2zybw}s)Xx%c0E5(H0;#Hi zD=`lf$HW3CVzyMghE=10F^zM0lYicR;|moPz!a?S=p|Np7nA;$A+rw z*QtQ+-D)D(CR`vUi?tYt18UPDJLRBI(!P5!d7l&E6bM^&BM~gcs6m7;{>6aO6^jK;G96s70g zBhqX0o9?=gAUY7r%Nyn+c%l%#q`G{TyAP-7VN1nQ_xRj+ayXe^XgZ+ztb)TNrM4)&~b_pCq{MUoMI z56{imCAp=%yG~a7Z(CAqj7nw``Or^}!}m5EGHK#(JuY9IXB(8yeCfB!mm|Jz1zBon z5D*eQx3CTrEc+qe|HAd62iNs-Pa`gsnU_)8qF5eCGUUJhM|&mtPuWpb@Ff`qU3}H; zP0BWv>^VDWy`vH9i+wSOSIeu3+#RMq<-@JZ)oD-$0#k??fCD7Ajw_ zDndy`uzT(5b3#jl_Fzg6AydJ3wRXu1028s2$Na>tl|y&nnxY!_MlOa)+U|UXz{59>oW_3I3d!h%`y-&gBB68UsS%& zs=zPf*#rbAyqnTr&3?;OvHx5mLuo(92Tz3n?CKKk#ejQ z2;^5%T;Vi{XHsM|G6#u9w9od_$wC9h@ss28{o7=+9Ub|}Sn{20q*_r#kS%UOM61vlRHY=ePiyev9`!~`?gqoHv5Z>93BYlcRbzUD+k?~RQ}ZrUam zJcD3H0L_c!#Z-2(|tF(KM{Uu4et95(5X$? z!50m#5>s|y+T(Y6&HMIg(7c=kT))<8-gnkmd8+i7EtzYDAH+l?%(6Kb zpTDVoDuMj_-S6G`Cco+qdM>z{IUy`Cqv-}|$*I0PAu&3`EomO=+{9LqKq8VfEGmk%<@VMyR!;>h)Jhhr56gm)Nok((%R#ZzM?YyF$b@W-1-;oq z>xDOIK&ROwAF%2CpVR&|F3Z2L-Leis_M{lju4p(__8tlwQatIKj zsz?{J+#+F+KJ<;jZjpC8PN>*})5Wc_5 zCNhiKustUy7llv~>%UL=G}kyf`=`1(F2S~Brp4L0<{dQy7&T}w|vtB^?nUoyE)IUSGROQn=l| zm+$%B#aW7TB4#CAu1`z7L)<&8_Z!S##RRBw^K)hGXn2@M_J>Qq$_aZ*L)huFLW*SbbI`O@f;x zNIz)rJXOS{8Y9ZA&e~LUXh6_7pdz~`4!mV`r3E+naC@@S)>;T-;OrS5Ad;v1w{gow z{_P_~B`gE2WUX4GU|=?%y2C`@(T=3lPCk8G(RMbnR>^~K;sv2|Em;lucb{)6wsU_s zi~qM4VAr0VGbbLR6F-K*AN4sy5r-r{K~lUN75b ztz=GQ&}KREOO5c9;j^YNNm0LY{XF2NS|8S2D(HHh+7IqIEq|YW!j?LCsm`PgHXulh zXpHefW~F}nc3`#^oUSYHF?+u00JgKQteJFFQX!B9OFNmMnp7qK9LXs&K0l%s5bzy1 zo%qHquWMFx?$B^cwOdG8`rccYl1+F_|p}D{8tt}lp$=oM8`VLqDd=7j3=7* zf-pcsy*&!sDe6~)Z9<~Kq2T$^ChNggoBh5R!dHgRqZ2oFNW9G7<4|pclu%h*e9~`0 z?+H)-Zw7wO)QXa~%1{PNCt5-$+Nh=rOdC1!uIk~1Y&QOo^=O~XKC9Ev$x&(+l32N4 zStHT`gRQ^(0+I$$9qLAl+%j}vxOrOgt{U~UdO+dB&=Z=fWbUIqb%@h%h~?z*yM+f+ zQ{!@{HICvb4lFn1(F$e~-c!YdyQ?4`inriDe1h(J;iE>`xpl!cjET$T?!KohiUht$ zew!l&{p@^m))49KUj&+6T}nSQ(LVI6T78n2?^2Q3ckyh;2jh z45{@i?cB4gG+mY_Fr{q&dQR=tO80u!k=FTv`I|&3DAb!}^hWV|!tTewm zt@DmF-0K^ILb8kkrc%gJ0K1y=D>1#mqB#i>pNMP&MwEc1?+xhICa((eNn>kqT9>Dk z)DfNYe{nT|GfQa;+wJdx9pCuPv8zk`DGE=H%Fff;ch*R+`1xbI zFgNtMQ$vEoO_qMjXw-PnOJbZf^{c>`c;iOZB09dlH-OCY{;ZB_f;yY0M#sbqy!$9o zZndLVm&SsCcUGCNXadNj?aba~K+lN&X3ee+cPe7wqkoSxjs9VL9XarMO{b2PRj z&rc-p0}n4*R%xtEA42&eaQ=5|Il(K4HwLbNHFy zvixfDSdkvQlMg9DsO9=Ss4UiHUuY!!{rg>3A;Id}@`3m6Br$>q5oq574h1`GPHwN1yL=4Z5v)-)yW zL3xEhcEe{}^))?^P_hqf`r{(GVH)BB1P#0fBF8)uY>8{!m(sRU>_Iq``Rojq z%n*cAeO=wdSHMVE31wyhK%&73UZ<)e> zma`!=Aq5H$gRR%cc2!45XKi0cke3|5TN5>C_xE1F2Ef2L)@Zh*CS1!fzYUjo)5N+T z71ib2zm;2;AADw^I`wx&h!h9vcY3OP3cjnr{lkY>C@s>bi=lWvMdvhQMXp_yB{36n zj2Hk*++M`ST__Y}RKWGGa4yJL^ zr274b4ty%{2JD9?KKg5XOCU-iL6RPmx-(f)ML~rSG8<9YV9QTYM~qKJzq5S%vjg=I+KUl!J-vyj(fXv?_|o&)R}<;;JU@Q|=w ztB-8SZ}kK7;I$$E`~wp|VU|4nyur}^tqJZIqQNH%1tDI9Y{|?d148hZz{EG6HMRX% zcpf~i>N9VGqB8q0{E?+JVhqKp>Y_^j)vNYc@`Yu@c9S)}Q=!rSRu5Pe2Cl8$*P+=R zyTq@a08wX}sRQa8lNJ!cZ>bhlpm*`4LuMdG2A*Y;uGSmie*xfAcCFjhdnaoDEObB1 z*qPUFrh!$-7$*%+@?e4+0HZy4FZDQqRT@cPP#}`eLYu}T;y@RRm{+rOIgcn$A$!uA zyT~(JFaE7pS~hIG0ssl>Z-<``Ovi`-NxH7&`dQ}WhCD{~0UpA@QEN&|2u!2&SYZq3 zC?*T`)BSUbFPa9C+a8yp;i)*NC(YrgTKj;aY!xv$qyX*8n0YRBvqIL+36cjX| za*VXc{b9p*Gyj=&<30nB4UW3o8mm!4^Gaop-?Jb-gk#E^7X|Qk5uBpt)P4atVgej@ zV;%t;P6#M$ndcxdYFbhkDhEnBQO zj>^2;uevasd_6Ubx)f+pW^~m^HPh_$WYP2dadcDp!W0-$1PY3pf0(V~5(W*`p_{~k z*!#F2jKp{|n=iopu)E$+S5B9uQmt#AIQuCfHHQ_Dm7}RNgwZV z84YpgRC44eoUx)d;EZKoyVV|w6s9(^_lq@n$8RpgiJgq6s^zEa_vP<3xf7!nT~Q3z z<{AxIsJeF#gpFrYu8MU|G4T)TC!yr6tzJ!6cX_NDRp0+y^!4pyhdsl>0=-*=<95Z?m3+j&TcfY6ckg6o-U!u>fiMsr0R$$!*z(#VbvwaUD(A;^(~Jt60!?GW{!JVb02y_ zQ(JtQj=Oj(+&Z2qr2Cf6+y>B}&GF#*=KgT&IZ{IQz)t2eB9#SJGU!15hWnR4TzP;r_zBwx$-M_BL zQ5V>7KeyB#$gIj^->&=x(w?rtpPgd*P$mp-@w%~P(DOV^xHxES1)baIN*K8$L5ih4 zJu7}?(qp({Bxbbnc>Sg)cNL3tnmBQGaC7G%_u#i7pQ7?WQEbNf zl-f*{aB_%z^9Kc6bV0PJKO0MM4!{9`QmZl>opLI`&ToWY3((T zxuALLjcb0IG5bTagHPxFwrZozRsyg&JE{jSLkb(r!BR$>zi_ilr-s5hmW? zeI0)NqqEaIU1F!TFWB%qtVJqCe7NE<6{ifvc=BO$sJNYk6`B} zC#YXkOA_jj@ijz5FBPZ57roc*qD@wjrtNi%GmVaDSJq2*r)!9VI@jaiyl}j!+{-3`5>D*(|T)$FK(ba8h zf5+G;OduCnR+gMc+tl6mv0!zLc&td02VVWHO~$5C1~?ypMG$y6PCacb$E1LFyC@{HeUuZVptF+EjM zJYev~*;O3n-b*r*BVptZ;ltGhXX6oK6i*YtER>D>FAf+ih=$(2YSq)y&Wnjr1ooV& z*4%1_J3_=D`?c#sENhc7x)lP@tU6#WEFa#d>wWnISO{jV&Y0N51LiUrj~&(BxvDaWnMfUXbS$h_ubBvhg=PFAmwR38 z#w;4oj;rQ)_obV!?@bd*G=mBYLE#OSbg(E2S+h@UAm-E_4)0M8kjKEfVJTC7KH&dn z+1{<^&9sc?nK~!joxc$tO6i9P5549o`!Kspg3TupG|tiZfR>+Mj<z zN8n}{)<3jT+mvH{F=5^qS$2TGt2Pv|lhb*>LG+u&i|}QzVxwyUMV1 zf?f!AL9Dyt`l!5AoOT!bH~UC6fMpOXqny7)%u&zR8icvGVb2@i1ZO^1tBd6sUe&j3=th;zP*9LDUkPqOn;F~(O+i%*F z5X#uTvIEMPcc+`8DtIQn%ysjWF74o03rV*XwS7gk6KH;IOW2A#hTIh1-9G{;JG$9Y z1+V_9s21xEXGO#8CkZ=T?+b$JTyNF)Jy$b<(+C{-rFurjv632;NTJ4ucB?hG`io6!%t{g&WbdDX>0M{lcTAE-?mVn^m6 zW8UTXN-ZQJ1TpTc*Mr#UN7=(yhuF&0{1*Igd+}+2nbaZt1ZM1L=Xwjb%WPbH+!#YC*Uh<$qC=rrS0|!;_UMf79+#e3Mesa!JCW&AS zT!OK29p>2gi76QcI$iWfna;xN6{dP72tmkL{qdONn9s+z)#htWQu2&jt<-K#2ieS} z)bDdOBGy(kxqB9eMGH+%2?TuNbnRnz_C0$YN(Z7!#;$zNypG* zhJ5qdl{F(ITuXpiWF2$DBU7VBEO!k=lWiO2C-?N^;?P%CtNc=p@ zT>{k4A6H$DRf=Otp;=H73KBXU$Y#gV%;zcvIlZMiJx!c0=^0F5 z8F!nfU_gCBbNzzo1QeAGU6*oi43uo4bH&;X{-@RNcb&-Iz3Y0rH!G>`k_#Dpmxz;R zXe!@wcy`wHtwvEnS7Ajj-mh1R{1ZH?rWnAvMclUai;Y!pk&&9Ls+Co`wj91F064b^ zDu3;}7vr~^^-q4f(FIH$Nsjv$R)<7we3uTbt<$x3UhxV>r|zsr0C$kEQ3bt-Fb948 zHs`DO4<0rawfXFLhZ`?Zm(bIiAFkANUDom7oi%S;7o+%X>NA|stuD>a1qR{U=SLIf zkKS%6IbYgR)(6c_3C{Zz_M~s5?EJBN(=~}vLJtYfdfrd;^r*NkrHw8Yj2_+VM^bO_alrIX$eYNWlpx3LQB~g^f&lBaO#o@8GVQ#4uRdo<~7H6tPY4g7GwVdx*g{f0vzT#ZJsYl;FoQ)AjvdqvOb z2*=uQK101e+Yia?YG1ndtg~vb@wgwv1p!y2rfj5Fr^rgr7C^;?4E?I5E9a@DhI`k8 zlWH4|m7W!SfOl-$BMUPRlMe-~v|SOcB!z%aUDa`@&rA=oo*w2KiHP-3#xjG}cORc& z3p%Y691bjv*6O$em6CijlH+dMIfV?H-*C1}jZMCuAH93OyJ>NCdHI|YPsBv??t;vW z>vTH_aN{iQ6JFhvYIVE+QN6Jzdbn%x1|r2izym*A2u3|zbj~YxyVLV{xVo`aKW0qC zrs%Y~5EhZ@9Zj3OF4lxbOO-Vb`d!TRHFQ-a-`$x4CiWuEbF)WGlEd_R1LSeNupt(ij)gA8glXJa1Q8_)wX3_zW_C!Aq<&9bnudYdV^C zP`6P_X7RZU;;zSW6NAfk5mdmG&QAfIA37;(+yX8P0OTOTw{h|do)Oq#ruc-UB2IEF zklPj8(wBT`*fQ&fXK~Kz4R*{*3`&|ytC9MB%kOnvcaZ-y-n{JJxZ6w)G3*;{bT}ON zS^0GeVyRd46Q<`8xN(0V%TZ;QBxH{Ry`ZUZ8M}QqRawwQje2f zqsK_Kq-djReOLo)dlAh{yXB}#-DM|!W4h9Svft|gFK2W*E2#PXD#_$VRhjoI;1twS z9asSz?_VX>Y>?SO9bBP^E<^`{Z(M`d{UtcP{mpP=u9cfKvu<-r;^OU(#0<}H+5QcV zt*s!}qqAPixyH#^lfA&f>fi{I-q4zb%HNEzvDe%wHDngJmCLKw2JwgGKMhMu)39QD zKYPqN?Jn-rBaq4swhRsyXGph-b(_N{`x7eMuIzyHK>g|%-cuC!eNIqth}DqFO6f+* z5zojUD}Gg0y}%By_hpUN7;SBXo744}=JZ@;s&(@WLAU^dn=)VMC}3Vtz^fA>UtkN1 zF?kCd^vLhnvd=1_KO$@RidKswm>yxF`?E`Atg^JiJrAI4_+Cm%ivHmC0JC^)E$K5& zw~ix<^P(H_$DYq4+{D?vTiB?m*rd{`CNxlIOPDIG;NXW(oL0$O>+{vyoin%3CY(Sj zD}R#&t~U}wC_|*A{(YCQppN_K6v(v61yT651<#w%nm_2C@6UxmIc(e}R17t$>`<%| z!>AK=hUPScSM0#`9;fk^+7P1D5?{t{?a5#=DwV#lu(zxLzNrf~wDus#OFXA3Kj}5@ zK;=CD<6e=Fh@6pn#BDV*^yXr|z?@!ee4Gpmi$uWxcCJwZWg7IZtLst?n%KT(r(j*9 zXkBBMTmD>F*c&lhyHcBM$}geGS?|7Jj3T#}BNC0jf!AucX1D?27L zG0gkJ-i6OZ*PesaW9Gt!>lR)eDDd?|S_u$RuJ$pqoCyiC0ic(+kdrVb5i6{kAlsZ2 zO9EAw!~eEXyY}5w`hsF&>(WCzYywp~ zw$`?A#&WfL5&)AvnM8l5x+6>TUm@K~>pWy=xB(`$*ovQ}cpi{B%Y;=aJ%Y#yvuo`p z%zhGjRD?j@Mn1>BQdWp4PC|g~BY@4<5AQjAtxD*P^AvriP_QggizHEnlHTTz1yJ(O zM^vl1D2f?91@Pj=mjp(PU<%Y&R@7Jxq{q^|AEqfnk^zJl=mOR{k77GRopH-~M7zcF z5<$QhL+%XLd6+>ZqU*rb<=~Zkp1<5$w>9FA=rkHbejyoTHlVPujsizpE@)K;7&r0+ znUPi)M)hNlN6dZYr@81q93H^)|8Ez?|8Fq;|M$)F3O6bV0L%u`9B~e)_|4Spm+!+w zZ60$7*^g<2cT9NRtdnb<#$~O>tUbmMMTI1BR}oa}Je}EUUFol47Ajgm{RZ&$gvUn% z^kAzXdNy)#h3ZMsv}nK`(oK_*x)$og90StcF+i#Um_uG1A6s}<-F_1C#~KyUG!@G( zSAyS`U8-q$CE!3HfAZ|;0l2B}Kt4Isy1Zzq=UBv31ijF$s9^ufmZXb>eu($%`3tbm z7tvQAkkHdXPmrE|X73{T%(dTi!J<{!V02dN>D(+lr7L5oMX_=$w6RIP*W_$sYGV4^ zdB5=@@;Sov7o9tM)cF6_0$?m}`Jv117L>d|?ueOUNjsv&U zFDS$KUdw5{>y%=BUqSmP>pO!}39m_W?PKvJuqG_OIg^4Zc*T({ZKXLSJMs9xV}Sjn zv``*v$sS+l(qW7?^%!7b05|Gw``A$fUd+4iDxe)p|Id5;3?X&5@-Fi(ay&_w>#tT7 zk5Zua-+Z}VZbrIFCnxhOM36m5oQLs$GA}x>1@`_f2vExrFPrkq>OfoHNXB8ZHs@J;58y5p)g(gQ)l)L*d=|1++b z-&&2e`6?aP#%$J~7-sdD+jW#2xHKuK&DZe?8NPQJOD*~FKT>+z)JvsY zJ^7#`5Pd?6_3p0$qH5z{J;*rqa&y*r?)#BgvsObi+>MM!&z1-%;=bH`c5OnFGrl$5 z$RCwxdi$e)5A_u@eIUQLC#9egK3!SqN;)g?%E{IHgLUT(n<2y75#8{Y6MlMnygv1e zki#j{lPAIZMD0}+0RaH#H5gj+iGwfc-051XjLNbSWC(D zN4`wz3cwGlc#{`QZ+LC^o`jCRY(3zjB`3G>I_c(SyMyQWY7T(tpgJek%mE%!Y@}J;7wy$xb+a)fozx&?^O=#?gWO>+I5!;bxH)8m zYrG2k%2v+t-Lo?N4QuyoN;u{^Rob<7;ik*mzxId^aY^&nQ`AF8o!&7g)|wL&J8!RF zxz4uKMihIX?j&rJHE~$2zo|K9*j%6>Hg&9<)p7kXWAfCc3=4;UD8LBO26%g2ho=#$ z3hh_T0dUFSo;NDi{l;6{mdT8mz{M)OJupnr_DNlj4a^2Av`Zn^tvriaExJR_?z#66 zS&!-}GON=*7dqh5aBAgtoRnFS{_(G*3u`QPf%R??J1c6)`_1edJwdJFe=Cfmf=wZ(${CrsB;7*7AO5q}n{g_u*5itaIvQ9v&HSkB19PM@ zMaIu;mP(UFwVBZMmm9+P@I z9at$wmWn8nN6j`*;xp4b9&1ErPL!A<%cW)QOaF9eT^f6p#qh1aFtORWVexO$ha#TL zoDprw(iw-_xvaOW`N;T{Sjx&{`%Z7s13MREr)Pe{6cqpQ$m{--Y&&BLawoSB{B?n@ zi_6BP3;nx1SN46?^_K4~j(ouA4;d+0LI4`O( z6>G%5Y(SP4&Nb~_6)><={;*|Wwp%&VusbesAtkxm$Jv^l*?=J`e{&RuoK$UQ=B4Gv z$W8&UnqPvO-Iy5FG5+_cUeWKk%75R+HbX-)Ep&FG6_rVi4csY zoWcg=hTR zx52HJI9{Kk;yLW7+wpPC`pOrbr{+94T-c#dY%2J_a&b9Mka28iym5h6;hu@ zEaA+FE%|QNdlx-#4H*SZa6zSj_5dMM%d?j5WAAu^5vJM5Q%w~aRf9{5TASCi%lk_0 zhNO@^_vLu*(jnF?q2A$~8o3Vr3E2lp+?TseE^C0ae$)KeWmc>^C-u_j_Yyc|7XCN5 zBlvF*2IGH&JFWl93N`#!R><+cvO+umU$of084P*3;Em}2MjJtts~Yk~qJ_$eUb@LO zTYFk_LieUPuro#eQ6cJL`YeC3Go<1uR#^ibP?r+JMf?<<6^w@dfrgUgN5`24bl-9l zS9SH=r??y*GJyn@twef1|3Vr87DVF0tM?w{7!J8${vjUk8K(k*#B50uj`GGm?+ zE=FbgbYo9z@J5dmJ^US!g~f^6_j%*bRSEw%Vy==4N}yFQqNZ*j09o@@MZD|okz}7# z2$B*IVUo=j=KmOhAs~L}^s75+!uoZT)}zJb9o%i039Y~`9a#3v`CJwG?}e-#krV?F zEdAEE*8eCELPjMz$nzT^|zRjsd$O@~| zxM+Eh*6Li+MKvV2-sZ0Hae5Fp`t+Y6j05@@U;bSrK}e=x{D*OGr0xL+^Pcj{q zF!;+^;hH(acR=)T%gZRH{OC1}%Dk~q>U!mOJ(?iB<46CtvvXARr`{fmzp8W5T9~B3 zyBtS4`F3Wc51VA(QQbje=@aSh@W{6uT$Lac@ zYW+sN`s|RfD+&70G}RZ2e>Zz%SWsH$-UN$<29!GNo)%2*kl+9M>{`FJP5+ZUuy=pH zg=56rcDe^pmv)4QE!Z9mcWY^c=T#utWQCnnis5`p=lod^J!(_7wyfDz5{4WEVLmN% z_<43UQ&`|KZ{#jG#`v$TG|6KnsunH&1bor%DQJTVZkbwOne|Ol>6Va|yzXB9vNS3j zUTVW5W30`58#+YbPx?{8-{KTlQS;G7T}LF;1I7cqHVR&_C3-Rkl;KT%TGZC<%I?q| zP|7duymVHg(*|HkR#Yz}l2`A&okLo@glp7c+jF2}7U!nd6t{d(SZgl~Z=-4`JmNRW zl4YWRD5A2woYL=8zrZMdlcS6}VmM6^2G$ifpY=q2bHOLvH1?n`(Q)b8rw>MBBpnWt zge*HmHSBC~;ce~#rY~)#FYneIO+!r}34Tf__|h|O%z#)PsX54|vv@P6%TA`NM~Jv^ zxX*>Xv*3!2?CTtZ601Y7J+syq?ie=v2xw;J*?9DInQ<(1cs+yB)TrIHE#Biv`F-Ce$h(lug8@BtboLI}xh7C}^s?|nGSZzgbWVY6S ztd7+f7PPRxehYf)Pjr~f$rCO>i2uP4Exwt@{bT(}fXaDFq3=WXlkTYEclp3Q-k5F% z8G`n)Q?<^l{6BMcC+lcHhgT#Gf0=TeK_TM|{aEt<>|cQZ<_memI(HVYo6LC$+m$r8 z_Vn}*OwL^k((ufHs&cRq&d{1S>g4J!P`t;JRP&1K=8Y2`?SN#$&s4sZNnPl>471zA+l;j9;b=cQ#<3nX5<)EtVqr0%wJ3^0)Tqs+)c_ z);_1A%Es5IvvPOi0X7wjEXNEc+tagE#d;t8{DxqY+{}`Ql5_|60fAgu2%emF!y}$> zSAEFGuDnPM+jq~2LuW;TQQ&>Bw$~jN7GdzhR%RV@8bcE2`Z<{xdu|F*d2`b+O2u^APg68v(llr zrtMy~c~!qig>J>`kwPZVScO1z?cp_3yMFoE7L3g4R_o_UwxfHh6ODUwWb;5v_lA8Y zE0F{-cR&|>Rz6LCjw1}|P+#2imiWb?yc$C-9T?l&827T~yo=4Nvo<#T17akpBTQx~ z(lOe8;;&UWt~O61ZHM`hsUEN2or~YS##r7)j=vwGYPvtuL3uqUudWa{VchwZ8L2d6 zAWy;O9Gk?rE!|gwMW3bN_ER3OfO0#`8F|{FVq*Wo(D3r3$2A5mZ9fa)&@U3!Sno&V z3a9fm!tWU6Y7DMT+S}gO)itO;X6syO>H6o&tzI+6Mc3VY5&K0X>1D-UT`exVQcwal z+|6{`K}Y)V;R7L?BbQiKur%>B(mWd*TSQc>%+*nfbgci4|CdEZ0({ARm`Ecvs-E4_ zu1EN@?+1@lRi%T4@XVQLmhJD@caTgT!6g3ItzAYI{IacEu&9?l)6Z2M`xO?U;ptFq z&!d`4Buytq&;jdfirLQ09IVCq`)v-ODvA-8L?~EfAnPNjGc7nMpObAWSdACpPk6}2 z!NqN%@8W1p79tMuO-0|Q0|>jIgG&KV)H*b6=gEL`BWon*Kv<0XeAW!isCzsBmjG|w zp2y5IpWNgal$mLOU_~j#leFxG45wR;q*u$nZabUwNKzr_LRQc1Q9eg>>dJ?Uw{1|l z@Ct+fN(&he57O&5v6fy`6@RG7866R`SR}0{3@X@780v=`AFrhTGctkiqT%|P_Hnoo zKc&6x2vJ9_+=dsRg#2Prlpx}Yg*NdYq&_2-^h_gI{!5ch*>oc1$J7|usIp_W$r7#o z_#mXaVtgeZLB7`Z; zxR&$ceV6%d9Vr}-&T|3v)eaC>mF?PQCtW;JOk$^g+xU3mednpYXiWfTTuCS?_eOCz zp{E`uYjQwnf=%dl(c}s=PZ&eA0m4T=W{g=OL|R#%ZI{}Jq8q@9KV)IF#?9%!r=*OH z%JijV;ANt%CV0%%4wbRd-RC@3tOj$sM<)!T5R7{LaqYjhHky%5Td(0XC*Y_2ClLIS z#|4!{36Yq>CzH5bE9cZL19^YQnx2i&`W{*F3v(u|eW07byl|mw_iWYHt?oXD=@xc4 z5q~<}n$Nf(Y5)B#Ph&Ke1dn^3sO~t8lJbHr7y9Owioqx1(KV6MJvY-SH9i6UD>2@D zfkVw?1)#J~n82@IZEu!tIk%4Jvoi24RK4C2i$jwfsoBRr`zV>k4K>vJP9Op!Dk6Tc zEHaBFQEGB#s=|Kv!y+R%V)=vUdp`Q)Em*FK<`N~&&m7$!LB4#;I${YlQle=;5KFfa1y7%pjIiA5VJWcHTNPCQljox(= z(~0|hnV|H)o=K)$6)y{vLv?2A2_n$WLvOy_sdSoE!m&9@>3{C0vM8L-sc9e1JiK*SO();k#baZ-8i^l*7sH=y< zwkMm0Ub878aj(D4UfL-%Xx%rIu~(OE-JZK|t}$?l*Tpoc9Q-UWoa~69$x+(5e;O4V z*>_h>S3NY}wQr9_68-hKFRt8U%o13AP~U;bse)vdB zM>kt-P*~F-ihk+j?+A-Wu<&TVmt` zL27u?OLBky{K*p)tq2$lWaS)arf)=q!3sKeEY#Q1KGsXTXZC!@YuX6cMn`0?OrnmI zqk>?lM;D#as!Lt1Q4}Y74uaspQR#Af?OIit^gjXpPSsr|zZFKsny&7$oL@VM|L|8H+Ocf$@u7K+tZ@g{9cWs z@;4WoFPFD}5^dqtH}dpKi}hz7MhfVLs2mQIqL3lT>4v@TR}9Y>rG*CYHOq!CoDIN8 zrY9g2_4flT=egooSKP@OPVNBoi(lnc7c%J`ok7-|7=`y=wuaI zvJA4a@^9*p&)>cgv9O%_>|Ry4Uu9IR!=a-)?cnm4pQ2=E=Tv(3b+ozjW&!kDVZT6Z ztg$e%R$lv%c4v9z{tC_w=egj0cK?UVP}3r6MBV3k#2Y0t=z_>oE=5XW%@{5|!#`nL zgV^DdbQcDnq~;>6^5wddn@{*9Q3%k98%q9(C-KjY>G*h3-Zs5D7bN8D6TQl7BtH-w zq*tWXM+5~0rDy+C0Z>R-7j>|keVn)<3=--Jz=bvgW3FI`W#tX%m) zR^-4R?!f*-*zf~P`+o=<>s8sDZ%2tcPPju%cmz^harE^?Vpn|hVXXmeHo7`S&L!wbOdJR4~n@7KVWpvbVdK}H8KUaX`-a-*4 zk=gO0NY2*p?=Fu+hB=gQv|@hYEzKUQ4jwFTaea$b4nMR82}CnyT@w-joh=durS%Yh zZISA3s${IV<(^H=RI~@R&y8kD$q|&YZwD}Sno1c2tV@~dX z*BJpYr0#KhpP48Oj?eMg%$VVJqZ)aY58{t(E+fCfY;H74o;PFrYNer$buk1N)9eo6s{>j0Hf7dE=x&U;i*1v zBQdtP^0=%xQBhW+l=jLftE1fT&5L$PeE1*`Hm16g!*KLz-?+8CgY&rqDyu!IQr(xZ zA%4CUXj5Ue^?jP@=_h2_J3-Iy-Xe+AWrXkP9e?F`bvJ2L{F~mwXU|OaIYh<0QF7K| z^*JWt#x#}C1dGzTprDgc%HoFQkz0Z1hXs*`-C@n@Zn$hG+3oSydFG+KmVGX16*d!5 z#)3AjXM-aR;Psn{>J5E~S9bdQlgYxQ^~GDx^$GVInBP6u9FZ=`-~@owk67G*^#1x_ zy~$x@YeQX!te^5$v>+Ld*bckgU(__TA!bj}M?~;2I(0r}Ceo!BePa3liF|Jj8P-^@{!mtF}QGgJW6uSdvnYm{NjgIP!@ZG zdiTAmR7#fGwq}-c8IEFjK{s@CDy5iB&W%g0vroZkfmio*{#43yjtkI^8^@?*2 zW}4LJ(v0}x_gq%!xQA-e%egr|cj+gl?!S`6zIdX7;-be7hBk{*2;S;}qNn3x+D+ap zG9W2m$}87F_y@LEooC^8_)itEJ<#Dr^;Y)CSP%oECQUvHO!X#?X!pqLAcTCrh6iqk z7hCcxmy9Mtz=A6K0)Zdk5FJV>KGh@3X!3JgY%A2*Sfsa51UCmpbDvp0D}{%20O$Yj z^cwoK%gPnL#ggM!3P|C-MA$MS(%kj?_;Tf7lXQU(@57456j6dhdW~$-UGFu{IGBX3 zHt=Tr?Xqrq4Z!P*10{JaEg9-s&jS23)U?}v36*~td0cHHd8hH|(YLnjVNcu4_frrg zht3&(Xf2BmOm&TI`scU7qzb z16rorhkEqnaIS6iqmn8Nb{crJmbkLq4jg4){~I*{uj>_8FM+3ro6140GXK|ksogfE zjUm6PaEYv(jRzm1z^z-d+`*y2+rfdyMw2J)Ko;YCI5&U*dGvdaaDTeGRIB%i2w*%B z+n=M>Jv1!b0I$32{iAIBd8a3w7#eAppUaBainjVBC)?Q_*yQ9WFpYhwD~pK36%N90 zOQlX|wuy&(TB^Ei__V(DL(r&m%{D6e?MQ_1Bg@WZkw$H#c$zz4W< zRGpk$*D$;oHj(S);h4}8#CL2TSK>y8aKH|M2xjSDWYl9r6fy~J&TpYx9v z1NB8t$7I&qO_d`b-!sNWRUkY(-psMZGe%smw7x5|9ZI)aQO0-IQ%7_2!nqc& zM&~h=Idi(vUG#Xr&vv|)*=R(vPGbV*1E{Y;f--B^$bL+=n?x*v(Rc}lGRyDa$_XC{ z`3|4eZu`!C;5ag7bk8{GjV}k|UP1O{RwUxa)Re`HgqT=GZN9KTqh$4>(!vlRyPtmg`$w-46?j5_uRnB*c<6!z46kl5 zYyj(Ef}5>&#cz!B7EKF|i{R5mQ%3Yq=hz?|Y|nUtBi<3vMI$61)?b0vPsVQF`ssO{ z3vSZ*jl44%;&Wzt{<$eYzRSD&$^6@y?fhP1HE$xqeT|%YSs>tiBzD+i&~;kTf0Xtq zDcSKON3-AY0VYM%N*#Wzpm_&;HD#H6j!~WC_IH3d>&*l4Y^xc|!nW6EIoGOZHEPs* zPDa$CJa%@c%bW1C5wH6aOTek@Ot6NgcwCtm!pAc^e*|7X+hK~tzdlLPw52!@P4?SGO4=?33UU`JDlrbJ=I*A&Yz1yn~p7K90Hsr$4fXg z&}dv9s5y=J`Go2UMquBr%vs?u#8>jrx{!qUn1f8~y4eStO-T_^ai?Wnx#yIOE!Eo( z*Lt{JUZ7!QFj(Y{%i!E0WVdAQ&M^WU{~KbQ?jJ490B=e>scBztOn&L+xNziTeE<0D z-h+&Sp6x9p?~u89NQ4zK6#uMlh(Y`{ZS*L;Kg zn1aDm=4*b>O>Iu9I{itM@$UE|{Fkpf zskDFe?hE!Xc-6Q!hrjqY3c6|Ab5hJVa}2(D&-Tw564_sPoi;Jb->i2{*4sExJ%`*W z;RW`FVv+__J9}%C|7;@Fq@HU`vGBg6b2l_HBQX2j3p6fSyrbp|3G!zf50w5;@N5d_ z+mTs5rIb#MN`ufF-Mp>|MZI3PEXvZ|MGim0>}2>(gce`S?pxx#^c zAO32xR?LRk7ph-a*fAz2Vr2$mr?^MBJmp8)aGss3e9$DhoMKaojcT+OKxqy{oL3@% zDYSqIhI@D{*|%`5G(}y%Ukma7*gIc8uN&JBJJ7yj2j!*oKoNZIHodcGW}A{b4h!>3 z=`*0FWXiW5iAC_heJNCU@DKmgu%8}55PkoVr$s%<;IvMQi+CRhlJlXMCI+Oy^%t*t zgp!UP#T2Wo@Q|;pI_Kmh$FA6wHjmQp+eaufu9^4fBxhT_--q830hf$w)PwJP6tBJI z)2#4hhv|4DgmFBJDkyT_pWhBljIeGL6S(ar^uA^HEUQ5QK>`VMz{qJMWZ5IP-XMg# zE7VCC9&Wi~H?Z9tw1v=wMqQd_cSAU4`&r#_#VEI(U=!e#_-ZFXNL)+O@>NOs_vDd8 z(^H4y;{6{*%Y|}YITtnyPD|s3@Fk$V+WBa1Ah($JuiHWQ6pXYH@vI>+EiHaPwi1ww z882Gf@pifu1-fcep1ql)D-gB}j~7;Q%~-)sw~pHk8pBPZ1LX^(FQfu+(?}|=X{Gms z$~MEuvX;hv6O1I>fpX@L^)17-|DX_Z$^tpE-(w=TmlPTqfU3SA{*YLcg_bkHZ_Mn*!N;b;iUs#H-f`QQ`%o#hld@^8nUllENcmdh- zg%N-%Pc$DkkHCPeaEXkuBBtU+YYnvfjxA=3!u}TRim0`dsH~Vr2=Gyt_WhurPiF)A zGx-}&9~HITv|`;EM95V;1DvlB%yWE)v8u}3eLojPP1WAR>&Jk8s5u-U$o*GsD?BhR z@T$;@M$=#tTbPK=@O0WXato zmoNc2G$gSJ#MoO9q4=Ca}~_@IbN* zK|uFVZ5BI(|M4%2X&a2Dl9GZoQ+ag@n7yKypU;Z63!aHIiMU(@p0YB_TeNtoK;+fx zi@Ds~j{t2ZaKP!t_dPEa(}{=4$B&d_d0=pZQ|L>hvs!#_EIRQC=s?fr8$cpEP;LF} z!6$HUiUcRz-hM&G6?D_}wQQj^I?=^xki!a>1p82eEik4&wDB$aG6BGGel70U8G;G zL+{=PFq^Y|3vf3TtDw=$(Kdf617K)%Q4Ymwv!$*|?tK1if*d6WzbNA#T>g&t>x7@Z z+6bK8OME`Rs0#;uyrrQQzYTPzhwd3%SCrDswnSC6;}CjXY8_~w;Zb;S{PiT*p^P|p zp#D^BEOFw-zY}KsQ>xMDp_pz~089zW^ZT<&f0yi5P{R$U4bjx}&z!mS@YTFUIKHeZ z6)%1a_XIzW@j3EAiZCy9Yab(Op<~7y00mPY*rNwncdNsU73bNG;s|_IJQ*yoBO)}HXqSmKhk-2Ia6#H6G2sv^G8ZMBDmxsIP8 zKj7>h{gS=yeO+o%_}BLm@{!h(@pum_w{nvPf zJ+7$U$X&qDeAUGqZHOx!4w8{}#q#0b)i)ttd&$Z6T6s<$M7=69WcN z9;u`$C*XO9y!m82botxmhbAaKf7mFSQRbktc&+Kg&5Q3n+`=vx$#P~Zt1F^R^FH#F zi`XK37U(TPIl}iF)-`*(n(cf)KDRugGdrC=Ih@B(4lZlSPL_d4~`%$a?W6~nTLoi!1)CQqk# zZPUAs**PDP_uA9ED-3VVOPX(GuC})A`l=j!{PxGm?k$=HOCz3|J9S{v6ADT^0M>#ER7N5oa4 z3ve&pmrz(B7x9rIw-*C82n1$kG<}EPF8|O`e;{W-%vw8fX(d0eu()j!h-LgPB(L`# z05$LKc&?7-L>#5Qrw=744(G~(pWV!=HOl8KxemgO1p_ya79@w4EiJ>sT=}d+P|wQQ z=U<_qzpffnPzLb6uucH)%Z|6wV95gn9BTPuxJYFefuvVTZrw81i z=E8Fn$Ycrwlg`CRvBrk!R+H1deJ+~ox#@hgb`2%^YTmvBXFQ*YsRMQ?rx_(~Xpam$}eEvF^I$yIoehiJ>L^r>QF6GA9H`sT-^KJgj0&8Y=u zPT<6ikvZ7DwNposAa*y_y%hn(+5iQdl=dGbeS!@l-(0NT8I8JPdtg%JYoe{$(R3MK zOmOV8X-d1TswEV?_x}QVGEpnDq5$GBtT=8shp$}0USe;Omg9gB5Dqy0sjGj~fM~S` zn@HGDfpWK#QnAkK5~~>;_?MfNkf8aEZp-rn_-|y=IR`fH!B>!)4XX~`k4q|mbp?-d*z{*j(OMsVfP<8xxR z){B=MS8OyG-ItIGB4>FYo*6anw@<65+qw)i*6LSl{53#wc1obbs=xEDr14Gx$WfxB zl4o<9b}(lUsmXN|Z2p|980&R| z@3q`R;i|<5oQn=@{NS0b>|D0AisrzD1I=@s_9cBnrzuk4*H8u zA|{^ZG&K~ok_VnHU-!Lr!iZgEKDeCnLGC4)t;O>j`+65tS@!eGsG4S9jawQLlJER} z;oQZLhhbRix4j4y0PqW`DW$a8SZ})v)bf0tF^1x^>VBc@0u0CLTd7E1bb9^jHTrwD zk2m?vw!$iOE{{)QKn_2;@3={Tf4=QOb~vn6gFE%CrhFSc%Ll@woMdY+@v-J3ghE`%kw_OmPhO1c!MdP<$R!xXIvr5ZL>x2B}wgv5*ZKOzGvoN zk$oL&|1=k^#tbt!Lk+20?I%VUfRBm&?J%GP-u7v<-pIIr67upwU}`>P)O5M=7y<@l zH2mDRX%0j_ZV5{&X+*8{&shO5Ja~YF(kF>?n^y=<{Ola+C zn|o0p?VGnX#%@A_l8O>sL}IFho-jPf=6=H1^HAzN_UGifn6lXm3>^;S0CDrshE!Cq zjnBK$Q6cOfVuEfyc3>;If_tcN@j1zU0lcPSx1HsMat(T)@1Az+07FnJo-JWK3ftM* zV&UNt&Y&j^kOwoEKmrRiYnS#Kau@)*i?Uy{Rad;})tS@wpyU&96Q4d2a+tG$YF`69 z#(`aZn=5N)o0afm-Q|m_P)5D(af+KJZORnh-`te~z5A!km%h72TGiNj6YXvU+LPfv z5ZbE-jlKc=bzHm8*M+R=p1(Nv#E6zH133?@KyBvRh zztOa^V=Xjp@h{H3^f9GsxX_E1AQMp6Bw4LsFFWu9n}!B(WjHy8gY6ywZf1{c@)sjF z(Z;_le*n+)a|ec?^)e98*UkZ|t&>WsIDjUtF$7ek>17y!E~l#4S<(F(V7$AAe=2*3 zn4c#i+B4r><`1~Lb5~LV+LusJtX8s)yg;RY&wft+Ec5V=_~b@caSZ;m9|IRLky^P4 zxqQa{+bO2#Qn1gv#v>st3jyA%Lj$-*E5D=^`yDw zf>k1ho-SIiUWEpwAH8J_giF6UZ-8{~pCfNsMK;=ynI$B!aj-=+)*hM#NY_JH_zT~x zZ#pXcJqL#l`i*`sxiiHdK3iw{2|IH(ZsAFoLaTk>ZcJ|Ks{IocYg{vYT=Ok?f54k{ zm@yj>x52pK-u~WfT4kwvY1xu-=ltDF8dSSriR|pWN=v=-T~uCLK^sB8pBUsHK7}wOg(vHmv1>zM zTv9o-{#>atiSLNh2e&&?bUu$<;D(@v^wHR41OixH`1&sFsh9zqDm}i=6=;qM3JHJD zkadge7P|fX#Z8?MzYwvr-Deb38t5bP6Ptv{cVs^YS`if>IMi)@ef=fr7o}JjnQR36 zTgZ%vl{7nD9DT-v(2Qd|K%WdjMIGID66cH0WmpWaxr_&DZX)DXD7i_^CmA_264_jIxp*GxNGL2r#6#}X4Z2CDgaE% zBizaYxP}~g z{vd(Vtx8L~O=|#dpPZw6L>?e`=g*arpAHr96kviv*Bu&9-4~~FffEDpeZyBkWVH02YsLwAHCJzvH>szB$Kn5{r!Y>mj0lF`>Kf8(Hs2TmpdXrf%gFFX>agw(AHEO_Rxx%P-(2xdy zzG(tsg7VNyd$X)Q0v|e-?5oQ&BO_W!zQDs1vCFz`BqTrkus^a|q1X}aD@9nbX?_&_ z@^S%Gzd2tDYNaPxRJ+8zNzN5rX0ySamWe$B|s2#cd)H(HGjR(Z(431I^S(rVcR)W`$=~djwI|d=J#*2 zq?gB+hX%~(8rcW>{sBT}kmBGeW`#0)#DJE%dS9y60wJqDmtSCb+kRDKl4`oT(96P{ z08og}8tAP6Mxb#Yxe@(e0cg;*^b3tLoH#|8N%0PNK3qpDXX9tzN*bSxD->|x@Un!( zSC;ut>YLx9p|($BT!cTP-AOh4S~mHf%^*M#*1Ro%?T$W$pJpre-JLkv#_iLI0m@;n z)wrIj_NOqQwm853!!GM*`DUXmLTT&W4g+JdyGk@ZRZHyEDS!jP`oxbA9-1v{S3F6@ zvg9WKh_s5IVRy$~qt`;Pv11d(;C3zay1Kh}D1Xh5P|(=FM$IwaciDD54XDKpa~}y` z#SSGE6cn%Ttt_^66Uf4j8jrdRIo2*`3ux)!)5IHtxFo)G<+0rDHCABF%-;7;csrKEy3roaLjW>bs*FSxaR)y7LXb~xf)qvWoP zZz%8kFEEnpdjCa6P6zOVPbgFJaQYKM8w{w{Y?u}qJf~_UyByVf^6l@7%zbR7{*9wc zF7qL_?3I;#oPrmv?M|MBmdn7>d?tp+L3`s@Nr~<0Mo?x2^yiTT%15g17t9+u^Tp&*)74`13nZpiWl5n@7ytxPippArR_@<{ zhM%4=qG7OLd_nPEL>6fvkg94|&Saif^#X@$57+{Zw(Vlx(Ob`7Z+YTJN9AZSW1?Cu zh`jX?^ZUO2P?M)3{fn#H~W&p=!EcZmr!A4U`WEzO9%~wv2gCP zO)*{CB0}=BwRhrD!Wkbg34>)X%eO1z>?UV^WR7~Z0k;$0g^e9PF)g%qr9AW^*~)yf zXb~)R1Skp14ky;f94-*$+eqjiuNj8(5ob}n!VT!F=e@b)Kwp+CF|wo z2Q=>il7#p+t&*7S1e?g1@U<@c&t5$ZEqZ7_TV9$>nNwv4v#btGW zPlHNyfb;xtdupQA;_j7xkX5U*U1$UQbUt7M_m-nh5ZnTD21HbZrM39ehVOpHExQt= zjUeCDUKc-mb=Z`&_;=lK0Wl;P{KVezS)}gvt`Ma{11M9hJ+<;l%iEdhCgk3`(gO&t zrTQsCR^E3hH&HyyB@bSV!062`*Pm#65TJNE)ey#aH|fAdA_K^LU@o6~Fmhef1DE^5 zM893Hy0V@ZAo+hrt{0np@oPf*Nqx&q4`UJ_jzR5D^OfH2b1JkW?(S; zI^y$Jci4$Pq&0F(m%PiT*3Cl}7UJ>8#vYgW?4G3U z4gMwd3E_Q4P|Wo?-+5cIgLMKgC+ji)d8&ik`4WUr8#XHZ=(hR9dopG^Teat5fBw4O zy`L0xAG4gp8qke=W4Zj7i@J()$^A2VU`p>LPH&~zK1L6u`E4--6Hyd7{&a9)lb}IB zb$mj>b>|2il^W~&t-x?A@sjWELh@}GC0yo$=-FoHwf*uB0j`uXJ_CkpL3h{VyL>DW zSN9%-?=I*353t`RLDmF)50IzOrM1nqYn}&r))&OJOz$5pLiF3 z+mDamj~9B(kb?pVCyqK)OHHh#ol)~w&bP2>PPoE8Ay3GA08Eq9R0*=NeOsM_ z2q>7aHF1en60VkzDmUUrSf-V;E-}w`n&m8f7Gw(s&j5jbk(+Q;mKAUsP8%HjgAwKgZIbNs<2e$6{8?? zalcLO8K@tt$gtPj-o|)t;8ThE~3^b$AiDPprEi<&jm5Fmrj83=S&(nnQ)}3 zqjZ4vtK{L}{)pfahOK6$!Hl*TI#~zPfQp`AxEIQ6^cQHj15h*UoaD{LB3=rg(RL;A z8~fuyHe^@pv8q$cyu0l|&8s%tMaQ%eMv$s|c?@Q@9%qOj!q;{^(*rf#r%_Sd)NgF> z*Khdrx~`V112aqoJdT}mzk5&|gZbhtdLS9%?gTwr9<1nLNaG5;^7874ZCMjX>q2IP zeoPIhzcspl2=H^u&EF}d*fgK9F*V)kcx%TBn|^&`Mw3!DAD;Y;11KmtAIuNTqHt!Y z6u1IPnQlj?yNk{%Ssy97&i{DTvH~{=z;<6fzoQBJ1m?BVt39wrV(B?bN^X@PlUl25Sl7?o9j_;EtgL7*gn#R-4X&uTb{M+>uiA3O-;OT5w5lyS&WONG&TyWzj%=5^ z?aMgwFpxdKC@6It5TEZaB;l65o$%cdMSnG3;nSCZ`-RWr;4Q93$PgEFDj5KG$kSLydbASj*7eZd|QvUDRpJ zvF6Cb%sH(G{A_ONSZlW8^sbwC#*W#9YWt@~2rH*tWMk+RxP^19zzcxP-`h-}N?o!8 z>x^!6%V zX*wG$BBG9{c$1d{oPWC+7y*8z`ymn$Iud~1-#XozEAUXjmo&iu z?`+I>{s}nFB-8*+?Xjk?q6gpaBS{^3V}MJd$$`)0|jgXI|xa}MW*@G zcF$z#8PJ$~8GgS0@Z1kBoJK5tXz{j86ds)Nbyn!PNUF!5et^~3TH4pplJ4Rgr84Bw z$4%u6*k`R&{`#OVvFGysN$*guz)OxAZ+5UGEw*{;H{SZm-k~CO%nrime16x9+unUl zj+{O&Ku&;?+&rvCJrrkym_+y~77bD{?QjyFOZNgYW%ZCdj|Z90+ZL zMncn58n3Y5z7;ZbeTz&-3(qAtK1puL(YU?HKx5HR_bFlM<~B8X&K)%b!5#)IAD3C!N~ zdKo3<*r#^o4^55~wt)IrRZChgIS*wl|x+anP`EW{ZzJu zt9XIVke!z4?cHtUax?OwzW!)FUY5>T#>qkGaj;20T6shINOFNJJX3;m4cL`q6#b*Q^dp|dLtDa>$@6P&WyoYccfoc~9ci;THn8dW{H>w}t^^YX?eH=z z=H|PxpS1!a3-_>uZ|&jLhKxypLzW-dO31Z->g+C&z%>@rjBKHpbaP5Y1^PDJ`fMYrq!FZSL#s><-~8YBc%BoqM!0Ywocr5i+~rIGHALwBQe zOLv!amvl>abLg%^AK(yk^Lyu;dDqN0Yu5MYtTk)-2eQudJon+bXneoRKt_UP)c~VhmBg=q8J*xQJGV_ zEF7)i=JGr76UbI*qap}q$$i}6`FlikQr`D$%hE&0LIt!TaNf5A}^<-K&whYj)ZLCk4L^fW8fHfW8s4=&e$=I zD=&TV_xV=VWWMQe^2G;3?S~ij013XzNsOT%EN2<{W#hb z%Q;EuuWPBhcNiUfRHsshZ2}M1diC^aZTF5{x&q17-{SJ!w?8#a=#eAJSri*wG>HrQ z9|xTkga@?gLR#ncc{%Z)2H}jXLTAU7(x92I z@PZKUz@wR)#{W!Vm?iwI>g6sm(WiUn=_|V`c2|BJ{ws3JCOG4LvP(+C!j2sXeR!iR zo8poe+`7Z->t^NXm=gvD5Eri9QjLLU^qRh~0lXBJpQn>=#lF+GKga`GR zF1o?rm$V#s9M-!R^vnbZ?mJ*m|Cr~00RTYaS_tJ|jcmus=l0UlIW;w5u;%+o_wwJ- zxUiDpL7HrNIsf;XEM7Dk8=;PT>yx#Hr@OY{&S$^p53m&m(Z{g%=YxNkO@Vg0969G1 z&IORt%vl?o^M}WD9BQ8jZGfIvo$~nn($e?bG{Hv!RE|k2gkhNyF6>BWF1+a8$Wf!~ z#~dHnDU)tz5uaJubSqUp(bKk$7`O7j9f5Wy0T(pGN?oP|DjLq#p#!zRz*8Pg-z(=2 zA1Pgg zKHEKK^D7e%VBp<4wX$lF(#Gm9LaR$OiSjzc?rJ9O-Z(MJk~CzUV}5u`n|MhoID%1+ z@(!tG*$NcYM7GGjE7-7SMvi}4oP;C>D1Q53_l`UR^SV{$?B}~jLS1?Vj<-e6WGWmn zpT-1LMc^IbnEMa$$Cq6Wl>iVNM15cL$*Dh)6l=W&&xjgvt#iE+jHYH4uSU;N4V80u z`mOfYi20b;4>xL#cI>C{=d? zopw7S`np6y33~toZ+g-)BKiUm@{JJpyD@|b;Nx=9^><~Omx4bV9l!9WTS|k&E-EWm z)aMb#C_Q!i?PF}Nn_zg7FTeHO^4&v*dbxXkCJJkx=v8uM=O(Wf?+TrkeoI%4x1#gz zgM;z#+Bhr&U~Wyb2;_eYQC%~^BAE(*?`|xT-9izR?p{|*cV9{mHR=x&`;XzL6ghe? z!lhgMXVV7E84XrpEa3Sr*^UB*=kI_j@5E5=%eXp2min{I=it`isyXBzxq{-isT`rB z-y2Vu$lC>F^P{sJ#D(+5U9#I*w(K~ZY_6NW`S`!Uf893DOsc)p$NHw|&j*mGJr~3P z!sPzKSs6yPEI|@|VNP#?v7<+t%&0+CaQj@6P{9A$>xuA(kC71yIw?OE9Nrr~$Ll6z z)oQHIT$KY_z1tCsXemKb8u?;q<6vc zUq8cY!fTwm{vhmVCXiMsP*bQD<8)CNobAU7e{-Vx`4gGPu^I%xZqKb>xrHO$s^mRXQ`DE6=eB9n1ws4iMP_RA0iIyYR+g34! zu|T?N$0e}i{7zBT2B}y|TG?s528iH3kBEqV>74twx+`Kx;9ckJ#!07Khi{keG>|iXM}R%r@tyDV^5pYu74^ z?lYrkXj3@^CnS!c^i?FytwWT5X^DP7{kZ521<`WHi-MrJ)Zv{+pdR>@>{U>QPF6|L zZw;EH-1~}zP>3c+QWz>jF1$`nreN~bUcti8y!!I6q9uZH>k(rXE-lj_cqQc;x13*? zZE4m$>wPFU6z3XJ9C2cWo?FiWRmyZtyQMdhV=hE%)(YBpHIG zI?9shLCn)pEe0{Jx9%l%p703R{MCG{{poxwq<@~pp5+kTMPja2_M(;B-dihd>Aoj=cMwRqxg+I737>Uy&ll}fjoxh=`*KN7{r zi3yA%FWx&zC1G?O4)tvo!}%YI8zG8&9Th*!5&o64eedq*dx8~L3eVZ)>CM?7WeBnRyI>F1z9P?-uG4V-PK{crl@&@Y{X_QP?a3yZ zeuBX^NX-#gPnT|swTJd^4%|%+II8UV!{frkW7nlpuH5a%UxkI>OKyFi{i!=uq#Bq} z{yaui5~BX5gP}1Xr{!i_3L`KuG;1mS6ihVGK3{G)DP9y?vz|=z7#lkmoG(EqJhng< zloG8TA@*G=w;~h83p=nE_(1Dc)+T?Pc+vBGtO=YMghJZ-tJYdl2y|Z;!W1_tQ6Tmr z;f8V6hWw~DnBw!tRB8VE$V}8!?{c6D92?Owv^I)ys6T-}?Wz>W{9C-(a3&xkIySn@ z)o9-6=W7;yDnLdpPSUU)E>xg)t5U5}r8~&f6BXMN?>;e5P$Ee^j03@T8Zv6R3f-Sc zB3i?Tc7qCbX1ty>=W*Z;G(0!?nq%KVSl#VOFriy0)Nn1beC<*X3IiM-VJ(L%#%FGJ zxsJ3qxI~v*)cEOkRpAK$W~U9< zT?t*4*l8B(;=DudVUx`3Fa%<*0k*9>WcsLV7!W!>QLi*?TR~K_${JjP zvIu02D3vqzN3-@A!Lvs(ds|1bubK?$IOXwSb6=b-`b{XpT8!C%wO74h@ziJiORMRk zxAW>I9zEorIpY5k7-A!TS?Sxe2!yUY?VBfOr}Xz(*C!$-`Zs9ddaZ3cMUbn5|20`- zC;&juZJYYGnom9*WCesgrToMdlDwct2C-q9F()7@nBxoB{BFp|rp-t?PY1B^%wiTI zEJ2Zw?BI(rgmX(WFXe<+~Fs$sn`cPKt)Brx9c;>YW(p1ihTSe@SCu3`3BB( z`k7RIz5*$2UULR%&Q}42@3hB(fj2d}zOGG_z?(gsvy|0k+C&| z&Lx_94F5~NS?=9=1y~+02?;XgKH)SlN~$SKn(r|ZeoelTy8llfb*D!cPkxSP;40GX7zA^h<0WC=hq)v30BqZzY4HP)Lnc{yfF67(IU$(?;!tE5HQ-I>gCzC! zH&)4)d1b9&;X=XU3s55Yxv&F3>CV}IPo(lt{X4=yD5+DeTdP7r_wDh@N;cq0aHJ?p z3KzXpp=~ z(s=R?Xg@#8g9aOG_uJsE3VF-k zGGc}d9L6& z@S29bx-d3(cn)UE5j|f%`q@D*XuU)_Iz6W_GD8PJre<+i30*(y(ont)53Hx1v$B3a z60bkAK3csI{CI20hu+cY4%H z>WpCsSOXzhF^)r01kmEMnrS3_ZWOTW@Z?$J1s`lR%5cpQRhAg<@OeFroSzVQX92V zIwz(6orP148QT?O{c@U;tsp^VB8LBx#ls_s0i)|ur)6TwSL6H=E@;SRvGy;`nx zKCA$B>Qnl^1uBKHKW?2H6Uk~@<{~uj)nM-X$2X-XN|sxV!6ogw<#lPqk{`c+v`tzH zXKvGSe>RM^xYdHYI$+!94e>JPcF3^f*q&~nL`Fsidw7oau+-S~1tonB;T6S?A{9gu zT-W@?tLGB1eoKQ54C#i`W*jk6D@LM}RNlg7)O2_FX}})WV=^s%B5H}*+D#15@d-V^ z7iTpgR2KwzGl;Z*9kj@n9n4(Nl*2?bV%F9u1U( zbsNrlR_w}F3hz4BYE+OWV)4s%8sJHDIp^=25x8e}0xT2JQ4Q9d_|6T` z^S03^AY*<4io|8Fh&g^=VO-5KS=Af|nawOCH(svW(Kqj+@9q)v>=u}r=I2|Z1+Z4z zD=1B)j1;;mX(C|vGd1JYWI`C?%Q$dd+GOS==}nK0$v7=>$oH30l>dQ9;X84MY~y$K zG+;$ia#2S{R(Lla&CLUQrEU$+gCA>`TN7fPRl(WWMaetTjjf>2UcZN2rAqbyp8-&z zw>epzwEiC3jfIG<_&Rmr=4(l+4QPxK7;rnXKtG2GeevRNxY%Ed$kVjJAxL%FFgQF= zP@H@y86PdprkxyY!Jb3uBd^GA2^%`vvZPxE677j+n=g#eHJ#8l@PB;iN2qAX3rZI6 zUH+J^3sW-#!9w_gC&pTjX2|%CzH_%~s`HK{sOTJ@o*O_bESUq#oq}lM3hM{3SpwzRws^MsIFM)G!X)%dABs?5v9M%+SoyE|(G#q~GjHd3m*EC~Z z(o!gJ>tZ`yEN@IkEa;(A?mF+)<8b5VuF{~79L{r2UJG?1d9I_Q@MHR@^R%?w!1W`N zyQ{qsxVh*~yw9lqYWU!Mozb)nD*fzj>75aqLqpcp$GHJS6Ia3> zpAuCJHH`dS=j%=2(Ua1;Ilv2nRuhuNya*l?|Nfgyb`)b|2eocL$a-QzF)Cr_`UN+E z-`rDB1W{c=D*A{DiXSo>$%5u8@0#0mCSnPYMl!Z!R>v^PT{lpO3UOW}L`w}bvY#O0 zO6yT)wxd(mEj7EYoh@IyoJ<9%@P8V!SDH7IAhO18MgU132-D*0QC13_;{TWB__cU) z)NDaAdh1XZwk!008 zWY$bsBH=kEtS%%e#%CzF#~X)XTO+R$FJvcf3D$e1^XNU26-&}D>H=G7F6=jhsXs9P z(9wKo6nwgqRbtS;ijz+_*uzehoEj%ZVYx@`K!5vUDcx$iT!!l3e8pH(>eR%<>&)_i}ls@J=i1}paf6$!IpUMbL` z%FuE}FO?VdFW@skYHX&x!yD#VSy(De4_s1R&lkTwPyHWU0Db`6k$P@hkh&geE!e<2 z{%1HdGI-=el+Jkf9C?8wmsFHM- zZu!x^-ni3dxyi!)9~!hyK$+;vrb)2sNMT_isxw~yyy$i;h8{{Z{Hu$f?D(84*yR4N z?@xDEYf$30O|J?W>J^)qoNUm7pW~IThhZ4X*`-GVq-Sff#_=58wt6JK+*7)yf8H^Df;Q0u@CCH;cTC6#stjQR?D|F2)CG@Vj4G-WrQcs_ z0B=9^h{;E8l~_*aQz}M96tVJa7nJ5^R75X?_6JBEtXasrzl}R-PMY-@-+3sHf}ab^N1?gy(?4Ir)O*^JQvlHY zX=ve#&>{WY{S{z%Tx2v?_%uq=e4dd$ubS%}mL#ReyV zXYEN64CQEa>lE75QVANzMn-UB-QZ}o-|J)3TRUuZTdog991)qQ6p+Q5C<_gF=y?mR znh>ad6tNL6-5$|!72_Oak|Wm{^i>bsInhff-Ux%GmQ-_?T~o5yR0KBnZdAt?ueOKJ zdeZn!OPeMQLA6KXPeDnWK2xRkF@v3y!-fh?jCeFPK7hk%2|$j2I#X3`-tw(=6n=Ue zz7?q?^DV2b6|=PIpn83U#gvu(``;i+;LKX#y`eBYakAM!X0s#oeuSkV2|8cNpOrCs zu6g^H2bC<;@1mUX@Omw0)cCTelg1g~*E6a0{-DA?Wihipy4h06uj8qSOc3k~j#F=` zLJGc;4fB@!WAzYWJfzc>+n2^4#^p9dhw!M^$Tb*bTew;}t&9ofDWCGo(|-wJnR$Q!#%$AKi4XJ%w}-g)Ud`AsW8qWd#LcJ&UKe82t_&l1X+ z(ymo`5)eRz+PX%ewFMlHpw~f8G2#AsY#?6&lr@M+vEHsOsRL{70L%EAQj; z$u&DJ*}}=o%Q|#A3X1MifB>>7zZb(WGJRjUdF98YY|e8 zyA0csb>Lamom*MU(%G^Y#_Zh$(6h%V%Cv9TsDArW>4rI>%fViAGSBLK56aQ<+VCmN z$jAyhxpwI^G+lIK4wYqy?UufyR5TlR)o>_#Lq?WnNT>cZh^N+sDM5{guQg?P; zAY5QW|+%Q{}eujM^xv2O6LX%X$CmtSq-VtxThlPA*5`T zfg^QccCS5h9Bq;I*$N$>KaCli#B+;ga7Su5I7;i4F6pR+aV7ePZLORilJ3`#ovhX9 zO_MtCH2FI((Hh=ST2`74qJt_gs&+N0hdNGz2kgL3T6*JfM_Nu*G3;x`TeI<}j!kkI zJiF!L!J(TyT1rO`nCqGb4hbsOC_OhO9X`)&t;#7AN zw_5c;)3ZDA{8@t?N?bT;*MR@w=5^rO)mBq@RlJ8?deweeRrGtbSptdvt(4lSAwiDo zYe2Y>%G+JqwH`Z~>jmiWKN;X_1R6j(TEzF9zMAMZLCBEp>hEA4L#dhy9{UUGLeXk4hkuo+{ z={wVTX1I3cT);D&(-N*sfm>JR`*|`dI$N~$C&$*L{N7uegd^1wMsQn8K(zB0N%IKo z^to90oNwarqyhRex+P zNUz8j&FQbfc@b3oy}8;w1l?goZ8=#YS#q^+sNU!n(NR)y{k%TWed9n}O>yPZO);vx zca37hmAr1LCfW0o5O1=aTeam2N_%D?jPa4XjJ(wb;Tx&1r7PPv-htwW!U{HAT@8tn zyrV$lbXyQh3wE|FHd7`ySp}@E=Pxrcc`1)Trb7( zWyN-kZ&3nwXHt9?JD~k!nF{%`1*}w)rqP4V|FAznD-!^u8X$HMY6*JNWskpov_H3S zXn)4Kaj3VE1@GZ!>C;fEJ9PvBKW@wdRp(sLmILQ@6 zmGKudw%;2Nig5KQkgRSmvc?1)$pB|3aIl;1?ba{fJm3#!hY>@eQKijf ztn^zF98YAyBgPm5TU(Jp;mLVm&*X4O?M|R4`wgMKFc~$J^vT+i}E)%}!^$LUou<_qw znNLAx%~n0vPoUuQKxwm@`9njaKP^6uC5r?xe4j)(l)Kg%yu*7)5N*oZ{g>Kt*~Fsg z{a$UC-5VC7(4n}*)!Y5v%dqH-wS~QH&%qXevhP}xd7R2mD7{$@w@gI;bFftRENSwa z+ptddC59d&F-Mu}`+fe4S+%g->o4@qNs7N&mdWire!ki(gtCWm##f?N3k&MDV2&U# z#zCj;P|hh7RUq_y5^{T|$A#VKgWcq(!}^+PNL~6a_Q&BlyndApr9BJUcHSBY%pDSe z=!PGNl%G61qHJA)#k(A#pY60AuuFZUqVk%Xa{;ujzUX-}V_UBW1NoD_O6Hl!V^j)* z4IVh`9{1HUtmNLLSA0%L__Nt2OD6gIhor2k$52*zKLOTa-S5DcfWRtkIeN54xzruG zQCM#`@i>+tRRZh}dXx*D-ppxh$2;(&f47chwvGhwVJAPFyHlp+Yq7hBNg|%7kHqv} z@Sjbo=Tytm>QxWfYKdCj(NPpbh3+}*kjoh1Q8Srj>A8Ik&!K#19h#8hU=*AX4V<-bvuUY_Vr2M5^9NlCvT!}m~EKp`0H$``^P#bFS!@Y<`1Ao z2h(K_&iJ{+=Q`S;98ejw;4Tg7<>g$r-jLQ!ui`F@Cr9Ht7RK7(jJ{pw}Eai~YTB`rLNW}4aOW*a$WZ@3Lhztzy5&dSy zI@GEU1@w@QoU>n(XNT(kBb>}Z2y}5f6N(RPQyv-@A25Rd-F5}&qE=J_A9K*AU_Y&X z=+SI71fg$O|7A$0%BDA`0ZKgSj^+M(DrpZF`Eb;xunIVQMR1ff?!Wji90S~-9^ByW zHhfT>cLN)?%4W- zRfV4$--D&#bUlhdt^>95ON$`{L<_;(!f+egV3D$F!EQ6-OsjF}i>R*!8GH<=yuY=D zzKEs2`Gq+|wl7<%Kz#)->X~W2Ags~9X$5<@K(U;2l}U;8umx=*g5RN7t4~_X(`M%S zKi|8velHqh_WT^{23G0(jF|T)COweKbfb+btp^?GrXE@?fsBN#&~~+~(a)xxG6c6( zkG#gb@duL6sojTKLXr;M0_H7}zt>hNI3luU>$!uI4qXCL1%*!^s)W0MKk#e2u(U23 zE2)O*=od|$X&=dhCp&RT!{1q=M8LK=2DWR*o-p@sX)AgO=Y99b*O<~HpE%nZ^8f1( zjFAHVVnDPKFg+jm%_=_zOZ%0g#y&mqf_dD;FvhW<&2HfwN}FqtfclNa-fhpO`TjyR zVc}%oVG*R}a7GB!=#c9bLzaF8d9@9tz;|0_luQp?SkQf3w z*^{Ue(rE~mQvU0@@ zyCLtzTM(k`57TH52)$Q1Ta!zcn!dH^R_BQXI=U|ih@O3MQ>W!;&;auIbYp)eAG%)% zllfn1Y4HM*UA1axcz8GTBg4`u!GQ`VA}}~q7yzcRrO;2D5fThUZTNb^_5Cl!DeSRq z5Y}K0&SvWA?nI_aiHg1gxou{qTaD#n2-E^@5hRzfULY2Q_Xj8g zALUQGWT{?;y!NDUNlCTb^!T|p469VEE>FN+J+l}0-v1L|#g}%AF5P@YgfjqC8=-B` zTFD$eISeGg4v#HS?RcoCHH9}X|5_2OJGq`msv!=3yE-di#8{yy+beRI{7QQ`cvn=gvg(If5t8FKl{S;JeWt9vjfC9r%s0;8!Z zNaW>a8fc3js1mYtl-(N z3U(~07&y5#HL-JvM6gXHg&#jEOn2laOz{QYWt<((wn)u~&pJhFF2x>0P+W$?Kf*XXZ&BK;UIZ_L~rS2N;HY2RTQLsaf-qezkvKmE!o zrXM3PNIt;~`nQ;d@gS$8Ty5CI-Kt0(19*t6Y83|F*YJltSVmP5`^#6iH{v;464Kv| zVaGflTKv(RBHuy&}T8#CY^~-pQ6LWd@@7{Ue?M z1;$LhI}M|C>JtC|ojyqIzjmbQ0?wO_X!Kd3uAFbeKBMoOFu77#!Z zxGPIiyyrtn8plIEA;jt(Ro&2xL6DqEt|0rTbCxnP`y$ll_ z?4^`xrDma|XWQq^>MVw|Sv?vdXWLmOlL)Mer(6?+c#l3x%Gsw83O;Y4}e@-0$yeXH%(IQ;=Rv9 z!~iI4{ffl~-OLQkE)!Oc#D#<1;VmWFW0Py~cb%ArC-qCTnM&{yS~V7o%Gq{G+m@A6 z=cT`U;hPWfL5z`68O0igcwe9M;nMxP&#g;YgO#O?LNL;u?=5gP;1;dLa1$ZD<#8~& z`MY43=z-|}fXi4UFg*tkN-eq_aN0D0^^f;=?*eDypJQHG8`<3 zc|}Aln?Kpv-Nks*9;|%bAAV@}JAQ`a8jA}jR9MhmgTzb`$T~ANOph|5wY9a`iNSjJ#t^$ZY=#aYz!Gud%vu9)0V>VfzW?JzhA%W|p05qCpg# zcb5`>CQSW8Ux}HBJ!x<}JSwpmO@AlINc0Q>ZG3_hBkmin7_3;Bqha^#lZi&Ja&yRT zfp{r}1}Yii*{gs-Q-R_sZAP_!i?wl02?-o`14*Q|S58wUL#;Zs%&V&s%8kor`)tH< zAtXIydmcRyHpc6U{&1b;EId7p;&lT|Yd`KB-Umah&SRPU$!DCNk773PdtPdz0*ccL z*{fv_i`scGmRDHlz&+yl^pvt*o|3JEpXVR?pThi=+8;D!szoypIyf+l`kydyBfmQvF_JN&A-9k zckeh8y8X~?Dl40SPm1Y9GP=xTYeTM_|0wwf=w*x=zhblb5Q>GhelXm||F-p3=GJ+7 z@zf71Pd;exumzBis)EA=3MVthceaz~eEUF2V(*bbD?k5?`e5{l^s2P z5y_MHPpuyEWW&H<`;2RXdU`rx&?3vVbnz1Ha;2_t2zVELPtbs~`T`a(|MtN(-zuADBqkELF81LlOqTg= z9@X~x;jLOf@K}iV4Ep%q4Sl72sjoKp@k;w43<&cE_t*aoNK%!P;6@xNC24gJ(aY#Z zha@a{!4$LKS=j-A3dFVY>E;a^O>VbKRkH`xOG<+O=tLM%Qer2O6wZD))yA|A<5+o1 ztp2m6yqO?W(O>nz`)fXmuOkf@)#{t&M|tBvJ9K(>>{iQE%jb(8lp;7Ecr5?xWEjZ@ zGEC@y$T0N(FJu^ia{T{fnE$VlVHQ4ykO_i*Hoy|}#yESo)^l~Zg}F7bSs_7hJe6q< zdZBHgtmgcs|BV~dsHJA>(cHWa8GK95Gtsb{ea!c<#}%TcHss1pDSv8yA2V-KQf+(j zyQao0R4#uVqIre$)AI#SPsoAdT`}jV5 zrI58d#9^1no;TDmyP)XN8#b6w=WFsh4HVSUrs0Om?Ac3bLy^<{lPUKrKgS0r`ZwZ6!?P2`y~&?XmEc4gCEt7r!Bs# z_p=SKqdx^_Ki8H_5+WDH9>04xG2#l-c!|lT|3d+HxSXRVh}h=BaoZgWs#gA`D|iD03ob z%s76oi~@Rq^Ircgn+pX*qQRgtj-rvFo%F*D;x ztnuB~Fgs#7A)XG%Ky}{97m4RMFf1rEi=M=~-i&f|hViFWto!35eJ5g%^oOMgx)r_} z!+x{5XXz;i8U38sFXSwgQxVVj-tV*Jp+-o98~QR7=8xI3zT3}`VedvuisN=OtJDZj zlg3wbv6ndL?0_#w)lNtmPnaqeFLkaBH-0xS#y3{?9Bi_jmQLy;vrM}B{lf5nZ~+9q zIlXFtlWMn}daj5nVvii%RTE)px!-tpRtK$|dft=7%@2Zm{2Jdm4W!QQZ>LL+OW8_rg+3bUtK}#LH+WOCt>+}50CjbzkDEI0rQlpH zO)ohkg2Gm3uWTQ@15B$EQT@l9&+_A>xH%h|ZE3kD^HsHkz?xRc$!MNOOqDVnyrDPvg;Rc#e*3mo3TMwlYC*vM@_a)`#W)7*IH)R zUPx>umx&T3sXMNVs5d5e>SxzTq|PToS}L}Hc5V=Xo9TO{@e6`e#(RLo4JY~VC9C_; z4wsBb6tW=utXrGDL6;goW+OW%=My_GorJ*?(@=t@Pp|wZzv>R_L~j|%r~r2f+Q`1I zuq54i%?`0`w)opZ0v&pO;qMI=XNfkLEpFF|3|^so6T$ljK(%l-$)~&Ko&6chfPql- zCTU4Szl+cZhiplB#{Si@o@rs};!E8ZlUp`Cv!(UB!ZHkI&<^yLK5n z5R?GFXt>ksow>w|@ts}NR$jYDPX#MkgpFZq`8wx=-Rm#A+a?Mx_4O(huBy3X^j^5>N{XWmTdj6y~Muh&_3^V{d}{+9BUFWY7NU ze^db)FpgJw@n5qVx4!0(oApp@@#o3Q{s^7lP$Wo;==5>Y^wdEym;7*Ew-zOptc780Mn$ks3#lRoGa zxrcKBZjs?us=K`l=SnmGVmnsl;rn~zcljyYWk(lO7CaGDtNTQ*%kW4POZ-IVEK0iJBO!>(6{vyHfhpgUD4DPKG<0^4S% zx;Ast*y(sj#Mz_m{XqS_H4tA#fAomTg$s1`1LFbRkD6)dk_)Nk&pHE-7u|L~p@+A;NE(!q3{99MW;?#oy7SAaiABR%>bUVgG@RlMNBImtRC%^L zoumTi=^Je)=gO_hDkw<&G9GB3)A3dCa(YQ?W6<-iVG#+Tpia*YyFuWkrtrssevH@Q zJ>$z}=7ZOg>TD*omd&@8tx2VP;IX70Cul;$l9YI4zQ$J`(@N#@Yi+xBE5eeR26X*w zkdLlQ7Ei~<>vXQ|xT-8m7uKti9f%zyuyRL4+gBq+54jVkpy?6H`C%%yqW!rVkU_u^xBoGZ$`q+)Klwr$GD2?$f-;r zMyEJGz2b9H&@Wmo_d@I@D`hjzsynr!$&HC@5= z+~NaEO=u};>zc!g1J{VL-5d4VS9!$*wzG^{?q8<`)(=&sHRps2BrvJ^htp}dWKu}e zX&F*}dC!+kD%j}H+sNbt-HMIrTt2}6NveOEHyG5j)@@kQ4*toST~wQl+v8rjvfI$= zG1MfApNzA~N7je4weYclvB+ttewnI?Q7)vR>X)FjMGSwiBVJcKIkuZBTI!@w8t#M~ zdx)79n3cr0`wh-tneK$g(^W%en+q3PGx(tL+?BRacymjPgfuS`)=^7o%W3G;1__-u zqNK?VHm5S$N5jpYR!z*NSMxw>*~&|s9?KWxZehbZpI$()AvSj!&xic?`QyW8byuJ` zgfHH_6fHf>Z)U?fXsI`Z+VR3X%6=QrOv|b&4%MW%<`)%QOnNq*Q378fKd6P#{17h~ zO7LO+ISdhO*-Qx*0@B0Iy_dt!1UNhvwZxTOUw`~y?N=;0caPwZ$4ZIvyU3C) zET1KrIdFIy9CYP8h_01p&pP2B2|Pa1V4lyMJguE~&OMn7JGFH)$$xgkD(P$I2g%5i zht1hFdyMYyh~+86xi=p5dNv}Svl_zoPQmxWO&=f4wdX;?&Wq|=qRT33L@Au?&ZOWU zW9&+5C`;mTCYV`K55OOlM6|OQn+a&|LblH7PlM`ixIah{U;b&iA?R=_ttuI4{UWsnW zj&Jjvh%Y%1X&`m~#-mZ3h<6Qw=X#K-HDn8$z(~BZ)ZRTJehF5oU z|9yu0^0ogb+MwsmTZlddYJ8#;QjpU2@4V&s%X)Af{+_A=pU51Ex*ANxB%*YMAJM^T zjD0zB`HblP^3FvoX?2C+DWXxwb-Wx!)yDSMTy%*&F9{?s!dN{FVtP*83KQeoGxMp3 zP76z^``)*{^r3GJ=$LA3z54#4CeUa};9iSnj9EG)maRME?ES)VYhcghWUDVlg{^e5 ztJj<=jlj>m=3O=T#L&RsD=xXnxnEB~H|cDnd7f61-?iDHyV+6+9RvR@6$9^iK24q43=I_)USgOU^l~krF)4V1p}zNeY~!O6*7 zeenj{ALd}9!Wr{p@lmXu>`nVwA;Z>+>z38> zOCY0IPXE%H#Kyce_4;gQ79U6)^1VfBT11dW<1PhxA(6Pk5jfZrte%I^&f1`j()%qE z4L*5?26%Fv$L){2jOn?c$vx+lUXks&ocAUO97df1D-ZQ@qP)VpX;4U6wbewMMcPor zD0JKx+OS!vn!oG_*>Ss`-Fm~Je4kVpnUncQ(28TFSYCAL67~5LlE>lFZCP@%Y8pX& zBMlSdi)8n~Ieq-KBPRUzNP9V7?a@0hNyC%8_XwhrE-=NKgqgOl5uA0K#80sgkQ$Ng zRStEqi|-Z7De5$&K*-RPH}Jt|7=299&2QY0f;@v)Ls%mRg6-Asyy|_*5hHv+@`P{D zKfB*~SGKfrYyH-Bc=Pzw*`~?zQNwZGO_5B-wSDBq6MOH-?y}i~b&~V@NX4}73lbp3 z-2-cGlV@n|_CCGy>EGB)Q@pAx93aKDpZHbB1RCo(Q^rUB zdd2i`gzcQvfFDlCnRFbm=E|ulm?$k`q}}M+SGz)cofJ1}(dwk-EUEHN;CV5)PKpZ~ zSfXk>v6vQz6&)11WliUfP%T}Af@7^*rQk`JMR5_=9uFzI>0o|KZ9;$8^Gs3OCt)U` z^$ST;y7Ua>EW)y6B;idp=prdS>+1h{`NexK?moQ|3w+{H>xskr*B(IOL8Wnb>zEaD z6cp5|tVQ*3x?53#+v_tKg0$yx{h_&mQGb~#ZNY5Ms;KLgi@Y7y3ZIbD-%7p|>RLN4 zGraw1IM5s(G5{$_W-6E3tIW%|RW4@ZLzsSw({!YP{RFa1jm7hM#S?KpPR%N z$csJvR3qOk76WBByALbhCDk5e{(w|fTt|{>DY-QV&V1T` zAIURFHpO9o!g>zgxlXIj;UtPe5Tx6vf{(*O-j{EE4#`+-{N~kKMiuE2-j4fH7$WYd zEB`m5#WJ|`&Mq_RFK)^Nnx5#R?%!5l_3+9S)09aImY1;=h_LeYN+_r@@%_?2ljCu_ zoc=}zkwuKEAf&+p+&sX1$vc}b%Wa-4Z^~HK%pT-y6LV4C3+<@$V*8vSmqYHKeMJB# zNc4L{NuS}MVLsJGN+FUSuE6v1=D!O~Ex$+1-g2aZ{zrj=Iarh{pnyJZvOj={Ou0%icUsVQ0T>NimCYm zpund_2x3^xW|zl@2)j7!wGX^jqDe}zb-wZiD*j`YYJ|_wdBLfzr_a0RF`ZWrKLB}Q zd{UmY-Y&%&5RA)^+~X)|*sVaP?D_=a7yYxNHe;4u`LF`E^$uSxCJ?ARBV+PfUVi)6 z4kDd2W!+~O>TpGY_loTg+0T!7@*l%=#_A$yZ&=gdkx#P3EauURg#`iB3N(S%37t-B zhjaZdY@t8mo|EAJ6wb=E^?wP5gC<0|srF`ChD@BaHYty^K79MnV_m&WXTwErTCM6- zJ&HwSA28oa)@#h`R>z)HNr-=7B2PZdPf2hc-WT4m^=2>5t0+h;fA0_6dbYfot6ttGH3h9LMv&X#LQ~;-~*f_ z^c|4dhYAbnU<>U~&gnxmg|(fYp_Vof#zCd7Hw~gUauB=HJ*e4dWZ{e-P-^GJe#p`z z6zNVTxy`E~_nR6IlRGWHQpT)$LNVqFMLMZINN_K9#N$XG)M)UpL^#Se&A71OQUfTj ztOlWvgpyxbgVMpcLfjjJ{QW||Dp2M$p{+=b&TeP7K6o{k!D;D&KM;G5U9%-ntDKHZC2{ z9&0XoQ=~Vn+(o@^9^E`4s8y`Luhdj9xIR)CPP(z)w3j^?!og*{z&Ve$2didy;s6XV z;iyHeb`u61=e^l!aMA7TT4H@5!}HwFXI7WGdoV09K}Q?5mmMNyBTMo5qd%1Xg41*t zE;THFzw>}^yHlD9W)U@z&7g64X1&He-7Y03B|GgFat3~RqNZx^LK7a>G}g~7%uM)m z1Ch1?1?hLzY;3G^+}&uqq`<#^NNcc%JmQb*%nl=_xx3T>7hVO-%rab#m32HlA4*$7 z0%Iie*Y8W{Hj2fLyG&SYN*m+wRZIVcd%OA0OrE*$0Hc5l8kbFNJomN8!)5Ovm~Gy{ z2XFVD+3hX%mF+W_ zc&8C_##`HG8zHP-xx3-6Wv)DUpS(NL7L8?g?ln%%;sKG#_E%KW=6&pvOxMTzMJ==W zKB(dcuUkqfZyrYmH$p6Cz4wv) zE`>T7wI(dC^q3rSb6W$|H$T^0b6=Kzpa-G>RW<+5<-Nn3d95``_ zAMKCgY#(n9NI#-yK9tz|_mNLNR4>N$c(Hk1lO=@2lH=B~^n3P2Em?n@AY zQ-=DRpkOs|ZN3vJCvmy{ipiYTvr7LW{lq3;J)PFsCrc#cS@|ShfN~wGxq$9!#$0}19{O#5D zncs~=vAj)W9_W7m_=IWzHO0YeF-n!CnEFjmFV_SELqfFRrFmc{WYDy*;BZP+v1JU@ zIxA;0=1E^w>jkH&*aAR+{_*P<7MOLUt36==E!%q>?N${svimJrj^ z$~fYSLNZSEIu9E$3;AQ-W8Wb(=`cQpCby>HT%Rm&EWX4IR&;-7s=h1{nJb-XPR&&) zPO{rl#zYWp*SytP3fEF>i5>>B6ZHRs)iz9Fu^w?duCKMTghZm}&K`W`aG=m~zx;j^ zfjh9h8xEZ&L%vFXC#v@Di$w{CWJu_Ii#vu>YWiFw2Q&h%q@f{cJUaToHUy9{uXek$ zt5rwH{)ck8H=7Be1+my*bzR4(Iy=TjnJffzJv)!8-qQeNlJr?Hp9W<6Hlp)u{7m*p zw7{>`?K*g5SL3uby1BEZ+pt(vUQYBhMhF!9JuOAUv1JpjmLY+C^*5SNrFAMD9UDx{ z6Pz(#n4$BaDUyJn9SA%K%Gm@}gva!4bnZEPuT!U_;uu(2<_0Dbr{=M#=^}QLAv&MG zw8VY1tFDggDco|(C^01=lvTcw0kW$G3#3_O!^4~4lOKjDa2GoXHU)YF0X{kfZj341>B z_{Y?)*ojb`PXYr4JbQX?-|kB6jYaFsl%K_ysWtt%@g5)dn5oeA@39cgou1$#{3*Xd zR{7X>;;~0?R))6A@A952J!1bC)$2K3Ru@8&&`H~_B~lG#RyQB8KC?_k1Pgi=49+^UBu~4$T@j`^;rWvKNS`py2Tpl)Dx;vTx^t z<@bIK!2bEuC1I8LXXI!Rf`W=>t?(oP*kGBWV~qZ_-B7!@fE^f=^jw@q$3yAgQq}QQ zDFG`^tk*38%;ZGe@ZX`o-!Ho*4(I9-5+^0>Bw;n!o^vc_-s5S?fO!Re)K>uj+m%U^ zI(Tf(l!he)0Y|8_eUUCPR6W!m{DqtY;T&J_y)htgB7ttk)ZfovUU_tY5TdBnb@|G+sZGFD-@wQqDlW#SsUTqJ(!tO%m&4+D5CWD^ohSRmj(Gln3hb3sMLEk&r0MDM+uL@hwA%Yi$QV+k`7}~R&$aThl zV(xTMK~btQpO zU-7<7?IMMBopfABV0kT^~Re5;?yo5JOgr&)R^!Jvc+*FB=@h{9J!fQ3~d zR7;p1oUMSVO4O0m+7Q8pilC-k3c3NepM&w;C$`C~ifYaz_Lv!zTrq2wLj9|c z0o@zCQcoAAP=E>Y={shT&i^;3F~6`%nJo)jAEg zJMlb~a=HTwYY~agYs?Y(yKzj1C?fvvHUJ*Kt`# z)FZF^jJN*B)I~P-XZ!s_bn#H60|fivRo1_Fyl!u`TATz*?zE7EUe_XelPjha+HQZr zTqJmJb+x%~T)y&Z4x(?~zz?N)!YsQx^qG|x6cvfTuBLvCCO}Jai4Fs=K}wC(&qQ~` zGwSH<)~-oPN{Z8gAiVSGVZ21vTayhgdA=zG;g!S^8mL~@yH^QTeq`Dq&e6#vCPUQp z#fB^B#V;~4bS+Lty<4@6dUFhK9CjX~Uf*yLpk5M9`sCLLk#?bK3#`xBmw8gJEjJ*L zxXMzdMsRJoHBIWM-h@kI;=Uj_eC7=w>7rNtq!Sgebc$@7eoqlP%KcPvPprSqv-80G zHjp}%Wxh^TCfhP~Wz&foTUG?kM&xaG@FZe$O)uhzqAsf>Nq=n&7 zW~hP%W>+g{_{{6Qp4g~YU1P#C+p|l};#gNbM*!Ly-vgn^Wr~BV5EIuUjr!4KUG`$< zeDJ(tuECU(I?-zY4QVyk!fAx{nhy)X%}CRpQ#ZSF;8)GBsy^l{Yx;o9e1ev$2aAY2 zwhx+)^CX70v1!BYSi~eGN$(<;1_KO3#TOgHD)?OkJD;99enbM$B(wcK2uefcbQuGm zp;CulXL+xF*0e6~Mp!g|W8Lt6`4Ji`Bnxa^QPmq1*tmDFfWUczdcfDD0vf&pEO#F3r&XAN95VAmzSNCG+Qp{( z0)DE{)J==)Y0TK(h~FD$HXBDsAPM)AA`jnsS@HNeo+wiYWSi?P)h}kKM^6h?p9e+7*<>_NXazMU_wHqWLi9xl-?#RsQ1dW2{f5!XT==Iy&qpszaYT=KAYiLv}|>M zvnOI>!;s$x+s|27l;B4pHq&LNsw40~*)}Rc0Q>R*7mlx3%u$!l(>4eSMG84QHpeOTSZmfdDA#2+2Qxi~p zGIafnqu%f~aQe-cooH2*)nfJ{B?F85Xb44yvKIK?N47P0-rhaxT98!emd!|ngpLpa zS#lN$SmzUL_sbZTKYro?ag^vW$khB4;#BV(3jN56cEYpthiInnJY2pXl&E@#ToHc^ zSdtHMc{Cl~hu>Py z5~BaVxB#K$>D+Si%ELRM381?D(tG3twX)%P(ofA;OdIu{6Jl|sMy)zV-x)0EL@%X@K2#VV2~kY zV6=0OD=XwVlj0bA8=+-K#{Ddz=KAiH`_1iC2+87>>G=9^ z_(8**t$Cc-V-OJXMPw$@7|eB>a-_-p@Ay97mhjR4$*>5hhHc~f5&3-LSbwxMIB5Nd zc3Mz5)MN-Jg9$X|zMdt}jyq|P1&w1yAGC(3N@uwr|R zPJ#nQn_~i+o;{?GPs=Z9P7g^%;sBhYq@%nrCzmNuF$c*<(5G$Z57oTCuWO+Wmz<*@ z!m(N=1w2d$s%*s=F@2j3LyDD@5@Hj!pT>C55(ZGGuxQ;B84yeSyED2dMn|)%DKHej zk;MCRLew6yrukX<&UcuhY@h3Q*B*#gP&S+n7FOK7nQN43`@7PfBAwYLVPb);AST8Zl*MVCO}_jUFbOUt^}?pYvZzk zg&OpaNo}c-k!dA#e39JAN!z*nT6~`5C+d#3YrpqJa5Ntfv_!Qf1aCUywhC&FHxkET zpxvP?vZQZ1YY+Gn!ovCG)sl`70$87|*Mi#u>4n-aWVmT|_P~t_JgzJuk8_s5H^!q!CXoh+} zVu@5p8O7Auv$`jGhfuN%xYH?7RXdfQU)gh^D^E9St$e91Mnzk9ee!=dZOtE`UjOoN zL*DL$w89&@*RU)#UZn>rj7%#oXA(2d)&9kk#=150u4lz!uDcnFu4`w;2bU`>-mOPS zk7u2CJRC2aVWLp@Ppbz@4o}Lh7oCFTO?I%nEsnbTR}J#|^-&8=P^9@Q1p8-A&bGCc zLD^^pAW6cUYrqhLlhyuJlg$_B^G5n>Dp&IBcUzXln^&a$S*+;z{g-l9uWkXWZM6B5 zcS9J`suw~VA4KXf;_tZN+&jZTr-=BtoJljaHeIyQmo4jWX69qtxz&Mfwk866eNc^5*?=&f0c}7)DuAlt;{Fz|v|IS>BiW%AO=C1A`09r>$!v+0i zmJWBm(zQh=^{C}~til*{A=T%S#VUy}9r0+9nw^uja5-RE!IzRH283bYVN~GQ zAOMjhm{X|~m!(iFe#jWsh25S{Ll3a@kR@L1${8i($@0_+dMS|)V)f;(L;%1K3t_rO z&0M%$k_%UX!9z;;#Z=0QuJp-BQ9f#`#Ckd#1JRr|aK<~dt~o7bLXfGUoS@uZM zH~FJ6?r#9hE69I+UI_;ToU>^tmnAxo%VUK{0NiY&c3O|_!m9|9!~s|Mxcmw*)bg4^ z+vX$ufF0uW9^}CJ1SLl!f`&AySUoLFd`MPNZ$1YHt`lG>q_I)sMPh?8J@^wVo1ZO^ z2Hb&@<-b*7ZF6Q+{j!T+CARq%9`EP69gn3PO(8+SQ?IQ2l}a#l#2-6m8D-tyH>pn(Rcr;$3+7cf;{$v6NKfiPjg0_gIz5i`g&Ku49dicCg>Oc_|7 z0Gpub*DoWmY_xBblw|YCY^5W8QqVAe*P2^_9v>fu&kAqy$ak<%#T_0q!6b@!#fJ|` zm(G!3?e+Ao>z_mQZHr-Cyz2M5g>SW+Vq66z4+|L)eH*$fzRswqsNKYH+NV!k%VwktTt{m6|wyP598nNhEb9;z$vJt5FJW8p;jzbGI4NYQOBh#^j+JX z0pU3UkQ_~FA&aKKoU^vceuelK_xNp<@)h*q5ev`f`uP!Nl|2uIQ^NX=I(5rLN+xGb z$9W1WO{$%5Wo>@(B`L=K zg5X0gYHZ1NlG6OHBLefyH%qoR(#FPh8ELJ#UJYd`*qs7DAs$Z-tUrTjS(4z@YaE(z zI&K{5u?JDnddFtnarS1_`-~9Zvpz^f%Imiouj|ulz&%I&lE=#iXIiw#dPPY9i&Lhg zRJ+c|YtY==VFlUv7#(GFrq?x}v3_oDlKlbv{pDeZOra1y@(=CR+u6Rj5BiM;e@uF{ z_@KnnXHCG!SG-;}xM+1xo_#eJeh;uZ;ya)6eR}8bhPH++mhR}VKUNSJYUhhyiE^w^y$vJ-45(Ck<(Ox1Z>lE z=RU5xe3K@}5!*9^J{K4oCk)~}3@$>IQr!3Vh~%w~uzT3vubkI^XOu2VRAwboV2k~x z@}}=aulW3hz+?#*G%lJhtaiIdqhg8B09Vm`95vxjzUJQK4X z}Cxu?L>SbK(43#{RI=6|pq3HXJg14TUwvtB}_`_CH43HUI43Kl@G}us?`q z#9!Y3Kzo5HJ7bnLoG$yI0FSH`YASY7clsAZq|{i(om za~s135ZahL{z7aIwfEs3Ep2U`$6}RLv?i&XEnWrS$PoUwyN27u#cQ@PXL)pgdabY~q)vo7~-E3F8 z{xnRQ%TiX01u=hy$tvM4F zrR_(uTVNTJutbXkJ$B>kPvv_=SH+c_YHh~+;1`pt^k!$*v`6=RxKd;*NzBjrs4s^J z9waI_dkXr$Kx7bRW`K#u3W?30R7Qg~V9f?F&Ahy2G|DP6e~Z631ZM?(Gb_P*{>_0d z<;wV=;w8|#ZCH!Vu%fE1s3I;WOl`3p5*yLAafXbE7p`7HZ2myCx?2ZQq6Sa>#&j8r z1T&x9(dUKVl3-z}+n!oo95U>CFQ3=+wy(BV^BDIhb0P)`R&G&bM4z^XZ|;b`9o^<8 ze!l*Llb4}Hur$&er$XG{dp4+O=pS5EPZ%)a+uiEar3F3GPOhJYK06#7W^RuIE&FL! zqmYAsMLv9-ul#>k^z2kUK6Cj779@c6h>04psmdgOGp6>wy2_rSqa45K zP%kSm-$C5m%)ngci}l1yOimw+9>NJg!ut)X3*R2woVA5*7%;c1(ZlxQQ(PMst02(pV$Ouh0wImNcbL258Y^i1zu;B!e5*QEle5M=;VP^`1zt zt_5Pf(R22gy>iwBZ;>%Si71@NWBU9FlHQZCkYqobmb?iJ7W$*^xe1CYON1Uw8dM0MHDXyXF<&XC7#HvIW%PI?#qxB2vc7`InZb zG97FZf=-rT6kS-dtAfFn;FraW1t2G`Ho-DLqkKd;C>dOSfcvlvjhZ@v3+#u^wC>Sj z(e4hn`lXtMN21bAJ>D)S&>UgAODeZ(-g|H0i_My<0(-rb}i> z0l@m08B2Fx4=O&!LCOCl5+iEt6YW~4oj{NhD8>K`!LX#Y#q!6e%w^x6pP zp8cy-$Rb7!AT4Ed_?HlHH$b%SrDZOcw{Uf1HG;F>;U5K{?t@*_%hlP=Q1hN!0Q|00 zR)6>3Y^WyJdzO`l(ZZ0j)a|d4Pt_9ou1)~(cR8j9{#r4pXyTGz3E0T6PDh|Hc|G2% zYOw`Zjv<#ft)sq9>%`Cw>#6J4e*(4xDnMny{dtv_^nJMb7fb)?AwmEYcR!Mg8SF%( zhWc9WCBw_L*m9I!9!5zX_-Wi4{1Y5vB`2GvOdga13=4Uexzq<$`6Q9Ttm2Qj*D{~p z{9UPn23Wk^>Nut#km;GC~YA#u~ow=eTP5k^c}cz7%gXfy1?+X<%8EY4j@Ac=E%LztfK4D z9r>eGh33PcL^-`;1n$E`Bw*KOO=!nE=C)r=+EL3lwS-{R6z zBVf3;4F*lxHsM4VzdHP zYldJDB?-X;mANBCr=#Uj$A%>>Ypi%6u5Iv&#FHU~ zCkx8*=0295e=)OQ&_Z3*gNGw4RW=t~N4p#C%ZzcJ@;;9R7>APw!pTp4`og@+?g~Lc z%^;fi9c#BF&=fjy5DmPwZHn?z-s>~knjw)Q!fcWDXmT6kyga#m5b4=@_GRPYOI}G_ zE}*%tIjdo>QmTC%PX;6-@nd#TwL|@esmkNrM6eD&7Ra!3%7Lo=ZCm<_0Na{F*T|#( zTNtd$>8Z+pV~9k)4NR5hu%X_81TFjD_)=d~Uu5SY{%_d&6Ly&q064&!9#i+Kao@YA z>#hQszR-<|hAq<4D9*&>o%wl>t}s2NI-r8UIlFRp=6eNija1w#EF!3RIP#Ka;r~82 zA)-GxE+N4-uhEB0v+mUdo#RA8<`pRqg{ywG?hgI=c3!a7;;O=t?Dg9KK!y5$qUHa= zh~V?qY0Mc*LSJDBj-H-|0;vWozd$j)hQ=O(E^zSV@;2qRI*suGt!rT5N+w>?2Pev@&q3$A0{aHRKm0?jMv7p z9gfC*m${uNQghjXcVoIo$0oMnw8T9krf}JOn0kr4${i&&wc*t{kXXPH>>}Qstl)=i zhN!n*J~Y=aFVD7AUb0m%`!lio$ZRnb$8Bo?43W-V1#u2H!8M*l5BdtkzZ7w+qpi*nw^khx%C zD-#BgaE!yNFFdX2mme8%h`4u#M_4-ZDe>gz#i0?~HC|U#G)Bx=WeGDMK7cFxxyA1# zW+?K`tt|u6H}HILftAAxVF+7RVMiJ)GF*fK10|IZiatCS)eF*C96I2w7C{vsPd zHTx+kE#_}StJR2IY&c2(e#*&@eMR89U1f8pnJhLo4dztgA8F74;wEz96zfyx^Fm0K~1e}fuM|zUaHZC3XFYfey%lCSNo*=l3b{j z$ZKxKLc)`j3i$wwsKRC$wYV1(94V*?@jo+Dd(zAi9-B2JW?k?4c%itIuPmyP;TIKE zQE3r}>2!4C?F;mUmSadrXM)( znF#!Dk65kKE!6rHU&9Ss!{kpb(JKGOEEej&*NukPHLpPr$0`vnwFjQbinRM(zM4S2 zBAGEb8CiPUi3_BphW&hmbYB3#jmuWj%J|=bwOWlT^;g#k!Rb;0?8v?cw8Z~l+@385 zy|UtS8N0ZTD1>z1hPD5U9yxqxRn298m!rT+Z}h6bME4bMNd^NkRe7fK(>l@kApv&l zPbW)9Qm!`0GByYxtV?D1U#C6M8f0W&_~Ox@jk7f;4jWF~*G_wp?NZQb@4^GR5jcvJ zXI=*bs2B3lkBI-hA{?o%VUHt!mLL^Qwwf9T!>=nX9dRB~GSJ{UEgz{X2sj25aSfrMeloWG_p9WCU}S zsIp0HFmUjG6Oyu(AL_ZCMvR#?9+q{YzKjf*>7Cu5#crt3xqKnhJA=B+vS&0w)7&e2 zAWg7_$e@hviy8^I5kb&JbzGM}J9iACBr&qcIf$^*JO6%$ne*b=g%`Effpjy>M_&J! zas{i3o4NLSH-khK%~@6)1{IAh)6l^vf9ggT?Mon-f=5{7`!^D3#i(k@_t|5u6n8Z3 zHvg?|!C+VV`@6!Y%-7Qcvc9LVyJ_JgffvcKq}`_APP`gr2*;X2!JE_$r{FoFYW=_y zk_)Q7EoFxGm)s9RM!41TJsi&!8>=(Ns7+bDVt5_KYPgE`wP?*W7U=)7@k&LpAVmT% zrm(`R1>ZxOT>ktgOAUuT$Q_-t_y2(AXMsBSE1K_op?bvdE-+_&FRrKKGY}$C&+pW2 zpepfe+)aNVSll?ZHYv^ zEgB%442K1Mn1DQc*?y>E7`qxq$dSfqpV5VkQx0(UTPvZY^C|E6o}3T0ZfLVFo(R2T z?;*baW31&LwzpVX>WJkrVY0dJ6U6^G@V7;KYk$`3`;e!18%4t0q2sjHW#)5K^=+CQ zAKp>GS3-(r$MjFeI{F#R;kNbnKWi3ed!+qE7cW_m;w87*V)U77C4zSFy}3A=|HKwhZ|yz?RCuf5;}d?pjU8(nlVt_NSZMz`NxiYF8|u(e zYzZjx3EfTQLfQw~%eG^$`>!pF6{XTA@?YH^b-WCBa@Tg>#z4y`d}3ECWSrfwZMogA z8l0~_Ro3IWGy+#joyvOmn6|H(IjcnFrpXpcDf^UYuC3E+=zSlCNL;Q|&t;DK5JAjB zC!yw{GJTWwfdLxzyTzlO+11tL$AR{dY4aDsJS$PUI<~B5sr<~~v8eAEI;RYYI!ynD ze2n4;+~Eb^XWHW#a33N*XSO{cM*fn-=Xg%np5UhRQ!@K8<_-gC`i3gUTtr2y6t0t9vOiFXOvaeRAd;|m@btZ5SFXKrMZ!bB$?r(6MJnvB3%9~PuM5ObY z*M}ll^9Vn8(q{A={i^Cn_LHxXz;q2aw#~&_lreX)IuJ~IQ2q7kT^-&>sybu&l6UWJ zFS_~hzi&?k({dGD^FRwUqSl^lrVTr+jmhUZaYNmcZES1^&F>M}O(0ITy?n`Oz9ej^ zOrzCccQ2ozX(x=nOlQnQz~|c=c;KV<8Wa9#hG2^A4Uwf^ku7|M>7#HUVyT8gUSC?! zOtPx1Lli&hx#Z~A?a*h$7Hx0C%n6g?tZ5gY^2~f9P&`AV`b&U_kR}@g;xo55vAYfx zgnGw!)IjOZ4j~qmn&2EX7>+vXcY({I!n4oaNNGO=%iab1RXOuQeNnbWboX)@t)mau zK@Juo+rYJR#>M)8wnTn8sdi_P@9Q z-U8V(Q`Fq8_ryj#4L<3a9bXzstb{kP{i+ILcn5W|SuWl~V0C=IU#*Oa>NX%zpj5si zpFf+2n@SroToQW8KAp3QDCcwzL*Wg~si4VbI>{^fdW81n+m6@a?cqC7dY9n!4R?7MjeT?J=P zU5ZtUG!S1kANeO{y(DJJKVqRpv&8Y$U{v1sr$QK88@ym+phUBLOr8JQyAAxHb~9~DukH^jAjqLiDb&+J=KUY1W++g(pK@dH5vA+l=6#`R!$fK_Y z1z&q))NRJ=Y@Bt=u*7Azz*;67>Y*n1s4q=gSYN(YTIj zocA0l9gfdkI#sr>J$L*bTs_b5Gy01ot!zdegr_SCm=jhT)_D}3NE&>%7=&kS5*dz2 zkn$gr5V#_q?m71kI&7`vs0`P1o+bMDUiFJM@fZFaZ&iF}PUUFY6PxuyP~KA7%Iqf3 zBSvrPI|~gm{Jj+TA?!G;yfx`*wL|E{{8(=z6)BgR-l1$(6Yb@U&y;fT?@CQXP+m4k zM2dt&FQFccv@n?}P~rGpPX7|Qz`V*BUI*-*a&JmIP?nu>B+J-=Z!eDK9p4=c`}9L9 zCupVn*Ob1g23MI3?-J-pLO_I<-vBBHigO+7v^Y-gHIc>HC%#YA`>WC@SY+|_UR13! zC`QV#OUJ0~JkCrck{ToFP93zdr!#Wqg}TNoE`#gt54CVRnhStGZP48yBsO%f zu8RAk5psjG%8|7Itb#6%Xe)aPG zQ@M9kxHa!kIlayw>MW?czy>?L4cJ+(3`4v4PyXsshim<%?pIzwj@MSGkm0dnv}!;2 zpek9KWK{b{drnfklo4@s|9fe1QJsHjGvh{8-+3>Z($Kk0P?HzEZK)4fzP}MMZDE{N zQSk6UA`JG_{AuqpAqQq|usGH_Y?=_7TP%1cYky`BmzP{45t1;@qZERkY|O?bxJ&n0_OwQQt2$sNh$)+uFW zi5JZ>m0RHc0MQMf_GPJZ&%(`_QTbhAkR+Z+2PaZYi*@dzo8#gFJ537T?9y=a>~Uc; z2gV8TdB(#3?K*4Jtuhnjq=U8%JGAOkoi#-6r`Es!rtz!pp8Dj?S}PYv(xIxLD)d&J zUkp#!Uj(*}28-OEBS&(Ln)n859*OkMj*x{UdLcnf>)PQL`Zu1Q*Zzd0wDJs}^iZiG zb5-doi#l)qEuEHQ>sZ!sQB2nL(=6JGB>}jo+q>daTaLrarfa@g*GVPpUc_`kxk9VQ z>pwhT&OYO!F)AmzTRc6cEQkp;OE)KnThrxmcp^#C>-6%RVx^1eNZp_4usFNe1979?E~+ksGdw6_B}#QlJR%#k+CkE;5Z ztX(=`2mCQWSN>=7eL@-PdyQJuLVo$Iv7`9cUOg5Yk3lol3is_}M~BahzF}JCRq8_{ z-ekmxfo&`I5CT=p(bUQ~+AZ)0$!l!|rC#)!$Ju2-=HpFN9esQ|^D&4`dNnCcR~i0z zb-dzvhfnvcvps#m2&;_ivsLy%`$uk@o`*-L*{^Ag2uAWE6?_j z9y24Wm@bpVCXYf|ZGCp}A?caCfy>*6JtwwTmT?(ef(y-C5SUa_ng>uyo5nUo)1SxG zq}{5Wo<+YGT3I;?uDdhe&h%KgzSzPm=R52!Ak{VSKXiCww@inr>2!4}pD=p;^VT}B zxH}Ez(lFs{Ssuuqe(CyW15L)+qJVkVfRPTDY9dsu1daN^C>NN*h@18b%vLvZIUJ4t zbst%Z=0IB_(emVmD7Jn<^Hes?eJ~O4@An1w3G#Po$@Xr_=q~G#%!Kz#^L!skt^5Tu z^M15s>Wh830;TI^c8Bex<7}1^TRO~f{&eMKanJ6h+f2Fjy-fN0>UW)57o!7kS;EG8 zM-iT3EXkb~+x4k0e}Ef6Z+{s4=r8FB)x?}L1mOexuj9c_ZygVPgsB7$FoN2vKjzQC z`1gjE=NeBsPBs0MWAaB0KWS3qFq2yLonAO6`h)7;5?|-F*}2g^KaMfMV;D;Fxkk^P9t7;9%eMY|XY05k;9UaD9haGN1{`_M@lBd>Lo&M|tV* zBS&TVPuj+ANH;I1h{VTk5&cqp|AhBpnVd^IjjUW&=47BMawsg>dsARl)xH?K(SFYU zh_eC*lAWT;Cpet>X+ z5tC2e@f!c873VK#Z^cD7T3=2#v_4mn$!vS}@^`T#8ttGXpJ>&!YJZV1Vb@DP=<_#n zxkPbB>@;VUJSI-9zEMIVQ%t*fXc)vig{H+WW=UB*yLWSIhtag7(#~zyO7`2wQ)-`L z@kG+ecPVT6;G3Ro6ax7+F7JajSO&y)gnlW-Ic9=9H z$XaSho9Ho3W@wHSmz8itH@^{5e$w8^sa^JX`t1VIEZh7Jhb`iHpYP$T{)0)-&Z@ej zE}6E#KXH-?BYZ`7*vOzf4Fyz4NP(nbBhdH7+2~AP&*jWG5+j*6l);TLN^zA+&+qJx zKoHxH$!&{D78^a~I3n{=meKYM9+T%SAiD)Us6<+9*#Q!ZO*jVx9!`13hn>Uol!ATg%O&URBm4Hc#j~0ggy1 zDxmVopgz}l!ho8JP%_`GW0f*ky`>YIa15W6BBY}hvOxah$6ps2D;=TlN<@$-XB;G` z@T`VKt&b2Kj|UjLyjHGkxTTU&wfQBTzQRP=JU4zdcPOUuO`U#_;u1-!LELfCxiX3Nd&EuS0ug&v8h^IMg?f*&*fkbGy8eiqx znYx}Pf$s>YLV6C=H}BZowaz4tm*9AQm_2-XwrsdJzG~mL^5Jqc91N7@;8zXy-&~?#DjGDK1?!?WFw3EH+0&OXF=c{O<>;x9^Z>8k$boeHPqkbhM#3G z4-Lk)yw?|-lk77AY@x}t_lmRv`07lI=&ykM9Rm_RKu~Gc;F*M4=hi=RKv==v2Ky7v)eA-2klt}~}KTH-2OkTGu(6o1N`i&|a3#fL}myB$!u@|iV?!M^ev*0Q?YMk9~mVWG@(uY z840R!=2Zvi0$U0DL&1TO&6VHyFk)rNFLRgE@xr-!`-+_$xBUVpSRb1Y(DM-SWYpM5 zxcZI50n>V0y$42T8z~>J4_A)V>ICiwm^|Kejok+VM=c={U9#-6HU^dWjY@8Yy746epi0Vhe(sPbVb394bYoVUaw@w69#KyUUdLJm5?K6^fFAN z0zVyeOBW}@zK7x3VSFj)k;kt>VItB>eIia{1v>~E4ho)X-#^6Mn69I6-H2)5=qXMk z!^E(WB|Ee2d8-wQ!*(Ij=5A-Y9L=~CMSV76PhsJA)&_1MDL7ig5tpH}&XBg}77S_2 z4{YWr`KmHc@qFKh9e=f5u)=ZTe%I%OI`7W$b3C2X^YM{i+;MLpw2J%iHlVK&8bdNq zq4iA{uUWl}{*j_aOr(xM>%p5hzsXr(Yucer8p}qRR8(zlcOw7tx5j^fTV3B>pf92t zB5PgzGWv^7H~k@|{TX}KKUP-!cL%40Vf6YCl_8p7FNr}tatXJzA%+}FTAF5S ztj(tBn;kA$e`pyVDY)ur(M}yElfmPc(G<)nvADeb@DT&u_VAPtxJ-q?Xki^gi$GZS2FEWRr#X}=4P@*mcN03o1Hs!?)KJAz)91Chf__B z!iQwl-c$w7etor3?va_~l#G-ZcNKNCsgW)?r$D_!v*}?@5 zGXJLJK7YB9VBf&T^A$Xh9yPs){`+wg-)>vm`H&krb1VX^b+tcrO`!gasd8Mz2EJTz zHiy~b=^w617@Wx19&90;Fk&i7=TnPpmd0GR`E_6YAtxC?H$lgnm$C7%e#}MX@U-(j z*w2^~`x9hN(a+&Geb^eVZsUR-Ol+*6oOA@M&?22Q2r~WV8S}7V3lig5uKS^OB+D-p zl4VG|g(G5HTL)^>`BtfEvie7{Rj#DVy~Bh>itL+Iw73rugrLSSdmgZ`z|G+U5=IJE zZE-_bAN^*qCx;I7jVy6iQ)$tl@eo}4O%qXLVUhfUzd_wjVTwkc>rt2O3!(7 zh;LzT*QFkjex0#`{C~0U7KMU>f_Lt`K$5t7lyLY&@ zY0uAR{L`n@Vf1)rc7X|0RF3M|zWJnI!{JMlIYx0m(vA@y$zPBn$<$Cmc<`0Jp_d*x zS1p<56$1^h3K)h%6E9GkVYN z8Q9Mqj4COs1|+2*cRymw z0>FG`yWnwJ*ZQm~U7zu@dH=DvM4=1l?PfOL_q;Xuyv%y;V?)Xh$mBFnEMs{QkUfa~7` zsj6wybv*0i=`MWO^bRyNY+{D?>fDD#H~B}MX)439o}5yk@Ytj< zd~8VXPS?C^V8=<^7nWaC83oc_S30XH;8nn|dxbOCkcgt+8{A$2H?CtBt{ns{z>=_rXwpG<>2U$0>vli3!vM8zX?*vxQZYVUBN z9U->=@1`lUI>YJs&+O)3)6R+@Y4+;Wb?kMn)wCNuZhbmuethtsy}i1z$6y&=w~*quD^Gk+*dUy6-qDP!XcXkex8L3Q7Y5#J2>XYtJywbc5z!w;&G(p~4ni+}yft8Wg8 zz|Ac#F7Ev4TRnl=>WP&Z+e+wEQZ^0A#-S)pLxu+Hc%bNT4jXd2n9~QMTG39Q2l?A_f}DLHo>+iBmqJ~ zaDqdE26wkWaCd?ScXuafaCZyA-Q9w_y9al7KfV4v_IbJY`M%sS)(fm}_198eT{UNQ zRmO-DPhSp004%}Or?)JtgE|3+ zi#6|?K+^ufXYoekLKvtsKY#y2_VM}lE65IUiQBBRu_hKBGixS4DkEuO%Cu^t zNJhKay}4r1JT@V&!t=-q3t{*m$dW2#UeeQ&mNBV%#n&V`>$tOZVc>TWf2q87`6VGZ z&G@xnOuBqNX&}BPgaNa%_RfF>m!a;W+gqTZW03FHOl}x+#v4ro?0DhyA*#1tjut88 z>Ik;TZ}^e@lq=L}5*I5lAE-m-{VJ{_PBdAkl!Ktuk(0-A!6kpICsAY2A{cb#qIu$F zBVTdVe12KCtokq^lX~QvZx%Hdw=n$1iYY$kW?TqU|24^n)->%SrZSmJ@sQk^J)2oX zZ8lqQ1+2=(0Y;P`?**8uDf(&?L%nVj{2=0_K~Zc-Ec`@B_#?xBAtj%Ju3eXYqE^cS z{-f`B15FeW(c9sP+@BFp@(r(QR0heGF(KXNLra+s?#}OB3GOYa!%Winsdf-1kYoBB z^BEt}D7>yzS#py6EzQ*SC*0JZwc-c>a*TYQ)7aZG}1g5Zdo;u!DZ za0(Q+@8L!Ys7Ifx5<|at$Kb(aPA`!5!G0y;&y)u`B}&x5qKS$WboXrn;K1-44;^t4 z17A0F`wW{l{4n_phT*z!qQi^`_c06lJ?tncco6bA%_BPJ0v(2YGSh0bWop$Me^uZ4 zQvNpx%)rhhd7U~g1?u9D<{zWfKELgV%K`b68BXQEFN|4(-UJEyNV;ybean0^oWmh1 z3mU0ez|#+*c!d1EHs({@pj>|o5Y_KeuI4i#Y|Ck%-U_JKlpLrM@#kEfQ)56LQ;zB1 z0w%ItVU2DsB|kE)y2ZOn49Xf&6cq67GqP!vshqe}{TH)yi{6Rl|^kKvH0>*a2MhNB$PH^_oW_9^{ggS^96atq_s zYP4fpKA$CBh~|%CVS~l<^5x+)T2^Vm`nv8YC1ghb5ygpv{lO0EcnE>N6Jp;J>T}_h zY8+QqGKS~j>-2d)gT!6l!`b9aT(f$R?ZD42LK&x9lL&!7kZCC}xn=YQV#VyGb~h1f zf2O8tAmXuuiYvOCr)ys@Fdri!Lm&L5NQYLcz*^<$Gq}CJjm7rp1dpn1E+dOzu8j=YLRfN?S|T7Zw_J!}bKO zr_i7>6l>AX^L2r8bsiNITC`_;T`c!bUqE6T-XNWnKeu>Q05dW@WPv1C54|c^%C;q) z!-1%7iM~iWtTyPFjiBumYjj;15EoeVH#)VRm*_>$4m<|ff!KC0MS_=DhpIK;!bZ2$ z?C{^!(Ox^bCY(9CB$Sf3oO#kXGP>@eMm8ZXt)stA=~p!FV?|1?Cl_w0s>7=BY5zc^ zR20*lmLz1p!>X-xE!kvpFKr6#khR$Gy|5;WYVRZ@4S{yacNf-_%|Eu*@OWJYf=34@ zs#B#PtBm!v_QQOw8QtuPZN$OVE{gAb)ro8xjz!g4SRi+Z+AtM6YE!o)0E(di^D*Bv zBd-*DBv-|ow(@tZ$k6R$T@%~N(_B@)s%1lw$3p*wM>qj5RzD$oo|oBb*%+(WrV-^^ zpD_Yj=g1G%{~z)7YK|HePraxsIdqg^Y-AoZcOp)aEnYEZ4Ks9!T{;Sjqlz1}D5{F=Al=mC@-%+GK`d*7oHT3l&zT zgDd~F;Wru>5yvQxPZ%OhW%a^{xLxmMxI4P$>*N&_4r(Q7W6nm~Ucvx^xpuH2C9MSw zk|y$+&06Um_GMCQ)q9^YS+39bGT`)o{NGprOa_~!FCZ`N!0Vf(b|)&YwT6UMB5G#8 zyoARz9p8Hh{!n?Me0Kf9+q-5BYFGE}Tk-0SM;pyI+C?mSwkJJD#aD&`jt1)2K2z`t z({TrIy3Uu-^iLj#^}+%i4!HufCU>&NoEZ*YJpVL)35iuXCbij=1hWai%~7Q#XOkMd zrN)5vjk3(_>eTM{m_L}4e+BP;%~%oZGhnPeSpoU~TSLc zq8%SeUYyrqK%A9ovo*9@SO6$`*?)n&yPAgyHvMl20X*2OC`~sc>lfme9^IPrjf9hn z_Pjw*9t~el1kvEQW|AY>(Z?n$5alE4(DOGDm&<-k3YsEgTXpfAi7Q?a1nfRO!bZ3p zf%fz;zNnqf6dMR1cd&F8oQ z?hvqPfvP3#bA)n>$gX%X<`hptubLL{%fQrGgUM&%m25KPj8nqE<5+)`Glln1qL5F* zi<^N9k(04MSp(#dtWs*o4BxN9KX_1_q!FJeP2Tph7Jmi2HMo-$owqbnYfx7IYVMS_ zUmx5T4&N%CB6!*JtdV@q+uh(1Vd}bsuG! zWr#X$_jap+eE#t+1RSTS(5zz>JIL#>p~QL*R*Dz~T)sL<4@in&t4SY8e)brY5p=*6 zysB23O(;p?;Jxbt`}0(FYrX%wpqRVXz(i@sxiy zJX^Wd^h-YFfbapPRO)=is;vH5jdp5@l00hPv<6|G0K)S~0rO}7jhDqfdc8J~=c z0mfjfdXOYpPOWm_xc&1yVzVzXmh0li;iE0Z-Gjne#Qsp^B4Mvinb%Od?M-Q~tW9#% zO>!8KtRMKj1asDh)%nyTfyHYyEy{x>WA|DHYSFIv51WfdiNZrMS0VW?k0 z;n`+8&bh-$;7;V`ycbUg+KYQ6xL$QwfkAFXM^lw2V|d*Bz5%D_0`| zY{<)c|9BLL^;|!tIb}uB)cJGVv@<-mnew$+-7(3-F8@0jg0-FoJ26SoQ;n_WVnA1W z(5SV2dhFEub;K6XM`F}kIKzhJVL*WzS1sMbM~$h#`hd4uiK8b4 zQ)3{cf2<|qJnLD?i2;)otDmDYp_Eld{rTn8@v(!mG5$5Mh7OhAGbZ_54pUVmBkT^y zG{uWtVM!kUq}jxumj>yMx9+fGcks%pV7`oUiRs)E0Lm_PA?6h-{7O6i(mpfrob@J@ z^jNS#R6wHrH28c+;8aNq=Yfs!a^}ioLewiPA$sYP7H5i>I2$rTTd5&rG4R(vQU$?v z(dW%E`o~Xc`PuEI6ojMX4ugoLt=Fvft~)~Vnv6*ZL4pDxSajvbkDFFs{jE(G5GvfZ znGTARoMt%j{!!jZH9VgzQ>OPgcZL!lq^vjH9zNu;p3@t?Uk{MX{Nh2U%H`Ru%P1Rd z;~gr+=c?TFaNV3{!b&JS6zz4%A)K840$W2Y;nWS7wjZQ%Zz z;Y<93_5i;>2NR^|Ged_Axh04|ENYR9BJ72mk(Sw=%gL|sv* zuBrgmK@JaP^!EYbZ+Z`;2DsWE#SYiBubtuiv#yW~H!UPI3{ZnW3OIks(!Yi^|Ikpy zmb}lL;T*n_0lrYYJUNwbCA~1juEOo|ml%mWGcUAanx*UWS@Pu0gg!8ufD_Xopp+-P zX#Di8ZzTaBxDK47EJZ;xe17|=H^1u|*^zQ)aQ)?dyA}DYErYB)zYl{QZhmXRF{o0! zUbRK_g`#9NW;xQY9*a{rz|Pz#xJZ&HDpEyOF;DrzIZ#+OYR8j2o8xZED>k+HRo$#` z7CfO9-S0ithql?(wY1svjRY&cHP8+u1WS11&g~qN=NS+1nTfb%X(PSbo`aya1FjSt zB`rm_ZbiLTLY#`MlIA!2UQy|U_!?t%si5FpZ&3X7l;P(6XqCA5K>l>v!$Z;Z-suD@ z&wF{xR=1|~zCNP+p&^PRhb0Gp5y1%>iXd2B8k?SyGi)rpiI-R4VVUBvYe}gKYH{ZSDJh!!Fcf5@>dr>eP5-gcM zoxGu<$6ju01E7+E;fO%i%;~a<_75vdb>^yM;6-)Yih)e_7{c#yZ}5e6t3b5N?VyyM zYVD)h#02g$v^gX;phgA?I_fNSsWsqlzThjObsJF+is9rUEA%uYx7< z&X{s|v3mHlJ_$YLPs=Ra^t%p29?Zy8(kQVsp7x!)wMx~|)%WwPS2ri-!&OJBUJXTX zO?Of&Ut;=)JR-RH6a3hZ>+f7=o=;)kf8_0n$G@`6=jqp%M#@=fYyJ|KzmnNbIy?`vdQfsEvV=PJPo|gGa$C&xU z9LE6*zd5oQDd065BRwzQlIBT(D-8%Ztf2%gt~S;g7frdeal&EKrdtV0J8ixbR{wq= zaN^6mOx}%dZ5fzLit*DXtYIRHu0Fq(rHnmXZkbdP`Cr~N4L1;a>@yK6NI#nEkHluj zt~RR$+2#X6QkW)^IsF4Y-+KGRB(hHD_$`|)L3a0>o8p--9tPMrR$kT5pTS*IS-C_p zV|Thxr7iYDM9D_VVzSq!8Bn1t7?v-^WWHuxTKva*s4G8pAfY+~fQ6Uq7{6MLuCSxA zc}-qFU^WLh{akL|tF+u2_J;q4&M@=CH&rE_rP+tSrv|{Q`a)I(`lj8ZT>wWXtaqr_* zEiMlx2#{Kgn(kNSbD>P}tCzmLul3k(TBv;G-np?f;4biINlV)l$BZeklYc)Re~I}8 znvt<8iNioQtp>-4Ir;nZlZ<4V9h}&5;}};#lMx1#&#Tu<3*2O!@4(sH;NZHNQbm(8 z94-{_O9!n73g|ST;18ykCXfelus4Q&1T0 z-{^%$gtwc<=J9;B9PRoF6#N4TI6;ovITsdwp6TF>oWm)Kzoiy7s&>3-ehASx}v?CuW4ToaSz;^M4+Wp0JO^%v4B zwiyY9lKp?7CDUB`z*>h1QW8_s!p9}hfp`4c<65YBRs~jafyPfoS`o@J!p)C4N2GxC zBx<}C!bSGc{?43f!^2%vlhj(-HLWZj#fL1X<^dN6zH|W!wTPvtqfQ zs}kS4L(dJc;vlf@`xNi<8{rSyG6Lj;~UCg9*i*x`B5Y6-4h@@h9%E6d(db9i2E9qmA1`$-;oEVoZuH4LZx8rhFGN8b+8us8e^*MT~@u ziYNNr_^k}>GZzJJt##v+OXlK|#TEwoM3IP!fY0l3u_HTH3IDUy^_sz^Mn+Cf5v80UKov zuyhBN6ml6|?hyhaz{Q=&hiYeXPcr2l&=yjwThN!N)e%W`M1tW`k8%~Cdv zTvLd`l+Y_!`VbCeLi-<%a4l6G>l28|XRS(_^VE}lfYoJ6$)_I3yxnZz#O9h^$3PzV z&2gj0l)}+qM+59n&B4)L=q{v0?;bYfre$#l8(I;z)Rc-2Q$~13KLy=-MfI(_;ez%cGEPgLURCoOSqQ!N9yM}LOMJ-fl{y3z&`9sZbgdU1$L zTWCQn>K3&>7j1NY&|}@BV6VlMu5rJP&jm4((KSXqHom0-M_VD8xgA&k5+|_(BdO54 z5U~P#76~<#umcrZ9Y4Hb0qo>UUIge#khF)eF2jC5U#0J%2d?JgiPNy=?VG?RpM!Qg zg1?3g;I6{^q$aQ4*lr-d6uY2d@kK&g;sxO;yb*WYP#)_1WkM5Cd8?VZ@?P(YJ zT++3ewwZQkNI`&wjq%pQW$KJIWw884n81dA_RpJ35wpT!-9K5*=Ho5EdjWVtf3T9- z_nO?b)aAyWP^=C&SINZ&z$!`E7NOcI)d zxQp=#%IZc`<<~b-8az4(ZDsethfD6cT3&&Rw%(Z9Zh<0%_qf`gw}jO=EWI*@wv$N| zk7^rFGOg=JD(RVe`t0P4mGuvq-K9S>!|=Zh@RD}Ei_QZr=X-7B%Y)DFH*;RF?K&5ZIv4plpNoSpNeUwzNvt9Z1PPV zQt0aGRZv!Y_cd?M`P|m7VnL0!DY&J(mkbE5j+py5J@sY$-&gN1sZG5QcL}z?)$K|f zKY9S%DacBYIm5FxwE5LdI{;@jupwAXme&g|TIpTL&L4?|`G!8Yu#~mr(FcL({;g0v zrg%_DI~?C~h5H8TTR;TJ&Tsc)RSQDs%oHG~yc4m{lkOrRVdglkSpD7poyKs}7RE3p zDTaJPjL-JXLsIh|1(RW=g94>vN*DvUo@?4&H&?7oCY3f)dbCKN6e^j{ng#Qk5Fe|s zNKmU5fW_4kjpVpc@OX43pJf#U>ZkY%x&?$x;Ads9M=|+||I}}GyhOqXc1;*9aF6P; zEhe;uw^r`)|48r!yDjL5Z>DOlySU8Y!idiK<9mS=%@LW)CahlCm_ck_Qv?Ij9GZ9K z(2#=K*H@r=b!0i>+8ckrF{?->3n|Jd5XYOuu>;Fmswv^(@?=9X9T#W5Qcn;v?^E*= zdd^5mNl9K^Q>Zt5d}?ay-(P-J6ZjQg8r+i~bqj*tG;cddPbQEmp^NaZcQSfxg22!~7v@9o}iKzM(!c z8ev3fZTwKouuNOg;6xvDE(CRt9wY)$gf*OVDN3RV;W~Z+Fld+rg2IM_aD&xwDbtb` zcXt_l%svyk@GE6mR@)0JD8t-&bYN1D)X^}ig|Mce2(Pkbt38PJQOrs z;IwD|X~qkB^G8n?{=)~o)l$v5BUV$hRGCKZL4D>QRq6+Eb;{C?A6p)-JNf8;`92)T zFgWwF7G1rPIc|Pn@*|hx0U)G>I>Rr2@*qft zU{Cci@E!cYS6S<~{OzB+x*BAn>U5UX#DhcR%%=KA5wL0(iZAykG3f}cK%I3^5WHCX z0T=e$h3lWi0bSOZjFb>bvXYx0$=l^vbVD}pd_GlA=kWc<+8|r=QV+TRq=f|t*g~Pj zg%67vdOcA2pQ^)_P1~tmD*(n23K%fQx$a#{2x}5yP&ZG%=P(k81Rl~LTL9I(yZ@m< zzCqHjQ={KA?TYmPUpPX(kQ6@aCI^o_eui*nEpN*~W85_qeLZW|D;;PM=E708N{wMg znG2317##&*a0(Xb9ix^tKc=RCPq==Ls-`i7@Mq7(cylGJ)MQzSaDaKC5=ikiw}xE^ zNTx)mWU*~P4N`=~d@kq!3*E8x7aB1TziBxD*j1JlKdRIO)d1_G66*+G32n_@j`iU? zy)!L@NP@ha4gGq8w3#C(IIU>{a?mQF7r(o)*QuKFIEf0${br5Q#!&?-T&UAK_a?kt7vOw zu1uvILy$7PuPO$HAiCI?PKv6iMmH+|-%~iBV+Q41?*1s6bxUgaSi_hpM3%@F2nB=A zgQf7%$Pq5NLTStLvGzBeOrlAk;(;KRfO8`Q=GB12n*|V>W;&@#!@-pgA*ld~7B!$h zG9?kkNdyM}euul|c$poqYF5`p*zMur0KPZ}tYOA+9i1Z02lBUO^O9R{Lr<{^`44IedNpexSD zU;pZHZ*<-NX2fW3GK43@Kja61z_TB3{Xyj5)9u!SWD4_0)otb2%*_hw|K)@Dmadrc z#tQVZjVeC9y%LS=$4K`F?==KeMa$)0xBj6Fsh$^Q?~VD7-bO+fyFCRzr?*$dly4K7 zdp|A@7LC3PR^2wYzO3_%{&{csqfK9U3cga?{XD~7`d5iU){&ufS|33BY^hQ>O}K;3 z7%UAyWPoHLWOy3K5IW>^&1i6s#UAykS90STCgk+&dVR}?;G&oeyy1L+l9IBBJ0t}i z6HUrq(a-1%=Ax&G@Zyo`1?DTz6XvpB5jYlXu3bMyi7XoqKFhP3pHY8&lL?J_hWC!Y z{!laa)1qlj=6_(%n(+es^Ud9?C69^Na?@%5B3+fyhRosWB~w|;=^LCdyHCFWs8|tr zqUSb%gtr{kk$l2y04fNTIy{ix=x?bITHA}fYjb~q-w^&_M-wAT!tFeYf2h_L-MQ$w z!AJLu8&|j|xAYVpb9+5m$5G4VZ$YtoF}Aw>x#S{ykg&}?Lv@nuYzyv1XJd45zTA}q zc(mWrXzCx%25*u$ZSV&9Tw|o#+&k|x;%%nqqBOWROg%NvC{jG{0_gZ|k)lxWp}tq1 zYH7Kx!Pi-U0yMVnqp*L7I+h0j*nXW`nyb(&+IqLyhPRj`P&Wb(wM6g6iR+~`l4;R) z-u+O9hKY8hW;If5QmlSQ+UuBG?lN4*ZGCf8YM_((x%uY)0&l)Gek!AF+v>v7@!?$C z`NUn`^U;TRaW?vV1Jm-T#d+DIuTJ ztzbOa<}lZ6^6^!lJ-vGwDE8dXYl~F)C-kl7}FuC6Tn0cuV z)jUvnHS+cHOytGpyKsPfHdOPNx9;=g^f;N zx8f)jx^r=()jc{J$b;*pJKB@+_8kJ$$jeF!C!&nb=l14@g^R=0$MEMa6ZYyOm3XhqT(gH!-qv418^UL&ubm)21tb$xe#Xe;jGftLIluYS5tqArv!(&q z#F665qkKTS@?m<+xY3man8fs6xa}*es7guE5W3f5g1 zvwPPP)5!1?;4-y;X@8OoNfY_+am{OI+6cnd%vb6mdAMEuJ5tHeyB>D3AtDaJRv@$P zJltEl`llP7!QI_uljXc!;s1Dfa8l|qi-C^yH_(c9t9y23yVmU^D)!1xm2@w>miE6* zgdTf^b-S&1z(3~)j8ahW+nv0!m)_DAICksX?`b7z7dLJv`Tz!};MMF%Rh@J`y7Q_q zS)|P!Z9xOj&V|gQuh7j?Tp)o*Frnu&$g}Q-RwC@X@&oF}MEy7(XR@#se`ardJFsTK zYHs_=B-q`4=ggByVAS3HdfaS)=)_m;m%8){03oo1t#@9M$sX^c*6?q4e4Ut_R-RG^ zMo2j+U-4-Z&Rzqmmn5b3X#FH4gN%gz*Nv7}I?xR99y@f{A;7*`=%^SFlki}Qoss)7cDpQVi=FIKf)WW z=C}Z{Kim&xBF^g>NVdH`ftn7fYJc=0Va zIU2S9@#VlIaOINE~EXqYxF-O@!X@&bGRrf%|e~_Opv=g zZ`FOTqK*3t#np+iF6oRjfPGA{gRH?c|+(vEP227(EX&PVB_?1w*v+p9fRqx zaK3Mo5%x+V_jmqWN%*v(-hL_KOmB>nNhmqhz%XvJE2?aSZ5loxH>R-Rf{` zu0nV9lg7-N9go_@w7|^8(ULc%_E<1)7D9(wwORd<(8YuLf5P<8^fwE8+2(Ts0BHw6 zd+p)eH-Py-TooubumVUgkh}dM>&~y)pIfrn+&aTsLU>Haevi+M&8Z)vy0IxE^sKm@ z~=gPsc#6l^{@XZA>fax6I+%oq7eA|y*g#) z_5nYWYcVAa!*YN_BqZHeWrosPX~n|Yt(tF7^79jf3U_^wFR_JzvV>bErzVOf^txsL zwzS`y>r60u8}d^i^T*3)y70SOl#c{r^0thic5S6=%xnG|0%SDYK|?sBAxWw7Vl9{) z`5<|bz#E1N5;C&$e`|WLURk{=EP8c!v1KqFaMTmC!BIuuN4enQ*(?$8UqXWe6&Y=*`9|Z-u1^7RxV7WCIV`S?jo|0rJArg2oZ_VLL1JJO zsMr`KXWa}`)kkiIW#6Pl3P@O3lp1yI*QZQO+_(I)H}#hyQvYog&35&YTLUMo;2G==slC@4&6RS@|Zx62fT|91A_a`KL9&T04ULEVwCh)5uj|2szguXHnX z86iiz6xlgBaxLPdur~+N^AkB=Gn20x(UIT&)nb#unX2fT?SugZB#7QM2?EY+C2ZO}-Pr%vTag1L^#X3Pmk6nclbz8?3L z)qFWD@PHLaO+}{-A^#1b`&=nAX>byneZTsGbfzp2OH^4>Pv3jTJeSEHEL_~E`1pX* zQri1_LaRCWdPfC4);h_(=*PQL1{;unC#i9F7qdCyE|Iwi^qdD1#znvNELPHTa_MUAVF~0uvc?ENhf^v6OFO|v=L0XkJUL@h>$bQs$ zGXyg+F)>v;A-&jYwBrCpt=91K1J(9g&FD`}TF620CiUOQpDhKNRg|u- zu2{PVdOv=ALV74}J81bY+HE!1i=;n1D2$j+V$AZtx_Prw zPjjU$JdqHWJt?r3) zt9#cYPALoCJr$0ZDom4!TwHv$y1&PDa*q=&#BJe80^%PNn2Z;14x16Z$I9O>IN<(L z%DP9`TMcRVa2qo_H7?l@#=UEKudYnDDgIB&6^TGX(wzG0;CrR(I3W(h!lUL14aC*B zRemHM6xy6HdWaQ=VJTEvA5N*Ocfm`DM!QP6oLF`{jqJaE|GmWquI>5+=C5zy=c$Tf z+K|UDB+Q|~7z3uUCQSvjyPovZlm+n?*+t4ZL?FBb`AG-=b{3fcMd;r!*LQW6Y=bH? zXM#ydeWnYbuJ&h2Khw>eK6XBtyeYfZ`!6#u2v| zY#_MIRt_t?++ToJK+~g)r|Jw9%bGv@ms(-~#jzH-W244mCGf<_a&|tV72N`4@&4*i z@`076FNO;f=z__Xm=E{&_p#Jk=w?L$pdY{U@&XO6DE)*4fi~#L@&4*_3{z!ZifhkiE*Ckj)xblJ%YN5Ki=Z_-1y@UN1Q?0~5 z+x|H>K}(aTqQxaRf3mW={(jAvwORq7kd(v);?*Ld1=?*}rsQHD9DbdRoNiun8s$!?Au+Mjq8}j#e>q*nTuH9MT*R zU2N4jwdou-VVY6?ASNLJ0kzz%2}cO{zItcCS*WWqxt>d!ETW(tIfJ?Qxs1!<^ayp~ z`SM{BDI!e0UiURvO}pV$w7?I8*7gn?*P6pDC$=DL9|4~$4A>Di>;Ej>m(unoGQ+s3 zzmfIyJTA25^)zlBPSo;cRDphn-``f)X7VJ+G*o#Up;Gg54@jrgD18gZpX(mB>rJxa zOWLdY=vAqV^RIhQg<7*JD2!^`roUHeLs-tD@}BdngHpTA#XCz)_K_9*1NJ?q@JdwhYb+X1Ssp~Y$4idO<9nuO5sfqZKs4n?fC{eVq=tP1kr`ApNw<^o#$!1GOr>9pkXM>p&6Yc{|P`)P|AXuxw~FbKJ>arAELo4>FUpvj7FJ(tKzar=acvOGe}K#B2UN34n6*`@ zq5nV|(6j&|n%IAM4S3HceboOS{$2i3M6#HxWasnxsX)Cbpn1Q@bm=!DX7h5sd_i;b zeo8D?0=7}aQJzu4H558^WW>L(UOfo-pF)NjIULd85ib)k&8+9jLk;YXHoH66Ivyg4 zrPY=DL+lh|dOo~Gyv%b5A>33-ijG(e?OT-L6JgFbE5N=*qNg7tXCKQ*Qs^BhYK0fi ziAJgQ7@wSsQ4u2xtu{D2G=WOQ!bQW|m1%!TjqSbpXMnwHg+hBJhR#PPK`#KOA{X- z_G&MDXXR*#(<_y#HPB|E@?DYe)mCQ46*!vn)}qeWUy8x`0;VF*SfR@05Fwl=BsOab$e?2M1?~7TK)VfNbPUn%*bBBeyx4U>`fZCs}=%U1h zh-^pQR~4;Or-|utot*%K#H6H3qc$#h_#njs#dM(0w=!Se@@Q%rO5u)9u%tA&?36a& z)7>>#NSHrd=?{+Z$j=XRIqh*6SF26cWtnchlf-62AZ)7w?gXqis08a-F??^HEMK61 zQ3%6qvgB>XW?8jtLKkok%WN)-+ljzi%xBcIlygqB#zYo|E&kq&O8EJ@sb`LbnfbSr zgc+XZ^7lFy@`?%@NqoLk;Ga}^4${_qY?U%GF**N3JvdPR6n*_-$?-H{d;jp`w}|aHasZ+zXj=Cr9fQ^ZS*n#t!*x^sIu@ignORx-=W{x#){DbO@5$MZY7*9bA4IQy ztA*SAxDocDbpeX{qDlf$Jnld(5pq^T} z$B{0Sbo~(-*e)Mul;^bwCK^1bl9?^N2Y+_jAF-w86tOWm?co5!v@b}(D7(JC-WiBJ zg0>8%Wg6c|xfJN-Ax6br2|IV9W_ME=N z?iBk?I>lt6{%3Vd<52h>UQ-Zzv9>t=;6BK29)r6Ro+!Mimw!Qq&gj3sde)+>qI5evj_{!4Bn|Ctw2uKSb6FqceT z64HU zoGB2v?anGN@zZFOLoLqIk^!LrC!NXiIvnU#_B}9|fTEhMXN>2aEN+d!PJ0Q)pgEtv zSkxxfeg-4P;xhjPS?z;I8)cf*q&0+kRlYIhe1>{PZ@{RIg_BcQl)f zCHSIi(dp#QVF*2)&nsv{iw&xl>p15m(uTdU&{JAMf|&9i<|4k-VEb`Pu~ar(s4DlB zY=Z#D_Posc{qUzADNv59w}sp5E*K7&quTVqbmERk(_ipIv43bNLC-4jBII@L z2vW#{PBd@x292R0J1Z=(7MZKnec~YX_oretPNSHboi&UzvoE$+?2DE=v|fjvhw4I*3da-Q*mFxbxjz*Y)Q^a ziwQ@=kR)VXCr{rl)ICRmlk)twUtyb0bFhVv@cdzu!M@Uj)Pn8iX0_Z@kucBWn4SH^ z=rZ#83!gjxNa1MO%Sx-q&HRPB^xjx43=e0WQQw@2`_0DaZCZ+64 zuJMvp>*U(Kk#h%i)rP;%ReDV4^LB^Z)H%`$xUh&XVV_^Sno*~iOyu)|O;~+62Uj$s z3E%hv^*}*b=Hou>f%aytZKH@56JSGn`$Iz1$t-b`A{sUh7y65qDnwa-Sk_s&*sH*4 z^gB5$8Ca~rTZ6U~pOB#*?gn$_z(F$JD)rt}vBd9XKIHOf9-D`U2R1CVD=Si#LOLxx zJesBmQ`b~iAfdH0dp`Pr%@+!yMvUlSMb7{##u7cez*026wZpo*`=$R$hevm_%2+y; z6QC1?=uSJw84x_I>(4gMQUCn)ftcVX(>+q!Zw9+K%_ld<&om!|Ws=3rHSox#(=yMT z9QKSa&}iX!ve_-39=>c+K&h0iMjP@}xq%Ans6ybL>-zAb(>dh_;85j`XmmA56t+^B z$pwELE*=|~Gri1e#H7<^(i=eqE-#12F{%^}%Wn~K+|+9VBH-!)@C}G_Oyn3nq6`gG+`UEz)7~D7@WUlLDA};RBQs2eCSjHl?N-W~1nI@^ zPx9MB?y?bU+U3-W4g7LA@O+hpGaup zEyyBxF$>+|j6=}=PcBAGN~*ivg%7AStUEJ4L_A*cH6NJrTGL+-QD_r!Ef8B^c5QN_ zFs$}sb!WtiBS$3x(R_KUWBQ;DYVPD1_>46Aatj}JmxVS~UR$j)Nmi#6eLNd)9Bu+m z(|Z7aKU1fei3I5ixtyL>7=E(8+jrP|0RS7a^93TtfU4-AVRTH4YK13mK|$fovkskA zm>Yqu?kX_kUoMnl%%LLmcs1U=)wgaVus@g!U(xh392kPZ8iH8n>3iMv*1~D23Vrj*WH4MSi0BsEcpdN5Ldlzr0LCyOfaPT-b5$NxvzXq6TUrK+ZK<01B z0@PG?hwTtlb6HJkR$#3)s(l`Y2fk}pclTfjll?~RzAxb?%6krg)negb zp`sPtpT@q2{}2=XuezG~_z7FG^WFjKd&~IGtHB-Hj$stSHYW4A?Y=8@!bO!lpv1CC z#BCmyTC!gfYQFfFh9eT2KbUG*!cHr_X&CC+PbgGur3PDNtezh~Hx#$0n(w2@l#}^v zG&n()TBMC*y+#raslL{QTkI{hvIvEs_sq?`Wm1@wX*K5YL=_k4=zaFM+74sB7Wb^@ z_7XZ8l#wpRmrhVPGQ;)VLv+PUKsEOl;Gdr$g`ELB3}^ z;Pcn18EQy;q#L-dkpQqVZ_E)UG68mX{hDv~U^4|p0RlExobc5FM1#llB4z<_&7P2c zy{f8WAE0RO{C$`iUB*=b@_W4O=88DeT);>nR&&jo23cd7PND+28Y1A*XGq0Q=8Os& z#QkjD-srG*;6q%qOL%3xkc-=9ew zobevmwbmx-7$fh#$4NYw3ond~ea%{$`yLldPD*MLt6lFN22RR~AKU1SPUgKqF?k#g z_sxo{{ka&to;$o^_Ix`M*EJpoga9kRp7l*1N^SE|v05p2n|$YjRZ)@Tbtf+)I5``( zlTBx#y@(}wbG_Wlt3rvfyX%e<<5}j%c{LlKoGf5kczxmXIB26h;^l?u?<1pSb)Ps= z=yal2$$SPKnRt6Pn9R!eJcjkquZP8L%E)F})T+o~sa1eN%qKFi)zu2`bNaGVRN6l? zKK|%Hr`==w(!ppnZ2JdGVh$y%tMj#S z10({|(xUJX71H7=%n}l2YM;C7n0|mF{$A(>BnJTO^Y6)2(_> zKsfpQAJD3?jxyT))guhe0d_Q&Uj(uZ2M_yA}g(-2@n4vOV_^= z$6%ig=~C*4eX>O@r+65s^pq95XZ8rJ^+}!%O!(LSU3QkiLPUc zkGHfeBtqt&)!^Zsl> zkipe}yn5LFY^LVHwgzIow4^y+jj1vzFYnJjqfzMTt+S6at4x-+pR`(C!_;99{P0t6 zE_$bI%+;$B74k;)w6c*$|7e#xB!qCI%MN!H^67kHV2Da{Lo6S*p@SGpz|S?GZwO4B zV+SDcH)nnHCQZb`np2ku-r`OImTbPfQSI&Rv?f75ug@V9mU$P@oV5=@fDn)cgjcCX z6F)E~w+3Pjcha9Un*XS&zo>w-qrzm`y;=HJ*J3)-2j;xOG|SY{xqXNN5I<{YF?nD* zLIM2y8JmPJ34e0bdStD8_qaM=ZOcpkG&)|-uL*(B zFXttoeuV~a5BXEsTdpPpD+w@Ip<0@p#zW>J!aN)E7nt^7W&84t?HwGjPbE|e2>wSX z@6sB6mGu%3r3+2wN_d6UPGL|eM!u=ByKHh|Fs-31h2sIP8M4Z2tMh+4Z>8F-{vs)V z;5gg@h;CsA(I4acCnpGC<<~_bJb&GJ$uua=yQ99$#*f@;0emb(&r3f*!Bty55d*tc zP>9c{ZjfKObd?P0sklL6w$k~U`H(z?eHAUHM|y0Qinv?Lqhq>Y%h( zrkm2ZS9>1N0+^i9Zl4`2d^=!(ht%q$fg!nkq1j`U z(Q$y9wM-4_FW`Ig!3lljX$su^WD7h_&qn(_j{{mvU=D|ZT?35Q?HG|_X!au>LBLb) zjrRw@UYVlcKluP(sIQa6fJU6b;n8|;2PopXh8?Ii6uC=W*7Tq(PlJ2EC_ulSv0qYz zs8}j4s&RpR415={#f)UIEcj$2i3vv}TwrHeK8es9&V5yTJmmo#4+kJ#hslErsTKJ4! z;c#=#!LJaB-``RQ_ht(4tyY@1mU4S!`LYN1})X+j9t^pTkuMO|GzY*tTBz?&Ei)a$%iMlzftaZ9Z= z)>;_t^Il2r-%cepJ7q6Sg7Of1*sl(2AGP^Eti5$qRe#s+jiO>8h#(3Gh?KO1bSO%f zbc1w*w8RDr5$WzwO1it0+H`k!cQII<%AGua zMk&BMUJuz91Oh5$mP7{h3d;KzG##hoX^M%o{2S6BsLo7P3bY1eEm!xW60FgbCdHnx=4utN8!0Zcx*3 zpEm#N_pgts!n{!gy_Q3i{vpm+cMj&@f2@e`5SJvyKTI45dqCZrp#RIm=YPKj76XF3 z`}TZz{9nj+#SD@+P{u9e1R5(R-O&?*rRX{ykBdw#liQt_`Qp(TN3rW%vt6TV@xH|I zCF=Wo`8}gjrKz4QwSB12l#!_;AEdkEi@JEv%dp7*g1#`==N02c{iQBh7u^r}9ae`9 zGA?MW_7AgMwJ&cE5}QH1T2y%yJ%wlr)Qk>mg-##W(D!@)+Y4~7x=H!m+y4?@_}h)W zjgc#ZUr62vD36a@2pG`EiOA&Jm(am~fRVBwEuSJh{T4gM1!VOPtwa|SzW7Bi4V@}G zy}@{AjVb!TVhrr`u%-hSHL@e=kaUp0q;XLQ;FS1X1kL?tCDVB<*- zr3;9NXbLssV4JBfW=WQi%l{zjw9P>c?hGvo*F?A66F*?CC?vYyNWAmwGN#6b^c0JL zn(3r7!h!=QTB#i*5FulgYxtBBZ1Zei zK;whmTL8X+l>_C(_m-nf8iKug*0J6rdeMKn)QJ-G$&i(D$Nay@ajyi4i5RYOe^}8( z?NNcRp6A`U9U4azTuk?1MIq{yekR{ACiSTE3U;tpeBB*TymsW&mFhx0Kp*FkmUiok z8%e3THu}f7I1<3a3+Xk~@Ca%YvC8A7wP#$!L4x2@g|&LKd`@cq_B`79sa=x^D@b?K zg$57YL^QVc?R4HxlAtNjYKM(ShXsQo0dD}G5g?$gWuk6B&RyI92a4i?)5X!n0x!_t zE&Z7Q%%t+8HMZ5~^hz}*@sK*LnU00WA(_Za`&&-10zuA+r19sAIT&f38SVwD88E~8 zOMzCE#fY1ugLoFuBOI%+vIxeJ>*QQ}aCEZm8mFVH0ARj4gHuA^yo4;Po}!byG&ZV( zbq#+HwaFG3yeKHIrlM}GKZ$kbS2|VHc?G0`7c-z~Gys1sVT$XqGly6thR+2c2ULlxVwOAfn2D>6pe?z~3W08u5blh0eU73u*;;Fj*)0$V5U; zE`MYoif|yK9b$77&U+F4I09&d<+*?#-{xySNfI8P;a=+Z?UTWOdPP+7{%CR6d^W8# z*RF^F(YMTc;}KX*5+GYk0|Qk6z%QHb#e2ZkxB2Hp0qDt9l`rE8?<^{6!`W^|35fY? z(b3Iu+&b5QII>v|6A)_>gUg75m*qAZTmpiz5}wycsYNkk&Z=^UcdJoCg)3v>x(h-P zEDq23FnkwuM4wT5KcsYIWK~_IB_1hG5LrBc^w0Mcn`B3RH>E8v`Xe$gc<1c}rkms< z|La>YQcJFomtIccpp|^y$TQd%Twzm0aG{}CG0F%~F5!M37dMg*akU^t=G|DID%uT2dV z+-20LrYhnv?_$Cv5{TXIU3{mn-<0j!x;&bQ8|}a;!EB@HW?8ps8@_WoW`IYd5wPF7 z(3PY7uz17f3d;r&T8-_)$O^l=dDhl#M;3U!)PDL~znkSMMov=nw|~*cb9^x=z_&e1 z5>TX7e0N+)pk~zX>+7>LT7Wx#au?;@V~B=9an*&ecqkO1P|If*VXd%H|z*Y)+E)`q6U}) zVy$CwQ#!Q-nRlPY>?EA~!RIHI+<=;)mB+?MFI-ZC1lNP?3D$ zCUZo65(O-@Px?(($t?&CCwVm9+fIVX zI|ek$DQwsz{9(%fKw}V49&uQ(zsOKD-0Ql+d)NP6bGj57M0Ge1&aWOOo5?=IlZ@vK z0yy7O*7+6{W==D+j8R{{_zMd_v^qp!<3;uL4Q~| zzPZE4PfiTdVdlI%6uiexm6jll`u}c)WUZbX&yc`?(J~EwO)x_m)KokS&vqNm#|EJh zd@(-fXY+6Pycgic=$T`=zU&NH-Mxy4a5(HWfw=}|Qi0l9axrn~fpVGUgL2|&uu`JQ z)RC7upX2vuCW$V=M-#_zInsQL7*YX-`3E2*n4_9u`k*OftB`zLkRqC%D)a|$ zns~DYxN^AMkJJ0KUQS6>A{50$zypYsIgzjWaWH7hv&0YCf|sxN?DQ;k=ETy=PR8}* z6Q2_*kfILBsXrXAyx88p^_bJu=e7YupIZL}ho-w_Yng;H*OIjlB!P_DRerq_uUDdt zjK>!=;mcm1Iudi=+uwU8yEYpXqsQ;Y>qICGgU2!s$;{T3DmpDFcMjWmlEEAI8v;~E zvNt!hCf*1Op}+4N^{>5t2R1H}CyR~ylkM%ZoIvPc_ZNlZhL2$+K8({GnO%3mx0);f zOlW(ci*{ke)RW>-l=&dk$FC#?u9~3keK5+v``Pwf#t5H>KTd_zGuO$J6)x~JI6b~0MbvQ{8cq(`0PG+`N438C*ORQ3J4O6zBgRAp-@e^A8_TAI)Q60oHwbVitNU;{rnWXWPwxTUC{xZCKqE#a=%3LoM^IwX`C-*wUDJTPeyKp^<09D#a zF$Iz2Tg*&!enwf&%?)W;*vkF;_kr|~ozpvB{v~%iE92nf9`34fRL0`A)IGISUZ9s{ zXh8pPMxj71>%PC>+vt=FR#rhvD4SzjG4;sF_w4Mu`}>n6m+wCd70){Cn(GV? zZzxFJra!qZG5FgM2~F^->p24TGjcq!?s_L^mV8oqk=_|_QT1r71f%MPKNa{yiIcG) zJV1hrwkS(Lt;T}G1>32oVzragO0xmvJ_5G@TD*X$lkGafCtP153)e*5%SB^T*a;>w z^>i~&o(BvX6w9EY{H(vsnY%8BYL@%rzu8RhyjbZ^?})89bRxt-ZGFfwB6GUcmQJuX`+ zkkzJXBZK)W9^(v$GmOBZpdH zd>Z4+VI_og=BP+JN9Kf^r_i^grpIWxFqXQXCiF+=hN0m#CNQ#|O- z(@QIjwE`*6r@}4QxTeS$NWFZ|_q+wmgBrZ^!P90rS=Fh3di|@2Ff-sf?%~3#P!NWQ zRK5(NQcjk0V!VD$4m|Vd&W?KEQrWo&3xfIaN~;j6&np{Sh?^2^C?1n(HvUg;oD;C9 zTa7XUPW!1h8jsd*ZaY5mf=zcmuI58S%iYmqgC z!_8M@PT~_mH8cTllI=tEK8}9clVb_6^|#DY%OoR7ud0L$RMKPsP6gwts{^7Ca!Ezn zP@`4phcpCdW4@a4yA<>>x93}oLqY*`&n~W+s?@NnnptMcB3t>F}rtyibxl5_@S}Q7!s*7gQ?XCyOU!B)*p2t;Ku6BndPn zA*y?Iuz+=awD1W?ryB zZZ{2OW@b-8tzo&Q&#+s=l9DKZzyXL;S?SOAij1TIIkD@fg@n`Z8y2S_5B@hVY!bD@ z@6qDXP}oVke!CH)Y{4U?SI(Us!VFC}Ca?hyc|r)2OjHT_(GEWqezcN+%_|GO18v1T z4Fb322^>gfQMB{7_UUxt=B}CMB(fewPNO(1zQVy4nJMXkjcez5)&c3xFO%65U>|;Y zfjAJ}rMPc0?&O-oI{5eS?y3%$n!R)v+9KH0R((vBjET^P2?n_++2~^$C;J=zyd))0 z^w<7gWNl}k=&E`LGRtJ}yx`FWfH`Q=3>srrK-&KE-6vNN#M1yS!bbk)4MM{qQOXe6 z3;`4bc)I-{dJ?QKNS z^6PizW-FYFKDM2T5?Sc6!@h{kL<&&27JSJzi!6F)H`RCMIw-AfpvlYQc92YVx}G*; zlJBBd{It2+?kg7yl4W)9yO%>KpC$Zn%sXb#~8-8G+_S~`Y z&B@_PEvy(_;EAH4x~L0{S}q9RT3B~cV$AK_OA`Z@GUB>V;nKV!HP;+_=aM}8$hrI- z9OH(FwCH}a1U~ZLEU##swihg{3ycOy7TSzQrPB+A1mMqx@rrWy@Rwp6`IA2R)A^;C zA&Y>|DWxyF{Cq=%Ysxw#%M9Q8IE3e4CSoU*;w+64-$Z`5Obz4CdHD^DG~Uo=828Pms5(mY8E*XN`C_>kF}czm+1BZBv5*2Q^AZ zCgZRoI_{70`uC=Iya3@gSuOMjn3b0MW8nRtL+KSNm|H2G-Z6#UgkFA*RzI-FoDsdT z?D8aj2-QOQ+VrmOr0WUg%X?ql{o7I{|3y+?HR1n1as*#u5ZjDMuHp+cdDq-dmTQK! zd1-n1AC3W^bzy}X-gP@p*Dy}N0^50xrrqH}st_J==(xOD!176?Q)9u;ZJ>H$x zyFJ$`0og;P+qn|SiDD>?W)N)VKzDO~$1AMEXkyLHU~2i8 zRiP2V?{X`vVvibxy6dc|?~IMnJ~{;o(nqq!_G-DHNEZ0#rjVqB=+7-`Z=x*8D%n1L zh7jz5y%uRXBbr7}4x0KHue%R;A;AoYUPI3KVcqsmx-7!Clsl|{sKmC4?G7J=5+UNK zAoKB970&KckN4x%VSvrl*v)?BF}%zoRD^`Y8#0!!9wIhi`iC@AOj_)Uf&@1NAhjl~ zv?zGDx?DR|&Br#9`)?+`#A>besI|$WPk=@>xShU3)dQe2(8gxV^%zi20lDM+wTZ%* zv9dOlO%hg?vttF;Rj}sG0I&utFp66*NGT%jzAaI@i?ue<1cubo8J7qkFz@u=1?UL; zFY|NKx{IAj$vEFrA1P=FdYK4OMgjU}k*_krL#JI|u7L zKA3k^A&i9>)9@&PKQqFr^DwJ?s=mnKv^tUdOX z${RdyCCeua48DNKj9OPb`b_d!~O(!K(_Y-0Q9Vsh{e_IqExyXYx; zyuVGYJu#+`rV>~B^(*G--})hyL`~QRBner+HXrPkIiIt`<}v%X?w;=>)aixPGs<0` ziiiA=l=oVK!nW>5)8W70y;$FmxO`8Xa5Hy!-w0?D>J~rX-EV=k6Sbj(Yd66{!tC<~ z-;<>a^fW1p0gH)-(+CwbzxX{7Z5jXj4GOK#P{;o!UEYJu2m4M%0SZi-!hy<_@mk^cNJof^uWQ%YJJW1u3|LN6K=%OavzJe;K9x z3NOlx!m%_e+@fKYeRsxhkN@kRT#SY);$U~-X~$KU6qgeF?RoWXxXm^>4tk$F=M(UA(_|cVqNRJ5LOk^$I4FR`t^-TLVTlcBmx; zI+7^6;=;s+q#G){6btfDRZBaAZs4mB1b5l<=WiLvnORt_z3X&y4C}m%J+U|4IoVfl z38iU|X~jG z5HAkQ)$70?dW@K0fu7M;NOzn0F$1$ z?0*v7Q3j^}QqqoOP7Mw7Gn8nt|I{I6(1xllZ$W*KYQ8gW>?x+fMSjuBGz_=J{pgZH z6CEkgTmwU5+J2H#v*{L!NlJ!16vO1F2?iXrdJxaS0}iY%O6v^1Le zr3#mvbIa5@vg0Yl(vs(TWcbMvT{(-$R76rzQbJ-M@7mqf!N&ar>Ok3UG{CQqlj*7W z`LBe3At_wt4*=vRSD^Ob$*vo!lp{S<;PQWduZutmbs6RGYCdje*SDl$ozZ`P@~NYt zvdeOiu9w6XYHF-df_AdEL}7M4=CDk@T;G~j`56+t>S?^%6TE=@f#Ru3 z7|%m}q+EuuqO<+_$22cyRF!LEQa4QhFvAb=-$cO9agUgo5=dJadey*x7kVhM;xn z=Xsi90U-u9X_jSLt-;Xz>|>XiTpa?xY|F9g)6~9i|5i+gi<2gv&$^0{gIk?BUKtEEPNl9bvG%PCZ*yO| zp`p(2v}e)5zalA0RFT`o&S%xxG17RCGnr>fg*Q{NHg!CEwH6r8OATH60xpXjCv{{W zTcIIq_Na#L@f=Jv7-tT-cxmd<%YLuY73zcb33n-rpS@%HPJHJP{UaaZieJBUF_P|_ zU6kfd5Nmcna^GBZat(@&WZ)>^spR0P81w}11*^`AMp2L8O|p7-kvC1qyLh+As02t6=}ojO!nSx zT<5R1T>3Eosp`!^U85QOzn(&Qo|@`?6P`Xv8_D>z-hH%YXDSh1i+Y6RR=&qSzc%UL z*Z;5Q2R2hQ;s5jBr@>+Y45&{bdqWlcL>=`4!S9k(uZsWc#gUSq&Hp(FGM30|!~eWO zQ2+n+8}2{j8TfB6!2iEDU%RAjVrP9Zzad0wqq@-5A=j6!^QH5X#Yl6c=}zgi#@28r zGd9N$Jlfx}=d#5XDzA{m428j$ieCG%eCkT;nK^=W&P7`ztLd>ZX{HJplCe>fSC)A$ zgM#Ds`woL6QGO@$$vf!i=VR05bn0ZDQb|Oy@`vE~d1OAD1?+iJ82c$a`R^p}L zQkN`x-x&5aH``tONjz5lKB&r)F(TTin{g+8md*L5x1o$um}5n@Y^zkdW!4ItnTo$5 zv2#zsrKn)tg!M_2w2gjeiY8mHJ~OMq$s3H059!lEp_Sk ztaykhwZ3?S+!CC0Q2m73R;x&K&34bf$LuWeiPv60lPJH+rNmQjE2UU;t+I4oV-z z_&J^KF!IJg;?}bv;FYV7X{k*3dWo};}nM6Mg+BkRudcVEeKv}%&yT~tC|DN-?{tn;VID~5kj=D=K)MmF<#-Ho$0 z%fWKHl@|e!{24#IOs5#UXjQW6Qn}FJA9SlFf11``nCM`Wa`bp~VygJdycs)f>#bY2 z{w!w1x9yxr-L!fwSQK1C(5(5-ai9JoA71Xy(o^??{v?gZdNEsLwT_B(R{}<9AJRRP zT-;fHt+B&b|7$q7*>qb6&m7Lg<8Q_{HtR6X+J319v-R}7urhCjA#?Sta%dY#`vb3d zplNb-LC}-E-TD+kGl5ZTV{@sr=4>y&Gx_c74m(9i59Ns~b_)Lgdu z%A@x=F^h}>G-Xx>k4fCEWE!zZKSB)>*6X$Apa#sh<0&LBhWtEOV>zeGJmfJ-Sl!FX z8ykgN9NG#Z^7J?GvSYZ~w5boLpV!9?4IPSC7t=my&6}|23D3T<1w|$uF*Sb<_%P7= z8II_TuzHhTX=1GneLVb>^>{2Vu)HYU%)CzLJD-+|W|_mmGx%YmudYrmkjyS`r1^x@ zsM3L2Raw(c5_1{{hu3W<1VV|fv_UjD)sI*+YvfW~hvm#QiqPPw8RNMB%y7v+XJ)2S zSGr?)W*_rQ&4Ls03w<|5s!LSD@6)F%!Hrn6pF7>os`w%W#&LGtM<}zL#naANS=Rq_ zb=^y4e!b089lp9)xiwafb*E^zV!=_7t8x`PJAPNZM|kBFqRaW9O)@pMv`&(e7e^!$ z&D9KMX>xfna@7C@)lUj^OV4%RX?MhL zO|3+d)5o5g<&#gPdHMNGw~yYN*Vdg%*Az%AGO!t8v#N(T*WgEdXVt2J`7F_Frjmod zs?=tbi(sleD7RUea?sEWd;9yHTe75D{5rgRqFRyIY(pa~Q;Rp++nr=?XSvRNH1}zP ziGkCu%5i6rHg1?xdVkh|g=C`w+Xb3>i?j3D0J8ojw zK-K#V|2Roe<45epS$TODvHElNe_0-Cu$SAmowC7WktOx24O5<`^2nSAY6Hs_zl=ervH;%dMTq#&5F|yo|>=>l>k$g;gz6ojIN| zW5Bj;RGFOV1xWIls++>Qjm1k#OK7mj_)T(HBx`vyvY8HksU0|8?mott`1W;X*2Ry# zorq?2b!DZeP=}8fn^d_+js=Fv?S)PWZ)t?_ST+U#3d!iDgt=5DnPrp9LQc%Q*;7-+ zTq15iX9gZtv%j|mU)P14#e)xJ>KQfdphfe5=4nu2U^%^Eik=xr5 zyT4S$xAM#{6xd5GQ^l*43O7c=*Ilsgo$}8!nXdG33kWDxC`m011cEHy`bC?0R%^IrinYfdt+0zNsRT*PB3U^f1ZNyW`qe zd0oghdB|BI|0wiTD*Z6ejfVU9#_pWz^P*^nBRrg;x5r6(>3W2&-yy3F(J$^O7#8*^_ib9TpE|C}MfZj7 zJkVc>X@G*BZ&MGMtfTlzqiG*J)BF{2VAzwqi=D-}?)Ygu&J)VH=FU7MN-ZWcG=1Ql zz8BcSLGzF2ov%&KPCCJiw=JMa^*wMEqUJm$)`wezQQs46${xu8~C&i8Vh#zA|`wejWW zrz_WY-Ak)njv_d)Nd?Fb&RyW{7N7G1$((G|uh5jJK7}GBjj#@#%jsEg3jIt<9gIEw z6k)_H@5ci@zEY)6aY%6f!c{`$cFE#+*WYzskQbVCtEiU1dIk!K^~svHxS9>--v07< z6}h}2)6=8lI}??6b-Z@D)z~c(m}{ez_z?6EaX34y|Cv+0Q|7vU11QmSVSJ5nc zvcoAdW@ct{yGgISK-u(?sX_Di)GREwKU!2A?y^&SrP^ObOMsSBaC1d?8t)yqzt-`+ zD;X)YMZ3H5XG3YkW*io%b69!D|6MBb)fuD40ApBsyo=q;Ogu)Ydrf=9Z_PJ>fyKP; z)A!-RQLwXzeN=Zu4LZo#Wp^fP+&gC!SHJuFW4xPu#Y7vzkUW>VKMaap2-7%--StQ$ zE(y*nW8+66GBM%@C)t+rkxvJ%zmH+}hm>V^&g8kfc6Ev-y&{LzxIz03M^u-sp^En} zU#wKaIK(2|rCMrc{b;92l(rwd96Gk0G;sKGWl^tRe7^K_iVO}2ki|vaTz;EZXecGx zI8RZ-Y7&zcHNwlsr}i*LfWLatcsS{k=_~{>w}K`}FTx)%=(eZZM;8UtC?(x1*}QIg zmIp(NVoT>9e4pvY^$OGEUS#<@{_M%htU!lFw}eKP-*6Y$z(84u!}>*AC1DtJtN8u+ zp=8;<&>BpH;N!b$i8!k4?q-I~Q$cm$U}c}k8T*ltM}G41L>U7$U&(WqZt>#viJTCp zM@eO!OA(I@;=w1dx7r^nTwKKb;sqHQ*%iovFz+f_d5EU9-$BY8COaQ3-F+0o5F-7wDC$`AM$j^_Hk1Db0ij-q;_UO(`Q7Y?d0S{|nPTQ8hlU#CFp zxY#e*xirxvl8NWTU`dVdcblfoWQ`do>Qd4m+g=c21S&Lf!d(P%IJsJ@*`*p9nq}`!6cQ@h%tN_6w}wy zDf2TCeOqmC_S8;VM-1wNHGIdcaqu1O?ZOB!-eX}Q7X5_NYCkchd zq%vv<>?Ak-6V1}LHJaJnG>t2l-pWfo)h{?KC&-Q(Bwi|du5wuEb^KCPGrLVzpL)8I z;ys4#Dq6-uSrmM$)IJ<`0+Y5#Hr5w^Vfq>D9czAg6T}soHZJY{Xzy!KgJLh{{RhR2 z33)L%*4EZb%Wf02h#mR}C^Gz!(N56U+nfBdx{~yE^7Kv-QKdh^Kh!{aJyX9wQ!5l! zLOS=kJL(T#DzDq7^ci|BFlsf3B9}3XH-(&v)R&fZK)hl?xG5|sDAQ|41q8f3_&_3i zRd5{x8n=`DGO2S`c&1JWOYj-vZ{afe-DgWQFxwTfG_-i=#`%-azr^v+A~YV)i-&i0 zoEWd{LnADSvL4D0M@t|sD=4t3JG%6gn`yU%(+GiSFtpPB^;F^$@zB1QljMu7shW8R zHXsg2y*311Ac75QmXl$C_*>h2BG{+XV^yT0r%LUG-tRB}CQ=}DfB77Eq#bkQ_!geT z6Y7jWc)%WE*VVviKo(QE{>^? zW~*59Y#}Y;LBUDzz&d5f$+^&6NOfT#_dJ_~*DAdZwl=kXq@ydzY~NUfK|~ z0PjvQ#|UFnT9ME}HpFV0i}SP0+ejI@dwq$7+cZS8C%BDAjWkr3CZzrabw5laj4Llj^F(+8&Y`F4#Y=Q_qQ=v5YKmwwh5Ka>iGWfGdh5Gpand0=&=L~E8?X&TiRI!Q!u znP7@IT2VpdF@EZwyO|K~z$|n(S{(DJ3`4ab3YtZJi@y|dzWYc>Qc^NM$D)@V5}n;t zo}H3Tx40WM?-s0DUn~T{yw92Z`rG1q%wUDCdg=}7M9=5eCsu?`UNH~buPG#EVw3PK zY%!A#T;zpr-Rwsit7)XY!l$qtUAYq8=Q!Wk+2>6J6#pJf!8*7Q^ zy-ehhP|B7+cig}OVAGhPY&BH9SXa4U2;hQ%84d+k7^~J|T~1QUr_6qlpKs06$XNU% zcew8csB}$6TWm`FI;FI4w_0W@IUR_D89-2XZ?x?}?t z&H1<%*Fwxi$oIw`tJh#Zs0x+f!EKUWU(Vff3lT12#c4qHP13|aeke2 zvj9o$Rp!uq^S!OBP)Cy&%lUlr`p`;`^D~w2R+$8N9g!xVT>~CzXR@vnjsb ziJEzGk22wzXrKby14%LAAr3!g`J?r-!|E2ax5pA{Jc zobYtG_!%1mzU#8C6esfaImzv^)pFsYmcF#(Sce^VrGKd9>GY=znXH;hr_7@~Tb}hf znO`}n$Z>Ceyr$G+@7T2Cn8l$%imYAPijBv_H(2XT3YF5BkN}2Yu9#Azi*+`1zN)Hb zNwiXiJD&i(9Gn7r$&XQNefUcz|I$!~AXW1$vCwiN;(o(zGiq;{zG{0`XZzKJzymmz zaw&rqw>o!GfualW(Z2*d7CJvS@~i;ig-AmAIW*386C7C3q6g@EIQaow{#LH|mYqCTx_NwK1SFd6N z$nG-pW7-cx5~*!)ALv^_fOJQ zH)va%i)0N?@1GvUP;p~YLBTq#ZGTQnIoH<|5UY!`sn67g2v@Hjv-R*BArKuFcgWrt z9s@vx47bvWs5ZKU4B`qIef^O9$0RsELo$vv6|pu?z5vbQEY%~oH&av|y$u~L@Hf%b z%WM{&XERE`8>%(S*VvEeYB4A=Mo6D?PukYn-dU9S@NB-%e!c6P9*HHCMQsBg#w6Wh zO;B?m|8WdqiN~OpvNZ9SUq>bKGxGzlJdiIJq%074R8Qm+h1(9>xobkdbpfwe{z@qN9FCs~a zbi|xi`A^-sW3naD@W4RRWwt4$gQX4CpUyk*ZpURJMuyUaQZR>n2qs8@`@wKQ7fZc0 zq`=teC!mBgwb($AGw$=a4}09bT7fcbvnz$mvWBVQ^pBGC#^evp982+P_WjZI6K7{m zUxF6Z96k+!#fG1;?x^{e^+EwPipy2Wi?g*m(!Pvx0rG?$ygN-(0(CZle$F18%Iz$+ zCT2pf+mFE1p&y{c$M}cp0}P1}xrn=oF9!WPX{0x7aZc;zR~}@HM}Dm41BTynj7vfv zFW`$>`n1@BgHKCPVDIE$?N?@wTPxsC@zo=7e5TssyL4qJetuZio0-P|ak+SPdC0*( zh!`$mDIimKl99k9P2z7uvqgiU03c_I1{G&3ZS5Yl{r>AfAG2J4tCJyyyEOK=mzbHI zU2e2Cm8dU=dQv&($9R|Z8zCVxqf{}M6A|GRMh1&04qg9ILdJOhdN_x0sgvg-Bcp79 zyhpM9Zv8||w8fwMLagRD%#81!5M1uHUowpRa_u&99uW}G9-D}*^NN{WCQIPy?M4ad z7d=N#j^e@vvRP<~ORAO&mJ={BG;O&ae~xOnx=y5ge`--EGN>WgoTrF?%wYMkFxHCa zVzGUU!1Slq9xj!Iw(LyxEO8+R3$1qGmB*`d{LnD#)2EAv#P0V6T@$NY;^tDbi63#c zcp-tC=%p5e@y8=dY6O><_%&n)sAc~OIrYv~H?G^-m|s!rVt1t;)2~FmLJpzf9!di9 z_~1a?6r8h}WCwPkJL;@%^=RdXM2%H{L{uI&i6|94Db>na0etD7vhH%9l++*c7YHRj zSARjGZEa|BPNa4++y1qA`jkA9&F~qn2=-sg-=-(tb@zCxbCj-E{G9y&@qbXmkNbp# zDdwaJHXiwHF>K$UyT;D5r8HrZKi53}@;c#5uBQ-p_YNk0lQM|oy>p}KE#hCeD)PBK zWA)-$np)oD4E*+AdYu;_F`~7`469bSGD;|A83oi)(6_aJxa9ZS&mL`#=fFlHq<4{F znuMd0A*><}5E*oiHDoNYc0sPaoBRHN0*+L*YC?*J!}&KK-8H~kl#2! zsVjv`eV!2!k5Xjp-i^G$FsLBVQLnhM$fWVh8hYP=pj5I-$XlG*;5NkBac&<7eZXhR z?1`ymV&^BmcoMEk$6ToATZD{kFE20W+x*3Jl|I!GFb7O#q&G0foU~`QMzfBdpq-QL z6UX^w*IoOkAZP??Ro_t=MFZX7l~Tg@-s>(0yL-d7Y8+PepChFe3M{gGsIb=#anVJj z^!w@w;NS{OicCk4QFk|1DvpgcM@v%lD)8;jou2D#))p18(kI%7he6x188*EuU`$H< z5GZIqo_m#4TOeDb<_akLx2nn=6C^fY0l7+m9F6c?_kXcf8!)Csy~sEC7K|R}>2J19 zsGRsmp#9!R@6gKq{2J-n6v#(sAQAcm$e;m&?CX(= zwjBjel~Sqs9GppDH@V#i>PBJVmMqcJiE-6pL-H#eo6!2?Q>(Beh&#{#LNzPvH(pb? zXI`+8?RJZO9KTC;tS_`IDtC5Ko4?3GmXo^{vCr$$}64+%vO^4OJdPWR zzaS0-2KI!F%_ossn&yg~@JgafYVn8IJrqm>@^uuqi$oqiW{74xqOKu!*Dh}yky5|q zcJX=CkrW1b;DA!lV3oW&qel6UQ!MNW50Uq~9egRB>MbARU5rCUs~11!x5ENrGu@*| z8$y>QOT`5(m4Msd!zYn`qfg;}j)(*p2<@|g0DYfYWI}@s?LG>uvX|5CJ2b6QfbIR7 z!g^nYi%3d`YFiZs_N_ZE$Z{!=KLr9h1PbMf(-4dVORK%8C$wq3+1h=G+OQ$#030-x zC|s+ntE*aJLWH(iOTNXmj!e!Nq(fbkeYG>0!vWQ%W6Mp6><;$hDFi&{$Bkn^r=2oZO;wsCbQYm9*FLd%dK z>XOi)P515FfFQ4Y_wku&vL^N27ZB>bVIR4{M!0An?R322>u?~_+*Xdx`5%yK#!28C zI!*R%Mh$!9CcGH)F6Ofc?S7_<|3qq)wE2WgVyV64MlVxEGvfQYp_k~ym&g1IQeDAD zVppdMPqrc=RFtyDF;P*@0==40o%4&l{I*-aPX?DFpgu+S1OD0PS^m^edyjiF^7_2@ zkFNHKECYRj_8(8ZBUc6twtsm%ND^d(bocl69(~DTJUVVwKyN^e%1Q^;xX}S? zfa63Oj-V;{p%7nkW0paGUIc9`1Rp&$R@muEw4ShE3xE6eh#<|<_F+>v#_QMUFwNvz zGJ5;_b=rf5WB4vPfR&pV(Ji1!z2!thdw5su%_{{4>qe(-daRA1rj)FTp`y(I8%csR z@Z|mI$~QrGGwy#Q*4y1rxi`-9^2Jj-$|uJ!1sEEB;LVKOZSQp2KarxRZ-Xz}49!*0 zZo1+n$x^Y%74XaFBRbtohZGi)7L|%OMv(B%AGTTM1J|f!6v@xgy1UcMoe9sTC6pBG z*r3nIA5VvJx82tj=+G-mV)pNwb=x#BJHp~+J2qP<%J=afv?_Wap=k>1v5+|=cet?s z1(}o6uGCqlQfAH4>1%!*J-q7Wb^IPVdrr?QmZoBIbLf+BN!{#s&(81H>;g z4DT)jVFQI3{ZIKzH!P>vzGu77MGO4k25lkSv?xZ)VP!TqS$2qaXP2JPq*-j0_tss- zeeAULOZlXJnX579t5)k2Le3}e_g7Z{u|Q869nI$go!Zs9dr7Ki?Bju?JVgdyMzN$X zoWj0-^}is~C;R%=HT0E3pTH|wn?1YzN6&4ZqQG!$XeJQk^&|?VtkJfEs#BBzH#W#< zuKTp5{sB^wx(WY7`&U5GOe5zfh3A5at2)V=yBqKRog-6^D zx08Q7Ot$J|d^|qe@(zRAwG;7ZTP}ReZAR`xS9{k>`!%oiP|?$YnuD?sm5IjUyEuXA zG?ejA%WT*67LNo+kg17@uLVCZ986N%VlD?B2~lxDhLWIr+yf24JwO2K>h7KnyS(Mg zLg2K;Ma#|Iz;hkOxtK7w5tEvi|0dUu2Q(;i!SQl9PD^Z>e`uurV5yr0^mg-u$WWs? zC5mKbCI3wZ9^sWLc4Ff1{)3eclc}~Xuhka4BGXnR-kY9Y;+gCRzsyG_GZyjlmX$4| znC}H--~Y~hFU1Dq?g{=;=GLTm;kdzK-1qd>TAecIA}r=F<0-Bv+o1Lx zz;8f06rJA7pMR=PNbUSU`cR~-r+IRs2J|Fv> zu!sGiQ7W=7zn|zRxzm4Sn3QtM`W{FDAq@M|uS7ng6bxmvje>HKS27^j|1_Q78Bx8w zy^adeuaaJuEzB(v{u4FeQc-jmNb({>*c?(ea2_REI8fz<%av5A2e449ahztz%s1rC=o=R`!1xdy2iHPVk>rOgQC z@w@ zNx~8H%Oi`qQ&$*JD|7^WHhTEDi!uAVudhMuD!Uu8z~{|$rP?vxJD|7y)XYc$x6;jj zE_BC<<`l%liJs@5%bf5b0jxU;B-OeV@pv7PgoF~kH2GZ~A79^R5duu$GC56>?cVw> zTD&%f1WU?q#qk?-tuesqqYQRaceb{J@lx?ol4esx^I1;?58S_FphF4z-3L%RGR|v* zlVe1PMZ*yl(0=PRwo#w&>3F(i@*K>Tl;H+guyI5_x4Eav!g*J3)KX^6*&!KdCcL@_ zPV~xPR+=WgD(t(pqRG7ZT0_?5(hT+v7my+%d#h@ove$IY_?Zkuen$s43Qj^mUSgqw)4^AfpXcK>Qe%9`CufN7!WY!Fs>)P0yWb$nTwD-fM9*>6$ zwo5v%G-9siRI8$Wj;~2Dx|A(68@^UEOJZ)Ph3azs{$ep~J(UIAJtfc=WpojZ`p~KY zra+l@Y>_vj(8)V?oA2-;3L_&V_sGE*RLKl zHKYMrJbYMrt-JTk!aHZrZeep5nsflAE%Z))RBd0I2N)aK-7L8_15OyRLu9EvRZ z|J2h_q%dI%lTJ}(U8J^wC{CTd(4BN=zPbHtnr%@*y-^>aCm0)Vf=S(aI!&U$PVY^VipV|Jg=*pm=R~lsz*+Zxnx|c}6>Tu-yaPI40EY`zY-D zKZ-lkcqscdj#E!co>I|cCpnX>O(Kz{9#IM*vM-M<+hoZ;wvtqg`NTw7i=x8VYC@VZ zmBD1!2rbGs8T(+Yajx4r=go7Tb6%V`$4g$gxBvaWuHWzbyKZcUY`v6l(~~|m-)W69 zA>IMf(=5^9) zJlf_$gJ-G=gu0mQ&k1jLVO?DNeF)`G?Qu!?ZzN5%a`@fvGia~84K6xcBy+vl;}&y@!-HUSG) z9me8HWExT5y%RPy)~g!A-u%s&RoQ^qK~4y*@Oy6ylS~SW`{7O@D9O-+=&;Ln4WM3C zDQ3sHxAL#3pwZ5qJ%0d5h6kPycZh2)BKfZA8ZC7N45@kB_PM5Un!f)cw_H_F%B;d z{7w#$1NaP)vy><7yoNqm5MvWorVs^>Dj~K(4mvr&oq^}w07N;E#;DWWy7|x^Pqq{_ zWj5T#j9Gn~nlS9TF(3Q<)7O84{u14E@NkQ=X8KCR?cm*5Y@?EiNNQJ{#p0IdKP;lE zMsS$BgP;EaTV7;upvfw%#I3y`0HMHv$_O1d?&4@4R#$&paCQqy7r>-q2c6t($*oJo zlXlC$`agj2Sv?DDyH3G(8@$`zjn0;1dhh0rpGHF!028TrVtu$@Zi`+^fiR~^*qj@n zDrMyu91i0H%QC-QBDSn7bd~I-FmD_5(Cn3@AgT2{zE$_&l1;PGXb))%s5JQ@mC3$+ zHGE9{N;JrQbeM;l3dIj%nYYj;!o~K`n+;v>uI}EvVvde+v<+hE4Tfl=;d3~k#GuxD zXVZ_hSjXZpV#_;4_11H-rT})JD88d9pa#}A@^*QC`eI^uUKPx#toc`UtEeJi@LGzu zC~#R1e%77lLR@0_ zyZOT``Cayv)ND`>iiFNvf~{_n&5?o50=z_j$lSoEA)c9e09LeLCZ7u_X<)T_!hC`h zDFK1^&t7D5!+AGk=@)^;a^PZ`#^Lslg`o?{M)zMMDn!`q(d($zG0)!T+&s(AoJhKV zZr5vQk;9vo*ys?pud-uxYuBZ=yK^7@E7BGcP%qgglST2r_2Y*y9IETonhZDwqNXqK zP#@HqEbkE!iJ#Jlf%?9q0w|A?*uM~hZiD@4i}8b3S{qT~o|cbvdg&KX5!JIevmbk) ze3Mo_$1Gc)4j_$N;1*%|o@f>CwPDrfAXgF;4XMdjo}cm#b7jYP)_YO-#yMI>fUJNt z_y)7$IN!1zd8@kJlz+4GJM1DjC@H}RmG}A=-lPoF6bx-NPva&!Qf|e^Yrtg-Ut{lm zusw;PZ(wkzzS%-X=`~&dIyS zNTdzs-Lqewd%Yrq+~>04d0|6A+N6FB#cJt=81?<7fO z>%}pu=KQx0jqN9tWZhX~k+=U70pvwEa&#H3_6zj>xxc(<103Z^T2YGiftf3xdPvgy zRm_V7Rf$fSa)UQq)q}+0c5~G++;17&Z#>927-8_pBAs>RPHKKpet4Xom6es3ii3kh zx8GM9JlLxAM{bOo7T^9?xsus2bx{-M7fVB38Jdin6cQm>-E1JB=;JFA)X^YaFFjts z)1&9+f{>-m(T?trFUdpjD7oB!uGxA0!bC(+w~y4SXN*j-MmLfK?ix_D(9@NlD#o#> z@5(~I*M`m8%4lm33=Fhi!1|lm)w3T%?dgtZ?uK7+GwfY3EH5Bk2nr6@67V`nmzm9X z90s{-!KQ&ugPz}TK1^_q0PEw~Mdi|=q7}03UYNlu$4!Ez00{!myJzj-06;*b2iBFm zA{?|mGsqVUqdMS5Jk~U~dwz3-dB`$P`0Bb5rFx@Fl^SU;Y&}>xtDl zTP7|fgwG+4%oKEUPM*)5(NRtge0fyes9v*$2*Pw z!HY`tG2vgnw+zLR^z}1@z_}%nQw9d#!>5ITCP-1o@3m2C7E$ZT@wHJRsC){UDm+^s zxY|=K0b7ThW$i)eTHd~ljDsLO?vuNuHUlcI!I&7-X{;%4L-PJJxn(QLI^gM zJWL|3r*51Mu7>K}#flqX!%@C~yl2tJfF93X&vDfczLD(d#W5%s{Ojh5@GU zXtavfU@=Ov6cvGSF6YEU)VrN%dErEG(x1AU4_~!X9P!t3OjlOC!CeA1u-PfbX@r`; z51O<+;DaD+jYulZf7F}nqo1b<-V{=q0^XJ{sm&hH=pRhzP`9 zfu5+dXXH>+O{MQw3!Li4q9jCi>=SeDt3@HwaL1QSjnV2Y0s^iaiB+`KQSeOB1y1v+uKP; zfqL*FaQpZEKt^mHi-|l0$o8eWGpBLYt?*U}9GleUU~C$0MNNVu@J-c~oI-IM*4!yE z>(TUC4%|5E@?MJBP;Q6$Lbl{DpKISj;3Rn>81*;Bq!znSg|UM4_cW!U#vB|aYA4#m zItKLmQFS-Pf&!ZOtUt3cr{xEWg^sjmQ3syzc8Rdh`K`WQm>FB#y{dVsd=G&VJ)8D* zvw>O3*)1j!HG{+7Z%0i@sX11rp8;&~WQg{Rb_E}Jh_-5&y0QR@{L+zVJILi?s>ZSR z03I$VnqVr2jIbGERV5B|jnXg2l0~z|v$r$niM8;tslpCDE@7=c1eiwB8C|DC4*Rf$ zhZCD&n}&8X(@bx?+TUCEh%D|8P?Y9d?f@Es&zU{6QM&6Qbcl+M)+&EjvBvXMvIdft zfLI395i@Md&X4O?S=!wK20QYabW0lrVA1JVo;pJ-JhNSzENPg)rC-q*VT~?{L~if4 znRUItN~+yYMZ#^7@opxhUF#T?l>c|s?SF~4adZa-UMHF}J#KQrkD: `, for example `channel: telegram`, `provider: kimi`, `tool: shell`): +- Contributor tier label (`trusted contributor|experienced contributor|principal contributor|distinguished contributor`, auto-managed/read-only; author merged PRs >=5/10/20/50): +- If any auto-label is incorrect, note requested correction: + +## Change Metadata + +- Change type (`bug|feature|refactor|docs|security|chore`): +- Primary scope (`runtime|provider|channel|memory|security|ci|docs|multi`): + +## Linked Issue + +- Closes # +- Related # +- Depends on # (if stacked) +- Supersedes # (if replacing older PR) + +## Supersede Attribution (required when `Supersedes #` is used) + +- Superseded PRs + authors (`# by @`, one per line): +- Integrated scope by source PR (what was materially carried forward): +- `Co-authored-by` trailers added for materially incorporated contributors? (`Yes/No`) +- If `No`, explain why (for example: inspiration-only, no direct code/design carry-over): +- Trailer format check (separate lines, no escaped `\n`): (`Pass/Fail`) + +## Validation Evidence (required) + +Commands and result summary: + +```bash +cargo fmt --all -- --check +cargo clippy --all-targets -- -D warnings +cargo test +``` + +- Evidence provided (test/log/trace/screenshot/perf): +- If any command is intentionally skipped, explain why: + +## Security Impact (required) + +- New permissions/capabilities? (`Yes/No`) +- New external network calls? (`Yes/No`) +- Secrets/tokens handling changed? (`Yes/No`) +- File system access scope changed? (`Yes/No`) +- If any `Yes`, describe risk and mitigation: + +## Privacy and Data Hygiene (required) + +- Data-hygiene status (`pass|needs-follow-up`): +- Redaction/anonymization notes: +- Neutral wording confirmation (use ZeroClaw/project-native labels if identity-like wording is needed): + +## Compatibility / Migration + +- Backward compatible? (`Yes/No`) +- Config/env changes? (`Yes/No`) +- Migration needed? (`Yes/No`) +- If yes, exact upgrade steps: + +## i18n Follow-Through (required when docs or user-facing wording changes) + +- i18n follow-through triggered? (`Yes/No`) +- If `Yes`, locale navigation parity updated in `README*`, `docs/README*`, and `docs/SUMMARY.md` for supported locales (`en`, `zh-CN`, `ja`, `ru`, `fr`, `vi`)? (`Yes/No`) +- If `Yes`, localized runtime-contract docs updated where equivalents exist (minimum for `fr`/`vi`: `commands-reference`, `config-reference`, `troubleshooting`)? (`Yes/No/N.A.`) +- If `Yes`, Vietnamese canonical docs under `docs/i18n/vi/**` synced and compatibility shims under `docs/*.vi.md` validated? (`Yes/No/N.A.`) +- If any `No`/`N.A.`, link follow-up issue/PR and explain scope decision: + +## Human Verification (required) + +What was personally validated beyond CI: + +- Verified scenarios: +- Edge cases checked: +- What was not verified: + +## Side Effects / Blast Radius (required) + +- Affected subsystems/workflows: +- Potential unintended effects: +- Guardrails/monitoring for early detection: + +## Agent Collaboration Notes (recommended) + +- Agent tools used (if any): +- Workflow/plan summary (if any): +- Verification focus: +- Confirmation: naming + architecture boundaries followed (`AGENTS.md` + `CONTRIBUTING.md`): + +## Rollback Plan (required) + +- Fast rollback command/path: +- Feature flags or config toggles (if any): +- Observable failure symptoms: + +## Risks and Mitigations + +List real risks in this PR (or write `None`). + +- Risk: + - Mitigation: diff --git a/third_party/zeroclaw/.github/workflows/README.md b/third_party/zeroclaw/.github/workflows/README.md new file mode 100644 index 0000000..9347bf3 --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/README.md @@ -0,0 +1,17 @@ +# Workflow Directory Layout + +GitHub Actions only loads workflow entry files from: + +- `.github/workflows/*.yml` +- `.github/workflows/*.yaml` + +Subdirectories are not valid locations for workflow entry files. + +Repository convention: + +1. Keep runnable workflow entry files at `.github/workflows/` root. +2. Keep cross-tooling/local CI scripts under `dev/` or `scripts/ci/` when used outside Actions. + +Workflow behavior documentation in this directory: + +- `.github/workflows/master-branch-flow.md` diff --git a/third_party/zeroclaw/.github/workflows/checks-on-pr.yml b/third_party/zeroclaw/.github/workflows/checks-on-pr.yml new file mode 100644 index 0000000..95c4638 --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/checks-on-pr.yml @@ -0,0 +1,175 @@ +name: Quality Gate + +on: + pull_request: + branches: [master] + +concurrency: + group: checks-${{ github.event.pull_request.number }} + cancel-in-progress: true + +permissions: + contents: read + +env: + CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + components: rustfmt, clippy + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + + - name: Ensure web/dist placeholder exists + run: mkdir -p web/dist && touch web/dist/.gitkeep + + - name: Check formatting + run: cargo fmt --all -- --check + + - name: Clippy + run: cargo clippy --all-targets -- -D warnings + + test: + name: Test + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + + - name: Ensure web/dist placeholder exists + run: mkdir -p web/dist && touch web/dist/.gitkeep + + - name: Install mold linker + run: | + sudo apt-get update -qq + sudo apt-get install -y mold + + - name: Install cargo-nextest + run: curl -LsSf https://get.nexte.st/latest/linux | tar zxf - -C ${CARGO_HOME:-~/.cargo}/bin + + - name: Run tests + run: cargo nextest run --locked + env: + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER: clang + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS: "-C link-arg=-fuse-ld=mold" + + build: + name: Build ${{ matrix.target }} + runs-on: ${{ matrix.os }} + timeout-minutes: 40 + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + - os: macos-14 + target: aarch64-apple-darwin + - os: windows-latest + target: x86_64-pc-windows-msvc + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + targets: ${{ matrix.target }} + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + if: runner.os != 'Windows' + + - name: Install mold linker + if: runner.os == 'Linux' + run: | + sudo apt-get update -qq + sudo apt-get install -y mold + + - name: Ensure web/dist placeholder exists + shell: bash + run: mkdir -p web/dist && touch web/dist/.gitkeep + + - name: Build release + shell: bash + run: cargo build --profile ci --locked --target ${{ matrix.target }} + env: + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER: clang + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS: "-C link-arg=-fuse-ld=mold" + + security: + name: Security Audit + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + + - name: Install cargo-audit + run: cargo install cargo-audit --locked + + - name: Install cargo-deny + run: cargo install cargo-deny --locked + + - name: Audit dependencies + run: cargo audit + + - name: Check licenses and sources + run: cargo deny check licenses sources + + check-32bit: + name: "Check (32-bit)" + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + targets: i686-unknown-linux-gnu + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + - name: Install 32-bit libs + run: sudo apt-get update && sudo apt-get install -y gcc-multilib + - name: Ensure web/dist placeholder exists + run: mkdir -p web/dist && touch web/dist/.gitkeep + - name: Cargo check (32-bit, no default features) + run: cargo check --target i686-unknown-linux-gnu --no-default-features + + # Composite status check — branch protection only needs to require this + # single job instead of tracking every matrix leg individually. + gate: + name: CI Required Gate + if: always() + needs: [lint, test, build, security, check-32bit] + runs-on: ubuntu-latest + steps: + - name: Check upstream job results + run: | + if [[ "${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}" == "true" ]]; then + echo "::error::One or more upstream jobs failed or were cancelled" + exit 1 + fi + + security-gate: + name: Security Required Gate + if: always() + needs: [security] + runs-on: ubuntu-latest + steps: + - name: Check security job result + run: | + if [[ "${{ needs.security.result }}" != "success" ]]; then + echo "::error::Security audit failed or was cancelled" + exit 1 + fi diff --git a/third_party/zeroclaw/.github/workflows/ci-run.yml b/third_party/zeroclaw/.github/workflows/ci-run.yml new file mode 100644 index 0000000..3a789b0 --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/ci-run.yml @@ -0,0 +1,210 @@ +name: CI + +on: + push: + branches: [master] + pull_request: + branches: [master] + +concurrency: + group: ci-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +permissions: + contents: read + +env: + CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + fetch-depth: 0 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + components: rustfmt, clippy + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + + - name: Ensure web/dist placeholder exists + run: mkdir -p web/dist && touch web/dist/.gitkeep + + - name: Check formatting + run: cargo fmt --all -- --check + + - name: Clippy + run: cargo clippy --all-targets -- -D warnings + + bench-compile: + name: Verify Benchmarks Compile + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + + - name: Ensure web/dist placeholder exists + run: mkdir -p web/dist && touch web/dist/.gitkeep + + - name: Verify benchmarks compile + run: cargo bench --no-run --locked + + lint-strict-delta: + name: Strict Delta Lint + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + fetch-depth: 0 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + components: clippy + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + + - name: Ensure web/dist placeholder exists + run: mkdir -p web/dist && touch web/dist/.gitkeep + + - name: Run strict delta lint gate + run: bash scripts/ci/rust_strict_delta_gate.sh + env: + BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }} + + test: + name: Test + runs-on: ubuntu-latest + timeout-minutes: 30 + needs: [lint] + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + + - name: Ensure web/dist placeholder exists + run: mkdir -p web/dist && touch web/dist/.gitkeep + + - name: Install mold linker + run: | + sudo apt-get update -qq + sudo apt-get install -y mold + + - name: Install cargo-nextest + run: curl -LsSf https://get.nexte.st/latest/linux | tar zxf - -C ${CARGO_HOME:-~/.cargo}/bin + + - name: Run tests + run: cargo nextest run --locked + env: + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER: clang + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS: "-C link-arg=-fuse-ld=mold" + + build: + name: Build ${{ matrix.target }} + runs-on: ${{ matrix.os }} + timeout-minutes: 40 + needs: [lint] + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + - os: macos-14 + target: aarch64-apple-darwin + - os: windows-latest + target: x86_64-pc-windows-msvc + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + targets: ${{ matrix.target }} + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + if: runner.os != 'Windows' + + - name: Install mold linker + if: runner.os == 'Linux' + run: | + sudo apt-get update -qq + sudo apt-get install -y mold + + - name: Ensure web/dist placeholder exists + shell: bash + run: mkdir -p web/dist && touch web/dist/.gitkeep + + - name: Build release + shell: bash + run: cargo build --profile ci --locked --target ${{ matrix.target }} + env: + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER: clang + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS: "-C link-arg=-fuse-ld=mold" + + check-all-features: + name: Check (all features) + runs-on: ubuntu-latest + timeout-minutes: 20 + needs: [lint] + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + fetch-depth: 0 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + + - name: Install system dependencies + run: sudo apt-get update -qq && sudo apt-get install -y libudev-dev + + - name: Ensure web/dist placeholder exists + run: mkdir -p web/dist && touch web/dist/.gitkeep + + - name: Check all features + run: cargo check --features ci-all --locked + + docs-quality: + name: Docs Quality + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + fetch-depth: 0 + - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4 + with: + node-version: 20 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + with: + python-version: "3.12" + + - name: Run docs quality gate + run: bash scripts/ci/docs_quality_gate.sh + env: + BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }} + + # Composite status check — branch protection requires this single job. + gate: + name: CI Required Gate + if: always() + needs: [lint, bench-compile, lint-strict-delta, test, build, docs-quality, check-all-features] + runs-on: ubuntu-latest + steps: + - name: Check upstream job results + env: + HAS_FAILURE: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }} + run: | + if [[ "$HAS_FAILURE" == "true" ]]; then + echo "::error::One or more upstream jobs failed or were cancelled" + exit 1 + fi diff --git a/third_party/zeroclaw/.github/workflows/cross-platform-build-manual.yml b/third_party/zeroclaw/.github/workflows/cross-platform-build-manual.yml new file mode 100644 index 0000000..e11b082 --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/cross-platform-build-manual.yml @@ -0,0 +1,82 @@ +name: Cross-Platform Build + +on: + workflow_dispatch: + +permissions: + contents: read + +env: + CARGO_TERM_COLOR: always + CARGO_INCREMENTAL: 0 + +jobs: + web: + name: Build Web Dashboard + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: web/package-lock.json + - name: Build web dashboard + run: cd web && npm ci && npm run build + - uses: actions/upload-artifact@v4 + with: + name: web-dist + path: web/dist/ + retention-days: 1 + + build: + name: Build ${{ matrix.target }} + needs: [web] + runs-on: ${{ matrix.os }} + timeout-minutes: 40 + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + target: aarch64-unknown-linux-gnu + cross_compiler: gcc-aarch64-linux-gnu + linker_env: CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER + linker: aarch64-linux-gnu-gcc + - os: ubuntu-latest + target: armv7-unknown-linux-gnueabihf + cross_compiler: gcc-arm-linux-gnueabihf + linker_env: CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER + linker: arm-linux-gnueabihf-gcc + - os: macos-15-intel + target: x86_64-apple-darwin + - os: windows-latest + target: x86_64-pc-windows-msvc + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + targets: ${{ matrix.target }} + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + if: runner.os != 'Windows' + + - uses: actions/download-artifact@v8 + with: + name: web-dist + path: web/dist/ + + - name: Install cross compiler + if: matrix.cross_compiler + run: | + sudo apt-get update -qq + sudo apt-get install -y ${{ matrix.cross_compiler }} + + - name: Build release + shell: bash + run: | + if [ -n "${{ matrix.linker_env || '' }}" ] && [ -n "${{ matrix.linker || '' }}" ]; then + export "${{ matrix.linker_env }}=${{ matrix.linker }}" + fi + cargo build --release --locked --features channel-matrix,channel-lark --target ${{ matrix.target }} diff --git a/third_party/zeroclaw/.github/workflows/discord-release.yml b/third_party/zeroclaw/.github/workflows/discord-release.yml new file mode 100644 index 0000000..c620a40 --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/discord-release.yml @@ -0,0 +1,145 @@ +name: Discord Release + +on: + workflow_call: + inputs: + release_tag: + description: "Stable release tag (e.g. v0.6.2)" + required: true + type: string + release_url: + description: "GitHub Release URL" + required: true + type: string + secrets: + DISCORD_WEBHOOK_URL: + required: false + workflow_dispatch: + inputs: + release_tag: + description: "Release tag (e.g. v0.6.2)" + required: true + type: string + release_url: + description: "GitHub Release URL" + required: true + type: string + +jobs: + discord: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + fetch-depth: 0 + + - name: Build Discord message + id: msg + shell: bash + env: + RELEASE_TAG: ${{ inputs.release_tag }} + RELEASE_URL: ${{ inputs.release_url }} + run: | + set -euo pipefail + + # Find previous stable tag + PREV_STABLE=$(git tag --sort=-creatordate \ + | grep -v "^${RELEASE_TAG}$" \ + | grep -vE '\-beta\.' \ + | head -1 || echo "") + + RANGE="${PREV_STABLE:+${PREV_STABLE}..}${RELEASE_TAG}" + + # Extract features + FEATURES=$(git log "$RANGE" --pretty=format:"%s" --no-merges \ + | grep -iE '^feat(\(|:)' \ + | sed 's/^feat(\([^)]*\)): /\1: /' \ + | sed 's/^feat: //' \ + | sed 's/ (#[0-9]*)$//' \ + | sort -uf || true) + + # Extract fixes + FIXES=$(git log "$RANGE" --pretty=format:"%s" --no-merges \ + | grep -iE '^fix(\(|:)' \ + | sed 's/^fix(\([^)]*\)): /\1: /' \ + | sed 's/^fix: //' \ + | sed 's/ (#[0-9]*)$//' \ + | sort -uf || true) + + FEAT_LIST="" + if [ -n "$FEATURES" ]; then + FEAT_LIST=$(echo "$FEATURES" | head -8 | while IFS= read -r line; do echo "🚀 ${line}"; done) + fi + + FIX_LIST="" + if [ -n "$FIXES" ]; then + FIX_LIST=$(echo "$FIXES" | head -5 | while IFS= read -r line; do echo "🔧 ${line}"; done) + fi + + BODY="" + if [ -n "$FEAT_LIST" ]; then + BODY="${FEAT_LIST}" + fi + if [ -n "$FIX_LIST" ]; then + [ -n "$BODY" ] && BODY="${BODY}\n" + BODY="${BODY}${FIX_LIST}" + fi + if [ -z "$BODY" ]; then + BODY="🚀 Incremental improvements and polish" + fi + + { + echo "body<> "$GITHUB_OUTPUT" + + - name: Post to Discord + shell: bash + env: + DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} + RELEASE_TAG: ${{ inputs.release_tag }} + RELEASE_URL: ${{ inputs.release_url }} + MSG_BODY: ${{ steps.msg.outputs.body }} + run: | + set -euo pipefail + + if [ -z "$DISCORD_WEBHOOK_URL" ]; then + echo "::warning::DISCORD_WEBHOOK_URL secret not configured — skipping" + exit 0 + fi + + # Build Discord embed payload + PAYLOAD=$(python3 -c " + import json, os + tag = os.environ['RELEASE_TAG'] + url = os.environ['RELEASE_URL'] + body = os.environ['MSG_BODY'] + + embed = { + 'title': f'ZeroClaw {tag} Released', + 'description': body + '\n\nZero overhead. Zero compromise. 100% Rust.', + 'url': url, + 'color': 0xF97316, + 'footer': {'text': 'ZeroClaw Release Bot'}, + } + + payload = { + 'username': 'ZeroClaw Releases', + 'embeds': [embed], + } + print(json.dumps(payload)) + ") + + HTTP_CODE=$(curl -s -o /tmp/discord_response.txt -w "%{http_code}" \ + -H "Content-Type: application/json" \ + -d "$PAYLOAD" \ + "$DISCORD_WEBHOOK_URL") + + if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ]; then + echo "Discord notification sent (HTTP $HTTP_CODE)" + else + echo "::error::Discord webhook failed (HTTP $HTTP_CODE)" + cat /tmp/discord_response.txt + exit 1 + fi diff --git a/third_party/zeroclaw/.github/workflows/master-branch-flow.md b/third_party/zeroclaw/.github/workflows/master-branch-flow.md new file mode 100644 index 0000000..395be2e --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/master-branch-flow.md @@ -0,0 +1,130 @@ +# Master Branch Delivery Flows + +This document explains what runs when code is proposed to `master` and released. + +Use this with: + +- [`docs/ci-map.md`](../../docs/contributing/ci-map.md) +- [`docs/pr-workflow.md`](../../docs/contributing/pr-workflow.md) +- [`docs/release-process.md`](../../docs/contributing/release-process.md) + +## Branching Model + +ZeroClaw uses a single default branch: `master`. All contributor PRs target `master` directly. There is no `dev` or promotion branch. + +Current maintainers with PR approval authority: `theonlyhennygod`, `JordanTheJet`, and `SimianAstronaut7`. + +## Active Workflows + +| File | Trigger | Purpose | +| --- | --- | --- | +| `checks-on-pr.yml` | `pull_request` → `master` | Lint + test + build + security audit on every PR | +| `cross-platform-build-manual.yml` | `workflow_dispatch` | Full platform build matrix (manual) | +| `release-beta-on-push.yml` | `push` → `master` | Beta release on every master commit | +| `release-stable-manual.yml` | `workflow_dispatch` | Stable release (manual, version-gated) | + +## Event Summary + +| Event | Workflows triggered | +| --- | --- | +| PR opened or updated against `master` | `checks-on-pr.yml` | +| Push to `master` (including after merge) | `release-beta-on-push.yml` | +| Manual dispatch | `cross-platform-build-manual.yml`, `release-stable-manual.yml` | + +## Step-By-Step + +### 1) PR → `master` + +1. Contributor opens or updates a PR against `master`. +2. `checks-on-pr.yml` starts: + - `lint` job: runs `cargo fmt --check` and `cargo clippy -D warnings`. + - `test` job: runs `cargo nextest run --locked` on `ubuntu-latest` with Rust 1.92.0 and mold linker. + - `build` job (matrix): compiles release binary on `x86_64-unknown-linux-gnu` and `aarch64-apple-darwin`. + - `security` job: runs `cargo audit` and `cargo deny check licenses sources`. + - Concurrency group cancels in-progress runs for the same PR on new pushes. +3. All jobs must pass before merge. +4. Maintainer (`theonlyhennygod`, `JordanTheJet`, or `SimianAstronaut7`) merges PR once checks and review policy are satisfied. +5. Merge emits a `push` event on `master` (see section 2). + +### 2) Push to `master` (including after merge) + +1. Commit reaches `master`. +2. `release-beta-on-push.yml` (Release Beta) starts: + - `version` job: computes beta tag as `v{cargo_version}-beta.{run_number}`. + - `build` job (matrix, 4 targets): `x86_64-linux`, `aarch64-linux`, `aarch64-darwin`, `x86_64-windows`. + - `publish` job: generates `SHA256SUMS`, creates a GitHub pre-release with all artifacts. Artifact retention: 7 days. + - `docker` job: builds multi-platform image (`linux/amd64,linux/arm64`) and pushes to `ghcr.io` with `:beta` and the versioned beta tag. +3. This runs on every push to `master` without filtering. Every merged PR produces a beta pre-release. + +### 3) Stable Release (manual) + +1. Maintainer runs `release-stable-manual.yml` via `workflow_dispatch` with a version input (e.g. `0.2.0`). +2. `validate` job checks: + - Input matches semver `X.Y.Z` format. + - `Cargo.toml` version matches input exactly. + - Tag `vX.Y.Z` does not already exist on the remote. +3. `build` job (matrix, same 4 targets as beta): compiles release binary. +4. `publish` job: generates `SHA256SUMS`, creates a stable GitHub Release (not pre-release). Artifact retention: 14 days. +5. `docker` job: pushes to `ghcr.io` with `:latest` and `:vX.Y.Z`. + +### 4) Full Platform Build (manual) + +1. Maintainer runs `cross-platform-build-manual.yml` via `workflow_dispatch`. +2. `build` job (matrix, 3 targets): `aarch64-linux-gnu`, `x86_64-darwin` (macOS 15 Intel), `x86_64-windows-msvc`. +3. Build-only, no tests, no publish. Used to verify cross-compilation on platforms not covered by `checks-on-pr.yml`. + +## Build Targets by Workflow + +| Target | `checks-on-pr.yml` | `cross-platform-build-manual.yml` | `release-beta-on-push.yml` | `release-stable-manual.yml` | +| --- | :---: | :---: | :---: | :---: | +| `x86_64-unknown-linux-gnu` | ✓ | | ✓ | ✓ | +| `aarch64-unknown-linux-gnu` | | ✓ | ✓ | ✓ | +| `aarch64-apple-darwin` | ✓ | | ✓ | ✓ | +| `x86_64-apple-darwin` | | ✓ | | | +| `x86_64-pc-windows-msvc` | ✓ | ✓ | ✓ | ✓ | + +## Mermaid Diagrams + +### PR to Master + +```mermaid +flowchart TD + A["PR opened or updated → master"] --> B["checks-on-pr.yml"] + B --> B0["lint: fmt + clippy"] + B --> B1["test: cargo nextest (ubuntu-latest)"] + B --> B2["build: x86_64-linux + aarch64-darwin"] + B --> B3["security: audit + deny"] + B0 & B1 & B2 & B3 --> C{"Checks pass?"} + C -->|No| D["PR stays open"] + C -->|Yes| E["Maintainer merges"] + E --> F["push event on master"] +``` + +### Beta Release (on every master push) + +```mermaid +flowchart TD + A["Push to master"] --> B["release-beta-on-push.yml"] + B --> B1["version: compute v{x.y.z}-beta.{N}"] + B1 --> B2["build: 4 targets"] + B2 --> B3["publish: GitHub pre-release + SHA256SUMS"] + B2 --> B4["docker: push ghcr.io :beta + versioned tag"] +``` + +### Stable Release (manual) + +```mermaid +flowchart TD + A["workflow_dispatch: version=X.Y.Z"] --> B["release-stable-manual.yml"] + B --> B1["validate: semver + Cargo.toml + tag uniqueness"] + B1 --> B2["build: 4 targets"] + B2 --> B3["publish: GitHub stable release + SHA256SUMS"] + B2 --> B4["docker: push ghcr.io :latest + :vX.Y.Z"] +``` + +## Quick Troubleshooting + +1. **Quality gate failing on PR**: check `lint` job for formatting/clippy issues; check `test` job for test failures; check `build` job for compile errors; check `security` job for audit/deny failures. +2. **Beta release not appearing**: confirm the push landed on `master` (not another branch); check `release-beta-on-push.yml` run status. +3. **Stable release failing at validate**: ensure `Cargo.toml` version matches the input version and the tag does not already exist. +4. **Full matrix build needed**: run `cross-platform-build-manual.yml` manually from the Actions tab. diff --git a/third_party/zeroclaw/.github/workflows/pr-path-labeler.yml b/third_party/zeroclaw/.github/workflows/pr-path-labeler.yml new file mode 100644 index 0000000..91da660 --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/pr-path-labeler.yml @@ -0,0 +1,19 @@ +name: PR Path Labeler + +on: + pull_request_target: + types: [opened, synchronize, reopened] + +permissions: + contents: read + pull-requests: write + +jobs: + label: + name: Apply path labels + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 # v5 + with: + sync-labels: true diff --git a/third_party/zeroclaw/.github/workflows/pub-aur.yml b/third_party/zeroclaw/.github/workflows/pub-aur.yml new file mode 100644 index 0000000..033824c --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/pub-aur.yml @@ -0,0 +1,181 @@ +name: Pub AUR Package + +on: + workflow_call: + inputs: + release_tag: + description: "Existing release tag (vX.Y.Z)" + required: true + type: string + dry_run: + description: "Generate PKGBUILD only (no push)" + required: false + default: false + type: boolean + secrets: + AUR_SSH_KEY: + required: false + workflow_dispatch: + inputs: + release_tag: + description: "Existing release tag (vX.Y.Z)" + required: true + type: string + dry_run: + description: "Generate PKGBUILD only (no push)" + required: false + default: true + type: boolean + +concurrency: + group: aur-publish-${{ github.run_id }} + cancel-in-progress: false + +permissions: + contents: read + +jobs: + publish-aur: + name: Update AUR Package + runs-on: ubuntu-latest + env: + RELEASE_TAG: ${{ inputs.release_tag }} + DRY_RUN: ${{ inputs.dry_run }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Validate and compute metadata + id: meta + shell: bash + run: | + set -euo pipefail + + if [[ ! "$RELEASE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "::error::release_tag must be vX.Y.Z format." + exit 1 + fi + + version="${RELEASE_TAG#v}" + tarball_url="https://github.com/${GITHUB_REPOSITORY}/archive/refs/tags/${RELEASE_TAG}.tar.gz" + tarball_sha="$(curl -fsSL "$tarball_url" | sha256sum | awk '{print $1}')" + + if [[ -z "$tarball_sha" ]]; then + echo "::error::Could not compute SHA256 for source tarball." + exit 1 + fi + + { + echo "version=$version" + echo "tarball_url=$tarball_url" + echo "tarball_sha=$tarball_sha" + } >> "$GITHUB_OUTPUT" + + { + echo "### AUR Package Metadata" + echo "- version: \`${version}\`" + echo "- tarball_url: \`${tarball_url}\`" + echo "- tarball_sha: \`${tarball_sha}\`" + } >> "$GITHUB_STEP_SUMMARY" + + - name: Generate PKGBUILD + id: pkgbuild + shell: bash + env: + VERSION: ${{ steps.meta.outputs.version }} + TARBALL_SHA: ${{ steps.meta.outputs.tarball_sha }} + run: | + set -euo pipefail + + pkgbuild_file="$(mktemp)" + sed -e "s/^pkgver=.*/pkgver=${VERSION}/" \ + -e "s/^sha256sums=.*/sha256sums=('${TARBALL_SHA}')/" \ + dist/aur/PKGBUILD > "$pkgbuild_file" + + echo "pkgbuild_file=$pkgbuild_file" >> "$GITHUB_OUTPUT" + + echo "### Generated PKGBUILD" >> "$GITHUB_STEP_SUMMARY" + echo '```bash' >> "$GITHUB_STEP_SUMMARY" + cat "$pkgbuild_file" >> "$GITHUB_STEP_SUMMARY" + echo '```' >> "$GITHUB_STEP_SUMMARY" + + - name: Generate .SRCINFO + id: srcinfo + shell: bash + env: + VERSION: ${{ steps.meta.outputs.version }} + TARBALL_SHA: ${{ steps.meta.outputs.tarball_sha }} + run: | + set -euo pipefail + + srcinfo_file="$(mktemp)" + sed -e "s/pkgver = .*/pkgver = ${VERSION}/" \ + -e "s/sha256sums = .*/sha256sums = ${TARBALL_SHA}/" \ + -e "s|zeroclaw-[0-9.]*.tar.gz|zeroclaw-${VERSION}.tar.gz|g" \ + -e "s|/v[0-9.]*\.tar\.gz|/v${VERSION}.tar.gz|g" \ + dist/aur/.SRCINFO > "$srcinfo_file" + + echo "srcinfo_file=$srcinfo_file" >> "$GITHUB_OUTPUT" + + - name: Push to AUR + if: inputs.dry_run == false + shell: bash + env: + AUR_SSH_KEY: ${{ secrets.AUR_SSH_KEY }} + PKGBUILD_FILE: ${{ steps.pkgbuild.outputs.pkgbuild_file }} + SRCINFO_FILE: ${{ steps.srcinfo.outputs.srcinfo_file }} + VERSION: ${{ steps.meta.outputs.version }} + run: | + set -euo pipefail + + if [[ -z "${AUR_SSH_KEY}" ]]; then + echo "::error::Secret AUR_SSH_KEY is required for non-dry-run." + exit 1 + fi + + # Set up SSH key — normalize line endings and ensure trailing newline + mkdir -p ~/.ssh + chmod 700 ~/.ssh + printf '%s\n' "$AUR_SSH_KEY" | tr -d '\r' > ~/.ssh/aur + chmod 600 ~/.ssh/aur + + cat > ~/.ssh/config <<'SSH_CONFIG' + Host aur.archlinux.org + IdentityFile ~/.ssh/aur + User aur + StrictHostKeyChecking accept-new + SSH_CONFIG + chmod 600 ~/.ssh/config + + # Verify key is valid and print fingerprint for debugging + echo "::group::SSH key diagnostics" + ssh-keygen -l -f ~/.ssh/aur || { echo "::error::AUR_SSH_KEY is not a valid SSH private key"; exit 1; } + echo "::endgroup::" + + # Test SSH connectivity before attempting clone + ssh -T -o BatchMode=yes -o ConnectTimeout=10 aur@aur.archlinux.org 2>&1 || true + + tmp_dir="$(mktemp -d)" + git clone ssh://aur@aur.archlinux.org/zeroclaw.git "$tmp_dir/aur" + + cp "$PKGBUILD_FILE" "$tmp_dir/aur/PKGBUILD" + cp "$SRCINFO_FILE" "$tmp_dir/aur/.SRCINFO" + + cd "$tmp_dir/aur" + git config user.name "zeroclaw-bot" + git config user.email "bot@zeroclaw.dev" + git add PKGBUILD .SRCINFO + git commit -m "zeroclaw ${VERSION}" + git push origin HEAD + + echo "AUR package updated to ${VERSION}" + + - name: Summary + shell: bash + run: | + if [[ "$DRY_RUN" == "true" ]]; then + echo "Dry run complete: PKGBUILD generated, no push performed." + else + echo "Publish complete: AUR package pushed." + fi diff --git a/third_party/zeroclaw/.github/workflows/pub-homebrew-core.yml b/third_party/zeroclaw/.github/workflows/pub-homebrew-core.yml new file mode 100644 index 0000000..7618228 --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/pub-homebrew-core.yml @@ -0,0 +1,235 @@ +name: Pub Homebrew Core + +on: + workflow_call: + inputs: + release_tag: + description: "Existing release tag to publish (vX.Y.Z)" + required: true + type: string + dry_run: + description: "Patch formula only (no push/PR)" + required: false + default: false + type: boolean + secrets: + HOMEBREW_UPSTREAM_PR_TOKEN: + required: false + HOMEBREW_CORE_BOT_TOKEN: + required: false + workflow_dispatch: + inputs: + release_tag: + description: "Existing release tag to publish (vX.Y.Z)" + required: true + type: string + dry_run: + description: "Patch formula only (no push/PR)" + required: false + default: true + type: boolean + +concurrency: + group: homebrew-core-${{ github.run_id }} + cancel-in-progress: false + +permissions: + contents: read + +jobs: + publish-homebrew-core: + name: Publish Homebrew Core PR + runs-on: ubuntu-latest + env: + UPSTREAM_REPO: Homebrew/homebrew-core + FORMULA_PATH: Formula/z/zeroclaw.rb + RELEASE_TAG: ${{ inputs.release_tag }} + DRY_RUN: ${{ inputs.dry_run }} + BOT_FORK_REPO: ${{ vars.HOMEBREW_CORE_BOT_FORK_REPO }} + BOT_EMAIL: ${{ vars.HOMEBREW_CORE_BOT_EMAIL }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Validate release tag and version alignment + id: release_meta + shell: bash + run: | + set -euo pipefail + + semver_pattern='^v[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$' + if [[ ! "$RELEASE_TAG" =~ $semver_pattern ]]; then + echo "::error::release_tag must match semver-like format (vX.Y.Z[-suffix])." + exit 1 + fi + + if ! git rev-parse "refs/tags/${RELEASE_TAG}" >/dev/null 2>&1; then + git fetch --tags origin + fi + + tag_version="${RELEASE_TAG#v}" + cargo_version="$(git show "${RELEASE_TAG}:Cargo.toml" \ + | sed -n 's/^version = "\([^"]*\)"/\1/p' | head -n1)" + if [[ -z "$cargo_version" ]]; then + echo "::error::Unable to read Cargo.toml version from tag ${RELEASE_TAG}." + exit 1 + fi + if [[ "$cargo_version" != "$tag_version" ]]; then + echo "::error::Tag ${RELEASE_TAG} does not match Cargo.toml version (${cargo_version})." + exit 1 + fi + + tarball_url="https://github.com/${GITHUB_REPOSITORY}/archive/refs/tags/${RELEASE_TAG}.tar.gz" + tarball_sha="$(curl -fsSL "$tarball_url" | sha256sum | awk '{print $1}')" + + { + echo "tag_version=$tag_version" + echo "tarball_url=$tarball_url" + echo "tarball_sha=$tarball_sha" + } >> "$GITHUB_OUTPUT" + + { + echo "### Release Metadata" + echo "- release_tag: \`${RELEASE_TAG}\`" + echo "- cargo_version: \`${cargo_version}\`" + echo "- tarball_sha256: \`${tarball_sha}\`" + echo "- dry_run: ${DRY_RUN}" + } >> "$GITHUB_STEP_SUMMARY" + + - name: Patch Homebrew formula + id: patch_formula + shell: bash + env: + HOMEBREW_CORE_BOT_TOKEN: ${{ secrets.HOMEBREW_UPSTREAM_PR_TOKEN || secrets.HOMEBREW_CORE_BOT_TOKEN }} + GH_TOKEN: ${{ secrets.HOMEBREW_UPSTREAM_PR_TOKEN || secrets.HOMEBREW_CORE_BOT_TOKEN }} + TARBALL_URL: ${{ steps.release_meta.outputs.tarball_url }} + TARBALL_SHA: ${{ steps.release_meta.outputs.tarball_sha }} + run: | + set -euo pipefail + + tmp_repo="$(mktemp -d)" + echo "tmp_repo=$tmp_repo" >> "$GITHUB_OUTPUT" + + if [[ "$DRY_RUN" == "true" ]]; then + git clone --depth=1 "https://github.com/${UPSTREAM_REPO}.git" "$tmp_repo/homebrew-core" + else + if [[ -z "${BOT_FORK_REPO}" ]]; then + echo "::error::Repository variable HOMEBREW_CORE_BOT_FORK_REPO is required when dry_run=false." + exit 1 + fi + if [[ -z "${HOMEBREW_CORE_BOT_TOKEN}" ]]; then + echo "::error::Repository secret HOMEBREW_CORE_BOT_TOKEN is required when dry_run=false." + exit 1 + fi + if [[ "$BOT_FORK_REPO" != */* ]]; then + echo "::error::HOMEBREW_CORE_BOT_FORK_REPO must be in owner/repo format." + exit 1 + fi + if ! gh api "repos/${BOT_FORK_REPO}" >/dev/null 2>&1; then + echo "::error::HOMEBREW_CORE_BOT_TOKEN cannot access ${BOT_FORK_REPO}." + exit 1 + fi + gh repo clone "${BOT_FORK_REPO}" "$tmp_repo/homebrew-core" -- --depth=1 + fi + + repo_dir="$tmp_repo/homebrew-core" + formula_file="$repo_dir/$FORMULA_PATH" + if [[ ! -f "$formula_file" ]]; then + echo "::error::Formula file not found: $FORMULA_PATH" + exit 1 + fi + + if [[ "$DRY_RUN" == "false" ]]; then + if git -C "$repo_dir" remote get-url upstream >/dev/null 2>&1; then + git -C "$repo_dir" remote set-url upstream "https://github.com/${UPSTREAM_REPO}.git" + else + git -C "$repo_dir" remote add upstream "https://github.com/${UPSTREAM_REPO}.git" + fi + if git -C "$repo_dir" ls-remote --exit-code --heads upstream main >/dev/null 2>&1; then + upstream_ref="main" + else + upstream_ref="master" + fi + git -C "$repo_dir" fetch --depth=1 upstream "$upstream_ref" + branch_name="zeroclaw-${RELEASE_TAG}-${GITHUB_RUN_ID}" + git -C "$repo_dir" checkout -B "$branch_name" "upstream/$upstream_ref" + echo "branch_name=$branch_name" >> "$GITHUB_OUTPUT" + fi + + tarball_url="${TARBALL_URL}" + tarball_sha="${TARBALL_SHA}" + + if [[ -z "$tarball_url" || -z "$tarball_sha" ]]; then + echo "::error::tarball_url or tarball_sha is empty — release_meta step output not propagated." + exit 1 + fi + + perl -0pi -e "s|^ url \".*\"| url \"${tarball_url}\"|m" "$formula_file" + perl -0pi -e "s|^ sha256 \".*\"| sha256 \"${tarball_sha}\"|m" "$formula_file" + perl -0pi -e "s|^ license \".*\"| license \"Apache-2.0 OR MIT\"|m" "$formula_file" + + # Ensure Node.js build dependency is declared so that build.rs can + # run `npm ci && npm run build` to produce the web frontend assets. + if ! grep -q 'depends_on "node" => :build' "$formula_file"; then + perl -0pi -e 's|( depends_on "rust" => :build\n)|\1 depends_on "node" => :build\n|m' "$formula_file" + fi + + git -C "$repo_dir" diff -- "$FORMULA_PATH" > "$tmp_repo/formula.diff" + if [[ ! -s "$tmp_repo/formula.diff" ]]; then + echo "::error::No formula changes generated. Nothing to publish." + exit 1 + fi + + { + echo "### Formula Diff" + echo '```diff' + cat "$tmp_repo/formula.diff" + echo '```' + } >> "$GITHUB_STEP_SUMMARY" + + - name: Push branch and open Homebrew PR + if: inputs.dry_run == false + shell: bash + env: + GH_TOKEN: ${{ secrets.HOMEBREW_UPSTREAM_PR_TOKEN || secrets.HOMEBREW_CORE_BOT_TOKEN }} + TMP_REPO: ${{ steps.patch_formula.outputs.tmp_repo }} + BRANCH_NAME: ${{ steps.patch_formula.outputs.branch_name }} + TAG_VERSION: ${{ steps.release_meta.outputs.tag_version }} + TARBALL_URL: ${{ steps.release_meta.outputs.tarball_url }} + TARBALL_SHA: ${{ steps.release_meta.outputs.tarball_sha }} + run: | + set -euo pipefail + + repo_dir="${TMP_REPO}/homebrew-core" + fork_owner="${BOT_FORK_REPO%%/*}" + bot_email="${BOT_EMAIL:-${fork_owner}@users.noreply.github.com}" + + git -C "$repo_dir" config user.name "$fork_owner" + git -C "$repo_dir" config user.email "$bot_email" + git -C "$repo_dir" add "$FORMULA_PATH" + git -C "$repo_dir" commit -m "zeroclaw ${TAG_VERSION}" + gh auth setup-git + git -C "$repo_dir" push --set-upstream origin "$BRANCH_NAME" + + pr_body="Automated formula bump from ZeroClaw release workflow. + + - Release tag: ${RELEASE_TAG} + - Source tarball: ${TARBALL_URL} + - Source sha256: ${TARBALL_SHA}" + + gh pr create \ + --repo "$UPSTREAM_REPO" \ + --base main \ + --head "${fork_owner}:${BRANCH_NAME}" \ + --title "zeroclaw ${TAG_VERSION}" \ + --body "$pr_body" + + - name: Summary + shell: bash + run: | + if [[ "$DRY_RUN" == "true" ]]; then + echo "Dry run complete: formula diff generated, no push/PR performed." + else + echo "Publish complete: branch pushed and PR opened from bot fork." + fi diff --git a/third_party/zeroclaw/.github/workflows/pub-scoop.yml b/third_party/zeroclaw/.github/workflows/pub-scoop.yml new file mode 100644 index 0000000..f1b1c6c --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/pub-scoop.yml @@ -0,0 +1,165 @@ +name: Pub Scoop Manifest + +on: + workflow_call: + inputs: + release_tag: + description: "Existing release tag (vX.Y.Z)" + required: true + type: string + dry_run: + description: "Generate manifest only (no push)" + required: false + default: false + type: boolean + secrets: + SCOOP_BUCKET_TOKEN: + required: false + workflow_dispatch: + inputs: + release_tag: + description: "Existing release tag (vX.Y.Z)" + required: true + type: string + dry_run: + description: "Generate manifest only (no push)" + required: false + default: true + type: boolean + +concurrency: + group: scoop-publish-${{ github.run_id }} + cancel-in-progress: false + +permissions: + contents: read + +jobs: + publish-scoop: + name: Update Scoop Manifest + runs-on: ubuntu-latest + env: + RELEASE_TAG: ${{ inputs.release_tag }} + DRY_RUN: ${{ inputs.dry_run }} + SCOOP_BUCKET_REPO: ${{ vars.SCOOP_BUCKET_REPO }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Validate and compute metadata + id: meta + shell: bash + run: | + set -euo pipefail + + if [[ ! "$RELEASE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "::error::release_tag must be vX.Y.Z format." + exit 1 + fi + + version="${RELEASE_TAG#v}" + zip_url="https://github.com/${GITHUB_REPOSITORY}/releases/download/${RELEASE_TAG}/zeroclaw-x86_64-pc-windows-msvc.zip" + sums_url="https://github.com/${GITHUB_REPOSITORY}/releases/download/${RELEASE_TAG}/SHA256SUMS" + + sha256="$(curl -fsSL "$sums_url" | grep 'zeroclaw-x86_64-pc-windows-msvc.zip' | awk '{print $1}')" + + if [[ -z "$sha256" ]]; then + echo "::error::Could not find Windows binary hash in SHA256SUMS for ${RELEASE_TAG}." + exit 1 + fi + + { + echo "version=$version" + echo "zip_url=$zip_url" + echo "sha256=$sha256" + } >> "$GITHUB_OUTPUT" + + { + echo "### Scoop Manifest Metadata" + echo "- version: \`${version}\`" + echo "- zip_url: \`${zip_url}\`" + echo "- sha256: \`${sha256}\`" + } >> "$GITHUB_STEP_SUMMARY" + + - name: Generate manifest + id: manifest + shell: bash + env: + VERSION: ${{ steps.meta.outputs.version }} + ZIP_URL: ${{ steps.meta.outputs.zip_url }} + SHA256: ${{ steps.meta.outputs.sha256 }} + run: | + set -euo pipefail + + manifest_file="$(mktemp)" + cat > "$manifest_file" < "${manifest_file}.formatted" + mv "${manifest_file}.formatted" "$manifest_file" + + echo "manifest_file=$manifest_file" >> "$GITHUB_OUTPUT" + + echo "### Generated Manifest" >> "$GITHUB_STEP_SUMMARY" + echo '```json' >> "$GITHUB_STEP_SUMMARY" + cat "$manifest_file" >> "$GITHUB_STEP_SUMMARY" + echo '```' >> "$GITHUB_STEP_SUMMARY" + + - name: Push to Scoop bucket + if: inputs.dry_run == false + shell: bash + env: + GH_TOKEN: ${{ secrets.SCOOP_BUCKET_TOKEN }} + MANIFEST_FILE: ${{ steps.manifest.outputs.manifest_file }} + VERSION: ${{ steps.meta.outputs.version }} + run: | + set -euo pipefail + + if [[ -z "${SCOOP_BUCKET_REPO}" ]]; then + echo "::error::Repository variable SCOOP_BUCKET_REPO is required (e.g. zeroclaw-labs/scoop-zeroclaw)." + exit 1 + fi + + tmp_dir="$(mktemp -d)" + gh repo clone "${SCOOP_BUCKET_REPO}" "$tmp_dir/bucket" -- --depth=1 + + mkdir -p "$tmp_dir/bucket/bucket" + cp "$MANIFEST_FILE" "$tmp_dir/bucket/bucket/zeroclaw.json" + + cd "$tmp_dir/bucket" + git config user.name "zeroclaw-bot" + git config user.email "bot@zeroclaw.dev" + git add bucket/zeroclaw.json + git commit -m "zeroclaw ${VERSION}" + gh auth setup-git + git push origin HEAD + + echo "Scoop manifest updated to ${VERSION}" diff --git a/third_party/zeroclaw/.github/workflows/publish-crates-auto.yml b/third_party/zeroclaw/.github/workflows/publish-crates-auto.yml new file mode 100644 index 0000000..a7f23e8 --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/publish-crates-auto.yml @@ -0,0 +1,160 @@ +name: Auto-sync crates.io + +on: + push: + branches: [master] + paths: + - "Cargo.toml" + +concurrency: + group: publish-crates-auto + cancel-in-progress: false + +permissions: + contents: read + +env: + CARGO_TERM_COLOR: always + +jobs: + detect-version-change: + name: Detect Version Bump + if: github.repository == 'zeroclaw-labs/zeroclaw' + runs-on: ubuntu-latest + outputs: + changed: ${{ steps.check.outputs.changed }} + version: ${{ steps.check.outputs.version }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Check if version changed + id: check + shell: bash + run: | + set -euo pipefail + + current=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1) + previous=$(git show HEAD~1:Cargo.toml 2>/dev/null | sed -n 's/^version = "\([^"]*\)"/\1/p' | head -1 || echo "") + + echo "Current version: ${current}" + echo "Previous version: ${previous}" + + # Skip if stable release workflow will handle this version + # (indicated by an existing or imminent stable tag) + if git ls-remote --exit-code --tags origin "refs/tags/v${current}" >/dev/null 2>&1; then + echo "Stable tag v${current} exists — stable release workflow handles crates.io" + echo "changed=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + if [[ "$current" != "$previous" && -n "$current" ]]; then + echo "changed=true" >> "$GITHUB_OUTPUT" + echo "version=${current}" >> "$GITHUB_OUTPUT" + echo "Version bumped from ${previous} to ${current} — will publish" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + echo "Version unchanged (${current}) — skipping publish" + fi + + check-registry: + name: Check if Already Published + needs: [detect-version-change] + if: needs.detect-version-change.outputs.changed == 'true' + runs-on: ubuntu-latest + outputs: + should_publish: ${{ steps.check.outputs.should_publish }} + steps: + - name: Check crates.io for existing version + id: check + shell: bash + env: + VERSION: ${{ needs.detect-version-change.outputs.version }} + run: | + set -euo pipefail + status=$(curl -s -o /dev/null -w "%{http_code}" \ + "https://crates.io/api/v1/crates/zeroclawlabs/${VERSION}") + + if [[ "$status" == "200" ]]; then + echo "Version ${VERSION} already exists on crates.io — skipping" + echo "should_publish=false" >> "$GITHUB_OUTPUT" + else + echo "Version ${VERSION} not yet published — proceeding" + echo "should_publish=true" >> "$GITHUB_OUTPUT" + fi + + publish: + name: Publish to crates.io + needs: [detect-version-change, check-registry] + if: needs.check-registry.outputs.should_publish == 'true' + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.92.0 + + - uses: Swatinem/rust-cache@v2 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: web/package-lock.json + + - name: Build web dashboard + run: cd web && npm ci && npm run build + + - name: Clean web build artifacts + run: rm -rf web/node_modules web/src web/package.json web/package-lock.json web/tsconfig*.json web/vite.config.ts web/index.html + + - name: Publish aardvark-sys to crates.io + shell: bash + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + run: | + OUTPUT=$(cargo publish --locked --allow-dirty --no-verify -p aardvark-sys 2>&1) && exit 0 + echo "$OUTPUT" + if echo "$OUTPUT" | grep -q 'already exists'; then + echo "::notice::aardvark-sys already on crates.io — skipping" + exit 0 + fi + exit 1 + + - name: Wait for aardvark-sys to index + run: sleep 15 + + - name: Publish to crates.io + shell: bash + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + VERSION: ${{ needs.detect-version-change.outputs.version }} + run: | + # Publish to crates.io; treat "already exists" as success + # (manual publish or stable workflow may have already published) + OUTPUT=$(cargo publish --locked --allow-dirty --no-verify 2>&1) && exit 0 + echo "$OUTPUT" + if echo "$OUTPUT" | grep -q 'already exists'; then + echo "::notice::zeroclawlabs@${VERSION} already on crates.io — skipping" + exit 0 + fi + exit 1 + + - name: Verify published + shell: bash + env: + VERSION: ${{ needs.detect-version-change.outputs.version }} + run: | + echo "Waiting for crates.io to index..." + sleep 15 + status=$(curl -s -o /dev/null -w "%{http_code}" \ + "https://crates.io/api/v1/crates/zeroclawlabs/${VERSION}") + if [[ "$status" == "200" ]]; then + echo "zeroclawlabs v${VERSION} is live on crates.io" + echo "Install: cargo install zeroclawlabs" + else + echo "::warning::Version may still be indexing — check https://crates.io/crates/zeroclawlabs" + fi diff --git a/third_party/zeroclaw/.github/workflows/publish-crates.yml b/third_party/zeroclaw/.github/workflows/publish-crates.yml new file mode 100644 index 0000000..cc3fe61 --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/publish-crates.yml @@ -0,0 +1,108 @@ +name: Publish to crates.io + +on: + workflow_dispatch: + inputs: + version: + description: "Version to publish (e.g. 0.2.0) — must match Cargo.toml" + required: true + type: string + dry_run: + description: "Dry run (validate without publishing)" + required: false + type: boolean + default: false + +concurrency: + group: publish-crates + cancel-in-progress: false + +permissions: + contents: read + +env: + CARGO_TERM_COLOR: always + +jobs: + validate: + name: Validate + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Check version matches Cargo.toml + shell: bash + env: + INPUT_VERSION: ${{ inputs.version }} + run: | + set -euo pipefail + cargo_version=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1) + if [[ "$cargo_version" != "$INPUT_VERSION" ]]; then + echo "::error::Cargo.toml version (${cargo_version}) does not match input (${INPUT_VERSION})" + exit 1 + fi + + publish: + name: Publish to crates.io + needs: [validate] + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.92.0 + + - uses: Swatinem/rust-cache@v2 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: web/package-lock.json + + - name: Build web dashboard + run: cd web && npm ci && npm run build + + - name: Clean web build artifacts + run: rm -rf web/node_modules web/src web/package.json web/package-lock.json web/tsconfig*.json web/vite.config.ts web/index.html + + - name: Publish aardvark-sys to crates.io + if: "!inputs.dry_run" + shell: bash + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + run: | + OUTPUT=$(cargo publish --locked --allow-dirty --no-verify -p aardvark-sys 2>&1) && exit 0 + echo "$OUTPUT" + if echo "$OUTPUT" | grep -q 'already exists'; then + echo "::notice::aardvark-sys already on crates.io — skipping" + exit 0 + fi + exit 1 + + - name: Wait for aardvark-sys to index + if: "!inputs.dry_run" + run: sleep 15 + + - name: Publish (dry run) + if: inputs.dry_run + run: cargo publish --dry-run --locked --allow-dirty --no-verify + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + + - name: Publish to crates.io + if: "!inputs.dry_run" + shell: bash + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + VERSION: ${{ inputs.version }} + run: | + # Publish to crates.io; treat "already exists" as success + OUTPUT=$(cargo publish --locked --allow-dirty --no-verify 2>&1) && exit 0 + echo "$OUTPUT" + if echo "$OUTPUT" | grep -q 'already exists'; then + echo "::notice::zeroclawlabs@${VERSION} already on crates.io — skipping" + exit 0 + fi + exit 1 diff --git a/third_party/zeroclaw/.github/workflows/release-beta-on-push.yml b/third_party/zeroclaw/.github/workflows/release-beta-on-push.yml new file mode 100644 index 0000000..2bc2d4c --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/release-beta-on-push.yml @@ -0,0 +1,462 @@ +name: Release Beta + +on: + push: + branches: [master] + +concurrency: + group: release-beta + cancel-in-progress: true + +permissions: + contents: write + packages: write + +env: + CARGO_TERM_COLOR: always + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + RELEASE_CARGO_FEATURES: channel-matrix,channel-lark,whatsapp-web + +jobs: + version: + name: Resolve Version + if: github.repository == 'zeroclaw-labs/zeroclaw' + runs-on: ubuntu-latest + outputs: + version: ${{ steps.ver.outputs.version }} + tag: ${{ steps.ver.outputs.tag }} + skip: ${{ steps.ver.outputs.skip }} + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + fetch-depth: 2 + - name: Compute beta version + id: ver + shell: bash + run: | + set -euo pipefail + base_version=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1) + + # Skip beta if this is a version bump commit (stable release handles it) + commit_msg=$(git log -1 --pretty=format:"%s") + if [[ "$commit_msg" =~ ^chore:\ bump\ version ]]; then + echo "Version bump commit detected — skipping beta release" + echo "skip=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # Skip beta if a stable tag already exists for this version + if git ls-remote --exit-code --tags origin "refs/tags/v${base_version}" >/dev/null 2>&1; then + echo "Stable tag v${base_version} exists — skipping beta release" + echo "skip=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + + beta_tag="v${base_version}-beta.${GITHUB_RUN_NUMBER}" + echo "version=${base_version}" >> "$GITHUB_OUTPUT" + echo "tag=${beta_tag}" >> "$GITHUB_OUTPUT" + echo "skip=false" >> "$GITHUB_OUTPUT" + echo "Beta release: ${beta_tag}" + + release-notes: + name: Generate Release Notes + needs: [version] + if: github.repository == 'zeroclaw-labs/zeroclaw' && needs.version.outputs.skip != 'true' + runs-on: ubuntu-latest + outputs: + notes: ${{ steps.notes.outputs.body }} + features: ${{ steps.notes.outputs.features }} + contributors: ${{ steps.notes.outputs.contributors }} + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + fetch-depth: 0 + - name: Build release notes + id: notes + shell: bash + run: | + set -euo pipefail + + # Use a wider range — find the previous stable tag to capture all + # contributors across the full release cycle, not just one beta bump + PREV_TAG=$(git tag --sort=-creatordate \ + | grep -vE '\-beta\.' \ + | head -1 || echo "") + if [ -z "$PREV_TAG" ]; then + RANGE="HEAD" + else + RANGE="${PREV_TAG}..HEAD" + fi + + # Extract features only (feat commits) — skip bug fixes for clean notes + FEATURES=$(git log "$RANGE" --pretty=format:"%s" --no-merges \ + | grep -iE '^feat(\(|:)' \ + | sed 's/^feat(\([^)]*\)): /\1: /' \ + | sed 's/^feat: //' \ + | sed 's/ (#[0-9]*)$//' \ + | sort -uf \ + | while IFS= read -r line; do echo "- ${line}"; done || true) + + if [ -z "$FEATURES" ]; then + FEATURES="- Incremental improvements and polish" + fi + + # Collect ALL unique contributors: git authors + Co-Authored-By + GIT_AUTHORS=$(git log "$RANGE" --pretty=format:"%an" --no-merges | sort -uf || true) + CO_AUTHORS=$(git log "$RANGE" --pretty=format:"%b" --no-merges \ + | grep -ioE 'Co-Authored-By: *[^<]+' \ + | sed 's/Co-Authored-By: *//i' \ + | sed 's/ *$//' \ + | sort -uf || true) + + # Merge, deduplicate, and filter out bots + ALL_CONTRIBUTORS=$(printf "%s\n%s" "$GIT_AUTHORS" "$CO_AUTHORS" \ + | sort -uf \ + | grep -v '^$' \ + | grep -viE '\[bot\]$|^dependabot|^github-actions|^copilot|^ZeroClaw Bot|^ZeroClaw Runner|^ZeroClaw Agent|^blacksmith' \ + | while IFS= read -r name; do echo "- ${name}"; done || true) + + # Build release body + BODY=$(cat <> "$GITHUB_OUTPUT" + + { + echo "features<> "$GITHUB_OUTPUT" + + { + echo "contributors<> "$GITHUB_OUTPUT" + + web: + name: Build Web Dashboard + needs: [version] + if: github.repository == 'zeroclaw-labs/zeroclaw' && needs.version.outputs.skip != 'true' + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: web/package-lock.json + - name: Build web dashboard + run: cd web && npm ci && npm run build + - uses: actions/upload-artifact@v4 + with: + name: web-dist + path: web/dist/ + retention-days: 1 + + build: + name: Build ${{ matrix.target }} + needs: [version, web] + runs-on: ${{ matrix.os }} + timeout-minutes: 40 + strategy: + fail-fast: false + matrix: + include: + # Use ubuntu-22.04 for Linux builds to link against glibc 2.35, + # ensuring compatibility with Ubuntu 22.04+ (#3573). + - os: ubuntu-22.04 + target: x86_64-unknown-linux-gnu + artifact: zeroclaw + ext: tar.gz + - os: ubuntu-22.04 + target: aarch64-unknown-linux-gnu + artifact: zeroclaw + ext: tar.gz + cross_compiler: gcc-aarch64-linux-gnu + linker_env: CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER + linker: aarch64-linux-gnu-gcc + - os: ubuntu-22.04 + target: armv7-unknown-linux-gnueabihf + artifact: zeroclaw + ext: tar.gz + cross_compiler: gcc-arm-linux-gnueabihf + linker_env: CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER + linker: arm-linux-gnueabihf-gcc + - os: macos-14 + target: aarch64-apple-darwin + artifact: zeroclaw + ext: tar.gz + - os: ubuntu-latest + target: aarch64-linux-android + artifact: zeroclaw + ext: tar.gz + ndk: true + - os: windows-latest + target: x86_64-pc-windows-msvc + artifact: zeroclaw.exe + ext: zip + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + targets: ${{ matrix.target }} + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + if: runner.os != 'Windows' + with: + prefix-key: ${{ matrix.os }}-${{ matrix.target }} + + - uses: actions/download-artifact@v4 + with: + name: web-dist + path: web/dist/ + + - name: Install cross compiler + if: matrix.cross_compiler + run: | + sudo apt-get update -qq + sudo apt-get install -y ${{ matrix.cross_compiler }} + + - name: Setup Android NDK + if: matrix.ndk + run: echo "$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin" >> "$GITHUB_PATH" + + - name: Build release + shell: bash + run: | + if [ -n "${{ matrix.linker_env || '' }}" ] && [ -n "${{ matrix.linker || '' }}" ]; then + export "${{ matrix.linker_env }}=${{ matrix.linker }}" + fi + cargo build --release --locked --features "${{ env.RELEASE_CARGO_FEATURES }}" --target ${{ matrix.target }} + + - name: Check binary size + shell: bash + run: bash scripts/ci/check_binary_size.sh "target/${{ matrix.target }}/release/${{ matrix.artifact }}" "${{ matrix.target }}" + + - name: Package (Unix) + if: runner.os != 'Windows' + run: | + cd target/${{ matrix.target }}/release + tar czf ../../../zeroclaw-${{ matrix.target }}.${{ matrix.ext }} ${{ matrix.artifact }} + + - name: Package (Windows) + if: runner.os == 'Windows' + run: | + cd target/${{ matrix.target }}/release + 7z a ../../../zeroclaw-${{ matrix.target }}.${{ matrix.ext }} ${{ matrix.artifact }} + + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: zeroclaw-${{ matrix.target }} + path: zeroclaw-${{ matrix.target }}.${{ matrix.ext }} + retention-days: 7 + + build-desktop: + name: Build Desktop App (macOS Universal) + needs: [version] + if: needs.version.outputs.skip != 'true' + runs-on: macos-14 + timeout-minutes: 40 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + targets: aarch64-apple-darwin,x86_64-apple-darwin + + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + with: + prefix-key: macos-tauri + + - uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Install Tauri CLI + run: cargo install tauri-cli --locked + + - name: Sync Tauri version with Cargo.toml + shell: bash + run: | + VERSION=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1) + cd apps/tauri + if command -v jq >/dev/null 2>&1; then + jq --arg v "$VERSION" '.version = $v' tauri.conf.json > tmp.json && mv tmp.json tauri.conf.json + else + sed -i '' "s/\"version\": \"[^\"]*\"/\"version\": \"$VERSION\"/" tauri.conf.json + fi + echo "Tauri version set to: $VERSION" + + - name: Build Tauri app (universal binary) + working-directory: apps/tauri + run: cargo tauri build --target universal-apple-darwin + + - name: Prepare desktop release assets + run: | + mkdir -p desktop-assets + find target -name '*.dmg' -exec cp {} desktop-assets/ZeroClaw.dmg \; 2>/dev/null || true + find target -name '*.app.tar.gz' -exec cp {} desktop-assets/ZeroClaw-macos.app.tar.gz \; 2>/dev/null || true + find target -name '*.app.tar.gz.sig' -exec cp {} desktop-assets/ZeroClaw-macos.app.tar.gz.sig \; 2>/dev/null || true + echo "--- Desktop assets ---" + ls -lh desktop-assets/ + + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: desktop-macos + path: desktop-assets/* + retention-days: 7 + + publish: + name: Publish Beta Release + needs: [version, release-notes, build, build-desktop] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + pattern: zeroclaw-* + path: artifacts + + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: desktop-macos + path: artifacts/desktop-macos + + - name: Generate checksums + run: | + cd artifacts + find . -type f \( -name '*.tar.gz' -o -name '*.zip' -o -name '*.dmg' \) -exec sha256sum {} + | sed 's| \./[^/]*/| |' > SHA256SUMS + cat SHA256SUMS + + - name: Collect release assets + run: | + mkdir -p release-assets + find artifacts -type f \( -name '*.tar.gz' -o -name '*.zip' -o -name '*.dmg' -o -name 'SHA256SUMS' \) -exec cp {} release-assets/ \; + cp install.sh release-assets/ + echo "--- Assets ---" + ls -lh release-assets/ + + - name: Write release notes + env: + NOTES: ${{ needs.release-notes.outputs.notes }} + run: printf '%s\n' "$NOTES" > release-notes.md + + - name: Create GitHub Release + env: + GH_TOKEN: ${{ secrets.RELEASE_TOKEN }} + TAG: ${{ needs.version.outputs.tag }} + run: | + gh release create "$TAG" release-assets/* \ + --repo "${{ github.repository }}" \ + --title "$TAG" \ + --notes-file release-notes.md \ + --prerelease + + redeploy-website: + name: Trigger Website Redeploy + needs: [publish] + runs-on: ubuntu-latest + steps: + - name: Trigger website redeploy + env: + PAT: ${{ secrets.WEBSITE_REPO_PAT }} + run: | + curl -fsSL -X POST \ + -H "Authorization: token $PAT" \ + -H "Accept: application/vnd.github+json" \ + https://api.github.com/repos/zeroclaw-labs/zeroclaw-website/dispatches \ + -d '{"event_type":"new-release","client_payload":{"install_script_url":"https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh"}}' + + docker: + name: Push Docker Image + needs: [version, build] + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: zeroclaw-x86_64-unknown-linux-gnu + path: artifacts/ + + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: zeroclaw-aarch64-unknown-linux-gnu + path: artifacts/ + + - name: Prepare Docker context with pre-built binaries + run: | + mkdir -p docker-ctx/bin/amd64 docker-ctx/bin/arm64 + tar xzf artifacts/zeroclaw-x86_64-unknown-linux-gnu.tar.gz -C docker-ctx/bin/amd64 + tar xzf artifacts/zeroclaw-aarch64-unknown-linux-gnu.tar.gz -C docker-ctx/bin/arm64 + + mkdir -p docker-ctx/zeroclaw-data/.zeroclaw docker-ctx/zeroclaw-data/workspace + printf '%s\n' \ + 'workspace_dir = "/zeroclaw-data/workspace"' \ + 'config_path = "/zeroclaw-data/.zeroclaw/config.toml"' \ + 'api_key = ""' \ + 'default_provider = "openrouter"' \ + 'default_model = "anthropic/claude-sonnet-4-20250514"' \ + 'default_temperature = 0.7' \ + '' \ + '[gateway]' \ + 'port = 42617' \ + 'host = "[::]"' \ + 'allow_public_bind = true' \ + > docker-ctx/zeroclaw-data/.zeroclaw/config.toml + + cp Dockerfile.ci docker-ctx/Dockerfile + cp Dockerfile.debian.ci docker-ctx/Dockerfile.debian + + - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 + + - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 + with: + context: docker-ctx + push: true + tags: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.version.outputs.tag }} + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:beta + platforms: linux/amd64,linux/arm64 + + - name: Build and push Debian compatibility image + uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 + with: + context: docker-ctx + file: docker-ctx/Dockerfile.debian + push: true + tags: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.version.outputs.tag }}-debian + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:beta-debian + platforms: linux/amd64,linux/arm64 + + # Tweet removed — only stable releases should tweet (see tweet-release.yml). diff --git a/third_party/zeroclaw/.github/workflows/release-stable-manual.yml b/third_party/zeroclaw/.github/workflows/release-stable-manual.yml new file mode 100644 index 0000000..17c98b0 --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/release-stable-manual.yml @@ -0,0 +1,598 @@ +name: Release Stable + +on: + push: + tags: + - "v[0-9]+.[0-9]+.[0-9]+" # stable tags only (no -beta suffix) + workflow_dispatch: + inputs: + version: + description: "Stable version to release (e.g. 0.2.0)" + required: true + type: string + +concurrency: + group: promote-release + cancel-in-progress: false + +permissions: + contents: write + packages: write + +env: + CARGO_TERM_COLOR: always + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + RELEASE_CARGO_FEATURES: channel-matrix,channel-lark,whatsapp-web + +jobs: + validate: + name: Validate Version + runs-on: ubuntu-latest + outputs: + tag: ${{ steps.check.outputs.tag }} + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - name: Validate semver and Cargo.toml match + id: check + shell: bash + env: + INPUT_VERSION: ${{ inputs.version || '' }} + REF_NAME: ${{ github.ref_name }} + EVENT_NAME: ${{ github.event_name }} + run: | + set -euo pipefail + cargo_version=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1) + + # Resolve version from tag push or manual input + if [[ "$EVENT_NAME" == "push" ]]; then + # Tag push: extract version from tag name (v0.5.9 -> 0.5.9) + input_version="${REF_NAME#v}" + else + input_version="$INPUT_VERSION" + fi + + if [[ ! "$input_version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "::error::Version must be semver (X.Y.Z). Got: ${input_version}" + exit 1 + fi + + if [[ "$cargo_version" != "$input_version" ]]; then + echo "::error::Cargo.toml version (${cargo_version}) does not match input (${input_version}). Bump Cargo.toml first." + exit 1 + fi + + tag="v${input_version}" + + # Only check tag existence for manual dispatch (tag push means it already exists) + if [[ "$EVENT_NAME" != "push" ]]; then + if git ls-remote --exit-code --tags origin "refs/tags/${tag}" >/dev/null 2>&1; then + echo "::error::Tag ${tag} already exists." + exit 1 + fi + fi + + echo "tag=${tag}" >> "$GITHUB_OUTPUT" + + web: + name: Build Web Dashboard + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: web/package-lock.json + - name: Build web dashboard + run: cd web && npm ci && npm run build + - uses: actions/upload-artifact@v4 + with: + name: web-dist + path: web/dist/ + retention-days: 1 + + release-notes: + name: Generate Release Notes + runs-on: ubuntu-latest + outputs: + notes: ${{ steps.notes.outputs.body }} + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + fetch-depth: 0 + - name: Build release notes + id: notes + shell: bash + env: + INPUT_VERSION: ${{ inputs.version || '' }} + REF_NAME: ${{ github.ref_name }} + EVENT_NAME: ${{ github.event_name }} + run: | + set -euo pipefail + + # Resolve version from tag push or manual input + if [[ "$EVENT_NAME" == "push" ]]; then + INPUT_VERSION="${REF_NAME#v}" + fi + + # Find the previous stable tag (exclude beta tags) + PREV_TAG=$(git tag --sort=-creatordate | grep -vE '\-beta\.' | grep -v "^v${INPUT_VERSION}$" | head -1 || echo "") + if [ -z "$PREV_TAG" ]; then + RANGE="HEAD" + else + RANGE="${PREV_TAG}..HEAD" + fi + + # Extract features only — skip bug fixes for clean release notes + FEATURES=$(git log "$RANGE" --pretty=format:"%s" --no-merges \ + | grep -iE '^feat(\(|:)' \ + | sed 's/^feat(\([^)]*\)): /\1: /' \ + | sed 's/^feat: //' \ + | sed 's/ (#[0-9]*)$//' \ + | sort -uf \ + | while IFS= read -r line; do echo "- ${line}"; done || true) + + if [ -z "$FEATURES" ]; then + FEATURES="- Incremental improvements and polish" + fi + + # Collect ALL unique contributors: git authors + Co-Authored-By + GIT_AUTHORS=$(git log "$RANGE" --pretty=format:"%an" --no-merges | sort -uf || true) + CO_AUTHORS=$(git log "$RANGE" --pretty=format:"%b" --no-merges \ + | grep -ioE 'Co-Authored-By: *[^<]+' \ + | sed 's/Co-Authored-By: *//i' \ + | sed 's/ *$//' \ + | sort -uf || true) + + # Merge, deduplicate, and filter out bots + ALL_CONTRIBUTORS=$(printf "%s\n%s" "$GIT_AUTHORS" "$CO_AUTHORS" \ + | sort -uf \ + | grep -v '^$' \ + | grep -viE '\[bot\]$|^dependabot|^github-actions|^copilot|^ZeroClaw Bot|^ZeroClaw Runner|^ZeroClaw Agent|^blacksmith' \ + | while IFS= read -r name; do echo "- ${name}"; done || true) + + BODY=$(cat <> "$GITHUB_OUTPUT" + + build: + name: Build ${{ matrix.target }} + needs: [validate, web] + runs-on: ${{ matrix.os }} + timeout-minutes: 40 + strategy: + fail-fast: false + matrix: + include: + # Use ubuntu-22.04 for Linux builds to link against glibc 2.35, + # ensuring compatibility with Ubuntu 22.04+ (#3573). + - os: ubuntu-22.04 + target: x86_64-unknown-linux-gnu + artifact: zeroclaw + ext: tar.gz + - os: ubuntu-22.04 + target: aarch64-unknown-linux-gnu + artifact: zeroclaw + ext: tar.gz + cross_compiler: gcc-aarch64-linux-gnu + linker_env: CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER + linker: aarch64-linux-gnu-gcc + - os: ubuntu-22.04 + target: armv7-unknown-linux-gnueabihf + artifact: zeroclaw + ext: tar.gz + cross_compiler: gcc-arm-linux-gnueabihf + linker_env: CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER + linker: arm-linux-gnueabihf-gcc + skip_prometheus: true + - os: ubuntu-22.04 + target: arm-unknown-linux-gnueabihf + artifact: zeroclaw + ext: tar.gz + cross_compiler: gcc-arm-linux-gnueabihf + linker_env: CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER + linker: arm-linux-gnueabihf-gcc + skip_prometheus: true + - os: macos-14 + target: aarch64-apple-darwin + artifact: zeroclaw + ext: tar.gz + - os: ubuntu-latest + target: aarch64-linux-android + artifact: zeroclaw + ext: tar.gz + ndk: true + - os: windows-latest + target: x86_64-pc-windows-msvc + artifact: zeroclaw.exe + ext: zip + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + targets: ${{ matrix.target }} + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + if: runner.os != 'Windows' + with: + prefix-key: ${{ matrix.os }}-${{ matrix.target }} + + - uses: actions/download-artifact@v4 + with: + name: web-dist + path: web/dist/ + + - name: Install cross compiler + if: matrix.cross_compiler + run: | + sudo apt-get update -qq + sudo apt-get install -y ${{ matrix.cross_compiler }} + + - name: Setup Android NDK + if: matrix.ndk + run: echo "$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin" >> "$GITHUB_PATH" + + - name: Build release + shell: bash + run: | + if [ -n "${{ matrix.linker_env || '' }}" ] && [ -n "${{ matrix.linker || '' }}" ]; then + export "${{ matrix.linker_env }}=${{ matrix.linker }}" + fi + # Force ARMv6 codegen for arm-unknown-linux-gnueabihf (#4556) + # Ubuntu 22.04's gcc-arm-linux-gnueabihf defaults to ARMv7+NEON, + # which segfaults on ARMv6 devices (e.g. Raspberry Pi Zero W). + if [ "${{ matrix.target }}" = "arm-unknown-linux-gnueabihf" ]; then + export CFLAGS_arm_unknown_linux_gnueabihf="-march=armv6 -mfpu=vfp -mfloat-abi=hard" + export CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_RUSTFLAGS="-C target-feature=-neon" + fi + if [ "${{ matrix.skip_prometheus || 'false' }}" = "true" ]; then + cargo build --release --locked --no-default-features --features "${{ env.RELEASE_CARGO_FEATURES }},channel-nostr,skill-creation" --target ${{ matrix.target }} + else + cargo build --release --locked --features "${{ env.RELEASE_CARGO_FEATURES }}" --target ${{ matrix.target }} + fi + + - name: Check binary size + shell: bash + run: bash scripts/ci/check_binary_size.sh "target/${{ matrix.target }}/release/${{ matrix.artifact }}" "${{ matrix.target }}" + + - name: Package (Unix) + if: runner.os != 'Windows' + run: | + cd target/${{ matrix.target }}/release + tar czf ../../../zeroclaw-${{ matrix.target }}.${{ matrix.ext }} ${{ matrix.artifact }} + + - name: Package (Windows) + if: runner.os == 'Windows' + run: | + cd target/${{ matrix.target }}/release + 7z a ../../../zeroclaw-${{ matrix.target }}.${{ matrix.ext }} ${{ matrix.artifact }} + + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: zeroclaw-${{ matrix.target }} + path: zeroclaw-${{ matrix.target }}.${{ matrix.ext }} + retention-days: 14 + + build-desktop: + name: Build Desktop App (macOS Universal) + needs: [validate] + runs-on: macos-14 + timeout-minutes: 40 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + + - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable + with: + toolchain: 1.92.0 + targets: aarch64-apple-darwin,x86_64-apple-darwin + + - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 + with: + prefix-key: macos-tauri + + - uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Install Tauri CLI + run: cargo install tauri-cli --locked + + - name: Sync Tauri version with Cargo.toml + shell: bash + run: | + VERSION=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1) + cd apps/tauri + if command -v jq >/dev/null 2>&1; then + jq --arg v "$VERSION" '.version = $v' tauri.conf.json > tmp.json && mv tmp.json tauri.conf.json + else + sed -i '' "s/\"version\": \"[^\"]*\"/\"version\": \"$VERSION\"/" tauri.conf.json + fi + echo "Tauri version set to: $VERSION" + + - name: Build Tauri app (universal binary) + working-directory: apps/tauri + run: cargo tauri build --target universal-apple-darwin + + - name: Prepare desktop release assets + run: | + mkdir -p desktop-assets + find target -name '*.dmg' -exec cp {} desktop-assets/ZeroClaw.dmg \; 2>/dev/null || true + find target -name '*.app.tar.gz' -exec cp {} desktop-assets/ZeroClaw-macos.app.tar.gz \; 2>/dev/null || true + find target -name '*.app.tar.gz.sig' -exec cp {} desktop-assets/ZeroClaw-macos.app.tar.gz.sig \; 2>/dev/null || true + echo "--- Desktop assets ---" + ls -lh desktop-assets/ + + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: desktop-macos + path: desktop-assets/* + retention-days: 14 + + publish: + name: Publish Stable Release + needs: [validate, release-notes, build, build-desktop] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + pattern: zeroclaw-* + path: artifacts + + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: desktop-macos + path: artifacts/desktop-macos + + - name: Generate checksums + run: | + cd artifacts + find . -type f \( -name '*.tar.gz' -o -name '*.zip' -o -name '*.dmg' \) -exec sha256sum {} + | sed 's| \./[^/]*/| |' > SHA256SUMS + cat SHA256SUMS + + - name: Collect release assets + run: | + mkdir -p release-assets + find artifacts -type f \( -name '*.tar.gz' -o -name '*.zip' -o -name '*.dmg' -o -name 'SHA256SUMS' \) -exec cp {} release-assets/ \; + cp install.sh release-assets/ + echo "--- Assets ---" + ls -lh release-assets/ + + - name: Write release notes + env: + NOTES: ${{ needs.release-notes.outputs.notes }} + run: printf '%s\n' "$NOTES" > release-notes.md + + - name: Create tag if manual dispatch + if: github.event_name == 'workflow_dispatch' + env: + TAG: ${{ needs.validate.outputs.tag }} + run: | + git tag -a "$TAG" -m "zeroclaw $TAG" + git push origin "$TAG" + + - name: Create GitHub Release + env: + GH_TOKEN: ${{ secrets.RELEASE_TOKEN }} + TAG: ${{ needs.validate.outputs.tag }} + run: | + gh release create "$TAG" release-assets/* \ + --repo "${{ github.repository }}" \ + --title "$TAG" \ + --notes-file release-notes.md \ + --latest + + crates-io: + name: Publish to crates.io + needs: [validate, publish] + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.92.0 + + - uses: Swatinem/rust-cache@v2 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + cache-dependency-path: web/package-lock.json + + - name: Build web dashboard + run: cd web && npm ci && npm run build + + - name: Clean web build artifacts + run: rm -rf web/node_modules web/src web/package.json web/package-lock.json web/tsconfig*.json web/vite.config.ts web/index.html + + - name: Publish aardvark-sys to crates.io + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + run: | + OUTPUT=$(cargo publish --locked --allow-dirty --no-verify -p aardvark-sys 2>&1) && exit 0 + echo "$OUTPUT" + if echo "$OUTPUT" | grep -q 'already exists'; then + echo "::notice::aardvark-sys already on crates.io — skipping" + exit 0 + fi + exit 1 + + - name: Wait for aardvark-sys to index + run: sleep 15 + + - name: Publish to crates.io + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + VERSION: ${{ inputs.version }} + run: | + # Publish to crates.io; treat "already exists" as success + # (auto-publish workflow may have already published this version) + CRATE_NAME=$(sed -n 's/^name = "\([^"]*\)"/\1/p' Cargo.toml | head -1) + OUTPUT=$(cargo publish --locked --allow-dirty --no-verify 2>&1) && exit 0 + echo "$OUTPUT" + if echo "$OUTPUT" | grep -q 'already exists'; then + echo "::notice::${CRATE_NAME}@${VERSION} already on crates.io — skipping" + exit 0 + fi + exit 1 + + redeploy-website: + name: Trigger Website Redeploy + needs: [publish] + runs-on: ubuntu-latest + steps: + - name: Trigger website redeploy + env: + PAT: ${{ secrets.WEBSITE_REPO_PAT }} + run: | + curl -fsSL -X POST \ + -H "Authorization: token $PAT" \ + -H "Accept: application/vnd.github+json" \ + https://api.github.com/repos/zeroclaw-labs/zeroclaw-website/dispatches \ + -d '{"event_type":"new-release","client_payload":{"install_script_url":"https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh"}}' + + docker: + name: Push Docker Image + needs: [validate, build] + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: zeroclaw-x86_64-unknown-linux-gnu + path: artifacts/ + + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: zeroclaw-aarch64-unknown-linux-gnu + path: artifacts/ + + - name: Prepare Docker context with pre-built binaries + run: | + mkdir -p docker-ctx/bin/amd64 docker-ctx/bin/arm64 + tar xzf artifacts/zeroclaw-x86_64-unknown-linux-gnu.tar.gz -C docker-ctx/bin/amd64 + tar xzf artifacts/zeroclaw-aarch64-unknown-linux-gnu.tar.gz -C docker-ctx/bin/arm64 + + mkdir -p docker-ctx/zeroclaw-data/.zeroclaw docker-ctx/zeroclaw-data/workspace + printf '%s\n' \ + 'workspace_dir = "/zeroclaw-data/workspace"' \ + 'config_path = "/zeroclaw-data/.zeroclaw/config.toml"' \ + 'api_key = ""' \ + 'default_provider = "openrouter"' \ + 'default_model = "anthropic/claude-sonnet-4-20250514"' \ + 'default_temperature = 0.7' \ + '' \ + '[gateway]' \ + 'port = 42617' \ + 'host = "[::]"' \ + 'allow_public_bind = true' \ + > docker-ctx/zeroclaw-data/.zeroclaw/config.toml + + cp Dockerfile.ci docker-ctx/Dockerfile + cp Dockerfile.debian.ci docker-ctx/Dockerfile.debian + + - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 + + - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 + with: + context: docker-ctx + push: true + tags: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.validate.outputs.tag }} + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest + platforms: linux/amd64,linux/arm64 + + - name: Build and push Debian compatibility image + uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 + with: + context: docker-ctx + file: docker-ctx/Dockerfile.debian + push: true + tags: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.validate.outputs.tag }}-debian + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:debian + platforms: linux/amd64,linux/arm64 + + # ── Post-publish: package manager auto-sync ───────────────────────── + scoop: + name: Update Scoop Manifest + needs: [validate, publish] + if: ${{ !cancelled() && needs.publish.result == 'success' }} + uses: ./.github/workflows/pub-scoop.yml + with: + release_tag: ${{ needs.validate.outputs.tag }} + dry_run: false + secrets: inherit + + aur: + name: Update AUR Package + needs: [validate, publish] + if: ${{ !cancelled() && needs.publish.result == 'success' }} + uses: ./.github/workflows/pub-aur.yml + with: + release_tag: ${{ needs.validate.outputs.tag }} + dry_run: false + secrets: inherit + + homebrew: + name: Update Homebrew Core + needs: [validate, publish] + if: ${{ !cancelled() && needs.publish.result == 'success' }} + uses: ./.github/workflows/pub-homebrew-core.yml + with: + release_tag: ${{ needs.validate.outputs.tag }} + dry_run: false + secrets: inherit + + # ── Post-publish: announce after release + website are live ─────────── + # Docker push can be slow; don't let it block announcements. + tweet: + name: Tweet Release + needs: [validate, publish, redeploy-website] + if: ${{ !cancelled() && needs.publish.result == 'success' }} + uses: ./.github/workflows/tweet-release.yml + with: + release_tag: ${{ needs.validate.outputs.tag }} + release_url: https://github.com/zeroclaw-labs/zeroclaw/releases/tag/${{ needs.validate.outputs.tag }} + secrets: inherit + + discord: + name: Discord Announcement + needs: [validate, publish, redeploy-website] + if: ${{ !cancelled() && needs.publish.result == 'success' }} + uses: ./.github/workflows/discord-release.yml + with: + release_tag: ${{ needs.validate.outputs.tag }} + release_url: https://github.com/zeroclaw-labs/zeroclaw/releases/tag/${{ needs.validate.outputs.tag }} + secrets: inherit diff --git a/third_party/zeroclaw/.github/workflows/tweet-release.yml b/third_party/zeroclaw/.github/workflows/tweet-release.yml new file mode 100644 index 0000000..4ae7e1f --- /dev/null +++ b/third_party/zeroclaw/.github/workflows/tweet-release.yml @@ -0,0 +1,308 @@ +name: Tweet Release + +on: + # Called by release workflows AFTER all publish steps (docker, crates, website) complete. + workflow_call: + inputs: + release_tag: + description: "Stable release tag (e.g. v0.3.0)" + required: true + type: string + release_url: + description: "GitHub Release URL" + required: true + type: string + secrets: + TWITTER_CONSUMER_API_KEY: + required: false + TWITTER_CONSUMER_API_SECRET_KEY: + required: false + TWITTER_ACCESS_TOKEN: + required: false + TWITTER_ACCESS_TOKEN_SECRET: + required: false + workflow_dispatch: + inputs: + tweet_text: + description: "Custom tweet text (include emojis, keep it punchy)" + required: true + type: string + image_url: + description: "Optional image URL to attach (png/jpg)" + required: false + type: string + +jobs: + tweet: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + with: + fetch-depth: 0 + + - name: Check for new features + id: check + shell: bash + env: + RELEASE_TAG: ${{ inputs.release_tag || '' }} + MANUAL_TEXT: ${{ inputs.tweet_text || '' }} + run: | + # Manual dispatch always proceeds + if [ -n "$MANUAL_TEXT" ]; then + echo "skip=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # Stable releases (no -beta suffix) always tweet — they represent + # the full release cycle, so skipping them loses visibility. + if [[ ! "$RELEASE_TAG" =~ -beta\. ]]; then + echo "Stable release ${RELEASE_TAG} — always tweet" + echo "skip=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # Find the previous STABLE release tag (exclude betas) to check for new features + PREV_TAG=$(git tag --sort=-creatordate \ + | grep -v "^${RELEASE_TAG}$" \ + | grep -vE '\-beta\.' \ + | head -1 || echo "") + + if [ -z "$PREV_TAG" ]; then + echo "skip=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # Count new feat() OR fix() commits since the previous release + NEW_CHANGES=$(git log "${PREV_TAG}..${RELEASE_TAG}" --pretty=format:"%s" --no-merges \ + | grep -ciE '^(feat|fix)(\(|:)' || echo "0") + + if [ "$NEW_CHANGES" -eq 0 ]; then + echo "No new features or fixes since ${PREV_TAG} — skipping tweet" + echo "skip=true" >> "$GITHUB_OUTPUT" + else + echo "${NEW_CHANGES} new change(s) since ${PREV_TAG} — tweeting" + echo "skip=false" >> "$GITHUB_OUTPUT" + fi + + - name: Build tweet text + id: tweet + if: steps.check.outputs.skip != 'true' + shell: bash + env: + RELEASE_TAG: ${{ inputs.release_tag || '' }} + RELEASE_URL: ${{ inputs.release_url || '' }} + MANUAL_TEXT: ${{ inputs.tweet_text || '' }} + run: | + set -euo pipefail + + if [ -n "$MANUAL_TEXT" ]; then + TWEET="$MANUAL_TEXT" + else + # Diff against the last STABLE release (exclude betas) to capture + # ALL features accumulated across the full beta cycle + PREV_STABLE=$(git tag --sort=-creatordate \ + | grep -v "^${RELEASE_TAG}$" \ + | grep -vE '\-beta\.' \ + | head -1 || echo "") + + RANGE="${PREV_STABLE:+${PREV_STABLE}..}${RELEASE_TAG}" + + # Extract ALL features since the last stable release + FEATURES=$(git log "$RANGE" --pretty=format:"%s" --no-merges \ + | grep -iE '^feat(\(|:)' \ + | sed 's/^feat(\([^)]*\)): /\1: /' \ + | sed 's/^feat: //' \ + | sed 's/ (#[0-9]*)$//' \ + | sort -uf || true) + + FEAT_COUNT=$(echo "$FEATURES" | grep -c . || echo "0") + + # Format top features with rocket emoji (limit to 6 for tweet space) + FEAT_LIST=$(echo "$FEATURES" \ + | head -6 \ + | while IFS= read -r line; do echo "🚀 ${line}"; done || true) + + if [ -z "$FEAT_LIST" ]; then + FEAT_LIST="🚀 Incremental improvements and polish" + fi + + # Build tweet — feature-focused style + TWEET=$(printf "🦀 ZeroClaw %s\n\n%s\n\nZero overhead. Zero compromise. 100%% Rust.\n\n#zeroclaw #rust #ai #opensource" \ + "$RELEASE_TAG" "$FEAT_LIST") + fi + + # X/Twitter counts any URL as 23 chars (t.co shortening). + # Extract the URL (if present), truncate the BODY to fit, then + # re-append the URL so it is never chopped. + URL="" + BODY="$TWEET" + + # Pull URL out of existing tweet text or use RELEASE_URL + FOUND_URL=$(echo "$TWEET" | grep -oE 'https?://[^ ]+' | tail -1 || true) + if [ -n "$FOUND_URL" ]; then + URL="$FOUND_URL" + BODY=$(echo "$TWEET" | sed "s|${URL}||" | sed -e 's/[[:space:]]*$//') + elif [ -n "$RELEASE_URL" ]; then + URL="$RELEASE_URL" + fi + + if [ -n "$URL" ]; then + # URL counts as 23 chars on X + 2 chars for \n\n separator = 25 + MAX_BODY=$((280 - 25)) + if [ ${#BODY} -gt $MAX_BODY ]; then + BODY="${BODY:0:$((MAX_BODY - 3))}..." + fi + TWEET=$(printf "%s\n\n%s" "$BODY" "$URL") + else + if [ ${#TWEET} -gt 280 ]; then + TWEET="${TWEET:0:277}..." + fi + fi + + echo "--- Tweet preview ---" + echo "$TWEET" + echo "--- ${#TWEET} chars ---" + + { + echo "text<> "$GITHUB_OUTPUT" + + - name: Check for duplicate tweet + id: dedup + if: steps.check.outputs.skip != 'true' + shell: bash + env: + TWEET_TEXT: ${{ steps.tweet.outputs.text }} + run: | + # Hash the tweet content (ignore whitespace differences) + TWEET_HASH=$(echo "$TWEET_TEXT" | tr -s '[:space:]' | sha256sum | cut -d' ' -f1) + echo "hash=${TWEET_HASH}" >> "$GITHUB_OUTPUT" + + # Check if we already have a cache hit for this exact tweet + MARKER_FILE="/tmp/tweet-dedup-${TWEET_HASH}" + echo "$TWEET_HASH" > "$MARKER_FILE" + + - uses: actions/cache@v4 + if: steps.check.outputs.skip != 'true' + id: tweet-cache + with: + path: /tmp/tweet-dedup-${{ steps.dedup.outputs.hash }} + key: tweet-${{ steps.dedup.outputs.hash }} + + - name: Skip duplicate tweet + if: steps.check.outputs.skip != 'true' && steps.tweet-cache.outputs.cache-hit == 'true' + run: | + echo "::warning::Duplicate tweet detected (hash=${{ steps.dedup.outputs.hash }}) — skipping" + echo "This exact tweet was already posted in a previous run." + + - name: Post to X + if: steps.check.outputs.skip != 'true' && steps.tweet-cache.outputs.cache-hit != 'true' + shell: bash + env: + TWITTER_CONSUMER_KEY: ${{ secrets.TWITTER_CONSUMER_API_KEY }} + TWITTER_CONSUMER_SECRET: ${{ secrets.TWITTER_CONSUMER_API_SECRET_KEY }} + TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }} + TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} + TWEET_TEXT: ${{ steps.tweet.outputs.text }} + IMAGE_URL: ${{ inputs.image_url || '' }} + run: | + set -euo pipefail + + # Skip if Twitter secrets are not configured + if [ -z "$TWITTER_CONSUMER_KEY" ] || [ -z "$TWITTER_ACCESS_TOKEN" ]; then + echo "::warning::Twitter secrets not configured — skipping tweet" + exit 0 + fi + + pip install requests requests-oauthlib --quiet + + python3 - <<'PYEOF' + import os, sys, time + from requests_oauthlib import OAuth1Session + + consumer_key = os.environ["TWITTER_CONSUMER_KEY"] + consumer_secret = os.environ["TWITTER_CONSUMER_SECRET"] + access_token = os.environ["TWITTER_ACCESS_TOKEN"] + access_token_secret = os.environ["TWITTER_ACCESS_TOKEN_SECRET"] + tweet_text = os.environ["TWEET_TEXT"] + image_url = os.environ.get("IMAGE_URL", "") + + oauth = OAuth1Session( + consumer_key, + client_secret=consumer_secret, + resource_owner_key=access_token, + resource_owner_secret=access_token_secret, + ) + + media_id = None + + # Upload image if provided + if image_url: + import requests + print(f"Downloading image: {image_url}") + img_resp = requests.get(image_url, timeout=30) + img_resp.raise_for_status() + + content_type = img_resp.headers.get("content-type", "image/png") + init_resp = oauth.post( + "https://upload.twitter.com/1.1/media/upload.json", + data={ + "command": "INIT", + "total_bytes": len(img_resp.content), + "media_type": content_type, + }, + ) + if init_resp.status_code != 202: + print(f"Media INIT failed: {init_resp.status_code} {init_resp.text}", file=sys.stderr) + sys.exit(1) + + media_id = init_resp.json()["media_id_string"] + + append_resp = oauth.post( + "https://upload.twitter.com/1.1/media/upload.json", + data={"command": "APPEND", "media_id": media_id, "segment_index": 0}, + files={"media_data": img_resp.content}, + ) + if append_resp.status_code not in (200, 204): + print(f"Media APPEND failed: {append_resp.status_code} {append_resp.text}", file=sys.stderr) + sys.exit(1) + + fin_resp = oauth.post( + "https://upload.twitter.com/1.1/media/upload.json", + data={"command": "FINALIZE", "media_id": media_id}, + ) + if fin_resp.status_code not in (200, 201): + print(f"Media FINALIZE failed: {fin_resp.status_code} {fin_resp.text}", file=sys.stderr) + sys.exit(1) + + state = fin_resp.json().get("processing_info", {}).get("state") + while state == "pending" or state == "in_progress": + wait = fin_resp.json().get("processing_info", {}).get("check_after_secs", 2) + time.sleep(wait) + status_resp = oauth.get( + "https://upload.twitter.com/1.1/media/upload.json", + params={"command": "STATUS", "media_id": media_id}, + ) + state = status_resp.json().get("processing_info", {}).get("state") + fin_resp = status_resp + + print(f"Image uploaded: media_id={media_id}") + + # Post tweet + payload = {"text": tweet_text} + if media_id: + payload["media"] = {"media_ids": [media_id]} + + resp = oauth.post("https://api.x.com/2/tweets", json=payload) + + if resp.status_code == 201: + data = resp.json() + tweet_id = data["data"]["id"] + print(f"Tweet posted: https://x.com/zeroclawlabs/status/{tweet_id}") + else: + print(f"Failed to post tweet: {resp.status_code}", file=sys.stderr) + print(resp.text, file=sys.stderr) + sys.exit(1) + PYEOF diff --git a/third_party/zeroclaw/.gitignore b/third_party/zeroclaw/.gitignore new file mode 100644 index 0000000..143225f --- /dev/null +++ b/third_party/zeroclaw/.gitignore @@ -0,0 +1,54 @@ +/target +/target-*/ +firmware/*/target +web/dist/* +!web/dist/.gitkeep +*.db +*.db-journal +.DS_Store +._* +.wt-pr37/ +__pycache__/ +*.pyc +docker-compose.override.yml + +# Environment files (may contain secrets) +.env + +# Python virtual environments + +.venv/ +venv/ + +# ESP32 build cache (esp-idf-sys managed) + +.embuild/ +.env.local +.env.*.local + +# Secret keys and credentials +.secret_key +*.key +*.pem +credentials.json +.worktrees/ +.zeroclaw/* + +# Skill eval workspaces (test outputs, transcripts, grading) +.claude/skills/*-workspace/ + +# Claude Code agent worktrees (temporary isolated workspaces) +.claude/worktrees/ + +# Local state backups +.local-state-backups/ +*.local-state-backup/ + +# Coverage artifacts +lcov.info + +# IDE's stuff +.idea + +# Wrangler cache +.wrangler/ \ No newline at end of file diff --git a/third_party/zeroclaw/.markdownlint-cli2.yaml b/third_party/zeroclaw/.markdownlint-cli2.yaml new file mode 100644 index 0000000..d6de542 --- /dev/null +++ b/third_party/zeroclaw/.markdownlint-cli2.yaml @@ -0,0 +1,15 @@ +config: + default: true + MD013: false + MD007: false + MD031: false + MD032: false + MD033: false + MD040: false + MD041: false + MD060: false + MD024: + allow_different_nesting: true + +ignores: + - "target/**" diff --git a/third_party/zeroclaw/.vscode/extensions.json b/third_party/zeroclaw/.vscode/extensions.json new file mode 100644 index 0000000..0ea0454 --- /dev/null +++ b/third_party/zeroclaw/.vscode/extensions.json @@ -0,0 +1,14 @@ +{ + "recommendations": [ + "rust-lang.rust-analyzer", + "vadimcn.vscode-lldb", + "serayuzgur.crates", + "bungcip.better-toml", + "usernamehw.errorlens", + "eamodio.gitlens", + "tamasfe.even-better-toml", + "dbaeumer.vscode-eslint", + "oderwat.indent-rainbow", + "ryanluker.vscode-coverage-gutters" + ] +} diff --git a/third_party/zeroclaw/.vscode/launch.json b/third_party/zeroclaw/.vscode/launch.json new file mode 100644 index 0000000..1650335 --- /dev/null +++ b/third_party/zeroclaw/.vscode/launch.json @@ -0,0 +1,73 @@ +{ + "version": "0.2.0", + "inputs": [ + { + "id": "testName", + "description": "Exact test name to debug (e.g. tests::my_test)", + "type": "promptString", + "default": "" + } + ], + "configurations": [ + // ── Runtime ─────────────────────────────────────────── + { + "type": "lldb", + "request": "launch", + "name": "Debug: Agent", + "program": "${workspaceFolder}/target/debug/zeroclaw", + "args": ["agent"], + "cwd": "${workspaceFolder}", + "preLaunchTask": "Build: Debug" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug: Gateway", + "program": "${workspaceFolder}/target/debug/zeroclaw", + "args": ["gateway"], + "cwd": "${workspaceFolder}", + "preLaunchTask": "Build: Debug" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug: Daemon", + "program": "${workspaceFolder}/target/debug/zeroclaw", + "args": ["daemon"], + "cwd": "${workspaceFolder}", + "preLaunchTask": "Build: Debug" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug: Status", + "program": "${workspaceFolder}/target/debug/zeroclaw", + "args": ["status"], + "cwd": "${workspaceFolder}", + "preLaunchTask": "Build: Debug" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug: Onboard", + "program": "${workspaceFolder}/target/debug/zeroclaw", + "args": ["onboard"], + "cwd": "${workspaceFolder}", + "preLaunchTask": "Build: Debug" + }, + // ── Test ────────────────────────────────────────────── + { + "type": "lldb", + "request": "launch", + "name": "Debug: Test (by name)", + "cargo": { + "args": ["test", "--no-run", "--lib", "--"], + "filter": { + "kind": "lib" + } + }, + "args": ["--exact", "${input:testName}", "--nocapture"], + "cwd": "${workspaceFolder}" + } + ] +} diff --git a/third_party/zeroclaw/.vscode/settings.json b/third_party/zeroclaw/.vscode/settings.json new file mode 100644 index 0000000..5ca32a7 --- /dev/null +++ b/third_party/zeroclaw/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "git.autofetch": true, + "git.autofetchPeriod": 90, + "search.exclude": { + "**/target": true + }, + "files.watcherExclude": { + "**/target/**": true + }, + "[rust]": { + "editor.defaultFormatter": "rust-lang.rust-analyzer" + }, + "editor.formatOnSave": true, + "editor.formatOnPaste": true, + "files.autoSave": "afterDelay", + "files.autoSaveDelay": 1000, + "rust-analyzer.check.command": "clippy", + "rust-analyzer.check.extraArgs": ["--all-targets", "--", "-D", "warnings"], + "window.title": "${activeRepositoryBranchName}", + "coverage-gutters.coverageFileNames": ["lcov.info"], + "git.postCommitCommand": "push" +} diff --git a/third_party/zeroclaw/.vscode/tasks.json b/third_party/zeroclaw/.vscode/tasks.json new file mode 100644 index 0000000..fac8eeb --- /dev/null +++ b/third_party/zeroclaw/.vscode/tasks.json @@ -0,0 +1,133 @@ +{ + "version": "2.0.0", + "inputs": [ + { + "id": "testFilter", + "description": "Test name or filter pattern", + "type": "promptString", + "default": "" + } + ], + "tasks": [ + // ── Build ────────────────────────────────────────────── + { + "label": "Build: Debug", + "type": "shell", + "command": "cargo", + "args": ["build"], + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": ["$rustc"] + }, + { + "label": "Build: Release", + "type": "shell", + "command": "cargo", + "args": ["build", "--release"], + "problemMatcher": ["$rustc"] + }, + { + "label": "Build: Check (fast)", + "type": "shell", + "command": "cargo", + "args": ["check", "--all-targets"], + "problemMatcher": ["$rustc"] + }, + // ── Lint ─────────────────────────────────────────────── + { + "label": "Lint: Clippy", + "type": "shell", + "command": "cargo", + "args": ["clippy", "--all-targets", "--", "-D", "warnings"], + "problemMatcher": ["$rustc"] + }, + { + "label": "Lint: Format Check", + "type": "shell", + "command": "cargo", + "args": ["fmt", "--all", "--", "--check"], + "problemMatcher": [] + }, + { + "label": "Lint: Format Fix", + "type": "shell", + "command": "cargo", + "args": ["fmt", "--all"], + "problemMatcher": [] + }, + // ── Test ────────────────────────────────────────────── + { + "label": "Test: All", + "type": "shell", + "command": "cargo nextest --version >/dev/null 2>&1 || cargo install cargo-nextest && cargo nextest run", + "group": { + "kind": "test", + "isDefault": true + }, + "problemMatcher": ["$rustc"] + }, + { + "label": "Test: Filtered", + "type": "shell", + "command": "cargo nextest --version >/dev/null 2>&1 || cargo install cargo-nextest && cargo nextest run -E 'test(${input:testFilter})'", + "problemMatcher": ["$rustc"] + }, + { + "label": "Test: Coverage Report", + "type": "shell", + "command": "cargo llvm-cov --version >/dev/null 2>&1 || cargo install cargo-llvm-cov && cargo llvm-cov --lcov --output-path lcov.info", + "problemMatcher": [] + }, + { + "label": "Test: Benchmarks", + "type": "shell", + "command": "cargo", + "args": ["bench"], + "problemMatcher": [] + }, + // ── Security ────────────────────────────────────────── + { + "label": "Security: Audit", + "type": "shell", + "command": "cargo audit --version >/dev/null 2>&1 || cargo install cargo-audit && cargo audit", + "problemMatcher": [] + }, + { + "label": "Security: Deny (licenses + sources)", + "type": "shell", + "command": "cargo deny --version >/dev/null 2>&1 || cargo install cargo-deny && cargo deny check licenses sources", + "problemMatcher": [] + }, + // ── CI (Docker) ─────────────────────────────────────── + { + "label": "CI: All (Docker)", + "type": "shell", + "command": "./dev/ci.sh", + "args": ["all"], + "problemMatcher": [] + }, + { + "label": "CI: Lint (Docker)", + "type": "shell", + "command": "./dev/ci.sh", + "args": ["lint"], + "problemMatcher": [] + }, + { + "label": "CI: Test (Docker)", + "type": "shell", + "command": "./dev/ci.sh", + "args": ["test"], + "problemMatcher": [] + }, + { + "label": "CI: Security (Docker)", + "type": "shell", + "command": "./dev/ci.sh", + "args": ["security"], + "problemMatcher": [] + } + ] +} diff --git a/third_party/zeroclaw/AGENTS.md b/third_party/zeroclaw/AGENTS.md new file mode 100644 index 0000000..9ff031a --- /dev/null +++ b/third_party/zeroclaw/AGENTS.md @@ -0,0 +1,92 @@ +# AGENTS.md — ZeroClaw + +Cross-tool agent instructions for any AI coding assistant working on this repository. + +## Commands + +```bash +cargo fmt --all -- --check +cargo clippy --all-targets -- -D warnings +cargo test +``` + +Full pre-PR validation (recommended): + +```bash +./dev/ci.sh all +``` + +Docs-only changes: run markdown lint and link-integrity checks. If touching bootstrap scripts: `bash -n install.sh`. + +## Project Snapshot + +ZeroClaw is a Rust-first autonomous agent runtime optimized for performance, efficiency, stability, extensibility, sustainability, and security. + +Core architecture is trait-driven and modular. Extend by implementing traits and registering in factory modules. + +Key extension points: + +- `src/providers/traits.rs` (`Provider`) +- `src/channels/traits.rs` (`Channel`) +- `src/tools/traits.rs` (`Tool`) +- `src/memory/traits.rs` (`Memory`) +- `src/observability/traits.rs` (`Observer`) +- `src/runtime/traits.rs` (`RuntimeAdapter`) +- `src/peripherals/traits.rs` (`Peripheral`) — hardware boards (STM32, RPi GPIO) + +## Repository Map + +- `src/main.rs` — CLI entrypoint and command routing +- `src/lib.rs` — module exports and shared command enums +- `src/config/` — schema + config loading/merging +- `src/agent/` — orchestration loop +- `src/gateway/` — webhook/gateway server +- `src/security/` — policy, pairing, secret store +- `src/memory/` — markdown/sqlite memory backends + embeddings/vector merge +- `src/providers/` — model providers and resilient wrapper +- `src/channels/` — Telegram/Discord/Slack/etc channels +- `src/tools/` — tool execution surface (shell, file, memory, browser) +- `src/peripherals/` — hardware peripherals (STM32, RPi GPIO) +- `src/runtime/` — runtime adapters (currently native) +- `docs/` — topic-based documentation (setup-guides, reference, ops, security, hardware, contributing, maintainers) +- `.github/` — CI, templates, automation workflows + +## Risk Tiers + +- **Low risk**: docs/chore/tests-only changes +- **Medium risk**: most `src/**` behavior changes without boundary/security impact +- **High risk**: `src/security/**`, `src/runtime/**`, `src/gateway/**`, `src/tools/**`, `.github/workflows/**`, access-control boundaries + +When uncertain, classify as higher risk. + +## Workflow + +1. **Read before write** — inspect existing module, factory wiring, and adjacent tests before editing. +2. **One concern per PR** — avoid mixed feature+refactor+infra patches. +3. **Implement minimal patch** — no speculative abstractions, no config keys without a concrete use case. +4. **Validate by risk tier** — docs-only: lightweight checks. Code changes: full relevant checks. +5. **Document impact** — update PR notes for behavior, risk, side effects, and rollback. +6. **Queue hygiene** — stacked PR: declare `Depends on #...`. Replacing old PR: declare `Supersedes #...`. + +Branch/commit/PR rules: +- Work from a non-`master` branch. Open a PR to `master`; do not push directly. +- Use conventional commit titles. Prefer small PRs (`size: XS/S/M`). +- Follow `.github/pull_request_template.md` fully. +- Never commit secrets, personal data, or real identity information (see `@docs/contributing/pr-discipline.md`). + +## Anti-Patterns + +- Do not add heavy dependencies for minor convenience. +- Do not silently weaken security policy or access constraints. +- Do not add speculative config/feature flags "just in case". +- Do not mix massive formatting-only changes with functional changes. +- Do not modify unrelated modules "while here". +- Do not bypass failing checks without explicit explanation. +- Do not hide behavior-changing side effects in refactor commits. +- Do not include personal identity or sensitive information in test data, examples, docs, or commits. + +## Linked References + +- `@docs/contributing/change-playbooks.md` — adding providers, channels, tools, peripherals; security/gateway changes; architecture boundaries +- `@docs/contributing/pr-discipline.md` — privacy rules, superseded-PR attribution/templates, handoff template +- `@docs/contributing/docs-contract.md` — docs system contract, i18n rules, locale parity diff --git a/third_party/zeroclaw/CHANGELOG.md b/third_party/zeroclaw/CHANGELOG.md new file mode 100644 index 0000000..825c32f --- /dev/null +++ b/third_party/zeroclaw/CHANGELOG.md @@ -0,0 +1 @@ +# Changelog diff --git a/third_party/zeroclaw/CLAUDE.md b/third_party/zeroclaw/CLAUDE.md new file mode 100644 index 0000000..d5d8466 --- /dev/null +++ b/third_party/zeroclaw/CLAUDE.md @@ -0,0 +1,16 @@ +# CLAUDE.md — ZeroClaw (Claude Code) + +> **Shared instructions live in [`AGENTS.md`](./AGENTS.md).** +> This file contains only Claude Code-specific directives. + +## Claude Code Settings + +Claude Code should read and follow all instructions in `AGENTS.md` at the repository root for project conventions, commands, risk tiers, workflow rules, and anti-patterns. + +## Hooks + +_No custom hooks defined yet._ + +## Slash Commands + +_No custom slash commands defined yet._ diff --git a/third_party/zeroclaw/CODE_OF_CONDUCT.md b/third_party/zeroclaw/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..3436d25 --- /dev/null +++ b/third_party/zeroclaw/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +https://x.com/argenistherose. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/third_party/zeroclaw/CONTRIBUTING.md b/third_party/zeroclaw/CONTRIBUTING.md new file mode 100644 index 0000000..e698669 --- /dev/null +++ b/third_party/zeroclaw/CONTRIBUTING.md @@ -0,0 +1,582 @@ +# Contributing to ZeroClaw + +Thanks for your interest in contributing to ZeroClaw! This guide will help you get started. + +--- + +## ⚠️ Branch Migration Notice (March 2026) + +**`master` is the ONLY default branch. The `main` branch no longer exists.** + +If you have an existing fork or local clone that tracks `main`, you **must** update it: + +```bash +# Update your local clone to track master +git checkout master +git branch -D main 2>/dev/null # delete local main if it exists +git remote set-head origin master +git fetch origin --prune # remove stale remote refs + +# If your fork still has a main branch, delete it +git push origin --delete main 2>/dev/null +``` + +All PRs must target **`master`**. PRs targeting `main` will be rejected. + +**Background:** ZeroClaw previously used `main` in some documentation and scripts, which caused 404 errors, broken CI refs, and contributor confusion (see [#2929](https://github.com/zeroclaw-labs/zeroclaw/issues/2929), [#3061](https://github.com/zeroclaw-labs/zeroclaw/issues/3061), [#3194](https://github.com/zeroclaw-labs/zeroclaw/pull/3194)). As of March 2026, all references have been corrected, stale branches cleaned up, and the `main` branch permanently deleted. + +--- + +## Branching Model + +> **`master`** is the single source-of-truth branch. +> +> **How contributors should work:** +> 1. Fork the repository +> 2. Create a `feat/*` or `fix/*` branch from `master` +> 3. Open a PR targeting `master` +> +> Do **not** create or push to a `main` branch. There is no `main` branch — it will not work. + +## First-Time Contributors + +Welcome — contributions of all sizes are valued. If this is your first contribution, here is how to get started: + +1. **Find an issue.** Look for issues labeled [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — these are scoped for newcomers and include context to get moving quickly. + +2. **Pick a scope.** Good first contributions include: + - Typo and documentation fixes + - Test additions or improvements + - Small bug fixes with clear reproduction steps + +3. **Follow the fork → branch → change → test → PR workflow:** + - Fork the repository and clone your fork + - Create a feature branch (`git checkout -b feat/my-change` or `git checkout -b fix/my-change`) + - Make your changes and run `cargo fmt && cargo clippy && cargo test` + - Open a PR against `master` using the PR template + +4. **Start with Track A.** ZeroClaw uses three [collaboration tracks](#collaboration-tracks-risk-based) (A/B/C) based on risk. First-time contributors should target **Track A** (docs, tests, chore) — these require lighter review and are the fastest path to a merged PR. + +If you get stuck, open a draft PR early and ask questions in the description. + +## Development Setup + +```bash +# Clone the repo +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +# Enable the pre-push hook (runs fmt, clippy, tests before every push) +git config core.hooksPath .githooks + +# Build +cargo build + +# Run tests (all must pass) +cargo test --locked + +# Format & lint (required before PR) +./scripts/ci/rust_quality_gate.sh + +# Optional strict lint audit (full repo, recommended periodically) +./scripts/ci/rust_quality_gate.sh --strict + +# Optional strict lint delta gate (blocks only changed Rust lines) +./scripts/ci/rust_strict_delta_gate.sh + +# Optional docs lint gate (blocks only markdown issues on changed lines) +./scripts/ci/docs_quality_gate.sh + +# Optional docs links gate (checks only links added on changed lines) +./scripts/ci/docs_links_gate.sh + +# Release build +cargo build --release --locked +``` + +### Pre-push hook + +The repo includes a pre-push hook in `.githooks/` that enforces `./scripts/ci/rust_quality_gate.sh` and `cargo test --locked` before every push. Enable it with `git config core.hooksPath .githooks`. + +For an opt-in strict lint pass during pre-push, set: + +```bash +ZEROCLAW_STRICT_LINT=1 git push +``` + +For an opt-in strict lint delta pass during pre-push (changed Rust lines only), set: + +```bash +ZEROCLAW_STRICT_DELTA_LINT=1 git push +``` + +For an opt-in docs quality pass during pre-push (changed-line markdown gate), set: + +```bash +ZEROCLAW_DOCS_LINT=1 git push +``` + +For an opt-in docs links pass during pre-push (added-links gate), set: + +```bash +ZEROCLAW_DOCS_LINKS=1 git push +``` + +For full CI parity in Docker, run: + +```bash +./dev/ci.sh all +``` + +To skip it during rapid iteration: + +```bash +git push --no-verify +``` + +> **Note:** CI runs the same checks, so skipped hooks will be caught on the PR. + +## Local Secret Management (Required) + +ZeroClaw supports layered secret management for local development and CI hygiene. + +### Secret Storage Options + +1. **Environment variables** (recommended for local development) + - Copy `.env.example` to `.env` and fill in values + - `.env` files are Git-ignored and should stay local + - Best for temporary/local API keys + +2. **Config file** (`~/.zeroclaw/config.toml`) + - Persistent setup for long-term use + - When `secrets.encrypt = true` (default), secret values are encrypted before save + - Secret key is stored at `~/.zeroclaw/.secret_key` with restricted permissions + - Use `zeroclaw onboard` for guided setup + +### Runtime Resolution Rules + +API key resolution follows this order: + +1. Explicit key passed from config/CLI +2. Provider-specific env vars (`OPENROUTER_API_KEY`, `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, ...) +3. Generic env vars (`ZEROCLAW_API_KEY`, `API_KEY`) + +Provider/model config overrides: + +- `ZEROCLAW_PROVIDER` / `PROVIDER` +- `ZEROCLAW_MODEL` + +See `.env.example` for practical examples and currently supported provider key env vars. + +### Pre-Commit Secret Hygiene (Mandatory) + +Before every commit, verify: + +- [ ] No `.env` files are staged (`.env.example` only) +- [ ] No raw API keys/tokens in code, tests, fixtures, examples, logs, or commit messages +- [ ] No credentials in debug output or error payloads +- [ ] `git diff --cached` has no accidental secret-like strings + +Quick local audit: + +```bash +# Search staged diff for common secret markers +git diff --cached | grep -iE '(api[_-]?key|secret|token|password|bearer|sk-)' + +# Confirm no .env file is staged +git status --short | grep -E '\.env$' +``` + +### Optional Local Secret Scanning + +For extra guardrails, install one of: + +- **gitleaks**: [GitHub - gitleaks/gitleaks](https://github.com/gitleaks/gitleaks) +- **truffleHog**: [GitHub - trufflesecurity/trufflehog](https://github.com/trufflesecurity/trufflehog) +- **git-secrets**: [GitHub - awslabs/git-secrets](https://github.com/awslabs/git-secrets) + +This repo includes `.githooks/pre-commit` to run `gitleaks protect --staged --redact` when gitleaks is installed. + +Enable hooks with: + +```bash +git config core.hooksPath .githooks +``` + +If gitleaks is not installed, the pre-commit hook prints a warning and continues. + +### What Must Never Be Committed + +- `.env` files (use `.env.example` only) +- API keys, tokens, passwords, or credentials (plain or encrypted) +- OAuth tokens or session identifiers +- Webhook signing secrets +- `~/.zeroclaw/.secret_key` or similar key files +- Personal identifiers or real user data in tests/fixtures + +### If a Secret Is Committed Accidentally + +1. Revoke/rotate the credential immediately +2. Do not rely only on `git revert` (history still contains the secret) +3. Purge history with `git filter-repo` or BFG +4. Force-push cleaned history (coordinate with maintainers) +5. Ensure the leaked value is removed from PR/issue/discussion/comment history + +Reference: [GitHub guide: removing sensitive data from a repository](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository) + +## Collaboration Tracks (Risk-Based) + +To keep review throughput high without lowering quality, every PR should map to one track: + +| Track | Typical scope | Required review depth | +|---|---|---| +| **Track A (Low risk)** | docs/tests/chore, isolated refactors, no security/runtime/CI impact | 1 maintainer review + green `CI Required Gate` | +| **Track B (Medium risk)** | providers/channels/memory/tools behavior changes | 1 subsystem-aware review + explicit validation evidence | +| **Track C (High risk)** | `src/security/**`, `src/runtime/**`, `src/gateway/**`, `.github/workflows/**`, access-control boundaries | 2-pass review (fast triage + deep risk review), rollback plan required | + +When in doubt, choose the higher track. + +## Documentation Optimization Principles + +To keep docs useful under high PR volume, we use these rules: + +- **Single source of truth**: policy lives in docs, not scattered across PR comments. +- **Decision-oriented content**: every checklist item should directly help accept/reject a change. +- **Risk-proportionate detail**: high-risk paths need deeper evidence; low-risk paths stay lightweight. +- **Side-effect visibility**: document blast radius, failure modes, and rollback before merge. +- **Automation assists, humans decide**: bots triage and label, but merge accountability stays human. +- **Index-first discoverability**: `docs/README.md` is the first entry point for operational documentation. +- **Template-first authoring**: start new operational docs from `docs/contributing/doc-template.md`. + +### Documentation System Map + +| Doc | Primary purpose | When to update | +|---|---|---| +| `docs/README.md` | canonical docs index and taxonomy | add/remove docs or change documentation ownership/navigation | +| `docs/contributing/doc-template.md` | standard skeleton for new operational documentation | when required sections or documentation quality bar changes | +| `CONTRIBUTING.md` | contributor contract and readiness baseline | contributor expectations or policy changes | +| `docs/contributing/pr-workflow.md` | governance logic and merge contract | workflow/risk/merge gate changes | +| `docs/contributing/reviewer-playbook.md` | reviewer operating checklist | review depth or triage behavior changes | +| `docs/contributing/ci-map.md` | CI ownership and triage entry points | workflow trigger/job ownership changes | +| `docs/ops/network-deployment.md` | runtime deployment and network operating guide | gateway/channel/tunnel/network runtime behavior changes | +| `docs/ops/proxy-agent-playbook.md` | agent-operable proxy runbook and rollback recipes | proxy scope/selector/tooling behavior changes | + +## PR Definition of Ready (DoR) + +Before requesting review, ensure all of the following are true: + +- Scope is focused to a single concern. +- `.github/pull_request_template.md` is fully completed. +- Relevant local validation has been run (`fmt`, `clippy`, `test`, scenario checks). +- Security impact and rollback path are explicitly described. +- No personal/sensitive data is introduced in code/docs/tests/fixtures/logs/examples/commit messages. +- Tests/fixtures/examples use neutral project-scoped wording (no identity-specific or first-person phrasing). +- If identity-like wording is required, use ZeroClaw-centric labels only (for example: `ZeroClawAgent`, `ZeroClawOperator`, `zeroclaw_user`). +- If docs were changed, update `docs/README.md` navigation and reciprocal links with related docs. +- If a new operational doc was added, start from `docs/contributing/doc-template.md` and keep risk/rollback/troubleshooting sections where applicable. +- Linked issue (or rationale for no issue) is included. + +## PR Definition of Done (DoD) + +A PR is merge-ready when: + +- `CI Required Gate` is green. +- Required reviewers approved (including CODEOWNERS paths). +- Risk level matches changed paths (`risk: low/medium/high`). +- User-visible behavior, migration, and rollback notes are complete. +- Follow-up TODOs are explicit and tracked in issues. +- For documentation changes, links and ownership mapping in `CONTRIBUTING.md` and `docs/README.md` are consistent. + +## High-Volume Collaboration Rules + +When PR traffic is high (especially with AI-assisted contributions), these rules keep quality and throughput stable: + +- **One concern per PR**: avoid mixing refactor + feature + infra in one change. +- **Small PRs first**: prefer PR size `XS/S/M`; split large work into stacked PRs. +- **Template is mandatory**: complete every section in `.github/pull_request_template.md`. +- **Explicit rollback**: every PR must include a fast rollback path. +- **Security-first review**: changes in `src/security/`, runtime, gateway, and CI need stricter validation. +- **Risk-first triage**: use labels (`risk: high`, `risk: medium`, `risk: low`) to route review depth. +- **Privacy-first hygiene**: redact/anonymize sensitive payloads and keep tests/examples neutral and project-scoped. +- **Identity normalization**: when identity traits are unavoidable, use ZeroClaw/project-native roles instead of personal or real-world identities. +- **Supersede hygiene**: if your PR replaces an older open PR, add `Supersedes #...` and request maintainers close the outdated one. + +Full maintainer workflow: [`docs/contributing/pr-workflow.md`](docs/contributing/pr-workflow.md). +CI workflow ownership and triage map: [`docs/contributing/ci-map.md`](docs/contributing/ci-map.md). +Reviewer operating checklist: [`docs/contributing/reviewer-playbook.md`](docs/contributing/reviewer-playbook.md). + +## Agent Collaboration Guidance + +Agent-assisted contributions are welcome and treated as first-class contributions. + +For smoother agent-to-agent and human-to-agent review: + +- Keep PR summaries concrete (problem, change, non-goals). +- Include reproducible validation evidence (`fmt`, `clippy`, `test`, scenario checks). +- Add brief workflow notes when automation materially influenced design/code. +- Agent-assisted PRs are welcome, but contributors remain accountable for understanding what the code does and what it could affect. +- Call out uncertainty and risky edges explicitly. + +We do **not** require PRs to declare an AI-vs-human line ratio. + +Agent implementation playbook lives in [`AGENTS.md`](AGENTS.md). + +## Architecture: Trait-Based Pluggability + +ZeroClaw's architecture is built on **traits** — every subsystem is swappable. This means contributing a new integration is as simple as implementing a trait and registering it in the factory function. + +``` +src/ +├── providers/ # LLM backends → Provider trait +├── channels/ # Messaging → Channel trait +├── observability/ # Metrics/logging → Observer trait +├── runtime/ # Platform adapters → RuntimeAdapter trait +├── tools/ # Agent tools → Tool trait +├── memory/ # Persistence/brain → Memory trait +└── security/ # Sandboxing → SecurityPolicy +``` + +## Code Naming Conventions (Required) + +Use these defaults unless an existing subsystem pattern clearly overrides them. + +- **Rust casing**: modules/files `snake_case`, types/traits/enums `PascalCase`, functions/variables `snake_case`, constants `SCREAMING_SNAKE_CASE`. +- **Domain-first naming**: prefer explicit role names such as `DiscordChannel`, `SecurityPolicy`, `SqliteMemory` over ambiguous names (`Manager`, `Util`, `Helper`). +- **Trait implementers**: keep predictable suffixes (`*Provider`, `*Channel`, `*Tool`, `*Memory`, `*Observer`, `*RuntimeAdapter`). +- **Factory keys**: keep lowercase and stable (`openai`, `discord`, `shell`); avoid adding aliases without migration need. +- **Tests**: use behavior-oriented names (`subject_expected_behavior`) and neutral project-scoped fixtures. +- **Identity-like labels**: if unavoidable, use ZeroClaw-native identifiers only (`ZeroClawAgent`, `zeroclaw_user`, `zeroclaw_node`). + +## Architecture Boundary Rules (Required) + +Keep architecture extensible and auditable by following these boundaries. + +- Extend features via trait implementations + factory registration before considering broad refactors. +- Keep dependency direction contract-first: concrete integrations depend on shared traits/config/util, not on other concrete integrations. +- Avoid cross-subsystem coupling (provider ↔ channel internals, tools mutating security/gateway internals directly, etc.). +- Keep responsibilities single-purpose by module (`agent` orchestration, `channels` transport, `providers` model I/O, `security` policy, `tools` execution, `memory` persistence). +- Introduce shared abstractions only after repeated stable use (rule-of-three) and at least one current caller. +- Treat `src/config/schema.rs` keys as public contract; document compatibility impact, migration steps, and rollback path for changes. + +## Naming and Architecture Examples (Bad vs Good) + +Use these quick examples to align implementation choices before opening a PR. + +### Naming examples + +- **Bad**: `Manager`, `Helper`, `doStuff`, `tmp_data` +- **Good**: `DiscordChannel`, `SecurityPolicy`, `send_message`, `channel_allowlist` + +- **Bad test name**: `test1` / `works` +- **Good test name**: `allowlist_denies_unknown_user`, `provider_returns_error_on_invalid_model` + +- **Bad identity-like label**: `john_user`, `alice_bot` +- **Good identity-like label**: `ZeroClawAgent`, `zeroclaw_user`, `zeroclaw_node` + +### Architecture boundary examples + +- **Bad**: channel implementation directly imports provider internals to call model APIs. +- **Good**: channel emits normalized `ChannelMessage`; agent/runtime orchestrates provider calls via trait contracts. + +- **Bad**: tool mutates gateway/security policy directly from execution path. +- **Good**: tool returns structured `ToolResult`; policy enforcement remains in security/runtime boundaries. + +- **Bad**: adding broad shared abstraction before any repeated caller. +- **Good**: keep local logic first; extract shared abstraction only after stable rule-of-three evidence. + +- **Bad**: config key changes without migration notes. +- **Good**: config/schema changes include defaults, compatibility impact, migration steps, and rollback guidance. + +## How to Add a New Provider + +Create `src/providers/your_provider.rs`: + +```rust +use async_trait::async_trait; +use anyhow::Result; +use crate::providers::traits::Provider; + +pub struct YourProvider { + api_key: String, + client: reqwest::Client, +} + +impl YourProvider { + pub fn new(api_key: Option<&str>) -> Self { + Self { + api_key: api_key.unwrap_or_default().to_string(), + client: reqwest::Client::new(), + } + } +} + +#[async_trait] +impl Provider for YourProvider { + async fn chat(&self, message: &str, model: &str, temperature: f64) -> Result { + // Your API call here + todo!() + } +} +``` + +Then register it in `src/providers/mod.rs`: + +```rust +"your_provider" => Ok(Box::new(your_provider::YourProvider::new(api_key))), +``` + +## How to Add a New Channel + +Create `src/channels/your_channel.rs`: + +```rust +use async_trait::async_trait; +use anyhow::Result; +use tokio::sync::mpsc; +use crate::channels::traits::{Channel, ChannelMessage}; + +pub struct YourChannel { /* config fields */ } + +#[async_trait] +impl Channel for YourChannel { + fn name(&self) -> &str { "your_channel" } + + async fn send(&self, message: &str, recipient: &str) -> Result<()> { + // Send message via your platform + todo!() + } + + async fn listen(&self, tx: mpsc::Sender) -> Result<()> { + // Listen for incoming messages, forward to tx + todo!() + } + + async fn health_check(&self) -> bool { true } +} +``` + +## How to Add a New Observer + +Create `src/observability/your_observer.rs`: + +```rust +use crate::observability::traits::{Observer, ObserverEvent, ObserverMetric}; + +pub struct YourObserver { /* client, config, etc. */ } + +impl Observer for YourObserver { + fn record_event(&self, event: &ObserverEvent) { + // Push event to your backend + } + + fn record_metric(&self, metric: &ObserverMetric) { + // Push metric to your backend + } + + fn name(&self) -> &str { "your_observer" } +} +``` + +## How to Add a New Tool + +Create `src/tools/your_tool.rs`: + +```rust +use async_trait::async_trait; +use anyhow::Result; +use serde_json::{json, Value}; +use crate::tools::traits::{Tool, ToolResult}; + +pub struct YourTool { /* security policy, config, etc. */ } + +#[async_trait] +impl Tool for YourTool { + fn name(&self) -> &str { "your_tool" } + + fn description(&self) -> &str { "Does something useful" } + + fn parameters_schema(&self) -> Value { + json!({ + "type": "object", + "properties": { + "input": { "type": "string", "description": "The input" } + }, + "required": ["input"] + }) + } + + async fn execute(&self, args: Value) -> Result { + let input = args["input"].as_str() + .ok_or_else(|| anyhow::anyhow!("Missing 'input'"))?; + Ok(ToolResult { + success: true, + output: format!("Processed: {input}"), + error: None, + }) + } +} +``` + +## Pull Request Checklist + +- [ ] PR template sections are completed (including security + rollback) +- [ ] `./scripts/ci/rust_quality_gate.sh` — merge gate formatter/lint baseline passes +- [ ] `cargo test --locked` — all tests pass locally or skipped tests are explained +- [ ] Optional strict audit: `./scripts/ci/rust_quality_gate.sh --strict` (full repo, run when doing lint cleanup or release-hardening work) +- [ ] Optional strict delta audit: `./scripts/ci/rust_strict_delta_gate.sh` (changed Rust lines only, useful for incremental debt control) +- [ ] New code has inline `#[cfg(test)]` tests +- [ ] No new dependencies unless absolutely necessary (we optimize for binary size) +- [ ] README updated if adding user-facing features +- [ ] Follows existing code patterns and conventions +- [ ] Follows code naming conventions and architecture boundary rules in this guide +- [ ] No personal/sensitive data in code/docs/tests/fixtures/logs/examples/commit messages +- [ ] Test names/messages/fixtures/examples are neutral and project-focused +- [ ] Any required identity-like wording uses ZeroClaw/project-native labels only + +## Commit Convention + +We use [Conventional Commits](https://www.conventionalcommits.org/): + +``` +feat: add Anthropic provider +feat(provider): add Anthropic provider +fix: path traversal edge case with symlinks +docs: update contributing guide +test: add heartbeat unicode parsing tests +refactor: extract common security checks +chore: bump tokio to 1.43 +``` + +Recommended scope keys in commit titles: + +- `provider`, `channel`, `memory`, `security`, `runtime`, `ci`, `docs`, `tests` + +## Code Style + +- **Minimal dependencies** — every crate adds to binary size +- **Inline tests** — `#[cfg(test)] mod tests {}` at the bottom of each file +- **Trait-first** — define the trait, then implement +- **Security by default** — sandbox everything, allowlist, never blocklist +- **No unwrap in production code** — use `?`, `anyhow`, or `thiserror` + +## Reporting Issues + +- **Bugs**: Include OS, Rust version, steps to reproduce, expected vs actual +- **Features**: Describe the use case, propose which trait to extend +- **Security**: See [SECURITY.md](SECURITY.md) for responsible disclosure +- **Privacy**: Redact/anonymize all personal data and sensitive identifiers before posting logs/payloads + +## Maintainer Merge Policy + +- Require passing `CI Required Gate` before merge. +- Require docs quality checks when docs are touched. +- Require review approval for non-trivial changes. +- Require CODEOWNERS review for protected paths. +- Use risk labels to determine review depth, scope labels (`core`, `provider`, `channel`, `security`, etc.) to route ownership, and module labels (`:`, e.g. `channel:telegram`, `provider:kimi`, `tool:shell`) to route subsystem expertise. +- Contributor tier labels are auto-applied on PRs and issues by merged PR count: `experienced contributor` (>=10), `principal contributor` (>=20), `distinguished contributor` (>=50). Treat them as read-only automation labels; manual edits are auto-corrected. +- Prefer squash merge with conventional commit title. +- Revert fast on regressions; re-land with tests. + +## License + +By contributing, you agree that your contributions will be licensed under the MIT License. diff --git a/third_party/zeroclaw/Cargo.lock b/third_party/zeroclaw/Cargo.lock new file mode 100644 index 0000000..36712a8 --- /dev/null +++ b/third_party/zeroclaw/Cargo.lock @@ -0,0 +1,12652 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aardvark-sys" +version = "0.1.0" +dependencies = [ + "libloading 0.8.9", + "thiserror 2.0.18", +] + +[[package]] +name = "accessory" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e416a3ab45838bac2ab2d81b1088d738d7b2d2c5272a54d39366565a29bd80" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "adobe-cmap-parser" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8abfa9a4688de8fc9f42b3f013b6fffec18ed8a554f5f113577e0b9b3212a3" +dependencies = [ + "pom", +] + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alsa" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" +dependencies = [ + "alsa-sys", + "bitflags 2.11.0", + "cfg-if", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "ambient-authority" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "anymap2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" + +[[package]] +name = "aquamarine" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" +dependencies = [ + "include_dir", + "itertools 0.10.5", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ar_archive_writer" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b" +dependencies = [ + "object 0.37.3", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + +[[package]] +name = "archery" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e0a5f99dfebb87bb342d0f53bb92c81842e100bbb915223e38349580e5441d" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] + +[[package]] +name = "as_variant" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dbc3a507a82b17ba0d98f6ce8fd6954ea0c8152e98009d36a40d8dcc8ce078a" + +[[package]] +name = "assert-json-diff" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "assign" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f093eed78becd229346bf859eec0aa4dd7ddde0757287b2b4107a1f09c80002" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener 5.4.1", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-compression" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" +dependencies = [ + "compression-codecs", + "compression-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-imap" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a78dceaba06f029d8f4d7df20addd4b7370a30206e3926267ecda2915b0f3f66" +dependencies = [ + "async-channel 2.5.0", + "async-compression", + "base64 0.22.1", + "bytes", + "chrono", + "futures", + "imap-proto", + "log", + "nom 7.1.3", + "pin-project", + "pin-utils", + "self_cell", + "stop-token", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener 5.4.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel 2.5.0", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.1", + "futures-lite", + "rustix 1.1.4", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.4", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-utility" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a34a3b57207a7a1007832416c3e4862378c8451b4e8e093e436f48c2d3d2c151" +dependencies = [ + "futures-util", + "gloo-timers", + "tokio", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-wsocket" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c92385c7c8b3eb2de1b78aeca225212e4c9a69a78b802832759b108681a5069" +dependencies = [ + "async-utility", + "futures", + "futures-util", + "js-sys", + "tokio", + "tokio-rustls", + "tokio-socks", + "tokio-tungstenite 0.26.2", + "url", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-destructor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef49f5882e4b6afaac09ad239a4f8c70a24b8f2b0897edb1f706008efd109cf4" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-lc-rs" +version = "1.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa7e52a4c5c547c741610a2c6f123f3881e409b714cd27e6798ef020c514f0a" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "axum" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" +dependencies = [ + "axum-core", + "axum-macros", + "base64 0.22.1", + "bytes", + "form_urlencoded", + "futures-util", + "http 1.4.0", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite 0.28.0", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +dependencies = [ + "bytes", + "futures-core", + "http 1.4.0", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "backon" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +dependencies = [ + "fastrand", + "gloo-timers", + "tokio", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "basic-udev" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a45f9771ced8a774de5e5ebffbe520f52e3943bf5a9a6baa3a5d14a5de1afe6" + +[[package]] +name = "bech32" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32637268377fc7b10a8c6d51de3e7fba1ce5dd371a96e342b34e6078db558e7f" + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.11.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.117", +] + +[[package]] +name = "bip39" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90dbd31c98227229239363921e60fcf5e558e43ec69094d46fc4996f08d1d5bc" +dependencies = [ + "bitcoin_hashes", + "serde", + "unicode-normalization", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitcoin-io" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" +dependencies = [ + "bitcoin-io", + "hex-conservative", + "serde", +] + +[[package]] +name = "bitfield" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21ba6517c6b0f2bf08be60e187ab64b038438f22dd755614d8fe4d4098c46419" +dependencies = [ + "bitfield-macros", +] + +[[package]] +name = "bitfield-macros" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f48d6ace212fdf1b45fd6b566bb40808415344642b76c3224c07c8df9da81e97" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bitmaps" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.2.17", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel 2.5.0", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +dependencies = [ + "allocator-api2", +] + +[[package]] +name = "bytecount" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "bytesize" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd91ee7b2422bcb158d90ef4d14f75ef67f340943fc4149891dcce8f8b972a3" + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.11.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cap-fs-ext" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5528f85b1e134ae811704e41ef80930f56e795923f866813255bc342cc20654" +dependencies = [ + "cap-primitives", + "cap-std", + "io-lifetimes", + "windows-sys 0.59.0", +] + +[[package]] +name = "cap-primitives" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cf3aea8a5081171859ef57bc1606b1df6999df4f1110f8eef68b30098d1d3a" +dependencies = [ + "ambient-authority", + "fs-set-times", + "io-extras", + "io-lifetimes", + "ipnet", + "maybe-owned", + "rustix 1.1.4", + "rustix-linux-procfs", + "windows-sys 0.59.0", + "winx", +] + +[[package]] +name = "cap-rand" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8144c22e24bbcf26ade86cb6501a0916c46b7e4787abdb0045a467eb1645a1d" +dependencies = [ + "ambient-authority", + "rand 0.8.5", +] + +[[package]] +name = "cap-std" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6dc3090992a735d23219de5c204927163d922f42f575a0189b005c62d37549a" +dependencies = [ + "cap-primitives", + "io-extras", + "io-lifetimes", + "rustix 1.1.4", +] + +[[package]] +name = "cap-time-ext" +version = "3.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def102506ce40c11710a9b16e614af0cde8e76ae51b1f48c04b8d79f4b671a80" +dependencies = [ + "ambient-authority", + "cap-primitives", + "iana-time-zone", + "once_cell", + "rustix 1.1.4", + "winx", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cbindgen" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "befbfd072a8e81c02f8c507aefce431fe5e7d051f83d48a23ffc9b9fe5a11799" +dependencies = [ + "heck 0.5.0", + "indexmap 2.13.0", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.117", + "tempfile", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom 7.1.3", +] + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cff-parser" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f5b6e9141c036f3ff4ce7b2f7e432b0f00dee416ddcd4f17741d189ddc2e9d" + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon 0.12.16", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20 0.9.1", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link 0.2.1", +] + +[[package]] +name = "chrono-tz" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" +dependencies = [ + "chrono", + "phf 0.12.1", +] + +[[package]] +name = "chumsky" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9" +dependencies = [ + "hashbrown 0.14.5", + "stacker", +] + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading 0.8.9", +] + +[[package]] +name = "clap" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_complete" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19c9f1dde76b736e3681f28cec9d5a61299cbaae0fce80a68e43724ad56031eb" +dependencies = [ + "clap", +] + +[[package]] +name = "clap_derive" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cmake" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +dependencies = [ + "cc", +] + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "cobs" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd93fd2c1b27acd030440c9dbd9d14c1122aad622374fe05a670b67a4bc034be" +dependencies = [ + "heapless", + "thiserror 2.0.18", +] + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "compression-codecs" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +dependencies = [ + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +dependencies = [ + "encode_unicode", + "libc", + "unicode-width 0.2.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_panic" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e262cdaac42494e3ae34c43969f9cdeb7da178bdb4b66fa6a1ea2edb4c8ae652" +dependencies = [ + "typewit", +] + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie_store" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" +dependencies = [ + "cookie 0.18.1", + "document-features", + "idna", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "libc", +] + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ceec7a6067e62d6f931a2baf6f3a751f4a892595bcec1461a3c94ef9949864b6" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cpal" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" +dependencies = [ + "alsa", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2 0.4.3", + "ndk 0.8.0", + "ndk-context", + "oboe", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.54.0", +] + +[[package]] +name = "cpp_demangle" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-assembler-x64" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b27381757f9295b67e558f4c64a83bfe7c6e82daad1ba4f8a948482c5de56ee9" +dependencies = [ + "cranelift-assembler-x64-meta", +] + +[[package]] +name = "cranelift-assembler-x64-meta" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e2ef32a4dbf1b380632a889995156080ecc0f1e07ac8eaa3f6325e4bd14ad8a" +dependencies = [ + "cranelift-srcgen", +] + +[[package]] +name = "cranelift-bforest" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b71c01a8007dd54330c8d73edeb82a8fc1a7143884af2f319e97340e290939b" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-bitset" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19fef6b39515a0ecfbb9954ab3d2d6740a459a11bef3d0536ef48460e6f6deb5" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "cranelift-codegen" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2060d8c75772e5208a9d3b766d9eb975bfc18ac459b75a0a2b2a72769a2f6da6" +dependencies = [ + "bumpalo", + "cranelift-assembler-x64", + "cranelift-bforest", + "cranelift-bitset", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-control", + "cranelift-entity", + "cranelift-isle", + "gimli", + "hashbrown 0.15.5", + "log", + "pulley-interpreter", + "regalloc2", + "rustc-hash", + "serde", + "smallvec", + "target-lexicon 0.13.5", + "wasmtime-internal-math", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "887e3ab41a8a75cb6b68c5fc686158b6083f1ad49cf52f2da7538fba17ff0be6" +dependencies = [ + "cranelift-assembler-x64-meta", + "cranelift-codegen-shared", + "cranelift-srcgen", + "heck 0.5.0", + "pulley-interpreter", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b187cbec77058579b47e8f75b1ce430b0d110df9c38d0fee2f8bd9801fd673" + +[[package]] +name = "cranelift-control" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b421ad1fefa33a1bb278d761d8ad7d49e17b7089f652fc2a1536435c75ff8def" +dependencies = [ + "arbitrary", +] + +[[package]] +name = "cranelift-entity" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46e3a650a696c3f4c93bb869e7d219ba3abf6e247164aaf7f12dc918a1d52772" +dependencies = [ + "cranelift-bitset", + "serde", + "serde_derive", +] + +[[package]] +name = "cranelift-frontend" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d48f516c004656a85747f6f8ccf6e23d8ec0a0a6dcf75ec85d6f2fa7e12c91" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon 0.13.5", +] + +[[package]] +name = "cranelift-isle" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce7761455ec4977010db897e9ad925200f08e435b9fa17575bd269ba174f33b" + +[[package]] +name = "cranelift-native" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42be1df38c4db6e19ba19d5ab8e65950c2865da0ad9e972a99ef224f1f77b8af" +dependencies = [ + "cranelift-codegen", + "libc", + "target-lexicon 0.13.5", +] + +[[package]] +name = "cranelift-srcgen" +version = "0.124.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fee765d14f3f91dcba44c0e4b0eaece5f89024539b620af15a6aeec485b1170" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950046b2aa2492f9a536f5f4f9a3de7b9e2476e575e05bd6c333371add4d98f3" +dependencies = [ + "alloca", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools 0.13.0", + "num-traits", + "oorandom", + "page_size", + "plotters", + "rayon", + "regex", + "serde", + "serde_json", + "tinytemplate", + "tokio", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8d80a2f4f5b554395e47b5d8305bc3d27813bacb73493eb1001e8f76dae29ea" +dependencies = [ + "cast", + "itertools 0.13.0", +] + +[[package]] +name = "cron" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5877d3fbf742507b66bc2a1945106bd30dd8504019d596901ddd012a4dd01740" +dependencies = [ + "chrono", + "once_cell", + "winnow 0.6.26", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.13.1", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "csv" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "csv-core" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "date_header" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c03c416ed1a30fbb027ef484ba6ab6f80e1eada675e1a2b92fd673c045a1f1d" + +[[package]] +name = "deadpool" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be2b1d1d6ec8d846f05e137292d0b89133caf95ef33695424c09568bdd39b1b" +dependencies = [ + "deadpool-runtime", + "lazy_static", + "num_cpus", + "tokio", +] + +[[package]] +name = "deadpool-runtime" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" +dependencies = [ + "tokio", +] + +[[package]] +name = "deadpool-sync" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524bc3df0d57e98ecd022e21ba31166c2625e7d3e5bcc4510efaeeab4abcab04" +dependencies = [ + "deadpool-runtime", +] + +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "uuid", +] + +[[package]] +name = "decancer" +version = "3.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9244323129647178bf41ac861a2cdb9d9c81b9b09d3d0d1de9cd302b33b8a1d" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "deku" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9711031e209dc1306d66985363b4397d4c7b911597580340b93c9729b55f6eb" +dependencies = [ + "bitvec", + "deku_derive", + "no_std_io2", + "rustversion", +] + +[[package]] +name = "deku_derive" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58cb0719583cbe4e81fb40434ace2f0d22ccc3e39a74bb3796c22b451b4f139d" +dependencies = [ + "darling 0.20.11", + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "delegate-display" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9926686c832494164c33a36bf65118f4bd6e704000b58c94681bf62e9ad67a74" +dependencies = [ + "impartial-ord", + "itoa", + "macroific", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl 2.1.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", + "unicode-xid", +] + +[[package]] +name = "dialoguer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" +dependencies = [ + "console", + "fuzzy-matcher", + "shell-words", + "tempfile", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.5.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users 0.4.6", + "winapi", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "docsplay" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8547ea80db62c5bb9d7796fcce5e6e07d1136bdc1a02269095061e806758fab4" +dependencies = [ + "docsplay-macros", +] + +[[package]] +name = "docsplay-macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11772ed3eb3db124d826f3abeadf5a791a557f62c19b123e3f07288158a71fdd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser 0.36.0", + "foldhash 0.2.0", + "html5ever 0.38.0", + "precomputed-hash", + "selectors 0.36.1", + "tendril 0.5.0", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecb" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a8bfa975b1aec2145850fcaa1c6fe269a16578c44705a532ae3edc92b8881c7" +dependencies = [ + "cipher", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "serde", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "email-encoding" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6" +dependencies = [ + "base64 0.22.1", + "memchr", +] + +[[package]] +name = "email_address" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" + +[[package]] +name = "embed-resource" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63a1d0de4f2249aa0ff5884d7080814f446bb241a559af6c170a41e878ed2d45" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.12+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "env_filter" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +dependencies = [ + "log", +] + +[[package]] +name = "env_logger" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +dependencies = [ + "env_filter", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "esp-idf-part" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5ebc2381d030e4e89183554c3fcd4ad44dc5ab34961ab09e09b4adbe4f94b61" +dependencies = [ + "bitflags 2.11.0", + "csv", + "deku", + "md-5", + "parse_int", + "regex", + "serde", + "serde_plain", + "strum", + "thiserror 2.0.18", +] + +[[package]] +name = "espflash" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f05d15cb2479a3cbbbe684b9f0831b2ae036d9faefd1eb08f21267275862f9" +dependencies = [ + "base64 0.22.1", + "bitflags 2.11.0", + "bytemuck", + "esp-idf-part", + "flate2", + "gimli", + "libc", + "log", + "md-5", + "miette", + "nix 0.30.1", + "object 0.38.1", + "serde", + "sha2", + "strum", + "thiserror 2.0.18", +] + +[[package]] +name = "euclid" +version = "0.20.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb7ef65b3777a325d1eeefefab5b6d4959da54747e33bd6258e789640f307ad" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.1", + "pin-project-lite", +] + +[[package]] +name = "extism" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "491d31da92442abcbbbf6c1e3074abb308925a2384a615c79ac76420e4f790fc" +dependencies = [ + "anyhow", + "cbindgen", + "extism-convert", + "extism-manifest", + "glob", + "libc", + "serde", + "serde_json", + "sha2", + "toml 0.9.12+spec-1.1.0", + "tracing", + "tracing-subscriber", + "ureq", + "url", + "uuid", + "wasi-common", + "wasmtime", + "wiggle", +] + +[[package]] +name = "extism-convert" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6a2f8c12ab80a3f810edef0d96fe7a5ffcc9ce59a534e81f1b6bd8e977c6772" +dependencies = [ + "anyhow", + "base64 0.22.1", + "bytemuck", + "extism-convert-macros", + "prost 0.14.3", + "rmp-serde", + "serde", + "serde_json", +] + +[[package]] +name = "extism-convert-macros" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317ea3a0ba61991baf81ed51e7a59d840952e9aacd625b4d3bef39093e7c86e7" +dependencies = [ + "manyhow", + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "extism-manifest" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af75c1bfec0592bd51be27de1506f21fb0991d7caf81e691d4298d5dc254da5" +dependencies = [ + "base64 0.22.1", + "serde", + "serde_json", +] + +[[package]] +name = "eyeball" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93bd0ebf93d61d6332d3c09a96e97975968a44e19a64c947bde06e6baff383f" +dependencies = [ + "futures-core", + "readlock", + "readlock-tokio", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "eyeball-im" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4790c03df183c2b46665c1a58118c04fd3e3976ec2fe16a0aa00e00c9eea7754" +dependencies = [ + "futures-core", + "imbl", + "tokio", + "tracing", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fancy_constructor" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a27643a5d05f3a22f5afd6e0d0e6e354f92d37907006f97b84b9cb79082198" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "fantoccini" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7737298823a6f9ca743e372e8cb03658d55354fbab843424f575706ba9563046" +dependencies = [ + "base64 0.22.1", + "cookie 0.18.1", + "http 1.4.0", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "mime", + "serde", + "serde_json", + "time", + "tokio", + "url", + "webdriver", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fd-lock" +version = "4.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" +dependencies = [ + "cfg-if", + "rustix 1.1.4", + "windows-sys 0.59.0", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +dependencies = [ + "cfg-if", + "libc", + "libredox", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs-set-times" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" +dependencies = [ + "io-lifetimes", + "rustix 1.1.4", + "windows-sys 0.59.0", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "fxprof-processed-profile" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" +dependencies = [ + "bitflags 2.11.0", + "debugid", + "fxhash", + "serde", + "serde_json", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +dependencies = [ + "fallible-iterator", + "indexmap 2.13.0", + "stable_deref_trait", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.11.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "growable-bloom-filter" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d174ccb4ba660d431329e7f0797870d0a4281e36353ec4b4a3c5eab6c2cfb6f1" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "xxhash-rust", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "h2" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.4.0", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "hashify" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "149e3ea90eb5a26ad354cfe3cb7f7401b9329032d0235f2687d03a35f30e5d4c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "headers" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" +dependencies = [ + "base64 0.22.1", + "bytes", + "headers-core", + "http 1.4.0", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http 1.4.0", +] + +[[package]] +name = "heapless" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-conservative" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hidapi" +version = "2.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1b71e1f4791fb9e93b9d7ee03d70b501ab48f6151432fbcadeabc30fe15396e" +dependencies = [ + "basic-udev", + "cc", + "cfg-if", + "libc", + "nix 0.30.1", + "pkg-config", + "windows-sys 0.61.2", +] + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "hostname" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd" +dependencies = [ + "cfg-if", + "libc", + "windows-link 0.2.1", +] + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever 0.14.1", + "match_token 0.1.0", +] + +[[package]] +name = "html5ever" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55d958c2f74b664487a2035fe1dadb032c48718a03b63f3ab0b8537db8549ed4" +dependencies = [ + "log", + "markup5ever 0.35.0", + "match_token 0.35.0", +] + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever 0.38.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-auth" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "150fa4a9462ef926824cf4519c84ed652ca8f4fbae34cb8af045b5cbcaf98822" +dependencies = [ + "memchr", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.4.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.4.0", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http 1.4.0", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.4.0", + "hyper", + "hyper-util", + "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.6", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http 1.4.0", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke 0.8.1", + "zerofrom", + "zerovec 0.11.5", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap 0.8.1", + "tinystr 0.8.2", + "writeable 0.6.2", + "zerovec 0.11.5", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap 0.7.5", + "tinystr 0.7.6", + "writeable 0.5.5", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections 2.1.1", + "icu_normalizer_data", + "icu_properties", + "icu_provider 2.1.1", + "smallvec", + "zerovec 0.11.5", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections 2.1.1", + "icu_locale_core", + "icu_properties_data", + "icu_provider 2.1.1", + "zerotrie", + "zerovec 0.11.5", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr 0.7.6", + "writeable 0.5.5", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable 0.6.2", + "yoke 0.8.1", + "zerofrom", + "zerotrie", + "zerovec 0.11.5", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "icu_segmenter" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a717725612346ffc2d7b42c94b820db6908048f39434504cb130e8b46256b0de" +dependencies = [ + "core_maths", + "displaydoc", + "icu_collections 1.5.0", + "icu_locid", + "icu_provider 1.5.0", + "icu_segmenter_data", + "utf8_iter", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_segmenter_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e52775179941363cc594e49ce99284d13d6948928d8e72c755f55e98caa1eb" + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ihex" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "365a784774bb381e8c19edb91190a90d7f2625e057b55de2bc0f6b57bc779ff2" + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png 0.18.1", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "imap-proto" +version = "0.16.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1f9b30846c3d04371159ef3a0413ce7c1ae0a8c619cd255c60b3d902553f22" +dependencies = [ + "nom 7.1.3", +] + +[[package]] +name = "imbl" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fade8ae6828627ad1fa094a891eccfb25150b383047190a3648d66d06186501" +dependencies = [ + "archery", + "bitmaps", + "imbl-sized-chunks", + "rand_core 0.9.5", + "rand_xoshiro", + "serde", + "version_check", +] + +[[package]] +name = "imbl-sized-chunks" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4241005618a62f8d57b2febd02510fb96e0137304728543dfc5fd6f052c22d" +dependencies = [ + "bitmaps", +] + +[[package]] +name = "impartial-ord" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab604ee7085efba6efc65e4ebca0e9533e3aff6cb501d7d77b211e3a781c6d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "indicatif" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +dependencies = [ + "console", + "portable-atomic", + "unicode-width 0.2.2", + "unit-prefix", + "web-time", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "io-extras" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2285ddfe3054097ef4b2fe909ef8c3bcd1ea52a8f0d274416caebeef39f04a65" +dependencies = [ + "io-lifetimes", + "windows-sys 0.59.0", +] + +[[package]] +name = "io-kit-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" +dependencies = [ + "core-foundation-sys", + "mach2 0.4.3", +] + +[[package]] +name = "io-kit-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d3a048d09fbb6597dbf7c69f40d14df4a49487db1487191618c893fc3b1c26" +dependencies = [ + "core-foundation-sys", + "mach2 0.5.0", +] + +[[package]] +name = "io-lifetimes" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "iri-string" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e7418f59cc01c88316161279a7f665217ae316b388e58a0d10e29f54f1e5eb" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "ittapi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b996fe614c41395cdaedf3cf408a9534851090959d90d54a535f675550b64b1" +dependencies = [ + "anyhow", + "ittapi-sys", + "log", +] + +[[package]] +name = "ittapi-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f5385394064fa2c886205dba02598013ce83d3e92d33dbdc0c52fe0e7bf4fc" +dependencies = [ + "cc", +] + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jep106" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1354c92c91fd5595fd4cc46694b6914749cc90ea437246549c26b6ff0ec6d1" +dependencies = [ + "serde", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "js_int" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d937f95470b270ce8b8950207715d71aa8e153c0d44c6684d59397ed4949160a" +dependencies = [ + "serde", +] + +[[package]] +name = "js_option" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7dd3e281add16813cf673bf74a32249b0aa0d1c8117519a17b3ada5e8552b3c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.11.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "konst" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4381b9b00c55f251f2ebe9473aef7c117e96828def1a7cb3bd3f0f903c6894e9" +dependencies = [ + "const_panic", + "konst_kernel", + "typewit", +] + +[[package]] +name = "konst_kernel" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4b1eb7788f3824c629b1116a7a9060d6e898c358ebff59070093d51103dcc3c" +dependencies = [ + "typewit", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser 0.29.6", + "html5ever 0.29.1", + "indexmap 2.13.0", + "selectors 0.24.0", +] + +[[package]] +name = "landlock" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49fefd6652c57d68aaa32544a4c0e642929725bdc1fd929367cdeb673ab81088" +dependencies = [ + "enumflags2", + "libc", + "thiserror 2.0.18", +] + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "lettre" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e13e10e8818f8b2a60f52cb127041d388b89f3a96a62be9ceaffa22262fef7f" +dependencies = [ + "base64 0.22.1", + "chumsky", + "email-encoding", + "email_address", + "fastrand", + "httpdate", + "idna", + "mime", + "nom 8.0.0", + "percent-encoding", + "quoted_printable", + "rustls", + "socket2", + "tokio", + "url", + "webpki-roots 1.0.6", +] + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading 0.7.4", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" +dependencies = [ + "bitflags 2.11.0", + "libc", + "plain", + "redox_syscall 0.7.3", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lopdf" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7184fdea2bc3cd272a1acec4030c321a8f9875e877b3f92a53f2f6033fdc289" +dependencies = [ + "aes", + "bitflags 2.11.0", + "cbc", + "ecb", + "encoding_rs", + "flate2", + "getrandom 0.3.4", + "indexmap 2.13.0", + "itoa", + "log", + "md-5", + "nom 8.0.0", + "nom_locate", + "rand 0.9.2", + "rangemap", + "sha2", + "stringprep", + "thiserror 2.0.18", + "ttf-parser", + "weezl", +] + +[[package]] +name = "lru" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "mach2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1b95cd5421ec55b445b5ae102f5ea0e768de1f82bd3001e11f426c269c3aea" +dependencies = [ + "libc", +] + +[[package]] +name = "macroific" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89f276537b4b8f981bf1c13d79470980f71134b7bdcc5e6e911e910e556b0285" +dependencies = [ + "macroific_attr_parse", + "macroific_core", + "macroific_macro", +] + +[[package]] +name = "macroific_attr_parse" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad4023761b45fcd36abed8fb7ae6a80456b0a38102d55e89a57d9a594a236be9" +dependencies = [ + "proc-macro2", + "quote", + "sealed", + "syn 2.0.117", +] + +[[package]] +name = "macroific_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a7594d3c14916fa55bef7e9d18c5daa9ed410dd37504251e4b75bbdeec33e3" +dependencies = [ + "proc-macro2", + "quote", + "sealed", + "syn 2.0.117", +] + +[[package]] +name = "macroific_macro" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da6f2ed796261b0a74e2b52b42c693bb6dee1effba3a482c49592659f824b3b" +dependencies = [ + "macroific_attr_parse", + "macroific_core", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "mail-parser" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82a3d6522697593ba4c683e0a6ee5a40fee93bc1a525e3cc6eeb3da11fd8897" +dependencies = [ + "hashify", +] + +[[package]] +name = "manyhow" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" +dependencies = [ + "manyhow-macros", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "manyhow-macros" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache 0.8.9", + "string_cache_codegen 0.5.4", + "tendril 0.4.3", +] + +[[package]] +name = "markup5ever" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "311fe69c934650f8f19652b3946075f0fc41ad8757dbb68f1ca14e7900ecc1c3" +dependencies = [ + "log", + "tendril 0.4.3", + "web_atoms 0.1.3", +] + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril 0.5.0", + "web_atoms 0.2.3", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "match_token" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac84fd3f360fcc43dc5f5d186f02a94192761a080e8bc58621ad4d12296a58cf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "matrix-pickle" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c34e6db65145740459f2ca56623b40cd4e6000ffae2a7d91515fa82aa935dbf" +dependencies = [ + "matrix-pickle-derive", + "thiserror 2.0.18", +] + +[[package]] +name = "matrix-pickle-derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a962fc9981f823f6555416dcb2ae9ae67ca412d767ee21ecab5150113ee6285b" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "matrix-sdk" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33f9bc45edd7f8e25161521fdd30654da5c55e6749be6afa1aa9d6cf838ace0" +dependencies = [ + "anymap2", + "aquamarine", + "as_variant", + "async-channel 2.5.0", + "async-stream", + "async-trait", + "backon", + "bytes", + "bytesize", + "cfg-if", + "event-listener 5.4.1", + "eyeball", + "eyeball-im", + "futures-core", + "futures-util", + "gloo-timers", + "http 1.4.0", + "imbl", + "indexmap 2.13.0", + "itertools 0.14.0", + "js_int", + "language-tags", + "matrix-sdk-base", + "matrix-sdk-common", + "matrix-sdk-indexeddb", + "matrix-sdk-sqlite", + "mime", + "mime2ext", + "oauth2", + "once_cell", + "percent-encoding", + "pin-project-lite", + "reqwest 0.12.28", + "ruma", + "serde", + "serde_html_form", + "serde_json", + "sha2", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", + "urlencoding", + "vodozemac", + "zeroize", +] + +[[package]] +name = "matrix-sdk-base" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f404a390ff98a73c426b1496b169be60ce6a93723a9a664e579d978a84c5e4" +dependencies = [ + "as_variant", + "async-trait", + "bitflags 2.11.0", + "decancer", + "eyeball", + "eyeball-im", + "futures-util", + "growable-bloom-filter", + "matrix-sdk-common", + "matrix-sdk-crypto", + "matrix-sdk-store-encryption", + "once_cell", + "regex", + "ruma", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tracing", + "unicode-normalization", +] + +[[package]] +name = "matrix-sdk-common" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54fae2bdfc3d760d21a84d6d2036b5db5c48d9a3dee3794119e3fb9c4cc4ccc5" +dependencies = [ + "eyeball-im", + "futures-core", + "futures-executor", + "futures-util", + "gloo-timers", + "imbl", + "ruma", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tracing", + "tracing-subscriber", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "matrix-sdk-crypto" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "304fc576810a9618bb831c4ad6403c758ec424f677668a49a196e3cde4b8f99f" +dependencies = [ + "aes", + "aquamarine", + "as_variant", + "async-trait", + "bs58", + "byteorder", + "cfg-if", + "ctr", + "eyeball", + "futures-core", + "futures-util", + "hkdf", + "hmac", + "itertools 0.14.0", + "js_option", + "matrix-sdk-common", + "pbkdf2", + "rand 0.8.5", + "rmp-serde", + "ruma", + "serde", + "serde_json", + "sha2", + "subtle", + "thiserror 2.0.18", + "time", + "tokio", + "tokio-stream", + "tracing", + "ulid", + "url", + "vodozemac", + "zeroize", +] + +[[package]] +name = "matrix-sdk-indexeddb" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6096084cc8d339c03e269ca25534d0f1e88d0097c35a215eb8c311797ec3e9" +dependencies = [ + "async-trait", + "base64 0.22.1", + "futures-util", + "getrandom 0.2.17", + "gloo-utils", + "hkdf", + "js-sys", + "matrix-sdk-base", + "matrix-sdk-crypto", + "matrix-sdk-store-encryption", + "matrix_indexed_db_futures", + "rmp-serde", + "ruma", + "serde", + "serde-wasm-bindgen", + "serde_json", + "sha2", + "thiserror 2.0.18", + "tokio", + "tracing", + "uuid", + "wasm-bindgen", + "web-sys", + "zeroize", +] + +[[package]] +name = "matrix-sdk-sqlite" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4325742fc06b7f75c80eec39e8fb32b06ea4b09b7aa1d432b67b01d08fbacc28" +dependencies = [ + "as_variant", + "async-trait", + "deadpool", + "deadpool-sync", + "itertools 0.14.0", + "matrix-sdk-base", + "matrix-sdk-crypto", + "matrix-sdk-store-encryption", + "num_cpus", + "rmp-serde", + "ruma", + "rusqlite", + "serde", + "serde_json", + "serde_path_to_error", + "thiserror 2.0.18", + "tokio", + "tracing", + "vodozemac", + "zeroize", +] + +[[package]] +name = "matrix-sdk-store-encryption" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162a93e83114d5cef25c0ebaea72aa01b9f233df6ec4a2af45f175d01ec26323" +dependencies = [ + "base64 0.22.1", + "blake3", + "chacha20poly1305", + "getrandom 0.2.17", + "hmac", + "pbkdf2", + "rand 0.8.5", + "rmp-serde", + "serde", + "serde_json", + "sha2", + "thiserror 2.0.18", + "zeroize", +] + +[[package]] +name = "matrix_indexed_db_futures" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245ff6a224b4df7b0c90dda2dd5a6eb46112708d49e8bdd8b007fccb09fea8e4" +dependencies = [ + "accessory", + "cfg-if", + "delegate-display", + "derive_more 2.1.1", + "fancy_constructor", + "futures-core", + "js-sys", + "matrix_indexed_db_futures_macros_internal", + "sealed", + "serde", + "serde-wasm-bindgen", + "smallvec", + "thiserror 2.0.18", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm_evt_listener", + "web-sys", + "web-time", +] + +[[package]] +name = "matrix_indexed_db_futures_macros_internal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b428aee5c0fe9e5babd29e99d289b7f64718c444989aac0442d1fd6d3e3f66d1" +dependencies = [ + "macroific", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "maybe-owned" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "md5" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memfd" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" +dependencies = [ + "rustix 1.1.4", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "cfg-if", + "miette-derive", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime2ext" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf6f36070878c42c5233846cd3de24cf9016828fd47bc22957a687298bb21fc" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "log", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "mio-serial" +version = "5.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029e1f407e261176a983a6599c084efd322d9301028055c87174beac71397ba3" +dependencies = [ + "log", + "mio", + "nix 0.29.0", + "serialport", + "winapi", +] + +[[package]] +name = "moka" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" +dependencies = [ + "async-lock", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "event-listener 5.4.1", + "futures-util", + "parking_lot", + "portable-atomic", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "muda" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.17.16", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "nanohtml2text" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec1bc47d34ae756616f387c11fd0595f86f2cc7e6473bde9e3ded30cb902a1" + +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.11.0", + "jni-sys 0.3.1", + "log", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys 0.3.1", + "log", + "ndk-sys 0.6.0+11769913", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "negentropy" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0efe882e02d206d8d279c20eb40e03baf7cb5136a1476dc084a324fbc3ec42d" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "no_std_io2" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a3564ce7035b1e4778d8cb6cacebb5d766b5e8fe5a75b9e441e33fb61a872c6" +dependencies = [ + "memchr", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "nom_locate" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b577e2d69827c4740cba2b52efaad1c4cc7c73042860b199710b3575c68438d" +dependencies = [ + "bytecount", + "memchr", + "nom 8.0.0", +] + +[[package]] +name = "nostr" +version = "0.44.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aa5e3b6a278ed061835fe1ee293b71641e6bf8b401cfe4e1834bbf4ef0a34e1" +dependencies = [ + "aes", + "base64 0.22.1", + "bech32", + "bip39", + "bitcoin_hashes", + "cbc", + "chacha20 0.9.1", + "chacha20poly1305", + "getrandom 0.2.17", + "hex", + "instant", + "scrypt", + "secp256k1", + "serde", + "serde_json", + "unicode-normalization", + "url", +] + +[[package]] +name = "nostr-database" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7462c9d8ae5ef6a28d66a192d399ad2530f1f2130b13186296dbb11bdef5b3d1" +dependencies = [ + "lru", + "nostr", + "tokio", +] + +[[package]] +name = "nostr-gossip" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade30de16869618919c6b5efc8258f47b654a98b51541eb77f85e8ec5e3c83a6" +dependencies = [ + "nostr", +] + +[[package]] +name = "nostr-relay-pool" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b1073ccfbaea5549fb914a9d52c68dab2aecda61535e5143dd73e95445a804b" +dependencies = [ + "async-utility", + "async-wsocket", + "atomic-destructor", + "hex", + "lru", + "negentropy", + "nostr", + "nostr-database", + "tokio", + "tracing", +] + +[[package]] +name = "nostr-sdk" +version = "0.44.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471732576710e779b64f04c55e3f8b5292f865fea228436daf19694f0bf70393" +dependencies = [ + "async-utility", + "nostr", + "nostr-database", + "nostr-gossip", + "nostr-relay-pool", + "tokio", + "tracing", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "nusb" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a330b3bc7f8b4fc729a4c63164b3927eeeaced198222a3ce6b8b6e034851b7a" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "futures-core", + "io-kit-sys 0.5.0", + "linux-raw-sys 0.12.1", + "log", + "once_cell", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "oauth2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" +dependencies = [ + "base64 0.22.1", + "chrono", + "getrandom 0.2.17", + "http 1.4.0", + "rand 0.8.5", + "reqwest 0.12.28", + "serde", + "serde_json", + "serde_path_to_error", + "sha2", + "thiserror 1.0.69", + "url", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "crc32fast", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "memchr", +] + +[[package]] +name = "object" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271638cd5fa9cca89c4c304675ca658efc4e64a66c716b7cfe1afb4b9611dbbc" +dependencies = [ + "flate2", + "memchr", + "ruzstd", +] + +[[package]] +name = "oboe" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" +dependencies = [ + "jni", + "ndk 0.8.0", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" +dependencies = [ + "cc", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "open" +version = "5.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "opentelemetry" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 2.0.18", +] + +[[package]] +name = "opentelemetry-http" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" +dependencies = [ + "async-trait", + "bytes", + "http 1.4.0", + "opentelemetry", + "reqwest 0.12.28", +] + +[[package]] +name = "opentelemetry-otlp" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f69cd6acbb9af919df949cd1ec9e5e7fdc2ef15d234b6b795aaa525cc02f71f" +dependencies = [ + "http 1.4.0", + "opentelemetry", + "opentelemetry-http", + "opentelemetry-proto", + "opentelemetry_sdk", + "prost 0.14.3", + "reqwest 0.12.28", + "thiserror 2.0.18", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" +dependencies = [ + "opentelemetry", + "opentelemetry_sdk", + "prost 0.14.3", + "tonic", + "tonic-prost", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" +dependencies = [ + "futures-channel", + "futures-executor", + "futures-util", + "opentelemetry", + "percent-encoding", + "rand 0.9.2", + "thiserror 2.0.18", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "os_pipe" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "parse_int" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c464266693329dd5a8715098c7f86e6c5fd5d985018b8318f53d9c6c2b21a31" +dependencies = [ + "num-traits", +] + +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "pdf-extract" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28ba1758a3d3f361459645780e09570b573fc3c82637449e9963174c813a98" +dependencies = [ + "adobe-cmap-parser", + "cff-parser", + "encoding_rs", + "euclid", + "log", + "lopdf", + "postscript", + "type1-encoding-parser", + "unicode-normalization", +] + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64 0.22.1", + "serde_core", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap 2.13.0", +] + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared 0.12.1", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "pin-project" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.11.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "pom" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60f6ce597ecdcc9a098e7fddacb1065093a3d66446fa16c675e7e71d1b5c28e6" + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs 0.3.0", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + +[[package]] +name = "postscript" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78451badbdaebaf17f053fd9152b3ffb33b516104eacb45e7864aaa9c712f306" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec 0.11.5", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "probe-rs" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee50102aaa214117fc4fbe1311077835f0f4faa71e4a769bf65f955cc020ee34" +dependencies = [ + "anyhow", + "async-io", + "bincode", + "bitfield", + "bitvec", + "cobs 0.5.1", + "docsplay", + "dunce", + "espflash", + "flate2", + "futures-lite", + "hidapi", + "ihex", + "itertools 0.14.0", + "jep106", + "nusb", + "object 0.38.1", + "parking_lot", + "probe-rs-target", + "rmp-serde", + "scroll", + "serde", + "serde_yaml", + "serialport", + "thiserror 2.0.18", + "tracing", + "uf2-decode", + "zerocopy", +] + +[[package]] +name = "probe-rs-target" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031bed1313b45d93dae4ca8f0fee098530c6632e4ebd9e2769d5a49cdef273d3" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.0", + "jep106", + "serde", + "serde_with", + "url", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +dependencies = [ + "toml_edit 0.20.7", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.8+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prometheus" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ca5326d8d0b950a9acd87e6a3f94745394f62e4dae1b1ee22b2bc0c394af43a" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot", + "thiserror 2.0.18", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive 0.13.5", +] + +[[package]] +name = "prost" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +dependencies = [ + "bytes", + "prost-derive 0.14.3", +] + +[[package]] +name = "prost-build" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" +dependencies = [ + "heck 0.5.0", + "itertools 0.14.0", + "log", + "multimap", + "petgraph", + "prost 0.14.3", + "prost-types", + "regex", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "prost-derive" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "prost-types" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +dependencies = [ + "prost 0.14.3", +] + +[[package]] +name = "protobuf" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65a1d4ddae7d8b5de68153b48f6aa3bba8cb002b243dbdbc55a5afbc98f99f4" +dependencies = [ + "once_cell", + "protobuf-support", + "thiserror 1.0.69", +] + +[[package]] +name = "protobuf-support" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e36c2f31e0a47f9280fb347ef5e461ffcd2c52dd520d8e216b52f93b0b0d7d6" +dependencies = [ + "thiserror 1.0.69", +] + +[[package]] +name = "psm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8" +dependencies = [ + "ar_archive_writer", + "cc", +] + +[[package]] +name = "pulldown-cmark" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" +dependencies = [ + "bitflags 2.11.0", + "memchr", + "pulldown-cmark-escape", + "unicase", +] + +[[package]] +name = "pulldown-cmark-escape" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" + +[[package]] +name = "pulley-interpreter" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5c8a4c6db43cd896bcc33f316c2f449a89fbec962717e9097d88c9c82547ec0" +dependencies = [ + "cranelift-bitset", + "log", + "pulley-macros", + "wasmtime-internal-math", +] + +[[package]] +name = "pulley-macros" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "573407df6287098f3e9ded7873a768156bc97c6939d077924d70416cb529bab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "pxfm" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" + +[[package]] +name = "qrcode" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68782463e408eb1e668cf6152704bd856c78c5b6417adaee3203d8f4c1fc9ec" +dependencies = [ + "image", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "quoted_printable" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478e0585659a122aa407eb7e3c0e1fa51b1d8a870038bd29f0cf4a8551eea972" + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20 0.10.0", + "getrandom 0.4.2", + "rand_core 0.10.0", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xoshiro" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "rangemap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rcgen" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +dependencies = [ + "pem", + "ring", + "rustls-pki-types", + "time", + "yasna", +] + +[[package]] +name = "readlock" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6da6f291b23556edd9edaf655a0be2ad8ef8002ff5f1bca62b264f3f58b53f34" + +[[package]] +name = "readlock-tokio" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7e264f9ec4f3d112e8e2f214e8e7cb5cf3b83278f3570b7e00bfe13d3bd8ff" +dependencies = [ + "tokio", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_syscall" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regalloc2" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08effbc1fa53aaebff69521a5c05640523fab037b34a4a2c109506bc938246fa" +dependencies = [ + "allocator-api2", + "bumpalo", + "hashbrown 0.15.5", + "log", + "rustc-hash", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 1.4.0", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams 0.4.2", + "web-sys", + "webpki-roots 1.0.6", +] + +[[package]] +name = "reqwest" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams 0.5.0", + "web-sys", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rmp" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "rmp-serde" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" +dependencies = [ + "rmp", + "serde", +] + +[[package]] +name = "rppal" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ce3b019009cff02cb6b0e96e7cc2e5c5b90187dc1a490f8ef1521d0596b026" +dependencies = [ + "libc", +] + +[[package]] +name = "ruma" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9f620a2116d0d3082f9256e61dcdf67f2ec266d3f6bb9d2f9c8a20ec5a1fabb" +dependencies = [ + "assign", + "js_int", + "js_option", + "ruma-client-api", + "ruma-common", + "ruma-events", + "ruma-federation-api", + "ruma-html", + "web-time", +] + +[[package]] +name = "ruma-client-api" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc977d1a91ea15dcf896cbd7005ed4a253784468833638998109ffceaee53e7" +dependencies = [ + "as_variant", + "assign", + "bytes", + "date_header", + "http 1.4.0", + "js_int", + "js_option", + "maplit", + "ruma-common", + "ruma-events", + "serde", + "serde_html_form", + "serde_json", + "thiserror 2.0.18", + "url", + "web-time", +] + +[[package]] +name = "ruma-common" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a01993f22d291320b7c9267675e7395775e95269ff526e2c8c3ed5e13175b" +dependencies = [ + "as_variant", + "base64 0.22.1", + "bytes", + "form_urlencoded", + "getrandom 0.2.17", + "http 1.4.0", + "indexmap 2.13.0", + "js-sys", + "js_int", + "konst", + "percent-encoding", + "rand 0.8.5", + "regex", + "ruma-identifiers-validation", + "ruma-macros", + "serde", + "serde_html_form", + "serde_json", + "thiserror 2.0.18", + "time", + "tracing", + "url", + "uuid", + "web-time", + "wildmatch", + "zeroize", +] + +[[package]] +name = "ruma-events" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dbdeccb62cb4ffe3282325de8ba28cbc0fdce7c78a3f11b7241fbfdb9cb9907" +dependencies = [ + "as_variant", + "indexmap 2.13.0", + "js_int", + "js_option", + "percent-encoding", + "pulldown-cmark", + "regex", + "ruma-common", + "ruma-identifiers-validation", + "ruma-macros", + "serde", + "serde_json", + "thiserror 2.0.18", + "tracing", + "url", + "web-time", + "wildmatch", + "zeroize", +] + +[[package]] +name = "ruma-federation-api" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb45c15badbf4299c6113a6b90df3e7cb64edbe756bbd8e0224144b56b38305" +dependencies = [ + "headers", + "http 1.4.0", + "http-auth", + "js_int", + "mime", + "ruma-common", + "ruma-events", + "ruma-signatures", + "serde", + "serde_json", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "ruma-html" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6dcd6e9823e177d15460d3cd3a413f38a2beea381f26aca1001c05cd6954ff" +dependencies = [ + "as_variant", + "html5ever 0.35.0", + "tracing", + "wildmatch", +] + +[[package]] +name = "ruma-identifiers-validation" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9c6b5643060beec0fc9d7acfb41d2c5d91e1591db440ff62361d178e77c35fe" +dependencies = [ + "js_int", + "thiserror 2.0.18", +] + +[[package]] +name = "ruma-macros" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a0753312ad577ac462de1742bf2e326b6ba9856ff6f13343aeb17d423fd5426" +dependencies = [ + "as_variant", + "cfg-if", + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "ruma-identifiers-validation", + "serde", + "syn 2.0.117", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "ruma-signatures" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146ace2cd59b60ec80d3e801a84e7e6a91e3e01d18a9f5d896ea7ca16a6b8e08" +dependencies = [ + "base64 0.22.1", + "ed25519-dalek", + "pkcs8", + "rand 0.8.5", + "ruma-common", + "serde_json", + "sha2", + "thiserror 2.0.18", +] + +[[package]] +name = "rusqlite" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" +dependencies = [ + "bitflags 2.11.0", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rust-embed" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn 2.0.117", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1" +dependencies = [ + "sha2", + "walkdir", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustix-linux-procfs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" +dependencies = [ + "once_cell", + "rustix 1.1.4", +] + +[[package]] +name = "rustls" +version = "0.23.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ruzstd" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive 0.8.22", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "schemars_derive 1.2.1", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "schemars_derive" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1257cd4248b4132760d6524d6dda4e053bc648c9070b960929bf50cfb1e7add" + +[[package]] +name = "scrypt" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" +dependencies = [ + "password-hash", + "pbkdf2", + "salsa20", + "sha2", +] + +[[package]] +name = "sealed" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f968c5ea23d555e670b449c1c5e7b2fc399fdaec1d304a17cd48e288abc107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "secp256k1" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" +dependencies = [ + "rand 0.8.5", + "secp256k1-sys", + "serde", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser 0.29.6", + "derive_more 0.99.20", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc 0.2.0", + "smallvec", +] + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.11.0", + "cssparser 0.36.0", + "derive_more 2.1.1", + "log", + "new_debug_unreachable", + "phf 0.13.1", + "phf_codegen 0.13.1", + "precomputed-hash", + "rustc-hash", + "servo_arc 0.4.3", + "smallvec", +] + +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_html_form" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2f2d7ff8a2140333718bb329f5c40fc5f0865b84c426183ce14c97d2ab8154f" +dependencies = [ + "form_urlencoded", + "indexmap 2.13.0", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_plain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876ac351060d4f882bb1032b6369eb0aef79ad9df1ea8bc404874d8cc3d0cd98" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.13.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialport" +version = "4.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4d91116f97173694f1642263b2ff837f80d933aa837e2314969f6728f661df3" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "core-foundation", + "core-foundation-sys", + "io-kit-sys 0.4.1", + "mach2 0.4.3", + "nix 0.26.4", + "scopeguard", + "unescaper", + "windows-sys 0.52.0", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shared_child" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" +dependencies = [ + "libc", + "sigchld", + "windows-sys 0.60.2", +] + +[[package]] +name = "shell-words" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" + +[[package]] +name = "shellexpand" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32824fab5e16e6c4d86dc1ba84489390419a39f97699852b66480bb87d297ed8" +dependencies = [ + "dirs", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "sigchld" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" +dependencies = [ + "libc", + "os_pipe", + "signal-hook", +] + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk 0.9.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall 0.5.18", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stacker" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d74a23609d509411d10e2176dc2a4346e3b4aea2e7b1869f19fdedbc71c013" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + +[[package]] +name = "stop-token" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af91f480ee899ab2d9f8435bfdfc14d08a5754bd9d3fef1f1a1c23336aad6c8b" +dependencies = [ + "async-channel 1.9.0", + "cfg-if", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.13.1", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", +] + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.23", + "version-compare", +] + +[[package]] +name = "system-interface" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4592f674ce18521c2a81483873a49596655b179f71c5e05d10c1fe66c78745" +dependencies = [ + "bitflags 2.11.0", + "cap-fs-ext", + "cap-std", + "fd-lock", + "io-lifetimes", + "rustix 0.38.44", + "windows-sys 0.59.0", + "winx", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "tao" +version = "0.34.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9103edf55f2da3c82aea4c7fab7c4241032bfeea0e71fa557d98e00e7ce7cc20" +dependencies = [ + "bitflags 2.11.0", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk 0.9.0", + "ndk-context", + "ndk-sys 0.6.0+11769913", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "parking_lot", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "target-lexicon" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" + +[[package]] +name = "tauri" +version = "2.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da77cc00fb9028caf5b5d4650f75e31f1ef3693459dfca7f7e506d1ecef0ba2d" +dependencies = [ + "anyhow", + "bytes", + "cookie 0.18.1", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http 1.4.0", + "image", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest 0.13.2", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows 0.61.3", +] + +[[package]] +name = "tauri-build" +version = "2.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bbc990d1dbf57a8e1c7fa2327f2a614d8b757805603c1b9ba5c81bade09fd4d" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a24476afd977c5d5d169f72425868613d82747916dd29e0a357c84c4bd6d29" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.117", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39b349a98dadaffebb73f0a40dcd1f23c999211e5a2e744403db384d0c33de7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddde7d51c907b940fb573006cdda9a642d6a7c8153657e88f8a5c3c9290cd4aa" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-plugin-shell" +version = "2.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8457dbf9e2bab1edd8df22bb2c20857a59a9868e79cb3eac5ed639eec4d0c73b" +dependencies = [ + "encoding_rs", + "log", + "open", + "os_pipe", + "regex", + "schemars 0.8.22", + "serde", + "serde_json", + "shared_child", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "tauri-plugin-single-instance" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc61e4822b8f74d68278e09161d3e3fdd1b14b9eb781e24edccaabf10c420e8c" +dependencies = [ + "serde", + "serde_json", + "tauri", + "thiserror 2.0.18", + "tracing", + "windows-sys 0.60.2", + "zbus", +] + +[[package]] +name = "tauri-plugin-store" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca1a8ff83c269b115e98726ffc13f9e548a10161544a92ad121d6d0a96e16ea" +dependencies = [ + "dunce", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "tokio", + "tracing", +] + +[[package]] +name = "tauri-runtime" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2826d79a3297ed08cd6ea7f412644ef58e32969504bc4fbd8d7dbeabc4445ea2" +dependencies = [ + "cookie 0.18.1", + "dpi", + "gtk", + "http 1.4.0", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows 0.61.3", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11ea2e6f801d275fdd890d6c9603736012742a1c33b96d0db788c9cdebf7f9e" +dependencies = [ + "gtk", + "http 1.4.0", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows 0.61.3", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219a1f983a2af3653f75b5747f76733b0da7ff03069c7a41901a5eb3ace4557d" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever 0.29.1", + "http 1.4.0", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 0.9.12+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "tendril" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" +dependencies = [ + "new_debug_unreachable", + "utf-8", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec 0.11.5", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-serial" +version = "5.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa1d5427f11ba7c5e6384521cfd76f2d64572ff29f3f4f7aa0f496282923fdc8" +dependencies = [ + "cfg-if", + "futures", + "log", + "mio-serial", + "serialport", + "tokio", +] + +[[package]] +name = "tokio-socks" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" +dependencies = [ + "either", + "futures-util", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-test" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6d24790a10a7af737693a3e8f1d03faef7e6ca0cc99aae5066f533766de545" +dependencies = [ + "futures-core", + "tokio", + "tokio-stream", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite 0.26.2", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite 0.28.0", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite 0.29.0", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-websockets" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad543404f98bfc969aeb71994105c592acfc6c43323fddcd016bb208d1c65cb" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-sink", + "http 1.4.0", + "httparse", + "rand 0.10.0", + "ring", + "rustls-pki-types", + "simdutf8", + "tokio", + "tokio-rustls", + "tokio-util", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.1.0", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8195ca05e4eb728f4ba94f3e3291661320af739c4e43779cbdfae82ab239fcc" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.1.0", + "toml_datetime 1.1.0+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.0", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.6.11", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.6.11", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.13.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_edit" +version = "0.25.8+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 1.1.0+spec-1.1.0", + "toml_parser", + "winnow 1.0.0", +] + +[[package]] +name = "toml_parser" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" +dependencies = [ + "winnow 1.0.0", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed" + +[[package]] +name = "tonic" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bytes", + "http 1.4.0", + "http-body", + "http-body-util", + "percent-encoding", + "pin-project", + "sync_wrapper", + "tokio-stream", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-prost" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" +dependencies = [ + "bytes", + "prost 0.14.3", + "tonic", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "async-compression", + "bitflags 2.11.0", + "bytes", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body", + "http-body-util", + "iri-string", + "pin-project-lite", + "tokio", + "tokio-util", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tray-icon" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.17.16", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http 1.4.0", + "httparse", + "log", + "rand 0.9.2", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +dependencies = [ + "bytes", + "data-encoding", + "http 1.4.0", + "httparse", + "log", + "rand 0.9.2", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" +dependencies = [ + "bytes", + "data-encoding", + "http 1.4.0", + "httparse", + "log", + "rand 0.9.2", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", +] + +[[package]] +name = "twox-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" + +[[package]] +name = "type1-encoding-parser" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa10c302f5a53b7ad27fd42a3996e23d096ba39b5b8dd6d9e683a05b01bee749" +dependencies = [ + "pom", +] + +[[package]] +name = "typed-builder" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31aa81521b70f94402501d848ccc0ecaa8f93c8eb6999eb9747e72287757ffda" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076a02dc54dd46795c2e9c8282ed40bcfb1e22747e955de9389a1de28190fb26" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "typewit" +version = "1.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c1ae7cc0fdb8b842d65d127cb981574b0d2b249b74d1c7a2986863dc134f71" +dependencies = [ + "typewit_proc_macros", +] + +[[package]] +name = "typewit_proc_macros" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "uf2-decode" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca77d41ab27e3fa45df42043f96c79b80c6d8632eed906b54681d8d47ab00623" + +[[package]] +name = "ulid" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" +dependencies = [ + "rand 0.9.2", + "web-time", +] + +[[package]] +name = "unescaper" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4064ed685c487dbc25bd3f0e9548f2e34bab9d18cefc700f9ec2dba74ba1138e" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "ureq" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" +dependencies = [ + "base64 0.22.1", + "cookie_store", + "flate2", + "log", + "percent-encoding", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "ureq-proto", + "utf8-zero", + "webpki-roots 1.0.6", +] + +[[package]] +name = "ureq-proto" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" +dependencies = [ + "base64 0.22.1", + "http 1.4.0", + "httparse", + "log", +] + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8-zero" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "vodozemac" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c022a277687e4e8685d72b95a7ca3ccfec907daa946678e715f8badaa650883d" +dependencies = [ + "aes", + "arrayvec", + "base64 0.22.1", + "base64ct", + "cbc", + "chacha20poly1305", + "curve25519-dalek", + "ed25519-dalek", + "getrandom 0.2.17", + "hkdf", + "hmac", + "matrix-pickle", + "prost 0.13.5", + "rand 0.8.5", + "serde", + "serde_bytes", + "serde_json", + "sha2", + "subtle", + "thiserror 2.0.18", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "wa-rs" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fecb468bdfe1e7d4c06a1bd12908c66edaca59024862cb64757ad11c3b948b1" +dependencies = [ + "anyhow", + "async-channel 2.5.0", + "async-trait", + "base64 0.22.1", + "bytes", + "chrono", + "dashmap", + "env_logger", + "hex", + "log", + "moka", + "prost 0.14.3", + "rand 0.9.2", + "rand_core 0.10.0", + "scopeguard", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "wa-rs-binary", + "wa-rs-core", + "wa-rs-proto", +] + +[[package]] +name = "wa-rs-appstate" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3845137b3aead2d99de7c6744784bf2f5a908be9dc97a3dbd7585dc40296925c" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "hkdf", + "log", + "prost 0.14.3", + "serde", + "serde-big-array", + "serde_json", + "sha2", + "thiserror 2.0.18", + "wa-rs-binary", + "wa-rs-libsignal", + "wa-rs-proto", +] + +[[package]] +name = "wa-rs-binary" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b30a6e11aebb39c07392675256ead5e2570c31382bd4835d6ddc877284b6be" +dependencies = [ + "flate2", + "phf 0.13.1", + "phf_codegen 0.13.1", + "serde", + "serde_json", +] + +[[package]] +name = "wa-rs-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed13bb2aff2de43fc4dd821955f03ea48a1d31eda3c80efe6f905898e304d11f" +dependencies = [ + "aes", + "aes-gcm", + "anyhow", + "async-channel 2.5.0", + "async-trait", + "base64 0.22.1", + "bytes", + "chrono", + "ctr", + "flate2", + "hex", + "hkdf", + "hmac", + "log", + "md5", + "once_cell", + "pbkdf2", + "prost 0.14.3", + "protobuf", + "rand 0.9.2", + "rand_core 0.10.0", + "serde", + "serde-big-array", + "serde_json", + "sha2", + "thiserror 2.0.18", + "typed-builder", + "wa-rs-appstate", + "wa-rs-binary", + "wa-rs-derive", + "wa-rs-libsignal", + "wa-rs-noise", + "wa-rs-proto", +] + +[[package]] +name = "wa-rs-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c03f610c9bc960e653d5d6d2a4cced9013bedbe5e6e8948787bbd418e4137c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "wa-rs-libsignal" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3471be8ff079ae4959fcddf2e7341281e5c6756bdc6a66454ea1a8e474d14576" +dependencies = [ + "aes", + "aes-gcm", + "arrayref", + "async-trait", + "cbc", + "chrono", + "ctr", + "curve25519-dalek", + "derive_more 2.1.1", + "displaydoc", + "ghash", + "hex", + "hkdf", + "hmac", + "itertools 0.14.0", + "log", + "prost 0.14.3", + "rand 0.9.2", + "serde", + "sha1", + "sha2", + "subtle", + "thiserror 2.0.18", + "uuid", + "wa-rs-proto", + "x25519-dalek", +] + +[[package]] +name = "wa-rs-noise" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3efb3891c1e22ce54646dc581e34e79377dc402ed8afb11a7671c5ef629b3ae" +dependencies = [ + "aes-gcm", + "anyhow", + "bytes", + "hkdf", + "log", + "prost 0.14.3", + "rand 0.9.2", + "rand_core 0.10.0", + "sha2", + "thiserror 2.0.18", + "wa-rs-binary", + "wa-rs-libsignal", + "wa-rs-proto", +] + +[[package]] +name = "wa-rs-proto" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ada50ee03752f0e66ada8cf415ed5f90d572d34039b058ce23d8b13493e510" +dependencies = [ + "prost 0.14.3", + "prost-build", + "serde", +] + +[[package]] +name = "wa-rs-tokio-transport" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfc638c168949dc99cbb756a776869898d4ae654b36b90d5f7ce2d32bf92a404" +dependencies = [ + "anyhow", + "async-channel 2.5.0", + "async-trait", + "bytes", + "futures-util", + "http 1.4.0", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tokio-websockets", + "wa-rs-core", + "webpki-roots 1.0.6", +] + +[[package]] +name = "wa-rs-ureq-http" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d0c7fff8a7bd93d0c17af8d797a3934144fa269fe47a615635f3bf04238806" +dependencies = [ + "anyhow", + "async-trait", + "tokio", + "ureq", + "wa-rs-core", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi-common" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913b688354290a2890e174c053792c7ea60c47415cef4c0b07548b7eda739c83" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "cap-fs-ext", + "cap-rand", + "cap-std", + "cap-time-ext", + "fs-set-times", + "io-extras", + "io-lifetimes", + "log", + "rustix 1.1.4", + "system-interface", + "thiserror 2.0.18", + "tracing", + "wasmtime", + "wiggle", + "windows-sys 0.60.2", +] + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.239.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be00faa2b4950c76fe618c409d2c3ea5a3c9422013e079482d78544bb2d184c" +dependencies = [ + "leb128fmt", + "wasmparser 0.239.0", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser 0.244.0", +] + +[[package]] +name = "wasm-encoder" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9dca005e69bf015e45577e415b9af8c67e8ee3c0e38b5b0add5aa92581ed5c" +dependencies = [ + "leb128fmt", + "wasmparser 0.245.1", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder 0.244.0", + "wasmparser 0.244.0", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasm_evt_listener" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc92d6378b411ed94839112a36d9dbc77143451d85b05dfb0cce93a78dab1963" +dependencies = [ + "accessory", + "derivative", + "derive_more 1.0.0", + "fancy_constructor", + "futures-core", + "js-sys", + "smallvec", + "tokio", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.239.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9d90bb93e764f6beabf1d02028c70a2156a6583e63ac4218dd07ef733368b0" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", + "serde", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e" +dependencies = [ + "bitflags 2.11.0", + "indexmap 2.13.0", + "semver", +] + +[[package]] +name = "wasmprinter" +version = "0.239.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3981f3d51f39f24f5fc90f93049a90f08dbbca8deba602cd46bb8ca67a94718" +dependencies = [ + "anyhow", + "termcolor", + "wasmparser 0.239.0", +] + +[[package]] +name = "wasmtime" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efcab4481a639a8f3413aa011f733db105ecccc1326a51a6f5c7d09c99314f85" +dependencies = [ + "addr2line", + "anyhow", + "async-trait", + "bitflags 2.11.0", + "bumpalo", + "cc", + "cfg-if", + "encoding_rs", + "fxprof-processed-profile", + "gimli", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "ittapi", + "libc", + "log", + "mach2 0.4.3", + "memfd", + "object 0.37.3", + "once_cell", + "postcard", + "pulley-interpreter", + "rayon", + "rustix 1.1.4", + "semver", + "serde", + "serde_derive", + "serde_json", + "smallvec", + "target-lexicon 0.13.5", + "wasm-encoder 0.239.0", + "wasmparser 0.239.0", + "wasmtime-environ", + "wasmtime-internal-asm-macros", + "wasmtime-internal-cache", + "wasmtime-internal-component-macro", + "wasmtime-internal-component-util", + "wasmtime-internal-cranelift", + "wasmtime-internal-fiber", + "wasmtime-internal-jit-debug", + "wasmtime-internal-jit-icache-coherence", + "wasmtime-internal-math", + "wasmtime-internal-slab", + "wasmtime-internal-unwinder", + "wasmtime-internal-versioned-export-macros", + "wasmtime-internal-winch", + "wat", + "windows-sys 0.60.2", +] + +[[package]] +name = "wasmtime-environ" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5f8069e3d2a235a8d273e58fc3b2088c730477fe8d5364495d4bf20ddbc45d" +dependencies = [ + "anyhow", + "cpp_demangle", + "cranelift-bitset", + "cranelift-entity", + "gimli", + "indexmap 2.13.0", + "log", + "object 0.37.3", + "postcard", + "rustc-demangle", + "semver", + "serde", + "serde_derive", + "smallvec", + "target-lexicon 0.13.5", + "wasm-encoder 0.239.0", + "wasmparser 0.239.0", + "wasmprinter", + "wasmtime-internal-component-util", +] + +[[package]] +name = "wasmtime-internal-asm-macros" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bdb85a6f168e68d3062fe38c784b2735924cb49733c3ce3e2c9679566c8894" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "wasmtime-internal-cache" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca4dc44ca075a2a22e733e661413d1be5352053c11dbc01042c01a5d7d70037" +dependencies = [ + "anyhow", + "base64 0.22.1", + "directories-next", + "log", + "postcard", + "rustix 1.1.4", + "serde", + "serde_derive", + "sha2", + "toml 0.8.23", + "windows-sys 0.60.2", + "zstd", +] + +[[package]] +name = "wasmtime-internal-component-macro" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf8aa820447f93cfdc089d744361333f16416c1bebc33e234f4fc5d15766dfe8" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasmtime-internal-component-util", + "wasmtime-internal-wit-bindgen", + "wit-parser 0.239.0", +] + +[[package]] +name = "wasmtime-internal-component-util" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38171538c2612e9d07473f06fcf03d872fe1581e3f7c8587e04e2b2f8e47dcab" + +[[package]] +name = "wasmtime-internal-cranelift" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4440d46baa6b12a40ba6beb1476ed023cee02e8fb45629d2666b9a852398c04b" +dependencies = [ + "anyhow", + "cfg-if", + "cranelift-codegen", + "cranelift-control", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "gimli", + "itertools 0.14.0", + "log", + "object 0.37.3", + "pulley-interpreter", + "smallvec", + "target-lexicon 0.13.5", + "thiserror 2.0.18", + "wasmparser 0.239.0", + "wasmtime-environ", + "wasmtime-internal-math", + "wasmtime-internal-unwinder", + "wasmtime-internal-versioned-export-macros", +] + +[[package]] +name = "wasmtime-internal-fiber" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8d776059b7f5674f2823b9d283616acfcd7e45b862bfad7c257485621099dea" +dependencies = [ + "anyhow", + "cc", + "cfg-if", + "libc", + "rustix 1.1.4", + "wasmtime-internal-asm-macros", + "wasmtime-internal-versioned-export-macros", + "windows-sys 0.60.2", +] + +[[package]] +name = "wasmtime-internal-jit-debug" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f189b670fe4e668015cace8a1df1faae03ed9f6b2b638a504204336b4b34de2" +dependencies = [ + "cc", + "object 0.37.3", + "rustix 1.1.4", + "wasmtime-internal-versioned-export-macros", +] + +[[package]] +name = "wasmtime-internal-jit-icache-coherence" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f138fe8652acc4cf8d5de15952a6b6c4bdef10479d33199cc6d50c3fbe778cdd" +dependencies = [ + "anyhow", + "cfg-if", + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "wasmtime-internal-math" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f9a2bff5db67f19f3d2f7b6ed4b4f67def9917111b824595eb84ef8e43c008e" +dependencies = [ + "libm", +] + +[[package]] +name = "wasmtime-internal-slab" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eafd48d67f1aae5a188c4842bee9de2c9f0e7a07626136e54223a0eb63bd4bca" + +[[package]] +name = "wasmtime-internal-unwinder" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73cb01a1d8cd95583ac06cb82fc2ad465e893c3ed7d9765f750dfd9d2483a411" +dependencies = [ + "anyhow", + "cfg-if", + "cranelift-codegen", + "log", + "object 0.37.3", +] + +[[package]] +name = "wasmtime-internal-versioned-export-macros" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d46615cb9e10960b72cc6f4b2220062523c06d25fff33a4e61d525a4f73ee8c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "wasmtime-internal-winch" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cd3b2c652e93a8b3d6499f3299e46cb58db076a4477ddef594be9089f4cac38" +dependencies = [ + "anyhow", + "cranelift-codegen", + "gimli", + "log", + "object 0.37.3", + "target-lexicon 0.13.5", + "wasmparser 0.239.0", + "wasmtime-environ", + "wasmtime-internal-cranelift", + "winch-codegen", +] + +[[package]] +name = "wasmtime-internal-wit-bindgen" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98aaee67f9f92aa730a0e6e977474d056f7d9c15ba259494574e3c2d0b75e14" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "heck 0.5.0", + "indexmap 2.13.0", + "wit-parser 0.239.0", +] + +[[package]] +name = "wast" +version = "35.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" +dependencies = [ + "leb128", +] + +[[package]] +name = "wast" +version = "245.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cf1149285569120b8ce39db8b465e8a2b55c34cbb586bd977e43e2bc7300bf" +dependencies = [ + "bumpalo", + "leb128fmt", + "memchr", + "unicode-width 0.2.2", + "wasm-encoder 0.245.1", +] + +[[package]] +name = "wat" +version = "1.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd48d1679b6858988cb96b154dda0ec5bbb09275b71db46057be37332d5477be" +dependencies = [ + "wast 245.0.1", +] + +[[package]] +name = "web-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414" +dependencies = [ + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache 0.8.9", + "string_cache_codegen 0.5.4", +] + +[[package]] +name = "web_atoms" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +dependencies = [ + "phf 0.13.1", + "phf_codegen 0.13.1", + "string_cache 0.9.0", + "string_cache_codegen 0.6.1", +] + +[[package]] +name = "webdriver" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91d53921e1bef27512fa358179c9a22428d55778d2c2ae3c5c37a52b82ce6e92" +dependencies = [ + "base64 0.22.1", + "bytes", + "cookie 0.16.2", + "http 0.2.12", + "icu_segmenter", + "log", + "serde", + "serde_derive", + "serde_json", + "thiserror 1.0.69", + "time", + "url", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.6", +] + +[[package]] +name = "webpki-roots" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows 0.61.3", + "windows-core 0.61.2", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "which" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459" +dependencies = [ + "libc", +] + +[[package]] +name = "wiggle" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a792fe35c2ba3092e8ed3b832a5a671f3076861628f9e9810f6ad7de802007" +dependencies = [ + "anyhow", + "async-trait", + "bitflags 2.11.0", + "thiserror 2.0.18", + "tracing", + "wasmtime", + "wiggle-macro", + "witx", +] + +[[package]] +name = "wiggle-generate" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "661421edf501b09b2ae7e2ffd234dd2947be67d4ca320c41da2325592543b181" +dependencies = [ + "anyhow", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "witx", +] + +[[package]] +name = "wiggle-macro" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e2741d47a84e93ae623216d8b6cc2b42e3b659ca987d44fffd4f020a1dc56c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "wiggle-generate", +] + +[[package]] +name = "wildmatch" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29333c3ea1ba8b17211763463ff24ee84e41c78224c16b001cd907e663a38c68" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winch-codegen" +version = "37.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece82b2b1513521f0bf419a61b4a6151bc99ee2906f3d51a75faf92c38c9b041" +dependencies = [ + "anyhow", + "cranelift-assembler-x64", + "cranelift-codegen", + "gimli", + "regalloc2", + "smallvec", + "target-lexicon 0.13.5", + "thiserror 2.0.18", + "wasmparser 0.239.0", + "wasmtime-environ", + "wasmtime-internal-cranelift", + "wasmtime-internal-math", +] + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "winx" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" +dependencies = [ + "bitflags 2.11.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "wiremock" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08db1edfb05d9b3c1542e521aea074442088292f00b5f28e435c714a98f85031" +dependencies = [ + "assert-json-diff", + "base64 0.22.1", + "deadpool", + "futures", + "http 1.4.0", + "http-body-util", + "hyper", + "hyper-util", + "log", + "once_cell", + "regex", + "serde", + "serde_json", + "tokio", + "url", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser 0.244.0", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.244.0", + "wasm-metadata", + "wasmparser 0.244.0", + "wit-parser 0.244.0", +] + +[[package]] +name = "wit-parser" +version = "0.239.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55c92c939d667b7bf0c6bf2d1f67196529758f99a2a45a3355cc56964fd5315d" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.239.0", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.244.0", +] + +[[package]] +name = "witx" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" +dependencies = [ + "anyhow", + "log", + "thiserror 1.0.69", + "wast 35.0.2", +] + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wry" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a8135d8676225e5744de000d4dff5a082501bf7db6a1c1495034f8c314edbc" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie 0.18.1", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http 1.4.0", + "javascriptcore-rs", + "jni", + "libc", + "ndk 0.9.0", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core 0.6.4", + "serde", + "zeroize", +] + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix 1.1.4", +] + +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive 0.7.5", + "zerofrom", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive 0.8.1", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.4.1", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix 1.1.4", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.15", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow 0.7.15", + "zvariant", +] + +[[package]] +name = "zeroclaw-desktop" +version = "0.1.0" +dependencies = [ + "anyhow", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "reqwest 0.12.28", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-shell", + "tauri-plugin-single-instance", + "tauri-plugin-store", + "tokio", +] + +[[package]] +name = "zeroclaw-robot-kit" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "base64 0.22.1", + "chrono", + "directories", + "portable-atomic", + "reqwest 0.12.28", + "rppal", + "serde", + "serde_json", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tokio-test", + "toml 1.1.0+spec-1.1.0", + "tracing", +] + +[[package]] +name = "zeroclawlabs" +version = "0.6.3" +dependencies = [ + "aardvark-sys", + "anyhow", + "async-imap", + "async-trait", + "axum", + "base64 0.22.1", + "chacha20poly1305", + "chrono", + "chrono-tz", + "clap", + "clap_complete", + "console", + "cpal", + "criterion", + "cron", + "dialoguer", + "directories", + "extism", + "fantoccini", + "flate2", + "futures-util", + "glob", + "hex", + "hmac", + "hostname", + "http-body-util", + "hyper", + "hyper-util", + "image", + "indicatif", + "landlock", + "lettre", + "libc", + "mail-parser", + "matrix-sdk", + "mime_guess", + "nanohtml2text", + "nostr-sdk", + "nusb", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry_sdk", + "parking_lot", + "pdf-extract", + "portable-atomic", + "probe-rs", + "prometheus", + "prost 0.14.3", + "qrcode", + "rand 0.10.0", + "rcgen", + "regex", + "reqwest 0.12.28", + "ring", + "rppal", + "rusqlite", + "rust-embed", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "schemars 1.2.1", + "scopeguard", + "serde", + "serde-big-array", + "serde_json", + "sha2", + "shellexpand", + "tar", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tokio-rustls", + "tokio-serial", + "tokio-socks", + "tokio-stream", + "tokio-tungstenite 0.29.0", + "tokio-util", + "toml 1.1.0+spec-1.1.0", + "tower", + "tower-http", + "tracing", + "tracing-subscriber", + "urlencoding", + "uuid", + "wa-rs", + "wa-rs-binary", + "wa-rs-core", + "wa-rs-proto", + "wa-rs-tokio-transport", + "wa-rs-ureq-http", + "webpki-roots 1.0.6", + "which", + "wiremock", + "zip", +] + +[[package]] +name = "zerocopy" +version = "0.8.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke 0.8.1", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke 0.7.5", + "zerofrom", + "zerovec-derive 0.10.3", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke 0.8.1", + "zerofrom", + "zerovec-derive 0.11.2", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zip" +version = "8.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7756d0206d058333667493c4014f545f4b9603c4330ccd6d9b3f86dcab59f7d9" +dependencies = [ + "crc32fast", + "flate2", + "indexmap 2.13.0", + "memchr", + "typed-path", +] + +[[package]] +name = "zlib-rs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + +[[package]] +name = "zune-jpeg" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7a1c0af6e5d8d1363f4994b7a091ccf963d8b694f7da5b0b9cceb82da2c0a6" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.15", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 0.7.15", +] diff --git a/third_party/zeroclaw/Cargo.toml b/third_party/zeroclaw/Cargo.toml new file mode 100644 index 0000000..f408c2d --- /dev/null +++ b/third_party/zeroclaw/Cargo.toml @@ -0,0 +1,337 @@ +[workspace] +members = [".", "crates/robot-kit", "crates/aardvark-sys", "apps/tauri"] +resolver = "2" + +[package] +name = "zeroclawlabs" +version = "0.6.3" +edition = "2021" +authors = ["theonlyhennygod"] +license = "MIT OR Apache-2.0" +description = "Zero overhead. Zero compromise. 100% Rust. The fastest, smallest AI assistant." +repository = "https://github.com/zeroclaw-labs/zeroclaw" +readme = "README.md" +keywords = ["ai", "agent", "cli", "assistant", "chatbot"] +categories = ["command-line-utilities", "api-bindings"] +rust-version = "1.87" +include = [ + "/src/**/*", + "/build.rs", + "/Cargo.toml", + "/Cargo.lock", + "/LICENSE*", + "/README.md", + "/web/dist/**/*", + "/tool_descriptions/**/*", +] + +[[bin]] +name = "zeroclaw" +path = "src/main.rs" + +[lib] +name = "zeroclaw" +path = "src/lib.rs" + +[dependencies] +# CLI - minimal and fast +clap = { version = "4.5", features = ["derive"] } +clap_complete = "4.5" + +# Async runtime - feature-optimized for size +tokio = { version = "1.50", default-features = false, features = ["rt-multi-thread", "macros", "time", "net", "io-util", "sync", "process", "io-std", "fs", "signal"] } +tokio-util = { version = "0.7", default-features = false } +tokio-stream = { version = "0.1.18", default-features = false, features = ["fs", "sync"] } + +# HTTP client - minimal features +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "blocking", "multipart", "stream", "socks"] } + +# Matrix client + E2EE decryption +matrix-sdk = { version = "0.16", optional = true, default-features = false, features = ["e2e-encryption", "rustls-tls", "markdown", "sqlite"] } + +# Serialization +serde = { version = "1.0", default-features = false, features = ["derive"] } +serde_json = { version = "1.0", default-features = false, features = ["std"] } + +# Config +directories = "6.0" +toml = "1.0" +shellexpand = "3.1" + +# JSON Schema generation for config export +schemars = "1.2" + +# Logging - minimal +tracing = { version = "0.1", default-features = false } +tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt", "ansi", "env-filter"] } + +# Observability - Prometheus metrics (optional; requires AtomicU64, unavailable on 32-bit) +prometheus = { version = "0.14", default-features = false, optional = true } + +# Base64 encoding (screenshots, image data) +base64 = "0.22" +image = { version = "0.25", default-features = false, features = ["jpeg", "png"] } + +# URL encoding for web search +urlencoding = "2.1" + +# HTML to plain text conversion (web_fetch tool) +nanohtml2text = "0.2" + +# Optional Rust-native browser automation backend +fantoccini = { version = "0.22.1", optional = true, default-features = false, features = ["rustls-tls"] } + +# Progress bars (update pipeline) +indicatif = "0.18" + +# Temp files (update pipeline rollback) +tempfile = "3.26" + +# Tar/gzip extraction (update pipeline) +flate2 = "1.1" +tar = "0.4" + +# Zip extraction for ClawhHub / OpenClaw registry installers +zip = { version = "8.1", default-features = false, features = ["deflate-flate2"] } + +# Error handling +anyhow = "1.0" +thiserror = "2.0" + +# Aardvark I2C/SPI/GPIO USB adapter (Total Phase) — stub when SDK absent +aardvark-sys = { path = "crates/aardvark-sys", version = "0.1.0" } + +# UUID generation +uuid = { version = "1.22", default-features = false, features = ["v4", "std"] } + +# Authenticated encryption (AEAD) for secret store +chacha20poly1305 = "0.10" + +# HMAC for webhook signature verification +hmac = "0.12" +sha2 = "0.10" +hex = "0.4" + +# CSPRNG for secure token generation +rand = "0.10" + +# Portable atomic fallbacks for targets without native 64-bit atomics +portable-atomic = "1" + +# serde-big-array for wa-rs storage (large array serialization) +serde-big-array = { version = "0.5", optional = true } + +# Fast mutexes that don't poison on panic +parking_lot = "0.12" + +# Async traits +async-trait = "0.1" + +# HMAC-SHA256 (Zhipu/GLM JWT auth) +ring = "0.17" + +# Protobuf encode/decode (Lark WS frame codec, WhatsApp storage) +prost = { version = "0.14", default-features = false, features = ["derive"], optional = true } + +# Memory / persistence +rusqlite = { version = "0.37", features = ["bundled"] } +chrono = { version = "0.4", default-features = false, features = ["clock", "std", "serde"] } +chrono-tz = "0.10" +cron = "0.15" + +# Interactive CLI prompts +dialoguer = { version = "0.12", features = ["fuzzy-select"] } +console = "0.16" + +# Hardware discovery (device path globbing) +glob = "0.3" + +# Binary discovery (init system detection) +which = "8.0" + +# WebSocket client channels (Discord/Lark/DingTalk/Nostr) +tokio-tungstenite = { version = "0.29", features = ["rustls-tls-webpki-roots"] } +tokio-socks = "0.5" +futures-util = { version = "0.3", default-features = false, features = ["sink"] } +nostr-sdk = { version = "0.44", default-features = false, features = ["nip04", "nip59"], optional = true } +regex = "1.10" +hostname = "0.4.2" +rustls = "0.23" +rustls-pemfile = "2" +rustls-pki-types = "1.14.0" +tokio-rustls = "0.26.4" +webpki-roots = "1.0.6" + +# email +lettre = { version = "0.11.19", default-features = false, features = ["builder", "smtp-transport", "rustls-tls"] } +mail-parser = "0.11.2" +async-imap = { version = "0.11",features = ["runtime-tokio"], default-features = false } + +# HTTP server (gateway) — replaces raw TCP for proper HTTP/1.1 compliance +axum = { version = "0.8", default-features = false, features = ["http1", "json", "tokio", "query", "ws", "macros"] } +hyper = { version = "1", features = ["http1", "server"] } +hyper-util = { version = "0.1", features = ["tokio", "server-auto", "server-graceful"] } +tower = { version = "0.5", default-features = false, features = ["util"] } +tower-http = { version = "0.6", default-features = false, features = ["limit", "timeout"] } +http-body-util = "0.1" + +# Embed frontend assets into binary (web dashboard) +rust-embed = "8" +mime_guess = "2" + +# OpenTelemetry — OTLP trace + metrics export. +# Use the blocking HTTP exporter client to avoid Tokio-reactor panics in +# OpenTelemetry background batch threads when ZeroClaw emits spans/metrics from +# non-Tokio contexts. +opentelemetry = { version = "0.31", default-features = false, features = ["trace", "metrics"], optional = true } +opentelemetry_sdk = { version = "0.31", default-features = false, features = ["trace", "metrics"], optional = true } +opentelemetry-otlp = { version = "0.31", default-features = false, features = ["trace", "metrics", "http-proto", "reqwest-blocking-client", "reqwest-rustls-webpki-roots"], optional = true } + +# Serial port for peripheral communication (STM32, etc.) +tokio-serial = { version = "5", default-features = false, optional = true } + +# USB device enumeration (hardware discovery) — only on platforms nusb supports +# (Linux, macOS, Windows). Android/Termux uses target_os="android" and is excluded. +[target.'cfg(any(target_os = "linux", target_os = "macos", target_os = "windows"))'.dependencies] +nusb = { version = "0.2", default-features = false, optional = true } + +# probe-rs for STM32/Nucleo memory read (Phase B) +probe-rs = { version = "0.31", optional = true } + +# PDF extraction for datasheet RAG (optional, enable with --features rag-pdf) +pdf-extract = { version = "0.10", optional = true } + +# WASM plugin runtime (extism) +extism = { version = "1.20", optional = true } + +# Cross-platform audio capture for voice wake word detection (optional, enable with --features voice-wake) +cpal = { version = "0.15", optional = true } + +# Terminal QR rendering for WhatsApp Web pairing flow. +qrcode = { version = "0.14", optional = true } + +# WhatsApp Web client (wa-rs) — optional, enable with --features whatsapp-web +# Uses wa-rs for Bot and Client, wa-rs-core for storage traits, custom rusqlite backend avoids Diesel conflict. +wa-rs = { version = "0.2", optional = true, default-features = false } +wa-rs-core = { version = "0.2", optional = true, default-features = false } +wa-rs-binary = { version = "0.2", optional = true, default-features = false } +wa-rs-proto = { version = "0.2", optional = true, default-features = false } +wa-rs-ureq-http = { version = "0.2", optional = true } +wa-rs-tokio-transport = { version = "0.2", optional = true, default-features = false } + +# Raspberry Pi GPIO / Landlock (Linux only) — target-specific to avoid compile failure on macOS +[target.'cfg(target_os = "linux")'.dependencies] +rppal = { version = "0.22", optional = true } +landlock = { version = "0.4", optional = true } + +# Unix-specific dependencies (for root check, etc.) +[target.'cfg(unix)'.dependencies] +libc = "0.2" + +[features] +default = ["observability-prometheus", "skill-creation"] +channel-nostr = ["dep:nostr-sdk"] +hardware = ["nusb", "tokio-serial"] +channel-matrix = ["dep:matrix-sdk"] +channel-lark = ["dep:prost"] +channel-feishu = ["channel-lark"] # Alias for Feishu users (Lark and Feishu are the same platform) +observability-prometheus = ["dep:prometheus"] +observability-otel = ["dep:opentelemetry", "dep:opentelemetry_sdk", "dep:opentelemetry-otlp"] +peripheral-rpi = ["rppal"] +# Browser backend feature alias used by cfg(feature = "browser-native") +browser-native = ["dep:fantoccini"] +# Backward-compatible alias for older invocations +fantoccini = ["browser-native"] +# Sandbox feature aliases used by cfg(feature = "sandbox-*") +sandbox-landlock = ["dep:landlock"] +sandbox-bubblewrap = [] +# Backward-compatible alias for older invocations +landlock = ["sandbox-landlock"] +# Prometheus metrics observer (requires 64-bit atomics; disable on 32-bit targets) +metrics = ["observability-prometheus"] +# probe = probe-rs for Nucleo memory read (adds ~50 deps; optional) +probe = ["dep:probe-rs"] +# rag-pdf = PDF ingestion for datasheet RAG +rag-pdf = ["dep:pdf-extract"] +# skill-creation = Autonomous skill creation from successful multi-step tasks +skill-creation = [] +# whatsapp-web = Native WhatsApp Web client with custom rusqlite storage backend +whatsapp-web = ["dep:wa-rs", "dep:wa-rs-core", "dep:wa-rs-binary", "dep:wa-rs-proto", "dep:wa-rs-ureq-http", "dep:wa-rs-tokio-transport", "dep:serde-big-array", "dep:prost", "dep:qrcode"] +# voice-wake = Voice wake word detection via microphone (cpal) +voice-wake = ["dep:cpal"] +# WASM plugin system (extism-based) +plugins-wasm = ["dep:extism"] +# WebAuthn / FIDO2 hardware key authentication +webauthn = [] +# Meta-feature for CI: all features except those requiring system C libraries +# not available on standard CI runners (e.g., voice-wake needs libasound2-dev). +ci-all = [ + "channel-nostr", + "hardware", + "channel-matrix", + "channel-lark", + "observability-prometheus", + "observability-otel", + "peripheral-rpi", + "browser-native", + "sandbox-landlock", + "sandbox-bubblewrap", + "probe", + "rag-pdf", + "skill-creation", + "whatsapp-web", + "plugins-wasm", +] + +[profile.release] +opt-level = "z" # Optimize for size +lto = "fat" # Maximum cross-crate optimization for smaller binaries +codegen-units = 1 # Serialized codegen for low-memory devices (e.g., Raspberry Pi 3 with 1GB RAM) + # Higher values (e.g., 8) compile faster but require more RAM during compilation +strip = true # Remove debug symbols +panic = "abort" # Reduce binary size + +[profile.release-fast] +inherits = "release" +codegen-units = 8 # Parallel codegen for faster builds on powerful machines (16GB+ RAM recommended) + # Use: cargo build --profile release-fast + +[profile.ci] +inherits = "release" +lto = "thin" # Much faster than fat LTO; still catches release-mode issues +codegen-units = 16 # Full parallelism for CI runners + +[profile.dist] +inherits = "release" +opt-level = "z" +lto = "fat" +codegen-units = 1 +strip = true +panic = "abort" + +[dev-dependencies] +tempfile = "3.26" +criterion = { version = "0.8", features = ["async_tokio"] } +wiremock = "0.6" +scopeguard = "1.2" +rcgen = "0.13" + +[[test]] +name = "component" +path = "tests/test_component.rs" + +[[test]] +name = "integration" +path = "tests/test_integration.rs" + +[[test]] +name = "system" +path = "tests/test_system.rs" + +[[test]] +name = "live" +path = "tests/test_live.rs" + +[[bench]] +name = "agent_benchmarks" +harness = false diff --git a/third_party/zeroclaw/Dockerfile b/third_party/zeroclaw/Dockerfile new file mode 100644 index 0000000..f9b1362 --- /dev/null +++ b/third_party/zeroclaw/Dockerfile @@ -0,0 +1,152 @@ +# syntax=docker/dockerfile:1.7 + +# ── Stage 0: Frontend build ───────────────────────────────────── +FROM node:22-alpine AS web-builder +WORKDIR /web +COPY web/package.json web/package-lock.json* ./ +RUN npm ci --ignore-scripts 2>/dev/null || npm install --ignore-scripts +COPY web/ . +RUN npm run build + +# ── Stage 1: Build ──────────────────────────────────────────── +FROM rust:1.94-slim@sha256:da9dab7a6b8dd428e71718402e97207bb3e54167d37b5708616050b1e8f60ed6 AS builder + +WORKDIR /app +ARG ZEROCLAW_CARGO_FEATURES="channel-lark,whatsapp-web" + +# Install build dependencies +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt-get update && apt-get install -y \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +# 1. Copy manifests to cache dependencies +COPY Cargo.toml Cargo.lock ./ +# Include every workspace member: Cargo.lock is generated for the full workspace. +# Previously we used sed to drop `crates/robot-kit`, which made the manifest disagree +# with the lockfile and caused `cargo --locked` to fail (Cargo refused to rewrite the lock). +COPY crates/robot-kit/ crates/robot-kit/ +COPY crates/aardvark-sys/ crates/aardvark-sys/ +# Create dummy targets declared in Cargo.toml so manifest parsing succeeds. +RUN mkdir -p src benches \ + && echo "fn main() {}" > src/main.rs \ + && echo "" > src/lib.rs \ + && echo "fn main() {}" > benches/agent_benchmarks.rs +RUN --mount=type=cache,id=zeroclaw-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=zeroclaw-cargo-git,target=/usr/local/cargo/git,sharing=locked \ + --mount=type=cache,id=zeroclaw-target,target=/app/target,sharing=locked \ + if [ -n "$ZEROCLAW_CARGO_FEATURES" ]; then \ + cargo build --release --locked --features "$ZEROCLAW_CARGO_FEATURES"; \ + else \ + cargo build --release --locked; \ + fi +RUN rm -rf src benches + +# 2. Copy only build-relevant source paths (avoid cache-busting on docs/tests/scripts) +COPY src/ src/ +COPY benches/ benches/ +COPY --from=web-builder /web/dist web/dist +COPY *.rs . +RUN touch src/main.rs +RUN --mount=type=cache,id=zeroclaw-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=zeroclaw-cargo-git,target=/usr/local/cargo/git,sharing=locked \ + --mount=type=cache,id=zeroclaw-target,target=/app/target,sharing=locked \ + rm -rf target/release/.fingerprint/zeroclawlabs-* \ + target/release/deps/zeroclawlabs-* \ + target/release/incremental/zeroclawlabs-* && \ + if [ -n "$ZEROCLAW_CARGO_FEATURES" ]; then \ + cargo build --release --locked --features "$ZEROCLAW_CARGO_FEATURES"; \ + else \ + cargo build --release --locked; \ + fi && \ + cp target/release/zeroclaw /app/zeroclaw && \ + strip /app/zeroclaw +RUN size=$(stat -c%s /app/zeroclaw) && \ + if [ "$size" -lt 1000000 ]; then echo "ERROR: binary too small (${size} bytes), likely dummy build artifact" && exit 1; fi + +# Prepare runtime directory structure and default config inline (no extra stage) +RUN mkdir -p /zeroclaw-data/.zeroclaw /zeroclaw-data/workspace && \ + printf '%s\n' \ + 'workspace_dir = "/zeroclaw-data/workspace"' \ + 'config_path = "/zeroclaw-data/.zeroclaw/config.toml"' \ + 'api_key = ""' \ + 'default_provider = "openrouter"' \ + 'default_model = "anthropic/claude-sonnet-4-20250514"' \ + 'default_temperature = 0.7' \ + '' \ + '[gateway]' \ + 'port = 42617' \ + 'host = "[::]"' \ + 'allow_public_bind = true' \ + 'require_pairing = false' \ + '' \ + '[autonomy]' \ + 'level = "supervised"' \ + 'auto_approve = ["file_read", "file_write", "file_edit", "memory_recall", "memory_store", "web_search_tool", "web_fetch", "calculator", "glob_search", "content_search", "image_info", "weather", "git_operations"]' \ + > /zeroclaw-data/.zeroclaw/config.toml && \ + chown -R 65534:65534 /zeroclaw-data + +# ── Stage 2: Development Runtime (Debian) ──────────────────── +FROM debian:trixie-slim@sha256:f6e2cfac5cf956ea044b4bd75e6397b4372ad88fe00908045e9a0d21712ae3ba AS dev + +# Install essential runtime dependencies only (use docker-compose.override.yml for dev tools) +RUN apt-get update && apt-get install -y \ + ca-certificates \ + curl \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=builder /zeroclaw-data /zeroclaw-data +COPY --from=builder /app/zeroclaw /usr/local/bin/zeroclaw + +# Overwrite minimal config with DEV template (Ollama defaults) +COPY dev/config.template.toml /zeroclaw-data/.zeroclaw/config.toml +RUN chown 65534:65534 /zeroclaw-data/.zeroclaw/config.toml + +# Environment setup +# Ensure UTF-8 locale so CJK / multibyte input is handled correctly +ENV LANG=C.UTF-8 +# Use consistent workspace path +ENV ZEROCLAW_WORKSPACE=/zeroclaw-data/workspace +ENV HOME=/zeroclaw-data +# Defaults for local dev (Ollama) - matches config.template.toml +ENV PROVIDER="ollama" +ENV ZEROCLAW_MODEL="llama3.2" +ENV ZEROCLAW_GATEWAY_PORT=42617 + +# Note: API_KEY is intentionally NOT set here to avoid confusion. +# It is set in config.toml as the Ollama URL. + +WORKDIR /zeroclaw-data +USER 65534:65534 +EXPOSE 42617 +HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=10s \ + CMD ["zeroclaw", "status", "--format=exit-code"] +ENTRYPOINT ["zeroclaw"] +CMD ["daemon"] + +# ── Stage 3: Production Runtime (Distroless) ───────────────── +FROM gcr.io/distroless/cc-debian13:nonroot@sha256:84fcd3c223b144b0cb6edc5ecc75641819842a9679a3a58fd6294bec47532bf7 AS release + +COPY --from=builder /app/zeroclaw /usr/local/bin/zeroclaw +COPY --from=builder /zeroclaw-data /zeroclaw-data + +# Environment setup +# Ensure UTF-8 locale so CJK / multibyte input is handled correctly +ENV LANG=C.UTF-8 +ENV ZEROCLAW_WORKSPACE=/zeroclaw-data/workspace +ENV HOME=/zeroclaw-data +# Default provider and model are set in config.toml, not here, +# so config file edits are not silently overridden +#ENV PROVIDER= +ENV ZEROCLAW_GATEWAY_PORT=42617 + +# API_KEY must be provided at runtime! + +WORKDIR /zeroclaw-data +USER 65534:65534 +EXPOSE 42617 +HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=10s \ + CMD ["zeroclaw", "status", "--format=exit-code"] +ENTRYPOINT ["zeroclaw"] +CMD ["daemon"] diff --git a/third_party/zeroclaw/Dockerfile.ci b/third_party/zeroclaw/Dockerfile.ci new file mode 100644 index 0000000..b0e4e31 --- /dev/null +++ b/third_party/zeroclaw/Dockerfile.ci @@ -0,0 +1,25 @@ +# Dockerfile.ci — CI/release image using pre-built binaries. +# Used by release workflows to skip the ~60 min Rust compilation. +# The main Dockerfile is still used for local dev builds. + +# ── Runtime (Distroless) ───────────────────────────────────── +FROM gcr.io/distroless/cc-debian13:nonroot@sha256:84fcd3c223b144b0cb6edc5ecc75641819842a9679a3a58fd6294bec47532bf7 + +ARG TARGETARCH + +# Copy the pre-built binary for this platform (amd64 or arm64) +COPY bin/${TARGETARCH}/zeroclaw /usr/local/bin/zeroclaw + +# Runtime directory structure and default config +COPY --chown=65534:65534 zeroclaw-data/ /zeroclaw-data/ + +ENV LANG=C.UTF-8 +ENV ZEROCLAW_WORKSPACE=/zeroclaw-data/workspace +ENV HOME=/zeroclaw-data +ENV ZEROCLAW_GATEWAY_PORT=42617 + +WORKDIR /zeroclaw-data +USER 65534:65534 +EXPOSE 42617 +ENTRYPOINT ["zeroclaw"] +CMD ["gateway"] diff --git a/third_party/zeroclaw/Dockerfile.debian b/third_party/zeroclaw/Dockerfile.debian new file mode 100644 index 0000000..5dd2076 --- /dev/null +++ b/third_party/zeroclaw/Dockerfile.debian @@ -0,0 +1,130 @@ +# syntax=docker/dockerfile:1.7 + +# ── Stage 0: Frontend build ───────────────────────────────────── +FROM node:22-alpine AS web-builder +WORKDIR /web +COPY web/package.json web/package-lock.json* ./ +RUN npm ci --ignore-scripts 2>/dev/null || npm install --ignore-scripts +COPY web/ . +RUN npm run build + +# Dockerfile.debian — Shell-equipped variant of the ZeroClaw container. +# +# The default Dockerfile produces a distroless "release" image with no shell, +# which is ideal for minimal attack surface but prevents the agent from using +# shell-based tools (pwd, ls, git, curl, etc.). +# +# This variant uses debian:bookworm-slim as the runtime base and ships +# essential CLI tools so the agent can operate as a full coding assistant. +# +# Build: +# docker build -f Dockerfile.debian -t zeroclaw:debian . +# +# Or with docker compose: +# docker compose -f docker-compose.yml -f docker-compose.debian.yml up + +# ── Stage 1: Build (match runtime glibc baseline) ─────────── +FROM rust:1.94-bookworm AS builder + +WORKDIR /app +ARG ZEROCLAW_CARGO_FEATURES="channel-lark,whatsapp-web" + +# Install build dependencies +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt-get update && apt-get install -y \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +# 1. Copy manifests to cache dependencies +COPY Cargo.toml Cargo.lock ./ +# Include every workspace member: Cargo.lock is generated for the full workspace. +# Previously we used sed to drop `crates/robot-kit`, which made the manifest disagree +# with the lockfile and caused `cargo --locked` to fail (Cargo refused to rewrite the lock). +COPY crates/robot-kit/ crates/robot-kit/ +# Create dummy targets declared in Cargo.toml so manifest parsing succeeds. +RUN mkdir -p src benches \ + && echo "fn main() {}" > src/main.rs \ + && echo "" > src/lib.rs \ + && echo "fn main() {}" > benches/agent_benchmarks.rs +RUN --mount=type=cache,id=zeroclaw-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=zeroclaw-cargo-git,target=/usr/local/cargo/git,sharing=locked \ + --mount=type=cache,id=zeroclaw-target,target=/app/target,sharing=locked \ + if [ -n "$ZEROCLAW_CARGO_FEATURES" ]; then \ + cargo build --release --locked --features "$ZEROCLAW_CARGO_FEATURES"; \ + else \ + cargo build --release --locked; \ + fi +RUN rm -rf src benches + +# 2. Copy only build-relevant source paths (avoid cache-busting on docs/tests/scripts) +COPY src/ src/ +COPY benches/ benches/ +COPY --from=web-builder /web/dist web/dist +RUN touch src/main.rs +RUN --mount=type=cache,id=zeroclaw-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=zeroclaw-cargo-git,target=/usr/local/cargo/git,sharing=locked \ + --mount=type=cache,id=zeroclaw-target,target=/app/target,sharing=locked \ + if [ -n "$ZEROCLAW_CARGO_FEATURES" ]; then \ + cargo build --release --locked --features "$ZEROCLAW_CARGO_FEATURES"; \ + else \ + cargo build --release --locked; \ + fi && \ + cp target/release/zeroclaw /app/zeroclaw && \ + strip /app/zeroclaw +RUN size=$(stat -c%s /app/zeroclaw) && \ + if [ "$size" -lt 1000000 ]; then echo "ERROR: binary too small (${size} bytes), likely dummy build artifact" && exit 1; fi + +# Prepare runtime directory structure and default config inline (no extra stage) +RUN mkdir -p /zeroclaw-data/.zeroclaw /zeroclaw-data/workspace && \ + printf '%s\n' \ + 'workspace_dir = "/zeroclaw-data/workspace"' \ + 'config_path = "/zeroclaw-data/.zeroclaw/config.toml"' \ + 'api_key = ""' \ + 'default_provider = "openrouter"' \ + 'default_model = "anthropic/claude-sonnet-4-20250514"' \ + 'default_temperature = 0.7' \ + '' \ + '[gateway]' \ + 'port = 42617' \ + 'host = "[::]"' \ + 'allow_public_bind = true' \ + '' \ + '[autonomy]' \ + 'level = "supervised"' \ + 'auto_approve = ["file_read", "file_write", "file_edit", "memory_recall", "memory_store", "web_search_tool", "web_fetch", "calculator", "glob_search", "content_search", "image_info", "weather", "git_operations"]' \ + > /zeroclaw-data/.zeroclaw/config.toml && \ + chown -R 65534:65534 /zeroclaw-data + +# ── Stage 2: Runtime (Debian with shell) ───────────────────── +FROM debian:bookworm-slim AS runtime + +# Install essential tools for agent shell operations +RUN apt-get update && apt-get install -y --no-install-recommends \ + bash \ + ca-certificates \ + curl \ + git \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=builder /app/zeroclaw /usr/local/bin/zeroclaw +COPY --from=builder /zeroclaw-data /zeroclaw-data + +# Environment setup +# Ensure UTF-8 locale so CJK / multibyte input is handled correctly +ENV LANG=C.UTF-8 +ENV ZEROCLAW_WORKSPACE=/zeroclaw-data/workspace +ENV HOME=/zeroclaw-data +# Default provider and model are set in config.toml, not here, +# so config file edits are not silently overridden +ENV ZEROCLAW_GATEWAY_PORT=42617 + +# API_KEY must be provided at runtime! + +WORKDIR /zeroclaw-data +USER 65534:65534 +EXPOSE 42617 +HEALTHCHECK --interval=60s --timeout=10s --retries=3 --start-period=10s \ + CMD ["zeroclaw", "status", "--format=exit-code"] +ENTRYPOINT ["zeroclaw"] +CMD ["daemon"] diff --git a/third_party/zeroclaw/Dockerfile.debian.ci b/third_party/zeroclaw/Dockerfile.debian.ci new file mode 100644 index 0000000..5b01931 --- /dev/null +++ b/third_party/zeroclaw/Dockerfile.debian.ci @@ -0,0 +1,34 @@ +# Dockerfile.debian.ci — CI/release Debian image using pre-built binaries. +# Mirrors Dockerfile.ci but uses debian:bookworm-slim with shell tools +# so the agent can use shell-based tools (pwd, ls, git, curl, etc.). +# Used by release workflows to skip ~60 min QEMU cross-compilation. + +# ── Runtime (Debian with shell) ──────────────────────────────── +FROM debian:bookworm-slim + +ARG TARGETARCH + +# Install essential tools for agent shell operations +RUN apt-get update && apt-get install -y --no-install-recommends \ + bash \ + ca-certificates \ + curl \ + git \ + && rm -rf /var/lib/apt/lists/* + +# Copy the pre-built binary for this platform (amd64 or arm64) +COPY bin/${TARGETARCH}/zeroclaw /usr/local/bin/zeroclaw + +# Runtime directory structure and default config +COPY --chown=65534:65534 zeroclaw-data/ /zeroclaw-data/ + +ENV LANG=C.UTF-8 +ENV ZEROCLAW_WORKSPACE=/zeroclaw-data/workspace +ENV HOME=/zeroclaw-data +ENV ZEROCLAW_GATEWAY_PORT=42617 + +WORKDIR /zeroclaw-data +USER 65534:65534 +EXPOSE 42617 +ENTRYPOINT ["zeroclaw"] +CMD ["gateway"] diff --git a/third_party/zeroclaw/Justfile b/third_party/zeroclaw/Justfile new file mode 100644 index 0000000..976a905 --- /dev/null +++ b/third_party/zeroclaw/Justfile @@ -0,0 +1,78 @@ +# Justfile - Convenient command runner for ZeroClaw development +# https://github.com/casey/just + +# Default recipe to display help +_default: + @just --list + +# Format all code +fmt: + cargo fmt --all + +# Check formatting without making changes +fmt-check: + cargo fmt --all -- --check + +# Run clippy lints +lint: + cargo clippy --all-targets -- -D warnings + +# Run all tests +test: + cargo test --locked + +# Run only unit tests (faster) +test-lib: + cargo test --lib + +# Run the full CI quality gate locally +ci: fmt-check lint test + @echo "✅ All CI checks passed!" + +# Build in release mode +build: + cargo build --release --locked + +# Build in debug mode +build-debug: + cargo build + +# Clean build artifacts +clean: + cargo clean + +# Run zeroclaw with example config (for development) +dev *ARGS: + cargo run -- {{ARGS}} + +# Check code without building +check: + cargo check --all-targets + +# Run cargo doc and open in browser +doc: + cargo doc --no-deps --open + +# Update dependencies +update: + cargo update + +# Run cargo audit to check for security vulnerabilities +audit: + cargo audit + +# Run cargo deny checks +deny: + cargo deny check + +# Format TOML files (requires taplo) +fmt-toml: + taplo format + +# Check TOML formatting (requires taplo) +fmt-toml-check: + taplo format --check + +# Run all formatting tools +fmt-all: fmt fmt-toml + @echo "✅ All formatting complete!" diff --git a/third_party/zeroclaw/LICENSE-APACHE b/third_party/zeroclaw/LICENSE-APACHE new file mode 100644 index 0000000..1b5ec8b --- /dev/null +++ b/third_party/zeroclaw/LICENSE-APACHE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/third_party/zeroclaw/LICENSE-MIT b/third_party/zeroclaw/LICENSE-MIT new file mode 100644 index 0000000..d6115dd --- /dev/null +++ b/third_party/zeroclaw/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 ZeroClaw Labs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/zeroclaw/NOTICE b/third_party/zeroclaw/NOTICE new file mode 100644 index 0000000..31405ef --- /dev/null +++ b/third_party/zeroclaw/NOTICE @@ -0,0 +1,58 @@ +ZeroClaw +Copyright 2025 ZeroClaw Labs + +This product includes software developed at ZeroClaw Labs (https://github.com/zeroclaw-labs). + +Official Repository +=================== + +The only official ZeroClaw repository is: +https://github.com/zeroclaw-labs/zeroclaw + +Any other repository claiming to be ZeroClaw is unauthorized. +See TRADEMARK.md for the full trademark policy. + +License +======= + +This software is available under a dual-license model: + + 1. MIT License — see LICENSE-MIT + 2. Apache License 2.0 — see LICENSE-APACHE + +You may use either license. Contributors grant rights under both. +See CLA.md for the contributor license agreement. + +Contributors +============ + +This NOTICE file is maintained by repository automation. +For the latest contributor list, see the repository contributors page: +https://github.com/zeroclaw-labs/zeroclaw/graphs/contributors + +All contributors retain copyright ownership of their contributions. +Contributions are permanently attributed in the repository commit history. +Patent rights are protected for all contributors under Apache License 2.0. + +Third-Party Dependencies +======================== + +This project uses third-party libraries and components, +each licensed under their respective terms. + +See Cargo.lock for a complete dependency list. + +Verifiable Intent Specification +================================ + +The src/verifiable_intent/ module is a Rust-native reimplementation based on +the Verifiable Intent open specification and reference implementation: + + Project: Verifiable Intent (VI) + Author: agent-intent + Source: https://github.com/agent-intent/verifiable-intent + License: Apache License, Version 2.0 + +This implementation follows the VI specification design (SD-JWT layered +credentials, constraint model, three-layer chain). No source code was copied +from the reference implementation. diff --git a/third_party/zeroclaw/README.ar.md b/third_party/zeroclaw/README.ar.md new file mode 100644 index 0000000..19e1afa --- /dev/null +++ b/third_party/zeroclaw/README.ar.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — مساعد الذكاء الاصطناعي الشخصي

+ +

+ صفر حمل زائد. صفر تنازلات. 100% Rust. 100% مستقل.
+ ⚡️ يعمل على أجهزة بقيمة 10 دولارات بأقل من 5 ميجابايت رام: هذا أقل بنسبة 99% من الذاكرة مقارنة بـ OpenClaw و98% أرخص من Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+تم بناؤه بواسطة طلاب وأعضاء من مجتمعات Harvard وMIT وSundai.Club. +

+ +

+ 🌐 اللغات: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw هو مساعد ذكاء اصطناعي شخصي تشغّله على أجهزتك الخاصة. يجيبك على القنوات التي تستخدمها بالفعل (WhatsApp، Telegram، Slack، Discord، Signal، iMessage، Matrix، IRC، Email، Bluesky، Nostr، Mattermost، Nextcloud Talk، DingTalk، Lark، QQ، Reddit، LinkedIn، Twitter، MQTT، WeChat Work، والمزيد). يحتوي على لوحة تحكم ويب للتحكم في الوقت الفعلي ويمكنه الاتصال بالأجهزة الطرفية (ESP32، STM32، Arduino، Raspberry Pi). البوابة هي مجرد مستوى التحكم — المنتج هو المساعد. + +إذا كنت تريد مساعدًا شخصيًا لمستخدم واحد يشعر بأنه محلي وسريع ويعمل دائمًا، فهذا هو. + +

+ الموقع الإلكتروني · + التوثيق · + البنية المعمارية · + البدء · + الانتقال من OpenClaw · + استكشاف الأخطاء · + Discord +

+ +> **الإعداد المفضل:** شغّل `zeroclaw onboard` في طرفيتك. ZeroClaw Onboard يرشدك خطوة بخطوة لإعداد البوابة ومساحة العمل والقنوات والمزود. إنه مسار الإعداد الموصى به ويعمل على macOS وLinux وWindows (عبر WSL2). تثبيت جديد؟ ابدأ هنا: [البدء](#البداية-السريعة) + +### مصادقة الاشتراك (OAuth) + +- **OpenAI Codex** (اشتراك ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (مفتاح API أو رمز مصادقة) + +ملاحظة حول النماذج: بينما يتم دعم العديد من المزودين/النماذج، للحصول على أفضل تجربة استخدم أقوى نموذج من أحدث جيل متاح لديك. انظر [الإعداد](#البداية-السريعة). + +إعدادات النماذج + CLI: [مرجع المزودين](docs/reference/api/providers-reference.md) +تدوير ملف المصادقة (OAuth مقابل مفاتيح API) + الانتقال التلقائي: [الانتقال التلقائي للنماذج](docs/reference/api/providers-reference.md) + +## التثبيت (موصى به) + +بيئة التشغيل: سلسلة أدوات Rust المستقرة. ملف ثنائي واحد، بدون تبعيات وقت التشغيل. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### التثبيت بنقرة واحدة + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` يعمل تلقائيًا بعد التثبيت لتكوين مساحة العمل والمزود. + +## البداية السريعة (TL;DR) + +دليل المبتدئين الكامل (المصادقة، الاقتران، القنوات): [البدء](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Install + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Start the gateway (webhook server + web dashboard) +zeroclaw gateway # default: 127.0.0.1:42617 +zeroclaw gateway --port 0 # random port (security hardened) + +# Talk to the assistant +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interactive mode +zeroclaw agent + +# Start full autonomous runtime (gateway + channels + cron + hands) +zeroclaw daemon + +# Check status +zeroclaw status + +# Run diagnostics +zeroclaw doctor +``` + +هل تقوم بالترقية؟ شغّل `zeroclaw doctor` بعد التحديث. + +### من المصدر (التطوير) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **البديل للتطوير (بدون تثبيت عام):** ابدأ الأوامر بـ `cargo run --release --` (مثال: `cargo run --release -- status`). + +## الانتقال من OpenClaw + +يمكن لـ ZeroClaw استيراد مساحة عمل OpenClaw والذاكرة والتكوين الخاص بك: + +```bash +# Preview what will be migrated (safe, read-only) +zeroclaw migrate openclaw --dry-run + +# Run the migration +zeroclaw migrate openclaw +``` + +يقوم هذا بترحيل إدخالات الذاكرة وملفات مساحة العمل والتكوين من `~/.openclaw/` إلى `~/.zeroclaw/`. يتم تحويل التكوين من JSON إلى TOML تلقائيًا. + +## إعدادات الأمان الافتراضية (الوصول عبر الرسائل المباشرة) + +يتصل ZeroClaw بأسطح المراسلة الحقيقية. تعامل مع الرسائل المباشرة الواردة كمدخلات غير موثوقة. + +دليل الأمان الكامل: [SECURITY.md](SECURITY.md) + +السلوك الافتراضي على جميع القنوات: + +- **اقتران الرسائل المباشرة** (افتراضي): يتلقى المرسلون غير المعروفين رمز اقتران قصير ولا يعالج البوت رسالتهم. +- الموافقة باستخدام: `zeroclaw pairing approve ` (ثم يُضاف المرسل إلى قائمة السماح المحلية). +- تتطلب الرسائل المباشرة العامة الواردة اشتراكًا صريحًا في `config.toml`. +- شغّل `zeroclaw doctor` لكشف سياسات الرسائل المباشرة الخطرة أو المُعدة خطأ. + +**مستويات الاستقلالية:** + +| المستوى | السلوك | +|---------|--------| +| `ReadOnly` | يمكن للوكيل المراقبة ولكن لا يمكنه التصرف | +| `Supervised` (افتراضي) | يتصرف الوكيل مع الموافقة على العمليات متوسطة/عالية المخاطر | +| `Full` | يتصرف الوكيل بشكل مستقل ضمن حدود السياسة | + +**طبقات العزل:** عزل مساحة العمل، حظر اجتياز المسار، قوائم السماح للأوامر، المسارات المحظورة (`/etc`، `/root`، `~/.ssh`)، تحديد المعدل (أقصى إجراءات/ساعة، حدود التكلفة/يوم). + + + + +### 📢 الإعلانات + +استخدم هذه اللوحة للإشعارات المهمة (التغييرات الجذرية، إرشادات الأمان، نوافذ الصيانة، وعوائق الإصدار). + +| التاريخ (UTC) | المستوى | الإشعار | الإجراء | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _حرج_ | نحن **غير مرتبطين** بـ `openagen/zeroclaw` أو `zeroclaw.org` أو `zeroclaw.net`. نطاقا `zeroclaw.org` و`zeroclaw.net` يشيران حاليًا إلى نسخة `openagen/zeroclaw` المتفرعة، وهذا النطاق/المستودع ينتحل صفة موقعنا/مشروعنا الرسمي. | لا تثق بالمعلومات أو الملفات الثنائية أو جمع التبرعات أو الإعلانات من تلك المصادر. استخدم فقط [هذا المستودع](https://github.com/zeroclaw-labs/zeroclaw) وحساباتنا الاجتماعية الموثقة. | +| 2026-02-21 | _مهم_ | موقعنا الرسمي متاح الآن: [zeroclawlabs.ai](https://zeroclawlabs.ai). شكرًا لصبركم أثناء تحضيرنا للإطلاق. ما زلنا نرى محاولات انتحال، لذا **لا** تنضم إلى أي نشاط استثمار أو جمع تبرعات يدعي اسم ZeroClaw ما لم يتم نشره عبر قنواتنا الرسمية. | استخدم [هذا المستودع](https://github.com/zeroclaw-labs/zeroclaw) كمصدر الحقيقة الوحيد. تابع [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21) و[Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs) و[Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) للتحديثات الرسمية. | +| 2026-02-19 | _مهم_ | قامت Anthropic بتحديث شروط المصادقة واستخدام بيانات الاعتماد في 2026-02-19. رموز Claude Code OAuth (Free، Pro، Max) مخصصة حصريًا لـ Claude Code وClaude.ai؛ استخدام رموز OAuth من Claude Free/Pro/Max في أي منتج أو أداة أو خدمة أخرى (بما في ذلك Agent SDK) غير مسموح به وقد ينتهك شروط خدمة المستهلك. | يرجى تجنب تكاملات Claude Code OAuth مؤقتًا لمنع الخسارة المحتملة. البند الأصلي: [المصادقة واستخدام بيانات الاعتماد](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## أبرز الميزات + +- **بيئة تشغيل خفيفة افتراضيًا** — تعمل مسارات CLI والحالة الشائعة في غلاف ذاكرة بضعة ميجابايت على إصدارات الإنتاج. +- **نشر فعال التكلفة** — مصمم للوحات بقيمة 10 دولارات والخوادم السحابية الصغيرة، بدون تبعيات وقت تشغيل ثقيلة. +- **بدء تشغيل بارد سريع** — بيئة تشغيل Rust بملف ثنائي واحد تجعل بدء تشغيل الأوامر والخدمة شبه فوري. +- **بنية قابلة للنقل** — ملف ثنائي واحد عبر ARM وx86 وRISC-V مع مزودين/قنوات/أدوات قابلة للتبديل. +- **بوابة محلية أولاً** — مستوى تحكم واحد للجلسات والقنوات والأدوات والمهام المجدولة وإجراءات التشغيل القياسية والأحداث. +- **صندوق وارد متعدد القنوات** — WhatsApp، Telegram، Slack، Discord، Signal، iMessage، Matrix، IRC، Email، Bluesky، Nostr، Mattermost، Nextcloud Talk، DingTalk، Lark، QQ، Reddit، LinkedIn، Twitter، MQTT، WeChat Work، WebSocket، والمزيد. +- **تنسيق متعدد الوكلاء (Hands)** — أسراب وكلاء مستقلة تعمل وفق جدول زمني وتصبح أذكى مع مرور الوقت. +- **إجراءات التشغيل القياسية (SOPs)** — أتمتة سير العمل المدفوعة بالأحداث مع MQTT والخطافات والمهام المجدولة ومشغلات الأجهزة الطرفية. +- **لوحة تحكم ويب** — واجهة مستخدم React 19 + Vite مع دردشة في الوقت الفعلي ومتصفح ذاكرة ومحرر تكوين ومدير مهام مجدولة وفاحص أدوات. +- **أجهزة طرفية** — ESP32، STM32 Nucleo، Arduino، Raspberry Pi GPIO عبر سمة `Peripheral`. +- **أدوات من الدرجة الأولى** — shell، قراءة/كتابة/تحرير الملفات، git، جلب/بحث الويب، MCP، Jira، Notion، Google Workspace، و70+ أخرى. +- **خطافات دورة الحياة** — اعتراض وتعديل استدعاءات LLM وتنفيذ الأدوات والرسائل في كل مرحلة. +- **منصة المهارات** — مهارات مدمجة ومجتمعية ومساحة عمل مع تدقيق أمني. +- **دعم الأنفاق** — Cloudflare، Tailscale، ngrok، OpenVPN، وأنفاق مخصصة للوصول عن بُعد. + +### لماذا تختار الفرق ZeroClaw + +- **خفيف افتراضيًا:** ملف Rust ثنائي صغير، بدء تشغيل سريع، بصمة ذاكرة منخفضة. +- **آمن بالتصميم:** اقتران، عزل صارم، قوائم سماح صريحة، نطاق مساحة العمل. +- **قابل للتبديل بالكامل:** الأنظمة الأساسية هي سمات (مزودون، قنوات، أدوات، ذاكرة، أنفاق). +- **بدون تقييد:** دعم مزود متوافق مع OpenAI + نقاط نهاية مخصصة قابلة للتوصيل. + +## لقطة المقارنة المرجعية (ZeroClaw مقابل OpenClaw، قابلة للتكرار) + +مقارنة محلية سريعة (macOS arm64، فبراير 2026) مُعايرة لأجهزة الحافة بتردد 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **اللغة** | TypeScript | Python | Go | **Rust** | +| **الرام** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **البدء (نواة 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **حجم الملف الثنائي** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **التكلفة** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **أي جهاز 10$** | + +> ملاحظات: نتائج ZeroClaw تم قياسها على إصدارات الإنتاج باستخدام `/usr/bin/time -l`. يتطلب OpenClaw بيئة تشغيل Node.js (عادةً ~390 ميجابايت حمل ذاكرة إضافي)، بينما يتطلب NanoBot بيئة تشغيل Python. PicoClaw وZeroClaw ملفات ثنائية ثابتة. أرقام الرام أعلاه هي ذاكرة وقت التشغيل؛ متطلبات التجميع في وقت البناء أعلى. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### القياس المحلي القابل للتكرار + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## كل ما بنيناه حتى الآن + +### المنصة الأساسية + +- بوابة HTTP/WS/SSE كمستوى تحكم مع الجلسات والحضور والتكوين والمهام المجدولة والخطافات ولوحة تحكم الويب والاقتران. +- واجهة CLI: `gateway`، `agent`، `onboard`، `doctor`، `status`، `service`، `migrate`، `auth`، `cron`، `channel`، `skills`. +- حلقة تنسيق الوكيل مع إرسال الأدوات وبناء الموجهات وتصنيف الرسائل وتحميل الذاكرة. +- نموذج الجلسات مع تطبيق سياسة الأمان ومستويات الاستقلالية وبوابة الموافقة. +- غلاف مزود مرن مع الانتقال التلقائي وإعادة المحاولة وتوجيه النماذج عبر 20+ واجهة LLM خلفية. + +### القنوات + +القنوات: WhatsApp (أصلي)، Telegram، Slack، Discord، Signal، iMessage، Matrix، IRC، Email، Bluesky، DingTalk، Lark، Mattermost، Nextcloud Talk، Nostr، QQ، Reddit، LinkedIn، Twitter، MQTT، WeChat Work، WATI، Mochat، Linq، Notion، WebSocket، ClawdTalk. + +مُحددة بالميزات: Matrix (`channel-matrix`)، Lark (`channel-lark`)، Nostr (`channel-nostr`). + +### لوحة تحكم الويب + +لوحة تحكم ويب React 19 + Vite 6 + Tailwind CSS 4 تُقدم مباشرة من البوابة: + +- **لوحة التحكم** — نظرة عامة على النظام، حالة الصحة، وقت التشغيل، تتبع التكاليف +- **دردشة الوكيل** — دردشة تفاعلية مع الوكيل +- **الذاكرة** — تصفح وإدارة إدخالات الذاكرة +- **التكوين** — عرض وتحرير التكوين +- **المهام المجدولة** — إدارة المهام المجدولة +- **الأدوات** — تصفح الأدوات المتاحة +- **السجلات** — عرض سجلات نشاط الوكيل +- **التكلفة** — استخدام الرموز وتتبع التكاليف +- **التشخيص** — تشخيصات صحة النظام +- **التكاملات** — حالة التكامل والإعداد +- **الاقتران** — إدارة اقتران الأجهزة + +### أهداف البرامج الثابتة + +| الهدف | المنصة | الغرض | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | وكيل طرفي لاسلكي | +| ESP32-UI | ESP32 + Display | وكيل بواجهة مرئية | +| STM32 Nucleo | STM32 (ARM Cortex-M) | طرفي صناعي | +| Arduino | Arduino | جسر مستشعر/مشغل أساسي | +| Uno Q Bridge | Arduino Uno | جسر تسلسلي إلى الوكيل | + +### الأدوات + الأتمتة + +- **الأساسية:** shell، قراءة/كتابة/تحرير الملفات، عمليات git، بحث glob، بحث المحتوى +- **الويب:** التحكم بالمتصفح، جلب الويب، بحث الويب، لقطة شاشة، معلومات الصور، قراءة PDF +- **التكاملات:** Jira، Notion، Google Workspace، Microsoft 365، LinkedIn، Composio، Pushover +- **MCP:** غلاف أداة Model Context Protocol + مجموعات أدوات مؤجلة +- **الجدولة:** إضافة/إزالة/تحديث/تشغيل cron، أداة الجدولة +- **الذاكرة:** استرجاع، تخزين، نسيان، معرفة، استخبارات المشروع +- **متقدم:** تفويض (وكيل إلى وكيل)، سرب، تبديل/توجيه النموذج، عمليات الأمان، العمليات السحابية +- **الأجهزة:** معلومات اللوحة، خريطة الذاكرة، قراءة الذاكرة (محددة بالميزات) + +### وقت التشغيل + الأمان + +- **مستويات الاستقلالية:** ReadOnly، Supervised (افتراضي)، Full. +- **العزل:** عزل مساحة العمل، حظر اجتياز المسار، قوائم السماح للأوامر، المسارات المحظورة، Landlock (Linux)، Bubblewrap. +- **تحديد المعدل:** أقصى إجراءات في الساعة، أقصى تكلفة في اليوم (قابل للتكوين). +- **بوابة الموافقة:** موافقة تفاعلية للعمليات متوسطة/عالية المخاطر. +- **إيقاف طارئ:** قدرة الإغلاق الطارئ. +- **129+ اختبار أمني** في CI الآلي. + +### العمليات + التغليف + +- لوحة تحكم ويب تُقدم مباشرة من البوابة. +- دعم الأنفاق: Cloudflare، Tailscale، ngrok، OpenVPN، أمر مخصص. +- محول وقت تشغيل Docker للتنفيذ في حاويات. +- CI/CD: تجريبي (تلقائي عند الدفع) → مستقر (إرسال يدوي) → Docker، crates.io، Scoop، AUR، Homebrew، تغريدة. +- ملفات ثنائية مُعدة مسبقًا لـ Linux (x86_64، aarch64، armv7)، macOS (x86_64، aarch64)، Windows (x86_64). + + +## التكوين + +الحد الأدنى `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +مرجع التكوين الكامل: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### تكوين القنوات + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### تكوين الأنفاق + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +التفاصيل: [مرجع القنوات](docs/reference/api/channels-reference.md) · [مرجع التكوين](docs/reference/api/config-reference.md) + +### دعم وقت التشغيل (الحالي) + +- **`native`** (افتراضي) — تنفيذ مباشر للعمليات، أسرع مسار، مثالي للبيئات الموثوقة. +- **`docker`** — عزل كامل بالحاويات، سياسات أمان مفروضة، يتطلب Docker. + +اضبط `runtime.kind = "docker"` للعزل الصارم أو عزل الشبكة. + +## مصادقة الاشتراك (OpenAI Codex / Claude Code / Gemini) + +يدعم ZeroClaw ملفات تعريف مصادقة أصلية للاشتراك (متعددة الحسابات، مشفرة عند الراحة). + +- ملف التخزين: `~/.zeroclaw/auth-profiles.json` +- مفتاح التشفير: `~/.zeroclaw/.secret_key` +- تنسيق معرف الملف: `:` (مثال: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT subscription) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Check / refresh / switch profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Run the agent with subscription auth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## مساحة عمل الوكيل + المهارات + +جذر مساحة العمل: `~/.zeroclaw/workspace/` (قابل للتكوين عبر التكوين). + +ملفات الموجه المحقونة: +- `IDENTITY.md` — شخصية الوكيل ودوره +- `USER.md` — سياق المستخدم وتفضيلاته +- `MEMORY.md` — حقائق ودروس طويلة المدى +- `AGENTS.md` — اتفاقيات الجلسة وقواعد التهيئة +- `SOUL.md` — الهوية الأساسية ومبادئ التشغيل + +المهارات: `~/.zeroclaw/workspace/skills//SKILL.md` أو `SKILL.toml`. + +```bash +# List installed skills +zeroclaw skills list + +# Install from git +zeroclaw skills install https://github.com/user/my-skill.git + +# Security audit before install +zeroclaw skills audit https://github.com/user/my-skill.git + +# Remove a skill +zeroclaw skills remove my-skill +``` + +## أوامر CLI + +```bash +# Workspace management +zeroclaw onboard # Guided setup wizard +zeroclaw status # Show daemon/agent status +zeroclaw doctor # Run system diagnostics + +# Gateway + daemon +zeroclaw gateway # Start gateway server (127.0.0.1:42617) +zeroclaw daemon # Start full autonomous runtime + +# Agent +zeroclaw agent # Interactive chat mode +zeroclaw agent -m "message" # Single message mode + +# Service management +zeroclaw service install # Install as OS service (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Channels +zeroclaw channel list # List configured channels +zeroclaw channel doctor # Check channel health +zeroclaw channel bind-telegram 123456789 + +# Cron + scheduling +zeroclaw cron list # List scheduled jobs +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memory +zeroclaw memory list # List memory entries +zeroclaw memory get # Retrieve a memory +zeroclaw memory stats # Memory statistics + +# Auth profiles +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardware peripherals +zeroclaw hardware discover # Scan for connected devices +zeroclaw peripheral list # List connected peripherals +zeroclaw peripheral flash # Flash firmware to device + +# Migration +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell completions +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +مرجع الأوامر الكامل: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## المتطلبات الأساسية + +
+Windows + +#### مطلوب + +1. **Visual Studio Build Tools** (يوفر رابط MSVC وWindows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + أثناء التثبيت (أو عبر Visual Studio Installer)، حدد حزمة عمل **"Desktop development with C++"**. + +2. **سلسلة أدوات Rust:** + + ```powershell + winget install Rustlang.Rustup + ``` + + بعد التثبيت، افتح طرفية جديدة وشغّل `rustup default stable` لضمان أن سلسلة الأدوات المستقرة نشطة. + +3. **تحقق** من أن كليهما يعملان: + ```powershell + rustc --version + cargo --version + ``` + +#### اختياري + +- **Docker Desktop** — مطلوب فقط إذا كنت تستخدم [وقت تشغيل Docker المعزول](#دعم-وقت-التشغيل-الحالي) (`runtime.kind = "docker"`). ثبّت عبر `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### مطلوب + +1. **أساسيات البناء:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** ثبّت Xcode Command Line Tools: `xcode-select --install` + +2. **سلسلة أدوات Rust:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + انظر [rustup.rs](https://rustup.rs) للتفاصيل. + +3. **تحقق** من أن كليهما يعملان: + ```bash + rustc --version + cargo --version + ``` + +#### مثبّت بسطر واحد + +أو تخطى الخطوات أعلاه وثبّت كل شيء (تبعيات النظام، Rust، ZeroClaw) بأمر واحد: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### متطلبات موارد التجميع + +البناء من المصدر يحتاج موارد أكثر من تشغيل الملف الثنائي الناتج: + +| المورد | الحد الأدنى | الموصى به | +| -------------- | ------- | ----------- | +| **الرام + swap** | 2 GB | 4 GB+ | +| **مساحة القرص الحرة** | 6 GB | 10 GB+ | + +إذا كان جهازك أقل من الحد الأدنى، استخدم الملفات الثنائية المُعدة مسبقًا: + +```bash +./install.sh --prefer-prebuilt +``` + +لطلب تثبيت ثنائي فقط بدون بديل مصدري: + +```bash +./install.sh --prebuilt-only +``` + +#### اختياري + +- **Docker** — مطلوب فقط إذا كنت تستخدم [وقت تشغيل Docker المعزول](#دعم-وقت-التشغيل-الحالي) (`runtime.kind = "docker"`). ثبّت عبر مدير الحزم أو [docker.com](https://docs.docker.com/engine/install/). + +> **ملاحظة:** الأمر الافتراضي `cargo build --release` يستخدم `codegen-units=1` لتقليل ضغط التجميع الذروة. للبناء الأسرع على أجهزة قوية، استخدم `cargo build --profile release-fast`. + +
+ + + +### ملفات ثنائية مُعدة مسبقًا + +يتم نشر أصول الإصدار لـ: + +- Linux: `x86_64`، `aarch64`، `armv7` +- macOS: `x86_64`، `aarch64` +- Windows: `x86_64` + +حمّل أحدث الأصول من: + + +## التوثيق + +استخدم هذه عندما تتجاوز مرحلة الإعداد وتريد المرجع الأعمق. + +- ابدأ بـ [فهرس التوثيق](docs/README.md) للتنقل و"ما هو أين." +- اقرأ [نظرة عامة على البنية المعمارية](docs/architecture.md) لنموذج النظام الكامل. +- استخدم [مرجع التكوين](docs/reference/api/config-reference.md) عندما تحتاج كل مفتاح ومثال. +- شغّل البوابة حسب الكتاب مع [دليل العمليات](docs/ops/operations-runbook.md). +- اتبع [ZeroClaw Onboard](#البداية-السريعة) للإعداد الموجه. +- صحح الأعطال الشائعة مع [دليل استكشاف الأخطاء](docs/ops/troubleshooting.md). +- راجع [إرشادات الأمان](docs/security/README.md) قبل كشف أي شيء. + +### مراجع التوثيق + +- مركز التوثيق: [docs/README.md](docs/README.md) +- جدول محتويات التوثيق الموحد: [docs/SUMMARY.md](docs/SUMMARY.md) +- مرجع الأوامر: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- مرجع التكوين: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- مرجع المزودين: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- مرجع القنوات: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- دليل العمليات: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- استكشاف الأخطاء: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### وثائق التعاون + +- دليل المساهمة: [CONTRIBUTING.md](CONTRIBUTING.md) +- سياسة سير عمل PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- دليل سير عمل CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- دليل المراجع: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- سياسة الإفصاح الأمني: [SECURITY.md](SECURITY.md) +- قالب التوثيق: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### النشر + العمليات + +- دليل نشر الشبكة: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- دليل وكيل البروكسي: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- أدلة الأجهزة: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +تم بناء ZeroClaw للسلطعون الناعم 🦀، مساعد ذكاء اصطناعي سريع وفعال. بناه Argenis De La Rosa والمجتمع. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## ادعم ZeroClaw + +إذا ساعدك ZeroClaw في عملك وتريد دعم التطوير المستمر، يمكنك التبرع هنا: + +Buy Me a Coffee + +### 🙏 شكر خاص + +شكر من القلب للمجتمعات والمؤسسات التي تلهم وتغذي هذا العمل مفتوح المصدر: + +- **Harvard University** — لتعزيز الفضول الفكري ودفع حدود ما هو ممكن. +- **MIT** — لتبني المعرفة المفتوحة والمصدر المفتوح والإيمان بأن التكنولوجيا يجب أن تكون متاحة للجميع. +- **Sundai Club** — للمجتمع والطاقة والسعي الدؤوب لبناء أشياء مهمة. +- **العالم وما وراءه** 🌍✨ — لكل مساهم وحالم وبانٍ هناك يجعل المصدر المفتوح قوة للخير. هذا من أجلكم. + +نحن نبني علنًا لأن أفضل الأفكار تأتي من كل مكان. إذا كنت تقرأ هذا، فأنت جزء منه. مرحبًا. 🦀❤️ + +## المساهمة + +جديد على ZeroClaw؟ ابحث عن المشكلات المصنفة [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — انظر [دليل المساهمة](CONTRIBUTING.md#first-time-contributors) لمعرفة كيفية البدء. مرحبًا بمساهمات AI/vibe-coded! 🤖 + +انظر [CONTRIBUTING.md](CONTRIBUTING.md) و[CLA.md](docs/contributing/cla.md). نفّذ سمة، قدّم PR: + +- دليل سير عمل CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- `Provider` جديد → `src/providers/` +- `Channel` جديد → `src/channels/` +- `Observer` جديد → `src/observability/` +- `Tool` جديد → `src/tools/` +- `Memory` جديد → `src/memory/` +- `Tunnel` جديد → `src/tunnel/` +- `Peripheral` جديد → `src/peripherals/` +- `Skill` جديد → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ المستودع الرسمي وتحذير الانتحال + +**هذا هو مستودع ZeroClaw الرسمي الوحيد:** + +> https://github.com/zeroclaw-labs/zeroclaw + +أي مستودع أو منظمة أو نطاق أو حزمة أخرى تدعي أنها "ZeroClaw" أو تشير إلى انتمائها لـ ZeroClaw Labs هي **غير مصرح بها وغير مرتبطة بهذا المشروع**. سيتم سرد النسخ المتفرعة غير المصرح بها المعروفة في [TRADEMARK.md](docs/maintainers/trademark.md). + +إذا واجهت انتحالًا أو إساءة استخدام للعلامة التجارية، يرجى [فتح مشكلة](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## الترخيص + +ZeroClaw مرخص بترخيص مزدوج لأقصى انفتاح وحماية للمساهمين: + +| الترخيص | حالة الاستخدام | +|---|---| +| [MIT](LICENSE-MIT) | مفتوح المصدر، بحثي، أكاديمي، استخدام شخصي | +| [Apache 2.0](LICENSE-APACHE) | حماية براءات الاختراع، مؤسسي، نشر تجاري | + +يمكنك اختيار أي ترخيص. **يمنح المساهمون الحقوق تلقائيًا بموجب كليهما** — انظر [CLA.md](docs/contributing/cla.md) لاتفاقية المساهم الكاملة. + +### العلامة التجارية + +اسم وشعار **ZeroClaw** هما علامتان تجاريتان لـ ZeroClaw Labs. لا يمنح هذا الترخيص إذنًا لاستخدامهما للإشارة إلى التأييد أو الانتماء. انظر [TRADEMARK.md](docs/maintainers/trademark.md) للاستخدامات المسموحة والمحظورة. + +### حماية المساهمين + +- أنت **تحتفظ بحقوق الملكية الفكرية** لمساهماتك +- **منح براءة الاختراع** (Apache 2.0) يحميك من مطالبات براءات الاختراع من مساهمين آخرين +- مساهماتك **منسوبة بشكل دائم** في تاريخ الالتزامات و[NOTICE](NOTICE) +- لا يتم نقل حقوق العلامة التجارية بالمساهمة + +--- + +**ZeroClaw** — صفر حمل زائد. صفر تنازلات. انشر في أي مكان. بدّل أي شيء. 🦀 + +## المساهمون + + + ZeroClaw contributors + + +يتم إنشاء هذه القائمة من رسم المساهمين في GitHub وتُحدّث تلقائيًا. + +## تاريخ النجوم + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.bn.md b/third_party/zeroclaw/README.bn.md new file mode 100644 index 0000000..407c96e --- /dev/null +++ b/third_party/zeroclaw/README.bn.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — ব্যক্তিগত AI সহকারী

+ +

+ শূন্য ওভারহেড। শূন্য আপস। 100% Rust। 100% অজ্ঞেয়বাদী।
+ ⚡️ $10 হার্ডওয়্যারে <5MB RAM দিয়ে চলে: এটি OpenClaw থেকে 99% কম মেমোরি এবং Mac mini থেকে 98% সস্তা! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Harvard, MIT, এবং Sundai.Club সম্প্রদায়ের ছাত্র ও সদস্যদের দ্বারা নির্মিত। +

+ +

+ 🌐 ভাষাসমূহ: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw একটি ব্যক্তিগত AI সহকারী যা আপনি আপনার নিজের ডিভাইসে চালান। এটি আপনাকে সেই চ্যানেলগুলোতে উত্তর দেয় যা আপনি ইতিমধ্যে ব্যবহার করেন (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, এবং আরও)। এতে রিয়েল-টাইম নিয়ন্ত্রণের জন্য একটি ওয়েব ড্যাশবোর্ড আছে এবং এটি হার্ডওয়্যার পেরিফেরালের (ESP32, STM32, Arduino, Raspberry Pi) সাথে সংযোগ করতে পারে। Gateway শুধুমাত্র কন্ট্রোল প্লেন — পণ্যটি হল সহকারী। + +আপনি যদি একটি ব্যক্তিগত, একক-ব্যবহারকারী সহকারী চান যা স্থানীয়, দ্রুত এবং সর্বদা চালু মনে হয়, এটাই সেটি। + +

+ ওয়েবসাইট · + ডকুমেন্টেশন · + আর্কিটেকচার · + শুরু করুন · + OpenClaw থেকে মাইগ্রেশন · + সমস্যা সমাধান · + Discord +

+ +> **পছন্দের সেটআপ:** আপনার টার্মিনালে `zeroclaw onboard` চালান। ZeroClaw Onboard আপনাকে gateway, workspace, channels, এবং provider সেট আপ করতে ধাপে ধাপে গাইড করে। এটি প্রস্তাবিত সেটআপ পথ এবং macOS, Linux, এবং Windows (WSL2 এর মাধ্যমে) এ কাজ করে। নতুন ইনস্টল? এখানে শুরু করুন: [শুরু করুন](#দ্রুত-শুরু) + +### সাবস্ক্রিপশন অথ (OAuth) + +- **OpenAI Codex** (ChatGPT সাবস্ক্রিপশন) +- **Gemini** (Google OAuth) +- **Anthropic** (API key বা auth token) + +মডেল নোট: যদিও অনেক প্রদানকারী/মডেল সমর্থিত, সেরা অভিজ্ঞতার জন্য আপনার কাছে উপলব্ধ সবচেয়ে শক্তিশালী সর্বশেষ প্রজন্মের মডেল ব্যবহার করুন। দেখুন [অনবোর্ডিং](#দ্রুত-শুরু)। + +মডেল কনফিগ + CLI: [প্রদানকারী রেফারেন্স](docs/reference/api/providers-reference.md) +অথ প্রোফাইল রোটেশন (OAuth বনাম API keys) + ফেইলওভার: [মডেল ফেইলওভার](docs/reference/api/providers-reference.md) + +## ইনস্টল (প্রস্তাবিত) + +রানটাইম: Rust স্থিতিশীল টুলচেইন। একক বাইনারি, কোনো রানটাইম নির্ভরতা নেই। + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### এক-ক্লিক বুটস্ট্র্যাপ + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` ইনস্টলের পরে স্বয়ংক্রিয়ভাবে চলে আপনার workspace এবং provider কনফিগার করতে। + +## দ্রুত শুরু (TL;DR) + +সম্পূর্ণ শিক্ষানবিশ গাইড (অথ, পেয়ারিং, চ্যানেল): [শুরু করুন](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Install + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Start the gateway (webhook server + web dashboard) +zeroclaw gateway # default: 127.0.0.1:42617 +zeroclaw gateway --port 0 # random port (security hardened) + +# Talk to the assistant +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interactive mode +zeroclaw agent + +# Start full autonomous runtime (gateway + channels + cron + hands) +zeroclaw daemon + +# Check status +zeroclaw status + +# Run diagnostics +zeroclaw doctor +``` + +আপগ্রেড করছেন? আপডেটের পরে `zeroclaw doctor` চালান। + +### সোর্স থেকে (ডেভেলপমেন্ট) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **ডেভ ফলব্যাক (কোনো গ্লোবাল ইনস্টল নেই):** কমান্ডের আগে `cargo run --release --` যোগ করুন (উদাহরণ: `cargo run --release -- status`)। + +## OpenClaw থেকে মাইগ্রেশন + +ZeroClaw আপনার OpenClaw workspace, মেমোরি, এবং কনফিগারেশন আমদানি করতে পারে: + +```bash +# Preview what will be migrated (safe, read-only) +zeroclaw migrate openclaw --dry-run + +# Run the migration +zeroclaw migrate openclaw +``` + +এটি আপনার মেমোরি এন্ট্রি, workspace ফাইল, এবং কনফিগারেশন `~/.openclaw/` থেকে `~/.zeroclaw/` তে মাইগ্রেট করে। কনফিগ স্বয়ংক্রিয়ভাবে JSON থেকে TOML এ রূপান্তরিত হয়। + +## নিরাপত্তা ডিফল্ট (DM অ্যাক্সেস) + +ZeroClaw প্রকৃত মেসেজিং সারফেসের সাথে সংযোগ করে। ইনবাউন্ড DM গুলোকে অবিশ্বস্ত ইনপুট হিসেবে বিবেচনা করুন। + +সম্পূর্ণ নিরাপত্তা গাইড: [SECURITY.md](SECURITY.md) + +সকল চ্যানেলে ডিফল্ট আচরণ: + +- **DM পেয়ারিং** (ডিফল্ট): অজানা প্রেরকরা একটি সংক্ষিপ্ত পেয়ারিং কোড পায় এবং বট তাদের বার্তা প্রক্রিয়া করে না। +- এর মাধ্যমে অনুমোদন করুন: `zeroclaw pairing approve ` (তারপর প্রেরক স্থানীয় অনুমতি তালিকায় যুক্ত হয়)। +- পাবলিক ইনবাউন্ড DM এর জন্য `config.toml` এ স্পষ্ট অপ্ট-ইন প্রয়োজন। +- ঝুঁকিপূর্ণ বা ভুল কনফিগার করা DM নীতি প্রকাশ করতে `zeroclaw doctor` চালান। + +**স্বায়ত্তশাসন স্তর:** + +| স্তর | আচরণ | +|-------|----------| +| `ReadOnly` | এজেন্ট পর্যবেক্ষণ করতে পারে কিন্তু কাজ করতে পারে না | +| `Supervised` (ডিফল্ট) | এজেন্ট মাঝারি/উচ্চ ঝুঁকি অপারেশনের জন্য অনুমোদন সহ কাজ করে | +| `Full` | এজেন্ট নীতি সীমার মধ্যে স্বায়ত্তশাসিতভাবে কাজ করে | + +**স্যান্ডবক্সিং স্তর:** workspace আইসোলেশন, পাথ ট্রাভার্সাল ব্লকিং, কমান্ড অনুমতি তালিকা, নিষিদ্ধ পাথ (`/etc`, `/root`, `~/.ssh`), রেট লিমিটিং (সর্বোচ্চ কার্য/ঘণ্টা, খরচ/দিন সীমা)। + + + + +### 📢 ঘোষণা + +গুরুত্বপূর্ণ নোটিশের (ব্রেকিং পরিবর্তন, নিরাপত্তা পরামর্শ, রক্ষণাবেক্ষণ উইন্ডো, এবং রিলিজ ব্লকার) জন্য এই বোর্ড ব্যবহার করুন। + +| তারিখ (UTC) | স্তর | নোটিশ | পদক্ষেপ | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _জটিল_ | আমরা `openagen/zeroclaw`, `zeroclaw.org` বা `zeroclaw.net` এর সাথে **সম্পর্কিত নই**। `zeroclaw.org` এবং `zeroclaw.net` ডোমেইনগুলো বর্তমানে `openagen/zeroclaw` ফর্কের দিকে নির্দেশ করে, এবং সেই ডোমেইন/রিপোজিটরি আমাদের অফিসিয়াল ওয়েবসাইট/প্রকল্পের ছদ্মবেশ ধারণ করছে। | সেই উৎসগুলো থেকে তথ্য, বাইনারি, তহবিল সংগ্রহ, বা ঘোষণায় বিশ্বাস করবেন না। শুধুমাত্র [এই রিপোজিটরি](https://github.com/zeroclaw-labs/zeroclaw) এবং আমাদের যাচাইকৃত সোশ্যাল অ্যাকাউন্ট ব্যবহার করুন। | +| 2026-02-21 | _গুরুত্বপূর্ণ_ | আমাদের অফিসিয়াল ওয়েবসাইট এখন লাইভ: [zeroclawlabs.ai](https://zeroclawlabs.ai)। লঞ্চ প্রস্তুত করার সময় আপনার ধৈর্যের জন্য ধন্যবাদ। আমরা এখনও ছদ্মবেশ প্রচেষ্টা দেখছি, তাই কোনো বিনিয়োগ বা তহবিল সংগ্রহ কার্যকলাপে **যোগ দেবেন না** যা ZeroClaw নাম দাবি করে যদি না এটি আমাদের অফিসিয়াল চ্যানেলের মাধ্যমে প্রকাশিত হয়। | [এই রিপোজিটরি](https://github.com/zeroclaw-labs/zeroclaw) কে সত্যের একক উৎস হিসেবে ব্যবহার করুন। অফিসিয়াল আপডেটের জন্য [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs), এবং [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) অনুসরণ করুন। | +| 2026-02-19 | _গুরুত্বপূর্ণ_ | Anthropic 2026-02-19 তে Authentication and Credential Use শর্তাবলী আপডেট করেছে। Claude Code OAuth টোকেন (Free, Pro, Max) একচেটিয়াভাবে Claude Code এবং Claude.ai এর জন্য; Claude Free/Pro/Max থেকে OAuth টোকেন অন্য কোনো পণ্য, টুল, বা সেবায় (Agent SDK সহ) ব্যবহার অনুমোদিত নয় এবং Consumer Terms of Service লঙ্ঘন করতে পারে। | সম্ভাব্য ক্ষতি রোধ করতে অনুগ্রহ করে Claude Code OAuth ইন্টিগ্রেশন সাময়িকভাবে এড়িয়ে চলুন। মূল ধারা: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use)। | + +## প্রধান বৈশিষ্ট্য + +- **ডিফল্টভাবে হালকা রানটাইম** — সাধারণ CLI এবং স্ট্যাটাস ওয়ার্কফ্লো রিলিজ বিল্ডে কয়েক-মেগাবাইট মেমোরি এনভেলপে চলে। +- **খরচ-সাশ্রয়ী ডিপ্লয়মেন্ট** — $10 বোর্ড এবং ছোট ক্লাউড ইনস্ট্যান্সের জন্য ডিজাইন করা, কোনো ভারী রানটাইম নির্ভরতা নেই। +- **দ্রুত কোল্ড স্টার্ট** — একক-বাইনারি Rust রানটাইম কমান্ড এবং ডেমন স্টার্টআপ প্রায় তাৎক্ষণিক রাখে। +- **পোর্টেবল আর্কিটেকচার** — ARM, x86, এবং RISC-V জুড়ে একটি বাইনারি যার সাথে বিনিময়যোগ্য প্রদানকারী/চ্যানেল/টুল। +- **লোকাল-ফার্স্ট Gateway** — সেশন, চ্যানেল, টুল, cron, SOPs, এবং ইভেন্টের জন্য একক কন্ট্রোল প্লেন। +- **মাল্টি-চ্যানেল ইনবক্স** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket, এবং আরও। +- **মাল্টি-এজেন্ট অর্কেস্ট্রেশন (Hands)** — স্বায়ত্তশাসিত এজেন্ট সোয়ার্ম যা সময়সূচী অনুযায়ী চলে এবং সময়ের সাথে আরও স্মার্ট হয়। +- **স্ট্যান্ডার্ড অপারেটিং প্রসিডিউর (SOPs)** — MQTT, webhook, cron, এবং পেরিফেরাল ট্রিগার সহ ইভেন্ট-চালিত ওয়ার্কফ্লো অটোমেশন। +- **ওয়েব ড্যাশবোর্ড** — React 19 + Vite ওয়েব UI যাতে রিয়েল-টাইম চ্যাট, মেমোরি ব্রাউজার, কনফিগ এডিটর, cron ম্যানেজার, এবং টুল ইন্সপেক্টর আছে। +- **হার্ডওয়্যার পেরিফেরাল** — `Peripheral` trait এর মাধ্যমে ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO। +- **প্রথম-শ্রেণীর টুল** — shell, ফাইল I/O, browser, git, ওয়েব fetch/search, MCP, Jira, Notion, Google Workspace, এবং 70+ আরও। +- **লাইফসাইকেল হুক** — প্রতিটি পর্যায়ে LLM কল, টুল এক্সিকিউশন, এবং বার্তা ইন্টারসেপ্ট ও পরিবর্তন করুন। +- **স্কিল প্ল্যাটফর্ম** — নিরাপত্তা অডিটিং সহ বান্ডেল, সম্প্রদায়, এবং workspace স্কিল। +- **টানেল সাপোর্ট** — রিমোট অ্যাক্সেসের জন্য Cloudflare, Tailscale, ngrok, OpenVPN, এবং কাস্টম টানেল। + +### দলগুলো কেন ZeroClaw বেছে নেয় + +- **ডিফল্টভাবে হালকা:** ছোট Rust বাইনারি, দ্রুত স্টার্টআপ, কম মেমোরি ফুটপ্রিন্ট। +- **ডিজাইনে নিরাপদ:** পেয়ারিং, কঠোর স্যান্ডবক্সিং, স্পষ্ট অনুমতি তালিকা, workspace স্কোপিং। +- **সম্পূর্ণ বিনিময়যোগ্য:** মূল সিস্টেমগুলো traits (providers, channels, tools, memory, tunnels)। +- **কোনো লক-ইন নেই:** OpenAI-সামঞ্জস্যপূর্ণ প্রদানকারী সমর্থন + প্লাগেবল কাস্টম এন্ডপয়েন্ট। + +## বেঞ্চমার্ক স্ন্যাপশট (ZeroClaw বনাম OpenClaw, পুনরুৎপাদনযোগ্য) + +স্থানীয় মেশিন দ্রুত বেঞ্চমার্ক (macOS arm64, ফেব্রুয়ারি 2026) 0.8GHz এজ হার্ডওয়্যারের জন্য স্বাভাবিকীকৃত। + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **ভাষা** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **স্টার্টআপ (0.8GHz কোর)** | > 500s | > 30s | < 1s | **< 10ms** | +| **বাইনারি আকার** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **খরচ** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **যেকোনো হার্ডওয়্যার $10** | + +> নোট: ZeroClaw ফলাফল `/usr/bin/time -l` ব্যবহার করে রিলিজ বিল্ডে পরিমাপ করা হয়েছে। OpenClaw এর Node.js রানটাইম প্রয়োজন (সাধারণত ~390MB অতিরিক্ত মেমোরি ওভারহেড), যেখানে NanoBot এর Python রানটাইম প্রয়োজন। PicoClaw এবং ZeroClaw স্ট্যাটিক বাইনারি। উপরের RAM পরিসংখ্যান রানটাইম মেমোরি; বিল্ড-টাইম কম্পাইলেশন প্রয়োজনীয়তা বেশি। + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### পুনরুৎপাদনযোগ্য স্থানীয় পরিমাপ + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## এখন পর্যন্ত আমরা যা তৈরি করেছি + +### কোর প্ল্যাটফর্ম + +- Gateway HTTP/WS/SSE কন্ট্রোল প্লেন যাতে সেশন, উপস্থিতি, কনফিগ, cron, webhooks, ওয়েব ড্যাশবোর্ড, এবং পেয়ারিং আছে। +- CLI সারফেস: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`। +- এজেন্ট অর্কেস্ট্রেশন লুপ যাতে টুল ডিসপ্যাচ, প্রম্পট নির্মাণ, বার্তা শ্রেণীবিভাগ, এবং মেমোরি লোডিং আছে। +- নিরাপত্তা নীতি প্রয়োগ, স্বায়ত্তশাসন স্তর, এবং অনুমোদন গেটিং সহ সেশন মডেল। +- 20+ LLM ব্যাকএন্ড জুড়ে ফেইলওভার, রিট্রাই, এবং মডেল রাউটিং সহ রেজিলিয়েন্ট প্রদানকারী র‍্যাপার। + +### চ্যানেল + +চ্যানেল: WhatsApp (নেটিভ), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk। + +ফিচার-গেটেড: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`)। + +### ওয়েব ড্যাশবোর্ড + +React 19 + Vite 6 + Tailwind CSS 4 ওয়েব ড্যাশবোর্ড সরাসরি Gateway থেকে পরিবেশিত: + +- **ড্যাশবোর্ড** — সিস্টেম ওভারভিউ, স্বাস্থ্য অবস্থা, আপটাইম, খরচ ট্র্যাকিং +- **এজেন্ট চ্যাট** — এজেন্টের সাথে ইন্টারেক্টিভ চ্যাট +- **মেমোরি** — মেমোরি এন্ট্রি ব্রাউজ ও পরিচালনা +- **কনফিগ** — কনফিগারেশন দেখুন ও সম্পাদনা করুন +- **Cron** — নির্ধারিত কাজ পরিচালনা +- **টুলস** — উপলব্ধ টুল ব্রাউজ করুন +- **লগস** — এজেন্ট কার্যকলাপ লগ দেখুন +- **খরচ** — টোকেন ব্যবহার এবং খরচ ট্র্যাকিং +- **ডক্টর** — সিস্টেম স্বাস্থ্য ডায়াগনস্টিকস +- **ইন্টিগ্রেশন** — ইন্টিগ্রেশন অবস্থা এবং সেটআপ +- **পেয়ারিং** — ডিভাইস পেয়ারিং পরিচালনা + +### ফার্মওয়্যার টার্গেট + +| টার্গেট | প্ল্যাটফর্ম | উদ্দেশ্য | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | ওয়্যারলেস পেরিফেরাল এজেন্ট | +| ESP32-UI | ESP32 + Display | ভিজ্যুয়াল ইন্টারফেস সহ এজেন্ট | +| STM32 Nucleo | STM32 (ARM Cortex-M) | ইন্ডাস্ট্রিয়াল পেরিফেরাল | +| Arduino | Arduino | বেসিক সেন্সর/অ্যাকচুয়েটর ব্রিজ | +| Uno Q Bridge | Arduino Uno | এজেন্টের জন্য সিরিয়াল ব্রিজ | + +### টুল + অটোমেশন + +- **কোর:** shell, ফাইল read/write/edit, git অপারেশন, glob search, content search +- **ওয়েব:** ব্রাউজার নিয়ন্ত্রণ, web fetch, web search, screenshot, image info, PDF read +- **ইন্টিগ্রেশন:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol টুল র‍্যাপার + ডিফার্ড টুল সেট +- **শিডিউলিং:** cron add/remove/update/run, schedule tool +- **মেমোরি:** recall, store, forget, knowledge, project intel +- **উন্নত:** delegate (এজেন্ট-টু-এজেন্ট), swarm, model switch/routing, security ops, cloud ops +- **হার্ডওয়্যার:** board info, memory map, memory read (ফিচার-গেটেড) + +### রানটাইম + নিরাপত্তা + +- **স্বায়ত্তশাসন স্তর:** ReadOnly, Supervised (ডিফল্ট), Full। +- **স্যান্ডবক্সিং:** workspace আইসোলেশন, পাথ ট্রাভার্সাল ব্লকিং, কমান্ড অনুমতি তালিকা, নিষিদ্ধ পাথ, Landlock (Linux), Bubblewrap। +- **রেট লিমিটিং:** প্রতি ঘণ্টায় সর্বোচ্চ কার্য, প্রতি দিনে সর্বোচ্চ খরচ (কনফিগারযোগ্য)। +- **অনুমোদন গেটিং:** মাঝারি/উচ্চ ঝুঁকি অপারেশনের জন্য ইন্টারেক্টিভ অনুমোদন। +- **ই-স্টপ:** জরুরি শাটডাউন ক্ষমতা। +- **129+ নিরাপত্তা পরীক্ষা** স্বয়ংক্রিয় CI তে। + +### অপস + প্যাকেজিং + +- ওয়েব ড্যাশবোর্ড সরাসরি Gateway থেকে পরিবেশিত। +- টানেল সাপোর্ট: Cloudflare, Tailscale, ngrok, OpenVPN, কাস্টম কমান্ড। +- কন্টেইনারাইজড এক্সিকিউশনের জন্য Docker রানটাইম অ্যাডাপ্টার। +- CI/CD: বেটা (পুশে অটো) → স্টেবল (ম্যানুয়াল ডিসপ্যাচ) → Docker, crates.io, Scoop, AUR, Homebrew, টুইট। +- Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64) এর জন্য প্রি-বিল্ট বাইনারি। + + +## কনফিগারেশন + +ন্যূনতম `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +সম্পূর্ণ কনফিগারেশন রেফারেন্স: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md)। + +### চ্যানেল কনফিগারেশন + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### টানেল কনফিগারেশন + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +বিস্তারিত: [চ্যানেল রেফারেন্স](docs/reference/api/channels-reference.md) · [কনফিগ রেফারেন্স](docs/reference/api/config-reference.md) + +### রানটাইম সাপোর্ট (বর্তমান) + +- **`native`** (ডিফল্ট) — সরাসরি প্রসেস এক্সিকিউশন, দ্রুততম পথ, বিশ্বস্ত পরিবেশের জন্য আদর্শ। +- **`docker`** — সম্পূর্ণ কন্টেইনার আইসোলেশন, প্রয়োগকৃত নিরাপত্তা নীতি, Docker প্রয়োজন। + +কঠোর স্যান্ডবক্সিং বা নেটওয়ার্ক আইসোলেশনের জন্য `runtime.kind = "docker"` সেট করুন। + +## সাবস্ক্রিপশন অথ (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw সাবস্ক্রিপশন-নেটিভ অথ প্রোফাইল সমর্থন করে (মাল্টি-অ্যাকাউন্ট, বিশ্রামে এনক্রিপ্টেড)। + +- স্টোর ফাইল: `~/.zeroclaw/auth-profiles.json` +- এনক্রিপশন কী: `~/.zeroclaw/.secret_key` +- প্রোফাইল id ফরম্যাট: `:` (উদাহরণ: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT subscription) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Check / refresh / switch profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Run the agent with subscription auth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## এজেন্ট workspace + স্কিল + +Workspace রুট: `~/.zeroclaw/workspace/` (কনফিগের মাধ্যমে কনফিগারযোগ্য)। + +ইনজেক্ট করা প্রম্পট ফাইল: +- `IDENTITY.md` — এজেন্টের ব্যক্তিত্ব এবং ভূমিকা +- `USER.md` — ব্যবহারকারীর প্রসঙ্গ এবং পছন্দ +- `MEMORY.md` — দীর্ঘমেয়াদী তথ্য এবং শিক্ষা +- `AGENTS.md` — সেশন কনভেনশন এবং ইনিশিয়ালাইজেশন নিয়ম +- `SOUL.md` — মূল পরিচয় এবং পরিচালন নীতি + +স্কিল: `~/.zeroclaw/workspace/skills//SKILL.md` বা `SKILL.toml`। + +```bash +# List installed skills +zeroclaw skills list + +# Install from git +zeroclaw skills install https://github.com/user/my-skill.git + +# Security audit before install +zeroclaw skills audit https://github.com/user/my-skill.git + +# Remove a skill +zeroclaw skills remove my-skill +``` + +## CLI কমান্ড + +```bash +# Workspace management +zeroclaw onboard # Guided setup wizard +zeroclaw status # Show daemon/agent status +zeroclaw doctor # Run system diagnostics + +# Gateway + daemon +zeroclaw gateway # Start gateway server (127.0.0.1:42617) +zeroclaw daemon # Start full autonomous runtime + +# Agent +zeroclaw agent # Interactive chat mode +zeroclaw agent -m "message" # Single message mode + +# Service management +zeroclaw service install # Install as OS service (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Channels +zeroclaw channel list # List configured channels +zeroclaw channel doctor # Check channel health +zeroclaw channel bind-telegram 123456789 + +# Cron + scheduling +zeroclaw cron list # List scheduled jobs +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memory +zeroclaw memory list # List memory entries +zeroclaw memory get # Retrieve a memory +zeroclaw memory stats # Memory statistics + +# Auth profiles +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardware peripherals +zeroclaw hardware discover # Scan for connected devices +zeroclaw peripheral list # List connected peripherals +zeroclaw peripheral flash # Flash firmware to device + +# Migration +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell completions +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +সম্পূর্ণ কমান্ড রেফারেন্স: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## পূর্বশর্ত + +
+Windows + +#### প্রয়োজনীয় + +1. **Visual Studio Build Tools** (MSVC লিঙ্কার এবং Windows SDK প্রদান করে): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + ইনস্টলেশনের সময় (বা Visual Studio Installer এর মাধ্যমে), **"Desktop development with C++"** ওয়ার্কলোড নির্বাচন করুন। + +2. **Rust টুলচেইন:** + + ```powershell + winget install Rustlang.Rustup + ``` + + ইনস্টলেশনের পরে, একটি নতুন টার্মিনাল খুলুন এবং `rustup default stable` চালান স্থিতিশীল টুলচেইন সক্রিয় করতে। + +3. **যাচাই করুন** উভয়ই কাজ করছে: + ```powershell + rustc --version + cargo --version + ``` + +#### ঐচ্ছিক + +- **Docker Desktop** — শুধুমাত্র [Docker স্যান্ডবক্সড রানটাইম](#রানটাইম-সাপোর্ট-বর্তমান) (`runtime.kind = "docker"`) ব্যবহার করলে প্রয়োজন। `winget install Docker.DockerDesktop` দিয়ে ইনস্টল করুন। + +
+ +
+Linux / macOS + +#### প্রয়োজনীয় + +1. **বিল্ড এসেনশিয়ালস:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Xcode Command Line Tools ইনস্টল করুন: `xcode-select --install` + +2. **Rust টুলচেইন:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + বিস্তারিতের জন্য [rustup.rs](https://rustup.rs) দেখুন। + +3. **যাচাই করুন** উভয়ই কাজ করছে: + ```bash + rustc --version + cargo --version + ``` + +#### এক-লাইন ইনস্টলার + +অথবা উপরের ধাপগুলো এড়িয়ে একটি কমান্ডে সবকিছু (সিস্টেম deps, Rust, ZeroClaw) ইনস্টল করুন: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### কম্পাইলেশন রিসোর্স প্রয়োজনীয়তা + +সোর্স থেকে বিল্ড করতে ফলাফল বাইনারি চালানোর চেয়ে বেশি রিসোর্স প্রয়োজন: + +| রিসোর্স | ন্যূনতম | প্রস্তাবিত | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **ফ্রি ডিস্ক** | 6 GB | 10 GB+ | + +আপনার হোস্ট ন্যূনতমের নিচে হলে, প্রি-বিল্ট বাইনারি ব্যবহার করুন: + +```bash +./install.sh --prefer-prebuilt +``` + +সোর্স ফলব্যাক ছাড়া শুধুমাত্র বাইনারি ইনস্টল করতে: + +```bash +./install.sh --prebuilt-only +``` + +#### ঐচ্ছিক + +- **Docker** — শুধুমাত্র [Docker স্যান্ডবক্সড রানটাইম](#রানটাইম-সাপোর্ট-বর্তমান) (`runtime.kind = "docker"`) ব্যবহার করলে প্রয়োজন। আপনার প্যাকেজ ম্যানেজার বা [docker.com](https://docs.docker.com/engine/install/) থেকে ইনস্টল করুন। + +> **নোট:** ডিফল্ট `cargo build --release` পিক কম্পাইল প্রেশার কমাতে `codegen-units=1` ব্যবহার করে। শক্তিশালী মেশিনে দ্রুত বিল্ডের জন্য, `cargo build --profile release-fast` ব্যবহার করুন। + +
+ + + +### প্রি-বিল্ট বাইনারি + +রিলিজ অ্যাসেট প্রকাশিত হয়: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +সর্বশেষ অ্যাসেট ডাউনলোড করুন: + + +## ডকুমেন্টেশন + +অনবোর্ডিং প্রবাহের পরে এবং গভীর রেফারেন্স চাইলে এগুলো ব্যবহার করুন। + +- নেভিগেশন এবং "কোথায় কী" এর জন্য [ডকুমেন্টেশন ইনডেক্স](docs/README.md) দিয়ে শুরু করুন। +- সম্পূর্ণ সিস্টেম মডেলের জন্য [আর্কিটেকচার ওভারভিউ](docs/architecture.md) পড়ুন। +- প্রতিটি কী এবং উদাহরণ প্রয়োজন হলে [কনফিগারেশন রেফারেন্স](docs/reference/api/config-reference.md) ব্যবহার করুন। +- [অপারেশনাল রানবুক](docs/ops/operations-runbook.md) অনুযায়ী Gateway চালান। +- গাইডেড সেটআপের জন্য [ZeroClaw Onboard](#দ্রুত-শুরু) অনুসরণ করুন। +- [সমস্যা সমাধান গাইড](docs/ops/troubleshooting.md) দিয়ে সাধারণ ব্যর্থতা ডিবাগ করুন। +- কিছু এক্সপোজ করার আগে [নিরাপত্তা নির্দেশনা](docs/security/README.md) পর্যালোচনা করুন। + +### রেফারেন্স ডকুমেন্টেশন + +- ডকুমেন্টেশন হাব: [docs/README.md](docs/README.md) +- একীভূত ডকুমেন্টেশন TOC: [docs/SUMMARY.md](docs/SUMMARY.md) +- কমান্ড রেফারেন্স: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- কনফিগ রেফারেন্স: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- প্রদানকারী রেফারেন্স: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- চ্যানেল রেফারেন্স: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- অপারেশনস রানবুক: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- সমস্যা সমাধান: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### সহযোগিতা ডকুমেন্টেশন + +- অবদান গাইড: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR ওয়ার্কফ্লো নীতি: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI ওয়ার্কফ্লো গাইড: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- পর্যালোচক প্লেবুক: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- নিরাপত্তা প্রকাশ নীতি: [SECURITY.md](SECURITY.md) +- ডকুমেন্টেশন টেমপ্লেট: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### ডিপ্লয়মেন্ট + অপারেশন + +- নেটওয়ার্ক ডিপ্লয়মেন্ট গাইড: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- প্রক্সি এজেন্ট প্লেবুক: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- হার্ডওয়্যার গাইড: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw smooth crab 🦀 এর জন্য তৈরি হয়েছিল, একটি দ্রুত এবং দক্ষ AI সহকারী। Argenis De La Rosa এবং সম্প্রদায় দ্বারা নির্মিত। + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## ZeroClaw সমর্থন করুন + +ZeroClaw আপনার কাজে সাহায্য করলে এবং আপনি চলমান উন্নয়ন সমর্থন করতে চাইলে, এখানে দান করতে পারেন: + +Buy Me a Coffee + +### 🙏 বিশেষ ধন্যবাদ + +যে সম্প্রদায় এবং প্রতিষ্ঠানগুলো এই ওপেন-সোর্স কাজকে অনুপ্রাণিত এবং শক্তি দেয় তাদের প্রতি আন্তরিক ধন্যবাদ: + +- **Harvard University** — বৌদ্ধিক কৌতূহল লালন এবং সম্ভাবনার সীমানা প্রসারিত করার জন্য। +- **MIT** — খোলা জ্ঞান, ওপেন সোর্স, এবং প্রযুক্তি সবার জন্য অ্যাক্সেসযোগ্য হওয়া উচিত এই বিশ্বাসের চ্যাম্পিয়ন হওয়ার জন্য। +- **Sundai Club** — সম্প্রদায়, শক্তি, এবং গুরুত্বপূর্ণ জিনিস তৈরির অদম্য চেষ্টার জন্য। +- **বিশ্ব এবং তার বাইরে** 🌍✨ — প্রতিটি অবদানকারী, স্বপ্নদ্রষ্টা, এবং নির্মাতার জন্য যারা ওপেন সোর্সকে ভালোর শক্তি বানাচ্ছে। এটি আপনার জন্য। + +আমরা খোলামেলাভাবে তৈরি করছি কারণ সেরা ধারণাগুলো সর্বত্র থেকে আসে। আপনি যদি এটি পড়ছেন, আপনি এর অংশ। স্বাগতম। 🦀❤️ + +## অবদান + +ZeroClaw এ নতুন? [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) লেবেলযুক্ত ইস্যু খুঁজুন — কিভাবে শুরু করতে হয় তা জানতে আমাদের [অবদান গাইড](CONTRIBUTING.md#first-time-contributors) দেখুন। AI/vibe-coded PR স্বাগত! 🤖 + +[CONTRIBUTING.md](CONTRIBUTING.md) এবং [CLA.md](docs/contributing/cla.md) দেখুন। একটি trait বাস্তবায়ন করুন, PR জমা দিন: + +- CI ওয়ার্কফ্লো গাইড: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- নতুন `Provider` → `src/providers/` +- নতুন `Channel` → `src/channels/` +- নতুন `Observer` → `src/observability/` +- নতুন `Tool` → `src/tools/` +- নতুন `Memory` → `src/memory/` +- নতুন `Tunnel` → `src/tunnel/` +- নতুন `Peripheral` → `src/peripherals/` +- নতুন `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ অফিসিয়াল রিপোজিটরি এবং ছদ্মবেশ সতর্কতা + +**এটিই একমাত্র অফিসিয়াল ZeroClaw রিপোজিটরি:** + +> https://github.com/zeroclaw-labs/zeroclaw + +অন্য কোনো রিপোজিটরি, সংগঠন, ডোমেইন, বা প্যাকেজ যা "ZeroClaw" বলে দাবি করে বা ZeroClaw Labs এর সাথে সংযুক্তি ইঙ্গিত করে তা **অননুমোদিত এবং এই প্রকল্পের সাথে সম্পর্কিত নয়**। পরিচিত অননুমোদিত ফর্ক [TRADEMARK.md](docs/maintainers/trademark.md) তে তালিকাভুক্ত করা হবে। + +আপনি ছদ্মবেশ বা ট্রেডমার্ক অপব্যবহারের সম্মুখীন হলে, অনুগ্রহ করে [একটি ইস্যু খুলুন](https://github.com/zeroclaw-labs/zeroclaw/issues)। + +--- + +## লাইসেন্স + +ZeroClaw সর্বোচ্চ উন্মুক্ততা এবং অবদানকারী সুরক্ষার জন্য দ্বৈত-লাইসেন্সপ্রাপ্ত: + +| লাইসেন্স | ব্যবহারের ক্ষেত্র | +|---|---| +| [MIT](LICENSE-MIT) | ওপেন-সোর্স, গবেষণা, একাডেমিক, ব্যক্তিগত ব্যবহার | +| [Apache 2.0](LICENSE-APACHE) | পেটেন্ট সুরক্ষা, প্রাতিষ্ঠানিক, বাণিজ্যিক ডিপ্লয়মেন্ট | + +আপনি যেকোনো লাইসেন্স বেছে নিতে পারেন। **অবদানকারীরা স্বয়ংক্রিয়ভাবে উভয়ের অধীনে অধিকার প্রদান করে** — সম্পূর্ণ অবদানকারী চুক্তির জন্য [CLA.md](docs/contributing/cla.md) দেখুন। + +### ট্রেডমার্ক + +**ZeroClaw** নাম এবং লোগো ZeroClaw Labs এর ট্রেডমার্ক। এই লাইসেন্স সমর্থন বা সংযুক্তি ইঙ্গিত করতে এগুলো ব্যবহারের অনুমতি দেয় না। অনুমোদিত এবং নিষিদ্ধ ব্যবহারের জন্য [TRADEMARK.md](docs/maintainers/trademark.md) দেখুন। + +### অবদানকারী সুরক্ষা + +- আপনি আপনার অবদানের **কপিরাইট ধরে রাখেন** +- **পেটেন্ট অনুদান** (Apache 2.0) আপনাকে অন্যান্য অবদানকারীদের পেটেন্ট দাবি থেকে রক্ষা করে +- আপনার অবদান কমিট ইতিহাস এবং [NOTICE](NOTICE) এ **স্থায়ীভাবে বিশেষিত** +- অবদান করে কোনো ট্রেডমার্ক অধিকার হস্তান্তরিত হয় না + +--- + +**ZeroClaw** — শূন্য ওভারহেড। শূন্য আপস। যেকোনো জায়গায় ডিপ্লয় করুন। যেকিছু বিনিময় করুন। 🦀 + +## অবদানকারীরা + + + ZeroClaw contributors + + +এই তালিকা GitHub অবদানকারী গ্রাফ থেকে তৈরি হয় এবং স্বয়ংক্রিয়ভাবে আপডেট হয়। + +## স্টার ইতিহাস + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.cs.md b/third_party/zeroclaw/README.cs.md new file mode 100644 index 0000000..7cf06be --- /dev/null +++ b/third_party/zeroclaw/README.cs.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Osobní AI Asistent

+ +

+ Nulová režie. Nulový kompromis. 100% Rust. 100% Agnostický.
+ ⚡️ Běží na hardwaru za $10 s <5MB RAM: To je o 99 % méně paměti než OpenClaw a o 98 % levnější než Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Vytvořeno studenty a členy komunit Harvard, MIT a Sundai.Club. +

+ +

+ 🌐 Jazyky: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw je osobní AI asistent, který spouštíte na vlastních zařízeních. Odpovídá vám na kanálech, které již používáte (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work a další). Má webový panel pro řízení v reálném čase a může se připojit k hardwarovým periferiím (ESP32, STM32, Arduino, Raspberry Pi). Gateway je pouze řídicí rovina — produktem je asistent. + +Pokud hledáte osobního jednouživatelského asistenta, který je lokální, rychlý a vždy dostupný — toto je ono. + +

+ Webové stránky · + Dokumentace · + Architektura · + Začínáme · + Migrace z OpenClaw · + Řešení problémů · + Discord +

+ +> **Doporučené nastavení:** spusťte `zeroclaw onboard` ve vašem terminálu. ZeroClaw Onboard vás krok za krokem provede nastavením gateway, workspace, kanálů a poskytovatele. Je to doporučená cesta nastavení a funguje na macOS, Linux a Windows (přes WSL2). Nová instalace? Začněte zde: [Začínáme](#rychlý-start) + +### Autentizace předplatného (OAuth) + +- **OpenAI Codex** (předplatné ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (API klíč nebo autorizační token) + +Poznámka k modelům: ačkoli je podporováno mnoho poskytovatelů/modelů, pro nejlepší zážitek použijte nejsilnější dostupný model nejnovější generace. Viz [Onboarding](#rychlý-start). + +Konfigurace modelů + CLI: [Reference poskytovatelů](docs/reference/api/providers-reference.md) +Rotace autorizačních profilů (OAuth vs API klíče) + failover: [Failover modelů](docs/reference/api/providers-reference.md) + +## Instalace (doporučená) + +Běhové prostředí: stabilní toolchain Rust. Jeden binární soubor, žádné runtime závislosti. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Instalace jedním kliknutím + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` se automaticky spustí po instalaci pro konfiguraci vašeho workspace a poskytovatele. + +## Rychlý start (TL;DR) + +Kompletní průvodce pro začátečníky (autentizace, párování, kanály): [Začínáme](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Instalace + onboarding +./install.sh --api-key "sk-..." --provider openrouter + +# Spuštění gateway (webhook server + webový panel) +zeroclaw gateway # výchozí: 127.0.0.1:42617 +zeroclaw gateway --port 0 # náhodný port (posílené zabezpečení) + +# Komunikace s asistentem +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interaktivní režim +zeroclaw agent + +# Spuštění plného autonomního běhového prostředí (gateway + kanály + cron + hands) +zeroclaw daemon + +# Kontrola stavu +zeroclaw status + +# Spuštění diagnostiky +zeroclaw doctor +``` + +Aktualizujete? Spusťte `zeroclaw doctor` po aktualizaci. + +### Ze zdrojového kódu (vývoj) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Vývojářský fallback (bez globální instalace):** předřaďte příkazy `cargo run --release --` (příklad: `cargo run --release -- status`). + +## Migrace z OpenClaw + +ZeroClaw může importovat váš workspace, paměť a konfiguraci OpenClaw: + +```bash +# Náhled toho, co bude migrováno (bezpečné, pouze čtení) +zeroclaw migrate openclaw --dry-run + +# Spuštění migrace +zeroclaw migrate openclaw +``` + +Migruje záznamy paměti, soubory workspace a konfiguraci z `~/.openclaw/` do `~/.zeroclaw/`. Konfigurace je automaticky převedena z JSON do TOML. + +## Výchozí nastavení zabezpečení (přístup DM) + +ZeroClaw se připojuje k reálným komunikačním platformám. Zacházejte s příchozími DM jako s nedůvěryhodným vstupem. + +Kompletní průvodce zabezpečením: [SECURITY.md](SECURITY.md) + +Výchozí chování na všech kanálech: + +- **Párování DM** (výchozí): neznámí odesílatelé obdrží krátký párovací kód a bot nezpracovává jejich zprávu. +- Schvalte pomocí: `zeroclaw pairing approve ` (poté je odesílatel přidán na lokální allowlist). +- Veřejné příchozí DM vyžadují explicitní opt-in v `config.toml`. +- Spusťte `zeroclaw doctor` pro odhalení rizikových nebo špatně nakonfigurovaných DM politik. + +**Úrovně autonomie:** + +| Úroveň | Chování | +|--------|---------| +| `ReadOnly` | Agent může pozorovat, ale nemůže jednat | +| `Supervised` (výchozí) | Agent jedná se schválením pro operace se středním/vysokým rizikem | +| `Full` | Agent jedná autonomně v rámci hranic politiky | + +**Vrstvy sandboxingu:** izolace workspace, blokování procházení cest, allowlisty příkazů, zakázané cesty (`/etc`, `/root`, `~/.ssh`), omezení rychlosti (max akcí/hodinu, denní limity nákladů). + + + + +### 📢 Oznámení + +Používejte tuto nástěnku pro důležitá oznámení (zlomové změny, bezpečnostní upozornění, okna údržby a blokátory vydání). + +| Datum (UTC) | Úroveň | Oznámení | Akce | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Kritické_ | **Nejsme spojeni** s `openagen/zeroclaw`, `zeroclaw.org` ani `zeroclaw.net`. Domény `zeroclaw.org` a `zeroclaw.net` aktuálně směřují na fork `openagen/zeroclaw` a tato doména/repozitář se vydávají za naši oficiální stránku/projekt. | Nedůvěřujte informacím, binárním souborům, sbírkám ani oznámením z těchto zdrojů. Používejte pouze [toto repozitárium](https://github.com/zeroclaw-labs/zeroclaw) a naše ověřené sociální účty. | +| 2026-02-21 | _Důležité_ | Naše oficiální webové stránky jsou nyní aktivní: [zeroclawlabs.ai](https://zeroclawlabs.ai). Děkujeme za trpělivost při přípravě spuštění. Stále vidíme pokusy o vydávání se za nás, takže se **ne**připojujte k žádným investicím nebo sbírkám pod jménem ZeroClaw, pokud nebyly zveřejněny prostřednictvím našich oficiálních kanálů. | Používejte [toto repozitárium](https://github.com/zeroclaw-labs/zeroclaw) jako jediný zdroj pravdy. Sledujte [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Skupina)](https://www.facebook.com/groups/zeroclawlabs) a [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) pro oficiální aktualizace. | +| 2026-02-19 | _Důležité_ | Anthropic aktualizoval podmínky autentizace a použití přihlašovacích údajů 2026-02-19. OAuth tokeny Claude Code (Free, Pro, Max) jsou určeny výhradně pro Claude Code a Claude.ai; používání OAuth tokenů z Claude Free/Pro/Max v jakémkoli jiném produktu, nástroji nebo službě (včetně Agent SDK) není povoleno a může porušovat Podmínky služby. | Prosím dočasně se vyhněte integracím Claude Code OAuth, abyste předešli potenciálním ztrátám. Původní klauzule: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Hlavní rysy + +- **Lehké běhové prostředí ve výchozím stavu** — běžné CLI a statusové workflow běží v obálce paměti několika megabajtů na release buildech. +- **Nákladově efektivní nasazení** — navrženo pro desky za $10 a malé cloudové instance, žádné těžké runtime závislosti. +- **Rychlé studené starty** — jednobinární Rust runtime udržuje start příkazů a démona téměř okamžitý. +- **Přenosná architektura** — jeden binární soubor pro ARM, x86 a RISC-V s vyměnitelnými poskytovateli/kanály/nástroji. +- **Lokální gateway** — jednotná řídicí rovina pro relace, kanály, nástroje, cron, SOP a události. +- **Vícekanálová schránka** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket a další. +- **Orchestrace více agentů (Hands)** — autonomní roje agentů, které běží podle plánu a časem se stávají chytřejšími. +- **Standardní operační postupy (SOP)** — automatizace workflow řízená událostmi s triggery MQTT, webhook, cron a periferiemi. +- **Webový panel** — rozhraní React 19 + Vite s chatem v reálném čase, prohlížečem paměti, editorem konfigurace, správcem cron a inspektorem nástrojů. +- **Hardwarové periferie** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO přes trait `Peripheral`. +- **Prvotřídní nástroje** — shell, souborové I/O, prohlížeč, git, web fetch/search, MCP, Jira, Notion, Google Workspace a 70+ dalších. +- **Lifecycle hooky** — zachytávejte a upravujte volání LLM, spouštění nástrojů a zprávy v každé fázi. +- **Platforma dovedností** — vestavěné, komunitní a workspace dovednosti s bezpečnostním auditem. +- **Podpora tunelů** — Cloudflare, Tailscale, ngrok, OpenVPN a vlastní tunely pro vzdálený přístup. + +### Proč týmy volí ZeroClaw + +- **Lehký ve výchozím stavu:** malý Rust binární soubor, rychlý start, nízká paměťová stopa. +- **Bezpečný od návrhu:** párování, přísný sandboxing, explicitní allowlisty, izolace workspace. +- **Plně vyměnitelný:** základní systémy jsou traity (poskytovatelé, kanály, nástroje, paměť, tunely). +- **Žádný vendor lock-in:** podpora poskytovatelů kompatibilních s OpenAI + připojitelné vlastní endpointy. + +## Srovnání výkonu (ZeroClaw vs OpenClaw, reprodukovatelné) + +Rychlý benchmark na lokálním stroji (macOS arm64, únor 2026) normalizovaný pro edge hardware 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Jazyk** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Start (jádro 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Velikost binárky** | ~28MB (dist) | N/A (Skripty) | ~8MB | **~8.8 MB** | +| **Náklady** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Jakýkoli hardware $10** | + +> Poznámky: Výsledky ZeroClaw jsou měřeny na release buildech pomocí `/usr/bin/time -l`. OpenClaw vyžaduje běhové prostředí Node.js (typicky ~390MB dodatečné paměťové režie), zatímco NanoBot vyžaduje běhové prostředí Python. PicoClaw a ZeroClaw jsou statické binárky. Výše uvedené hodnoty RAM jsou runtime paměť; požadavky kompilace jsou vyšší. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Reprodukovatelné lokální měření + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Vše, co jsme dosud vytvořili + +### Základní platforma + +- Gateway HTTP/WS/SSE řídicí rovina s relacemi, přítomností, konfigurací, cron, webhooky, webovým panelem a párováním. +- CLI rozhraní: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Orchestrační smyčka agenta s dispatchem nástrojů, konstrukcí promptů, klasifikací zpráv a načítáním paměti. +- Model relací s vynucováním bezpečnostní politiky, úrovněmi autonomie a schvalovacím gatováním. +- Odolný wrapper poskytovatele s failoverem, opakováním a routingem modelů napříč 20+ LLM backendy. + +### Kanály + +Kanály: WhatsApp (nativní), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Za feature gate: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Webový panel + +Webový panel React 19 + Vite 6 + Tailwind CSS 4 servírovaný přímo z Gateway: + +- **Dashboard** — přehled systému, stav zdraví, uptime, sledování nákladů +- **Chat s agentem** — interaktivní chat s agentem +- **Paměť** — prohlížení a správa záznamů paměti +- **Konfigurace** — zobrazení a úprava konfigurace +- **Cron** — správa naplánovaných úloh +- **Nástroje** — prohlížení dostupných nástrojů +- **Logy** — zobrazení logů aktivity agenta +- **Náklady** — využití tokenů a sledování nákladů +- **Doctor** — diagnostika zdraví systému +- **Integrace** — stav a nastavení integrací +- **Párování** — správa párování zařízení + +### Cíle firmwaru + +| Cíl | Platforma | Účel | +|-----|-----------|------| +| ESP32 | Espressif ESP32 | Bezdrátový periferní agent | +| ESP32-UI | ESP32 + Displej | Agent s vizuálním rozhraním | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Průmyslová periferie | +| Arduino | Arduino | Základní můstek senzorů/aktuátorů | +| Uno Q Bridge | Arduino Uno | Sériový můstek k agentovi | + +### Nástroje + automatizace + +- **Základní:** shell, čtení/zápis/editace souborů, operace git, glob vyhledávání, vyhledávání obsahu +- **Web:** ovládání prohlížeče, web fetch, webové vyhledávání, snímek obrazovky, info o obrázku, čtení PDF +- **Integrace:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** wrapper nástrojů Model Context Protocol + odložené sady nástrojů +- **Plánování:** cron add/remove/update/run, nástroj plánování +- **Paměť:** recall, store, forget, knowledge, project intel +- **Pokročilé:** delegate (agent-to-agent), swarm, model switch/routing, security ops, cloud ops +- **Hardware:** board info, memory map, memory read (za feature gate) + +### Běhové prostředí + bezpečnost + +- **Úrovně autonomie:** ReadOnly, Supervised (výchozí), Full. +- **Sandboxing:** izolace workspace, blokování procházení cest, allowlisty příkazů, zakázané cesty, Landlock (Linux), Bubblewrap. +- **Omezení rychlosti:** max akcí za hodinu, max nákladů za den (konfigurovatelné). +- **Schvalovací gatování:** interaktivní schvalování operací se středním/vysokým rizikem. +- **E-stop:** schopnost nouzového vypnutí. +- **129+ bezpečnostních testů** v automatizovaném CI. + +### Provoz + balíčkování + +- Webový panel servírovaný přímo z Gateway. +- Podpora tunelů: Cloudflare, Tailscale, ngrok, OpenVPN, vlastní příkaz. +- Docker runtime adaptér pro kontejnerizované spouštění. +- CI/CD: beta (auto na push) → stable (ruční dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Předpřipravené binárky pro Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Konfigurace + +Minimální `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Kompletní reference konfigurace: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Konfigurace kanálů + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Konfigurace tunelu + +```toml +[tunnel] +kind = "cloudflare" # nebo "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Podrobnosti: [Reference kanálů](docs/reference/api/channels-reference.md) · [Reference konfigurace](docs/reference/api/config-reference.md) + +### Podpora runtime (aktuální) + +- **`native`** (výchozí) — přímé spouštění procesů, nejrychlejší cesta, ideální pro důvěryhodná prostředí. +- **`docker`** — plná kontejnerová izolace, vynucené bezpečnostní politiky, vyžaduje Docker. + +Nastavte `runtime.kind = "docker"` pro přísný sandboxing nebo síťovou izolaci. + +## Autentizace předplatného (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw podporuje nativní autorizační profily předplatného (více účtů, šifrování v klidu). + +- Soubor úložiště: `~/.zeroclaw/auth-profiles.json` +- Šifrovací klíč: `~/.zeroclaw/.secret_key` +- Formát ID profilu: `:` (příklad: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (předplatné ChatGPT) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Kontrola / obnovení / přepnutí profilu +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Spuštění agenta s autentizací předplatného +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Workspace agenta + dovednosti + +Kořenový adresář workspace: `~/.zeroclaw/workspace/` (konfigurovatelné přes config). + +Injektované soubory promptů: +- `IDENTITY.md` — osobnost a role agenta +- `USER.md` — kontext a preference uživatele +- `MEMORY.md` — dlouhodobá fakta a poučení +- `AGENTS.md` — konvence relací a inicializační pravidla +- `SOUL.md` — základní identita a provozní principy + +Dovednosti: `~/.zeroclaw/workspace/skills//SKILL.md` nebo `SKILL.toml`. + +```bash +# Seznam nainstalovaných dovedností +zeroclaw skills list + +# Instalace z git +zeroclaw skills install https://github.com/user/my-skill.git + +# Bezpečnostní audit před instalací +zeroclaw skills audit https://github.com/user/my-skill.git + +# Odebrání dovednosti +zeroclaw skills remove my-skill +``` + +## CLI příkazy + +```bash +# Správa workspace +zeroclaw onboard # Průvodce nastavením +zeroclaw status # Zobrazení stavu démona/agenta +zeroclaw doctor # Spuštění diagnostiky systému + +# Gateway + démon +zeroclaw gateway # Spuštění gateway serveru (127.0.0.1:42617) +zeroclaw daemon # Spuštění plného autonomního runtime + +# Agent +zeroclaw agent # Interaktivní režim chatu +zeroclaw agent -m "message" # Režim jedné zprávy + +# Správa služeb +zeroclaw service install # Instalace jako služba OS (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Kanály +zeroclaw channel list # Seznam konfigurovaných kanálů +zeroclaw channel doctor # Kontrola zdraví kanálů +zeroclaw channel bind-telegram 123456789 + +# Cron + plánování +zeroclaw cron list # Seznam naplánovaných úloh +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Paměť +zeroclaw memory list # Seznam záznamů paměti +zeroclaw memory get # Získání záznamu +zeroclaw memory stats # Statistiky paměti + +# Autorizační profily +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardwarové periferie +zeroclaw hardware discover # Skenování připojených zařízení +zeroclaw peripheral list # Seznam připojených periferií +zeroclaw peripheral flash # Flash firmwaru na zařízení + +# Migrace +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Doplňování shellu +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Kompletní reference příkazů: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Předpoklady + +
+Windows + +#### Požadované + +1. **Visual Studio Build Tools** (poskytuje MSVC linker a Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Během instalace (nebo přes Visual Studio Installer) vyberte workload **"Desktop development with C++"**. + +2. **Toolchain Rust:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Po instalaci otevřete nový terminál a spusťte `rustup default stable`, abyste zajistili aktivní stabilní toolchain. + +3. **Ověřte**, že obojí funguje: + ```powershell + rustc --version + cargo --version + ``` + +#### Volitelné + +- **Docker Desktop** — požadován pouze při použití [Docker sandboxovaného runtime](#podpora-runtime-aktuální) (`runtime.kind = "docker"`). Instalace přes `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Požadované + +1. **Nástroje pro sestavení:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Instalace Xcode Command Line Tools: `xcode-select --install` + +2. **Toolchain Rust:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Viz [rustup.rs](https://rustup.rs) pro podrobnosti. + +3. **Ověřte**, že obojí funguje: + ```bash + rustc --version + cargo --version + ``` + +#### Jednořádkový instalátor + +Nebo přeskočte výše uvedené kroky a nainstalujte vše (systémové závislosti, Rust, ZeroClaw) jedním příkazem: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Požadavky na zdroje kompilace + +Sestavení ze zdrojového kódu vyžaduje více zdrojů než spuštění výsledné binárky: + +| Zdroj | Minimum | Doporučeno | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Volné místo** | 6 GB | 10 GB+ | + +Pokud je váš host pod minimem, použijte předpřipravené binárky: + +```bash +./install.sh --prefer-prebuilt +``` + +Pro vynucení instalace pouze z binárky bez fallbacku na zdrojový kód: + +```bash +./install.sh --prebuilt-only +``` + +#### Volitelné + +- **Docker** — požadován pouze při použití [Docker sandboxovaného runtime](#podpora-runtime-aktuální) (`runtime.kind = "docker"`). Instalace přes správce balíčků nebo [docker.com](https://docs.docker.com/engine/install/). + +> **Poznámka:** Výchozí `cargo build --release` používá `codegen-units=1` pro snížení špičkového zatížení kompilace. Pro rychlejší buildy na výkonných strojích použijte `cargo build --profile release-fast`. + +
+ + + +### Předpřipravené binárky + +Vydané assety jsou publikovány pro: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Stáhněte nejnovější assety z: + + +## Dokumentace + +Používejte tyto, když jste prošli onboardingem a chcete hlubší referenci. + +- Začněte s [indexem dokumentace](docs/README.md) pro navigaci a „co je kde." +- Přečtěte si [přehled architektury](docs/architecture.md) pro úplný model systému. +- Použijte [referenci konfigurace](docs/reference/api/config-reference.md), když potřebujete každý klíč a příklad. +- Provozujte Gateway podle [provozní příručky](docs/ops/operations-runbook.md). +- Následujte [ZeroClaw Onboard](#rychlý-start) pro průvodce nastavením. +- Odlaďte běžné chyby s [průvodcem řešením problémů](docs/ops/troubleshooting.md). +- Projděte [bezpečnostní pokyny](docs/security/README.md) před vystavením čehokoli. + +### Referenční dokumentace + +- Centrum dokumentace: [docs/README.md](docs/README.md) +- Ujednocený obsah: [docs/SUMMARY.md](docs/SUMMARY.md) +- Reference příkazů: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Reference konfigurace: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Reference poskytovatelů: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Reference kanálů: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Provozní příručka: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Řešení problémů: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Dokumentace spolupráce + +- Průvodce přispíváním: [CONTRIBUTING.md](CONTRIBUTING.md) +- Politika PR workflow: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Průvodce CI workflow: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Příručka recenzenta: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Politika bezpečnostního zveřejnění: [SECURITY.md](SECURITY.md) +- Šablona dokumentace: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Nasazení + provoz + +- Průvodce síťovým nasazením: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Příručka proxy agenta: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Hardwarové průvodce: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw byl vytvořen pro smooth crab 🦀, rychlého a efektivního AI asistenta. Vytvořil Argenis De La Rosa a komunita. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Podpořte ZeroClaw + +Pokud vám ZeroClaw pomáhá v práci a chcete podpořit další vývoj, můžete přispět zde: + +Buy Me a Coffee + +### 🙏 Speciální poděkování + +Srdečné poděkování komunitám a institucím, které inspirují a pohánějí tuto open-source práci: + +- **Harvard University** — za podporu intelektuální zvědavosti a posouvání hranic toho, co je možné. +- **MIT** — za prosazování otevřených znalostí, open source a víry, že technologie by měla být dostupná všem. +- **Sundai Club** — za komunitu, energii a neúnavný drive budovat věci, na kterých záleží. +- **Svět a dále** 🌍✨ — každému přispěvateli, snílkovi a tvůrci, kteří dělají z open source sílu dobra. Toto je pro vás. + +Stavíme otevřeně, protože nejlepší nápady přicházejí odevšad. Pokud toto čtete, jste toho součástí. Vítejte. 🦀❤️ + +## Přispívání + +Jste v ZeroClaw noví? Hledejte issues označené [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — podívejte se na náš [Průvodce přispíváním](CONTRIBUTING.md#first-time-contributors), jak začít. AI/vibe-coded PR vítány! 🤖 + +Viz [CONTRIBUTING.md](CONTRIBUTING.md) a [CLA.md](docs/contributing/cla.md). Implementujte trait, odešlete PR: + +- Průvodce CI workflow: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Nový `Provider` → `src/providers/` +- Nový `Channel` → `src/channels/` +- Nový `Observer` → `src/observability/` +- Nový `Tool` → `src/tools/` +- Nový `Memory` → `src/memory/` +- Nový `Tunnel` → `src/tunnel/` +- Nový `Peripheral` → `src/peripherals/` +- Nový `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Oficiální repozitář a varování před podvržením identity + +**Toto je jediný oficiální repozitář ZeroClaw:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Jakýkoli jiný repozitář, organizace, doména nebo balíček tvrdící, že je „ZeroClaw" nebo naznačující spojení se ZeroClaw Labs je **neautorizovaný a není spojen s tímto projektem**. Známé neautorizované forky budou uvedeny v [TRADEMARK.md](docs/maintainers/trademark.md). + +Pokud narazíte na podvržení identity nebo zneužití ochranné známky, prosím [otevřete issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Licence + +ZeroClaw je dvojitě licencován pro maximální otevřenost a ochranu přispěvatelů: + +| Licence | Případ použití | +|---------|---------------| +| [MIT](LICENSE-MIT) | Open-source, výzkum, akademie, osobní použití | +| [Apache 2.0](LICENSE-APACHE) | Patentová ochrana, institucionální, komerční nasazení | + +Můžete si vybrat kteroukoli licenci. **Přispěvatelé automaticky udělují práva pod oběma** — viz [CLA.md](docs/contributing/cla.md) pro úplnou dohodu přispěvatele. + +### Ochranná známka + +Název **ZeroClaw** a logo jsou ochranné známky ZeroClaw Labs. Tato licence neuděluje povolení k jejich použití pro naznačení podpory nebo spojení. Viz [TRADEMARK.md](docs/maintainers/trademark.md) pro povolená a zakázaná použití. + +### Ochrana přispěvatelů + +- **Zachováváte si autorská práva** ke svým příspěvkům +- **Udělení patentu** (Apache 2.0) vás chrání před patentovými nároky jiných přispěvatelů +- Vaše příspěvky jsou **trvale připsány** v historii commitů a [NOTICE](NOTICE) +- Přispíváním se nepřevádějí žádná práva k ochranné známce + +--- + +**ZeroClaw** — Nulová režie. Nulový kompromis. Nasaďte kdekoli. Vyměňte cokoli. 🦀 + +## Přispěvatelé + + + ZeroClaw contributors + + +Tento seznam je generován z grafu přispěvatelů GitHub a aktualizuje se automaticky. + +## Historie hvězd + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.da.md b/third_party/zeroclaw/README.da.md new file mode 100644 index 0000000..abf1f30 --- /dev/null +++ b/third_party/zeroclaw/README.da.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Personlig AI-assistent

+ +

+ Nul overhead. Nul kompromis. 100% Rust. 100% Agnostisk.
+ ⚡️ Korer pa $10 hardware med <5MB RAM: Det er 99% mindre hukommelse end OpenClaw og 98% billigere end en Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Bygget af studerende og medlemmer af Harvard-, MIT- og Sundai.Club-faellesskaberne. +

+ +

+ 🌐 Sprog: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw er en personlig AI-assistent, du korer pa dine egne enheder. Den svarer dig pa de kanaler, du allerede bruger (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work og flere). Den har et web-dashboard til realtidsstyring og kan forbindes til hardware-periferier (ESP32, STM32, Arduino, Raspberry Pi). Gateway'en er blot kontrolplanet — produktet er assistenten. + +Hvis du vil have en personlig, enkeltbruger-assistent der foeles lokal, hurtig og altid taendt, er dette den. + +

+ Hjemmeside · + Dokumentation · + Arkitektur · + Kom i gang · + Migrering fra OpenClaw · + Fejlsoegning · + Discord +

+ +> **Anbefalet opsaetning:** kor `zeroclaw onboard` i din terminal. ZeroClaw Onboard guider dig trin for trin gennem opsaetning af gateway, arbejdsomrade, kanaler og udbyder. Det er den anbefalede opsaetningssti og virker pa macOS, Linux og Windows (via WSL2). Ny installation? Start her: [Kom i gang](#hurtig-start-tldr) + +### Abonnementsgodkendelse (OAuth) + +- **OpenAI Codex** (ChatGPT-abonnement) +- **Gemini** (Google OAuth) +- **Anthropic** (API-noegle eller godkendelsestoken) + +Modelnotat: selvom mange udbydere/modeller understoettes, brug den staerkeste nyeste-generations model tilgaengelig for dig for den bedste oplevelse. Se [Onboarding](#hurtig-start-tldr). + +Modelkonfiguration + CLI: [Udbyderreference](docs/reference/api/providers-reference.md) +Auth-profilrotation (OAuth vs API-noegler) + failover: [Model-failover](docs/reference/api/providers-reference.md) + +## Installation (anbefalet) + +Koerselsmiljoe: Rust stable toolchain. Enkelt binaer, ingen koerselsmiljoafhaengigheder. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Et-klik-installation + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` koerer automatisk efter installation for at konfigurere dit arbejdsomrade og din udbyder. + +## Hurtig start (TL;DR) + +Fuld begynderguide (godkendelse, parring, kanaler): [Kom i gang](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Installation + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Start gateway'en (webhook-server + web-dashboard) +zeroclaw gateway # standard: 127.0.0.1:42617 +zeroclaw gateway --port 0 # tilfaeldig port (sikkerhedshaerdet) + +# Tal med assistenten +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interaktiv tilstand +zeroclaw agent + +# Start fuld autonom koersel (gateway + kanaler + cron + hands) +zeroclaw daemon + +# Tjek status +zeroclaw status + +# Koer diagnostik +zeroclaw doctor +``` + +Opgradering? Koer `zeroclaw doctor` efter opdatering. + +### Fra kildekode (udvikling) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Udviklingsfallback (ingen global installation):** praefikser kommandoer med `cargo run --release --` (eksempel: `cargo run --release -- status`). + +## Migrering fra OpenClaw + +ZeroClaw kan importere dit OpenClaw-arbejdsomrade, hukommelse og konfiguration: + +```bash +# Forhaandsvisning af hvad der vil blive migreret (sikkert, skrivebeskyttet) +zeroclaw migrate openclaw --dry-run + +# Koer migreringen +zeroclaw migrate openclaw +``` + +Dette migrerer dine hukommelsesposter, arbejdsomradefiler og konfiguration fra `~/.openclaw/` til `~/.zeroclaw/`. Konfiguration konverteres automatisk fra JSON til TOML. + +## Sikkerhedsstandarder (DM-adgang) + +ZeroClaw forbinder til rigtige beskedplatforme. Behandl indgaaende DM'er som utrovaerdigt input. + +Fuld sikkerhedsguide: [SECURITY.md](SECURITY.md) + +Standardadfaerd pa alle kanaler: + +- **DM-parring** (standard): ukendte afsendere modtager en kort parringskode, og botten behandler ikke deres besked. +- Godkend med: `zeroclaw pairing approve ` (derefter tilfojes afsenderen til en lokal godkendelsesliste). +- Offentlige indgaaende DM'er kraever et eksplicit opt-in i `config.toml`. +- Koer `zeroclaw doctor` for at afsloere risikable eller forkert konfigurerede DM-politikker. + +**Autonominiveauer:** + +| Niveau | Adfaerd | +|--------|---------| +| `ReadOnly` | Agenten kan observere men ikke handle | +| `Supervised` (standard) | Agenten handler med godkendelse for mellem/hoej risiko-operationer | +| `Full` | Agenten handler autonomt inden for politikgraenser | + +**Sandboxing-lag:** arbejdsomradeisolering, sti-traverseringsblokering, kommandogodkendelseslister, forbudte stier (`/etc`, `/root`, `~/.ssh`), hastighedsbegraensning (maks handlinger/time, omkostninger/dag-lofter). + + + + +### 📢 Meddelelser + +Brug dette board til vigtige meddelelser (aendringsbrydende aendringer, sikkerhedsraadgivning, vedligeholdelsesperioder og udgivelsesblokkeringer). + +| Dato (UTC) | Niveau | Meddelelse | Handling | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Kritisk_ | Vi er **ikke tilknyttet** `openagen/zeroclaw`, `zeroclaw.org` eller `zeroclaw.net`. Domaenerne `zeroclaw.org` og `zeroclaw.net` peger i oejeblikket pa `openagen/zeroclaw`-forken, og det domaene/repository udgiver sig for at vaere vores officielle hjemmeside/projekt. | Stol ikke pa information, binaerfiler, fundraising eller meddelelser fra disse kilder. Brug kun [dette repository](https://github.com/zeroclaw-labs/zeroclaw) og vores verificerede sociale konti. | +| 2026-02-21 | _Vigtigt_ | Vores officielle hjemmeside er nu live: [zeroclawlabs.ai](https://zeroclawlabs.ai). Tak for din talmodighed, mens vi forberedte lanceringen. Vi ser stadig identitetstyveriforsoeg, sa **tilslut dig ikke** nogen investerings- eller fundraisingaktivitet, der haevder ZeroClaw-navnet, medmindre det er offentliggjort via vores officielle kanaler. | Brug [dette repository](https://github.com/zeroclaw-labs/zeroclaw) som den eneste kilde til sandhed. Foelg [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs) og [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) for officielle opdateringer. | +| 2026-02-19 | _Vigtigt_ | Anthropic opdaterede vilkaarene for Godkendelse og Legitimationsoplysningsbrug den 2026-02-19. Claude Code OAuth-tokens (Free, Pro, Max) er udelukkende beregnet til Claude Code og Claude.ai; brug af OAuth-tokens fra Claude Free/Pro/Max i ethvert andet produkt, vaerktoej eller tjeneste (inklusive Agent SDK) er ikke tilladt og kan overtraede forbrugervilkaarene. | Undga venligst midlertidigt Claude Code OAuth-integrationer for at forebygge potentielt tab. Original klausul: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Hoejdepunkter + +- **Let koerselsmiljoe som standard** — almindelige CLI- og statusarbejdsgange koerer i et hukommelsesfodaftryk pa faa megabytes i release-builds. +- **Omkostningseffektiv udrulning** — designet til $10-kort og smaa cloud-instanser, ingen tunge koerselsmiljoafhaengigheder. +- **Hurtige koldstarter** — enkelt-binaer Rust-koerselsmiljoe holder kommando- og daemon-opstart naesten oejeblikkelig. +- **Portabel arkitektur** — en binaer pa tvaers af ARM, x86 og RISC-V med udskiftelige udbydere/kanaler/vaerktoejer. +- **Lokalt-foerst Gateway** — enkelt kontrolplan for sessioner, kanaler, vaerktoejer, cron, SOPs og haendelser. +- **Multikanal-indbakke** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket og flere. +- **Multi-agent-orkestrering (Hands)** — autonome agentsvaerme, der koerer efter tidsplan og bliver klogere over tid. +- **Standardoperationsprocedurer (SOPs)** — haendelsesdrevet workflowautomatisering med MQTT, webhook, cron og periferitriggere. +- **Web-dashboard** — React 19 + Vite web-UI med realtidschat, hukommelsesbrowser, konfigurationseditor, cron-manager og vaerktoejsinspektoer. +- **Hardware-periferier** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO via `Peripheral`-trait'et. +- **Foersteklasses vaerktoejer** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace og 70+ flere. +- **Livscyklushooks** — opfang og modificer LLM-kald, vaerktoejsudfoerelser og beskeder pa hvert trin. +- **Faerdighedsplatform** — medfoelgende, faellesskabs- og arbejdsomraadefaerdigheder med sikkerhedsauditering. +- **Tunnelsupport** — Cloudflare, Tailscale, ngrok, OpenVPN og brugerdefinerede tunneler til fjernadgang. + +### Hvorfor hold vaelger ZeroClaw + +- **Let som standard:** lille Rust-binaer, hurtig opstart, lavt hukommelsesfodaftryk. +- **Sikkert fra design:** parring, streng sandboxing, eksplicitte godkendelseslister, arbejdsomradeafgraensning. +- **Fuldt udskifteligt:** kernesystemer er traits (providers, channels, tools, memory, tunnels). +- **Ingen laasning:** OpenAI-kompatibel udbydersupport + tilslutbare brugerdefinerede endepunkter. + +## Benchmark-overblik (ZeroClaw vs OpenClaw, Reproducerbart) + +Lokal maskinens hurtige benchmark (macOS arm64, feb. 2026) normaliseret for 0.8GHz edge-hardware. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Sprog** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Opstart (0.8GHz core)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Binaerstaerrelse** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Omkostning** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Enhver hardware $10** | + +> Notat: ZeroClaw-resultater er maalt pa release-builds ved brug af `/usr/bin/time -l`. OpenClaw kraever Node.js-koerselsmiljoe (typisk ~390MB ekstra hukommelsesoverhead), mens NanoBot kraever Python-koerselsmiljoe. PicoClaw og ZeroClaw er statiske binaerer. RAM-tallene ovenfor er koerselstidshukommelse; kompileringstidskrav er hoejere. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Reproducerbar lokal maaling + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Alt vi har bygget indtil nu + +### Kerneplatform + +- Gateway HTTP/WS/SSE-kontrolplan med sessioner, tilstedevaerelse, konfiguration, cron, webhooks, web-dashboard og parring. +- CLI-overflade: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Agent-orkestreringsloekke med vaerktoejsafsendelse, prompt-konstruktion, beskedklassificering og hukommelsesindlaesning. +- Sessionsmodel med sikkerhedspolitikhaandhaeveelse, autonominiveauer og godkendelsesportering. +- Robust udbyderindpakning med failover, genforsoeg og modelrutering pa tvaers af 20+ LLM-backends. + +### Kanaler + +Kanaler: WhatsApp (native), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Web-dashboard + +React 19 + Vite 6 + Tailwind CSS 4 web-dashboard serveret direkte fra Gateway'en: + +- **Dashboard** — systemoversigt, sundhedsstatus, oppetid, omkostningsovervaagning +- **Agent Chat** — interaktiv chat med agenten +- **Memory** — gennemse og administrer hukommelsesposter +- **Config** — vis og rediger konfiguration +- **Cron** — administrer planlagte opgaver +- **Tools** — gennemse tilgaengelige vaerktoejer +- **Logs** — vis agentaktivitetslogge +- **Cost** — tokenforbrug og omkostningsovervaagning +- **Doctor** — systemsundhedsdiagnostik +- **Integrations** — integrationsstatus og opsaetning +- **Pairing** — enhedsparringsstyring + +### Firmware-maal + +| Maal | Platform | Formaal | +|------|----------|---------| +| ESP32 | Espressif ESP32 | Tradloes periferiagent | +| ESP32-UI | ESP32 + Display | Agent med visuel graenseflade | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Industriel periferi | +| Arduino | Arduino | Basis sensor-/aktuatorbro | +| Uno Q Bridge | Arduino Uno | Seriel bro til agent | + +### Vaerktoejer + automatisering + +- **Kerne:** shell, file read/write/edit, git operations, glob search, content search +- **Web:** browser control, web fetch, web search, screenshot, image info, PDF read +- **Integrationer:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **Planlaegning:** cron add/remove/update/run, schedule tool +- **Hukommelse:** recall, store, forget, knowledge, project intel +- **Avanceret:** delegate (agent-to-agent), swarm, model switch/routing, security ops, cloud ops +- **Hardware:** board info, memory map, memory read (feature-gated) + +### Koerselsmiljoe + sikkerhed + +- **Autonominiveauer:** ReadOnly, Supervised (standard), Full. +- **Sandboxing:** arbejdsomradeisolering, sti-traverseringsblokering, kommandogodkendelseslister, forbudte stier, Landlock (Linux), Bubblewrap. +- **Hastighedsbegraensning:** maks handlinger pr. time, maks omkostninger pr. dag (konfigurerbart). +- **Godkendelsesportering:** interaktiv godkendelse for mellem/hoej risiko-operationer. +- **E-stop:** noedstopkapabilitet. +- **129+ sikkerhedstests** i automatiseret CI. + +### Drift + pakning + +- Web-dashboard serveret direkte fra Gateway'en. +- Tunnelsupport: Cloudflare, Tailscale, ngrok, OpenVPN, brugerdefineret kommando. +- Docker-koerselsmiljoetilpasning til containeriseret udfoersel. +- CI/CD: beta (auto on push) → stable (manual dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Forhaandsbyggede binaerer til Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Konfiguration + +Minimal `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Fuld konfigurationsreference: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Kanalkonfiguration + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Tunnelkonfiguration + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Detaljer: [Kanalreference](docs/reference/api/channels-reference.md) · [Konfigurationsreference](docs/reference/api/config-reference.md) + +### Koerselsmiljoestoette (aktuel) + +- **`native`** (standard) — direkte procesudfoersel, hurtigste sti, ideel til betroede miljoeer. +- **`docker`** — fuld containerisolering, haandhaevede sikkerhedspolitikker, kraever Docker. + +Saet `runtime.kind = "docker"` for streng sandboxing eller netvaerksisolering. + +## Abonnementsgodkendelse (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw understoetter abonnements-native godkendelsesprofiler (flere konti, krypteret i hvile). + +- Lagerfil: `~/.zeroclaw/auth-profiles.json` +- Krypteringsnoegle: `~/.zeroclaw/.secret_key` +- Profil-id-format: `:` (eksempel: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT subscription) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Check / refresh / switch profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Run the agent with subscription auth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Agent-arbejdsomrade + faerdigheder + +Arbejdsomraderod: `~/.zeroclaw/workspace/` (konfigurerbart via config). + +Injicerede promptfiler: +- `IDENTITY.md` — agentens personlighed og rolle +- `USER.md` — brugerkontekst og praeferencer +- `MEMORY.md` — langsigtede fakta og laerdommer +- `AGENTS.md` — sessionskonventioner og initialiseringsregler +- `SOUL.md` — kerneidentitet og driftsprincipper + +Faerdigheder: `~/.zeroclaw/workspace/skills//SKILL.md` eller `SKILL.toml`. + +```bash +# List installed skills +zeroclaw skills list + +# Install from git +zeroclaw skills install https://github.com/user/my-skill.git + +# Security audit before install +zeroclaw skills audit https://github.com/user/my-skill.git + +# Remove a skill +zeroclaw skills remove my-skill +``` + +## CLI-kommandoer + +```bash +# Arbejdsomraadestyring +zeroclaw onboard # Guidet opsaetningsguide +zeroclaw status # Vis daemon/agent-status +zeroclaw doctor # Koer systemdiagnostik + +# Gateway + daemon +zeroclaw gateway # Start gateway-server (127.0.0.1:42617) +zeroclaw daemon # Start fuld autonom koersel + +# Agent +zeroclaw agent # Interaktiv chattilstand +zeroclaw agent -m "message" # Enkeltbeskedtilstand + +# Servicestyring +zeroclaw service install # Installer som OS-service (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Kanaler +zeroclaw channel list # List konfigurerede kanaler +zeroclaw channel doctor # Tjek kanalsundhed +zeroclaw channel bind-telegram 123456789 + +# Cron + planlaegning +zeroclaw cron list # List planlagte opgaver +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Hukommelse +zeroclaw memory list # List hukommelsesposter +zeroclaw memory get # Hent en hukommelse +zeroclaw memory stats # Hukommelsesstatistik + +# Godkendelsesprofiler +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardware-periferier +zeroclaw hardware discover # Skan efter tilsluttede enheder +zeroclaw peripheral list # List tilsluttede periferier +zeroclaw peripheral flash # Flash firmware til enhed + +# Migrering +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell-fuldfoerelser +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Fuld kommandoreference: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Forudsaetninger + +
+Windows + +#### Paakraevet + +1. **Visual Studio Build Tools** (giver MSVC-linker og Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Under installation (eller via Visual Studio Installer) vaelg workloaden **"Desktop development with C++"**. + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Efter installation, aabn en ny terminal og koer `rustup default stable` for at sikre, at den stabile toolchain er aktiv. + +3. **Verificer**, at begge virker: + ```powershell + rustc --version + cargo --version + ``` + +#### Valgfrit + +- **Docker Desktop** — paakraevet kun ved brug af [Docker sandboxed runtime](#koerselsmiljoestoette-aktuel) (`runtime.kind = "docker"`). Installer via `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Paakraevet + +1. **Byggevaerktoejer:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Installer Xcode Command Line Tools: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Se [rustup.rs](https://rustup.rs) for detaljer. + +3. **Verificer**, at begge virker: + ```bash + rustc --version + cargo --version + ``` + +#### En-linje-installationsprogram + +Eller spring trinnene ovenfor over og installer alt (systemafhaengigheder, Rust, ZeroClaw) med en enkelt kommando: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Kompileringsressourcekrav + +Bygning fra kildekode kraever flere ressourcer end at koere den resulterende binaer: + +| Ressource | Minimum | Anbefalet | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Ledig disk** | 6 GB | 10 GB+ | + +Hvis din vaert er under minimum, brug forhaandsbyggede binaerer: + +```bash +./install.sh --prefer-prebuilt +``` + +For kun-binaer-installation uden kildekodefallback: + +```bash +./install.sh --prebuilt-only +``` + +#### Valgfrit + +- **Docker** — paakraevet kun ved brug af [Docker sandboxed runtime](#koerselsmiljoestoette-aktuel) (`runtime.kind = "docker"`). Installer via din pakkehaandtering eller [docker.com](https://docs.docker.com/engine/install/). + +> **Notat:** Standard `cargo build --release` bruger `codegen-units=1` for at reducere spidskompileringspresset. For hurtigere builds pa kraftige maskiner, brug `cargo build --profile release-fast`. + +
+ + + +### Forhaandsbyggede binaerer + +Udgivelsesaktiver udgives for: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Download de seneste aktiver fra: + + +## Dokumentation + +Brug disse, naar du er forbi onboarding-flowet og vil have den dybere reference. + +- Start med [dokumentationsindekset](docs/README.md) til navigation og "hvad er hvor." +- Laes [arkitekturoversigten](docs/architecture.md) for den fulde systemmodel. +- Brug [konfigurationsreferencen](docs/reference/api/config-reference.md), naar du har brug for hver noegle og eksempel. +- Koer Gateway'en efter bogen med [driftsrunbooken](docs/ops/operations-runbook.md). +- Foelg [ZeroClaw Onboard](#hurtig-start-tldr) for en guidet opsaetning. +- Fejlsoeg almindelige fejl med [fejlsoegningsguiden](docs/ops/troubleshooting.md). +- Gennemgaa [sikkerhedsvejledning](docs/security/README.md) foer du eksponerer noget. + +### Referencedokumentation + +- Dokumentationscentral: [docs/README.md](docs/README.md) +- Samlet indholdsfortegnelse: [docs/SUMMARY.md](docs/SUMMARY.md) +- Kommandoreference: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Konfigurationsreference: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Udbyderreference: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Kanalreference: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Driftsrunbook: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Fejlsoegning: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Samarbejdsdokumentation + +- Bidragsguide: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR-arbejdsgangspolitik: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI-arbejdsgangsguide: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Anmelderhaandbog: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Sikkerhedsoplysningspolitik: [SECURITY.md](SECURITY.md) +- Dokumentationsskabelon: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Udrulning + drift + +- Netvaerksudrulningsguide: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Proxy-agent-haandbog: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Hardwareguider: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw blev bygget til smooth crab 🦀, en hurtig og effektiv AI-assistent. Bygget af Argenis De La Rosa og faellesskabet. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Stoet ZeroClaw + +Hvis ZeroClaw hjaelper dit arbejde, og du vil stoette den igangvaerende udvikling, kan du donere her: + +Buy Me a Coffee + +### 🙏 Saerlig tak + +En hjertelig tak til de faellesskaber og institutioner, der inspirerer og naerer dette open source-arbejde: + +- **Harvard University** — for at fremme intellektuel nysgerrighed og skubbe graenserne for hvad der er muligt. +- **MIT** — for at kaempe for aben viden, open source og troen pa, at teknologi skal vaere tilgaengelig for alle. +- **Sundai Club** — for faellesskabet, energien og den utraettelige drift til at bygge ting, der betyder noget. +- **Verden & Hinsides** 🌍✨ — til enhver bidragyder, droommer og bygger derude, der goer open source til en kraft for det gode. Dette er for dig. + +Vi bygger i det aabne, fordi de bedste ideer kommer fra alle steder. Hvis du laeser dette, er du en del af det. Velkommen. 🦀❤️ + +## Bidrag + +Ny til ZeroClaw? Kig efter issues maerket [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — se vores [Bidragsguide](CONTRIBUTING.md#first-time-contributors) for at komme i gang. AI/vibe-kodede PR'er velkomne! 🤖 + +Se [CONTRIBUTING.md](CONTRIBUTING.md) og [CLA.md](docs/contributing/cla.md). Implementer et trait, indsend en PR: + +- CI-arbejdsgangsguide: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Ny `Provider` → `src/providers/` +- Ny `Channel` → `src/channels/` +- Ny `Observer` → `src/observability/` +- Nyt `Tool` → `src/tools/` +- Ny `Memory` → `src/memory/` +- Ny `Tunnel` → `src/tunnel/` +- Ny `Peripheral` → `src/peripherals/` +- Ny `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Officielt repository og advarsel om identitetstyveri + +**Dette er det eneste officielle ZeroClaw-repository:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Ethvert andet repository, organisation, domaene eller pakke, der haevder at vaere "ZeroClaw" eller antyder tilknytning til ZeroClaw Labs, er **uautoriseret og ikke tilknyttet dette projekt**. Kendte uautoriserede forks vil blive opfoert i [TRADEMARK.md](docs/maintainers/trademark.md). + +Hvis du stoeder pa identitetstyveri eller varemaerkemisbrug, bedes du [aabne et issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Licens + +ZeroClaw er dobbeltlicenseret for maksimal aabenhed og bidragyderbeskyttelse: + +| Licens | Anvendelse | +|---|---| +| [MIT](LICENSE-MIT) | Open source, forskning, akademisk, personligt brug | +| [Apache 2.0](LICENSE-APACHE) | Patentbeskyttelse, institutionel, kommerciel udrulning | + +Du kan vaelge enten licens. **Bidragydere giver automatisk rettigheder under begge** — se [CLA.md](docs/contributing/cla.md) for den fulde bidragsaftale. + +### Varemaerke + +Navnet **ZeroClaw** og logoet er varemaerker tilhoerende ZeroClaw Labs. Denne licens giver ikke tilladelse til at bruge dem til at antyde stoette eller tilknytning. Se [TRADEMARK.md](docs/maintainers/trademark.md) for tilladte og forbudte anvendelser. + +### Bidragyderbeskyttelser + +- Du **beholder ophavsretten** til dine bidrag +- **Patentbevilling** (Apache 2.0) beskytter dig mod patentkrav fra andre bidragydere +- Dine bidrag er **permanent attribueret** i commit-historik og [NOTICE](NOTICE) +- Ingen varemaerkerettigheder overfoeres ved at bidrage + +--- + +**ZeroClaw** — Nul overhead. Nul kompromis. Udrulning overalt. Udskift hvad som helst. 🦀 + +## Bidragydere + + + ZeroClaw contributors + + +Denne liste genereres fra GitHub-bidragydergrafiken og opdateres automatisk. + +## Stjernehistorik + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.de.md b/third_party/zeroclaw/README.de.md new file mode 100644 index 0000000..d14e8c2 --- /dev/null +++ b/third_party/zeroclaw/README.de.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Persönlicher KI-Assistent

+ +

+ Null Overhead. Null Kompromisse. 100% Rust. 100% Agnostisch.
+ ⚡️ Läuft auf $10-Hardware mit <5MB RAM: 99% weniger Speicher als OpenClaw und 98% günstiger als ein Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Entwickelt von Studenten und Mitgliedern der Communitys von Harvard, MIT und Sundai.Club. +

+ +

+ 🌐 Sprachen: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw ist ein persönlicher KI-Assistent, den du auf deinen eigenen Geräten ausführst. Er antwortet dir auf den Kanälen, die du bereits nutzt (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work und mehr). Er verfügt über ein Web-Dashboard für Echtzeitkontrolle und kann sich mit Hardware-Peripheriegeräten verbinden (ESP32, STM32, Arduino, Raspberry Pi). Das Gateway ist nur die Steuerungsebene — das Produkt ist der Assistent. + +Wenn du einen persönlichen Einzelbenutzer-Assistenten willst, der sich lokal, schnell und immer verfügbar anfühlt, ist das genau das Richtige. + +

+ Website · + Dokumentation · + Architektur · + Erste Schritte · + Migration von OpenClaw · + Fehlerbehebung · + Discord +

+ +> **Empfohlene Einrichtung:** Führe `zeroclaw onboard` in deinem Terminal aus. ZeroClaw Onboard führt dich Schritt für Schritt durch die Einrichtung von Gateway, Workspace, Kanälen und Provider. Es ist der empfohlene Einrichtungspfad und funktioniert auf macOS, Linux und Windows (über WSL2). Neue Installation? Starte hier: [Erste Schritte](#schnellstart) + +### Abonnement-Authentifizierung (OAuth) + +- **OpenAI Codex** (ChatGPT-Abonnement) +- **Gemini** (Google OAuth) +- **Anthropic** (API-Schlüssel oder Auth-Token) + +Modellhinweis: Obwohl viele Provider/Modelle unterstützt werden, verwende für die beste Erfahrung das stärkste verfügbare Modell der neuesten Generation. Siehe [Onboarding](#schnellstart). + +Modellkonfiguration + CLI: [Provider-Referenz](docs/reference/api/providers-reference.md) +Auth-Profilrotation (OAuth vs API-Schlüssel) + Failover: [Modell-Failover](docs/reference/api/providers-reference.md) + +## Installation (empfohlen) + +Voraussetzung: Stabile Rust-Toolchain. Einzelnes Binary, keine Laufzeitabhängigkeiten. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Ein-Klick-Bootstrap + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` wird nach der Installation automatisch ausgeführt, um deinen Workspace und Provider zu konfigurieren. + +## Schnellstart (TL;DR) + +Vollständige Einsteiger-Anleitung (Authentifizierung, Pairing, Kanäle): [Erste Schritte](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Installieren + Onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Gateway starten (Webhook-Server + Web-Dashboard) +zeroclaw gateway # Standard: 127.0.0.1:42617 +zeroclaw gateway --port 0 # Zufälliger Port (gehärtete Sicherheit) + +# Mit dem Assistenten sprechen +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interaktiver Modus +zeroclaw agent + +# Vollständige autonome Laufzeit starten (Gateway + Kanäle + Cron + Hands) +zeroclaw daemon + +# Status prüfen +zeroclaw status + +# Diagnose ausführen +zeroclaw doctor +``` + +Aktualisierung? Führe `zeroclaw doctor` nach dem Update aus. + +### Aus dem Quellcode (Entwicklung) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Entwicklungs-Fallback (ohne globale Installation):** Stelle Befehlen `cargo run --release --` voran (Beispiel: `cargo run --release -- status`). + +## Migration von OpenClaw + +ZeroClaw kann deinen OpenClaw-Workspace, Speicher und Konfiguration importieren: + +```bash +# Vorschau, was migriert wird (sicher, nur lesen) +zeroclaw migrate openclaw --dry-run + +# Migration ausführen +zeroclaw migrate openclaw +``` + +Dies migriert deine Speichereinträge, Workspace-Dateien und Konfiguration von `~/.openclaw/` nach `~/.zeroclaw/`. Die Konfiguration wird automatisch von JSON nach TOML konvertiert. + +## Sicherheitsstandards (DM-Zugriff) + +ZeroClaw verbindet sich mit echten Messaging-Oberflächen. Behandle eingehende DMs als nicht vertrauenswürdige Eingabe. + +Vollständiger Sicherheitsleitfaden: [SECURITY.md](SECURITY.md) + +Standardverhalten auf allen Kanälen: + +- **DM-Pairing** (Standard): Unbekannte Absender erhalten einen kurzen Pairing-Code und der Bot verarbeitet ihre Nachricht nicht. +- Genehmige mit: `zeroclaw pairing approve ` (der Absender wird dann zu einer lokalen Allowlist hinzugefügt). +- Öffentliche eingehende DMs erfordern eine explizite Aktivierung in `config.toml`. +- Führe `zeroclaw doctor` aus, um riskante oder falsch konfigurierte DM-Richtlinien aufzudecken. + +**Autonomiestufen:** + +| Stufe | Verhalten | +|-------|-----------| +| `ReadOnly` | Der Agent kann beobachten, aber nicht handeln | +| `Supervised` (Standard) | Der Agent handelt mit Genehmigung für Operationen mit mittlerem/hohem Risiko | +| `Full` | Der Agent handelt autonom innerhalb der Richtliniengrenzen | + +**Sandboxing-Schichten:** Workspace-Isolation, Pfad-Traversal-Blockierung, Befehls-Allowlisting, verbotene Pfade (`/etc`, `/root`, `~/.ssh`), Ratenbegrenzung (max. Aktionen/Stunde, Kosten/Tag-Obergrenzen). + + + + +### 📢 Ankündigungen + +Verwende dieses Board für wichtige Hinweise (Breaking Changes, Sicherheitshinweise, Wartungsfenster und Release-Blocker). + +| Datum (UTC) | Stufe | Hinweis | Aktion | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Kritisch_ | Wir sind **nicht verbunden** mit `openagen/zeroclaw`, `zeroclaw.org` oder `zeroclaw.net`. Die Domains `zeroclaw.org` und `zeroclaw.net` verweisen derzeit auf den Fork `openagen/zeroclaw`, und diese Domain/dieses Repository geben sich als unsere offizielle Website/unser offizielles Projekt aus. | Vertraue keinen Informationen, Binaries, Spendenaktionen oder Ankündigungen aus diesen Quellen. Verwende nur [dieses Repository](https://github.com/zeroclaw-labs/zeroclaw) und unsere verifizierten Social-Media-Konten. | +| 2026-02-21 | _Wichtig_ | Unsere offizielle Website ist jetzt online: [zeroclawlabs.ai](https://zeroclawlabs.ai). Danke für deine Geduld während wir den Launch vorbereitet haben. Wir sehen weiterhin Identitätsdiebstahlversuche, also nimm **nicht** an Investitions- oder Spendenaktivitäten teil, die den Namen ZeroClaw verwenden, es sei denn, sie werden über unsere offiziellen Kanäle veröffentlicht. | Verwende [dieses Repository](https://github.com/zeroclaw-labs/zeroclaw) als einzige Wahrheitsquelle. Folge [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Gruppe)](https://www.facebook.com/groups/zeroclawlabs) und [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) für offizielle Updates. | +| 2026-02-19 | _Wichtig_ | Anthropic hat die Bedingungen zur Authentifizierung und Nutzung von Zugangsdaten am 2026-02-19 aktualisiert. Claude Code OAuth-Tokens (Free, Pro, Max) sind ausschließlich für Claude Code und Claude.ai bestimmt; die Verwendung von OAuth-Tokens von Claude Free/Pro/Max in anderen Produkten, Tools oder Diensten (einschließlich Agent SDK) ist nicht gestattet und kann gegen die Verbrauchernutzungsbedingungen verstoßen. | Bitte vermeide vorübergehend Claude Code OAuth-Integrationen, um potenzielle Verluste zu vermeiden. Originalklausel: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Highlights + +- **Leichte Laufzeitumgebung standardmäßig** — gängige CLI- und Status-Workflows laufen in einem Speicherumfang von wenigen Megabyte bei Release-Builds. +- **Kosteneffiziente Bereitstellung** — entwickelt für $10-Boards und kleine Cloud-Instanzen, keine schwergewichtigen Laufzeitabhängigkeiten. +- **Schnelle Kaltstarts** — die Rust-Single-Binary-Laufzeit hält den Start von Befehlen und Daemon nahezu sofortig. +- **Portable Architektur** — ein Binary für ARM, x86 und RISC-V mit austauschbaren Providern/Kanälen/Tools. +- **Local-first Gateway** — einzelne Steuerungsebene für Sitzungen, Kanäle, Tools, Cron, SOPs und Events. +- **Multi-Kanal-Posteingang** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket und mehr. +- **Multi-Agenten-Orchestrierung (Hands)** — autonome Agentenschwärme, die nach Zeitplan laufen und mit der Zeit intelligenter werden. +- **Standardbetriebsverfahren (SOPs)** — ereignisgesteuerte Workflow-Automatisierung mit MQTT, Webhook, Cron und Peripherie-Triggern. +- **Web-Dashboard** — React 19 + Vite Web-UI mit Echtzeit-Chat, Speicher-Browser, Konfigurationseditor, Cron-Manager und Tool-Inspektor. +- **Hardware-Peripheriegeräte** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO über den `Peripheral`-Trait. +- **Erstklassige Tools** — Shell, Datei-I/O, Browser, Git, Web Fetch/Search, MCP, Jira, Notion, Google Workspace und über 70 weitere. +- **Lifecycle-Hooks** — LLM-Aufrufe, Tool-Ausführungen und Nachrichten in jeder Phase abfangen und modifizieren. +- **Skills-Plattform** — mitgelieferte, Community- und Workspace-Skills mit Sicherheitsaudit. +- **Tunnel-Unterstützung** — Cloudflare, Tailscale, ngrok, OpenVPN und benutzerdefinierte Tunnel für Remote-Zugriff. + +### Warum Teams ZeroClaw wählen + +- **Standardmäßig leicht:** kleines Rust-Binary, schneller Start, geringer Speicherverbrauch. +- **Sicher by Design:** Pairing, striktes Sandboxing, explizite Allowlists, Workspace-Scoping. +- **Vollständig austauschbar:** Kernsysteme sind Traits (Provider, Kanäle, Tools, Speicher, Tunnel). +- **Kein Vendor Lock-in:** OpenAI-kompatible Provider-Unterstützung + steckbare benutzerdefinierte Endpunkte. + +## Benchmark-Übersicht (ZeroClaw vs OpenClaw, reproduzierbar) + +Schneller lokaler Benchmark (macOS arm64, Feb 2026), normalisiert für 0,8GHz Edge-Hardware. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Sprache** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Start (0,8GHz Core)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Binary-Größe** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Kosten** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Beliebige Hardware $10** | + +> Hinweise: ZeroClaw-Ergebnisse werden bei Release-Builds mit `/usr/bin/time -l` gemessen. OpenClaw benötigt die Node.js-Laufzeit (typischerweise ~390MB zusätzlicher Speicherverbrauch), während NanoBot die Python-Laufzeit benötigt. PicoClaw und ZeroClaw sind statische Binaries. Die RAM-Zahlen oben sind Laufzeitspeicher; die Kompilierungsanforderungen sind höher. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Reproduzierbare lokale Messung + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Alles, was wir bisher gebaut haben + +### Kernplattform + +- Gateway HTTP/WS/SSE-Steuerungsebene mit Sitzungen, Präsenz, Konfiguration, Cron, Webhooks, Web-Dashboard und Pairing. +- CLI-Oberfläche: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Agenten-Orchestrierungsschleife mit Tool-Dispatch, Prompt-Konstruktion, Nachrichtenklassifizierung und Speicherladung. +- Sitzungsmodell mit Durchsetzung von Sicherheitsrichtlinien, Autonomiestufen und Genehmigungsgating. +- Resiliente Provider-Wrapper mit Failover, Retry und Modell-Routing über 20+ LLM-Backends. + +### Kanäle + +Kanäle: WhatsApp (nativ), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Web-Dashboard + +React 19 + Vite 6 + Tailwind CSS 4 Web-Dashboard, direkt vom Gateway bereitgestellt: + +- **Dashboard** — Systemübersicht, Gesundheitsstatus, Betriebszeit, Kostenverfolgung +- **Agenten-Chat** — interaktiver Chat mit dem Agenten +- **Speicher** — Speichereinträge durchsuchen und verwalten +- **Konfiguration** — Konfiguration anzeigen und bearbeiten +- **Cron** — geplante Aufgaben verwalten +- **Tools** — verfügbare Tools durchsuchen +- **Logs** — Aktivitätsprotokolle des Agenten anzeigen +- **Kosten** — Token-Nutzung und Kostenverfolgung +- **Doctor** — Systemdiagnose +- **Integrationen** — Integrationsstatus und Einrichtung +- **Pairing** — Gerätekopplung verwalten + +### Firmware-Ziele + +| Ziel | Plattform | Zweck | +|------|-----------|-------| +| ESP32 | Espressif ESP32 | Drahtloser Peripherie-Agent | +| ESP32-UI | ESP32 + Display | Agent mit visueller Oberfläche | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Industrielle Peripherie | +| Arduino | Arduino | Grundlegende Sensor-/Aktor-Brücke | +| Uno Q Bridge | Arduino Uno | Serielle Brücke zum Agenten | + +### Tools + Automatisierung + +- **Core:** Shell, Datei lesen/schreiben/bearbeiten, Git-Operationen, Glob-Suche, Inhaltssuche +- **Web:** Browser-Steuerung, Web Fetch, Web Search, Screenshot, Bildinformation, PDF-Lesen +- **Integrationen:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol Tool-Wrapper + verzögerte Tool-Sets +- **Planung:** cron add/remove/update/run, Planungstool +- **Speicher:** recall, store, forget, knowledge, project intel +- **Erweitert:** delegate (Agent-zu-Agent), swarm, Modellwechsel/-routing, Sicherheitsoperationen, Cloud-Operationen +- **Hardware:** board info, memory map, memory read (feature-gated) + +### Laufzeit + Sicherheit + +- **Autonomiestufen:** ReadOnly, Supervised (Standard), Full. +- **Sandboxing:** Workspace-Isolation, Pfad-Traversal-Blockierung, Befehls-Allowlists, verbotene Pfade, Landlock (Linux), Bubblewrap. +- **Ratenbegrenzung:** max. Aktionen pro Stunde, max. Kosten pro Tag (konfigurierbar). +- **Genehmigungsgating:** interaktive Genehmigung für Operationen mit mittlerem/hohem Risiko. +- **Notfall-Stopp:** Notabschaltungsfähigkeit. +- **129+ Sicherheitstests** in automatisiertem CI. + +### Betrieb + Paketierung + +- Web-Dashboard direkt vom Gateway bereitgestellt. +- Tunnel-Unterstützung: Cloudflare, Tailscale, ngrok, OpenVPN, benutzerdefinierter Befehl. +- Docker-Laufzeitadapter für containerisierte Ausführung. +- CI/CD: beta (automatisch bei Push) → stable (manueller Dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, Tweet. +- Vorgefertigte Binaries für Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Konfiguration + +Minimale `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Vollständige Konfigurationsreferenz: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Kanalkonfiguration + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Tunnel-Konfiguration + +```toml +[tunnel] +kind = "cloudflare" # oder "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Details: [Kanal-Referenz](docs/reference/api/channels-reference.md) · [Konfigurationsreferenz](docs/reference/api/config-reference.md) + +### Laufzeitunterstützung (aktuell) + +- **`native`** (Standard) — direkte Prozessausführung, schnellster Pfad, ideal für vertrauenswürdige Umgebungen. +- **`docker`** — vollständige Container-Isolation, erzwungene Sicherheitsrichtlinien, erfordert Docker. + +Setze `runtime.kind = "docker"` für striktes Sandboxing oder Netzwerkisolation. + +## Abonnement-Authentifizierung (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw unterstützt native Abonnement-Authentifizierungsprofile (Multi-Account, verschlüsselt im Ruhezustand). + +- Speicherdatei: `~/.zeroclaw/auth-profiles.json` +- Verschlüsselungsschlüssel: `~/.zeroclaw/.secret_key` +- Profil-ID-Format: `:` (Beispiel: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT-Abonnement) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Prüfen / aktualisieren / Profil wechseln +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Agenten mit Abonnement-Auth ausführen +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Agenten-Workspace + Skills + +Workspace-Root: `~/.zeroclaw/workspace/` (konfigurierbar über Config). + +Injizierte Prompt-Dateien: +- `IDENTITY.md` — Persönlichkeit und Rolle des Agenten +- `USER.md` — Benutzerkontext und Präferenzen +- `MEMORY.md` — Langzeitfakten und Lektionen +- `AGENTS.md` — Sitzungskonventionen und Initialisierungsregeln +- `SOUL.md` — Kernidentität und Betriebsprinzipien + +Skills: `~/.zeroclaw/workspace/skills//SKILL.md` oder `SKILL.toml`. + +```bash +# Installierte Skills auflisten +zeroclaw skills list + +# Von Git installieren +zeroclaw skills install https://github.com/user/my-skill.git + +# Sicherheitsaudit vor der Installation +zeroclaw skills audit https://github.com/user/my-skill.git + +# Einen Skill entfernen +zeroclaw skills remove my-skill +``` + +## CLI-Befehle + +```bash +# Workspace-Verwaltung +zeroclaw onboard # Geführter Einrichtungsassistent +zeroclaw status # Daemon/Agenten-Status anzeigen +zeroclaw doctor # Systemdiagnose ausführen + +# Gateway + Daemon +zeroclaw gateway # Gateway-Server starten (127.0.0.1:42617) +zeroclaw daemon # Vollständige autonome Laufzeit starten + +# Agent +zeroclaw agent # Interaktiver Chat-Modus +zeroclaw agent -m "message" # Einzelnachrichten-Modus + +# Service-Verwaltung +zeroclaw service install # Als OS-Dienst installieren (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Kanäle +zeroclaw channel list # Konfigurierte Kanäle auflisten +zeroclaw channel doctor # Kanalgesundheit prüfen +zeroclaw channel bind-telegram 123456789 + +# Cron + Planung +zeroclaw cron list # Geplante Aufgaben auflisten +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Speicher +zeroclaw memory list # Speichereinträge auflisten +zeroclaw memory get # Speicher abrufen +zeroclaw memory stats # Speicherstatistiken + +# Auth-Profile +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardware-Peripherie +zeroclaw hardware discover # Angeschlossene Geräte scannen +zeroclaw peripheral list # Angeschlossene Peripherie auflisten +zeroclaw peripheral flash # Firmware auf Gerät flashen + +# Migration +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell-Vervollständigung +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Vollständige Befehlsreferenz: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Voraussetzungen + +
+Windows + +#### Erforderlich + +1. **Visual Studio Build Tools** (stellt den MSVC-Linker und das Windows SDK bereit): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Wähle während der Installation (oder über den Visual Studio Installer) den Workload **"Desktopentwicklung mit C++"** aus. + +2. **Rust-Toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Öffne nach der Installation ein neues Terminal und führe `rustup default stable` aus, um sicherzustellen, dass die stabile Toolchain aktiv ist. + +3. **Überprüfe**, dass beide funktionieren: + ```powershell + rustc --version + cargo --version + ``` + +#### Optional + +- **Docker Desktop** — nur erforderlich bei Verwendung der [Docker-Sandbox-Laufzeit](#laufzeitunterstützung-aktuell) (`runtime.kind = "docker"`). Installation über `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Erforderlich + +1. **Grundlegende Build-Tools:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Xcode Command Line Tools installieren: `xcode-select --install` + +2. **Rust-Toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Siehe [rustup.rs](https://rustup.rs) für Details. + +3. **Überprüfe**, dass beide funktionieren: + ```bash + rustc --version + cargo --version + ``` + +#### Ein-Zeilen-Installer + +Oder überspringe die obigen Schritte und installiere alles (Systemabhängigkeiten, Rust, ZeroClaw) mit einem einzigen Befehl: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Ressourcenanforderungen für die Kompilierung + +Das Kompilieren aus dem Quellcode benötigt mehr Ressourcen als das Ausführen des resultierenden Binary: + +| Ressource | Minimum | Empfohlen | +| -------------- | ------- | ----------- | +| **RAM + Swap** | 2 GB | 4 GB+ | +| **Freier Speicher** | 6 GB | 10 GB+ | + +Wenn dein Host unter dem Minimum liegt, verwende vorgefertigte Binaries: + +```bash +./install.sh --prefer-prebuilt +``` + +Um eine reine Binary-Installation ohne Quellcode-Fallback zu erfordern: + +```bash +./install.sh --prebuilt-only +``` + +#### Optional + +- **Docker** — nur erforderlich bei Verwendung der [Docker-Sandbox-Laufzeit](#laufzeitunterstützung-aktuell) (`runtime.kind = "docker"`). Installation über deinen Paketmanager oder [docker.com](https://docs.docker.com/engine/install/). + +> **Hinweis:** Der Standard `cargo build --release` verwendet `codegen-units=1`, um den maximalen Kompilierungsdruck zu senken. Für schnellere Builds auf leistungsstarken Maschinen verwende `cargo build --profile release-fast`. + +
+ + + +### Vorgefertigte Binaries + +Release-Assets werden veröffentlicht für: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Lade die neuesten Assets herunter von: + + +## Dokumentation + +Verwende diese Ressourcen, wenn du den Onboarding-Prozess abgeschlossen hast und die tiefere Referenz benötigst. + +- Starte mit dem [Docs-Index](docs/README.md) für die Navigation und "was ist wo." +- Lies die [Architekturübersicht](docs/architecture.md) für das vollständige Systemmodell. +- Verwende die [Konfigurationsreferenz](docs/reference/api/config-reference.md), wenn du jede Einstellung und jedes Beispiel brauchst. +- Betreibe das Gateway nach Buch mit dem [Betriebs-Runbook](docs/ops/operations-runbook.md). +- Folge [ZeroClaw Onboard](#schnellstart) für eine geführte Einrichtung. +- Behebe häufige Fehler mit der [Fehlerbehebungsanleitung](docs/ops/troubleshooting.md). +- Überprüfe die [Sicherheitshinweise](docs/security/README.md), bevor du etwas exponierst. + +### Referenzdokumentation + +- Dokumentations-Hub: [docs/README.md](docs/README.md) +- Einheitliches Docs-TOC: [docs/SUMMARY.md](docs/SUMMARY.md) +- Befehlsreferenz: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Konfigurationsreferenz: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Provider-Referenz: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Kanal-Referenz: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Betriebs-Runbook: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Fehlerbehebung: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Zusammenarbeitsdokumentation + +- Beitragsleitfaden: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR-Workflow-Richtlinie: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI-Workflow-Leitfaden: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Reviewer-Handbuch: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Sicherheitsoffenlegungsrichtlinie: [SECURITY.md](SECURITY.md) +- Dokumentationsvorlage: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Bereitstellung + Betrieb + +- Netzwerk-Bereitstellungsleitfaden: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Proxy-Agent-Handbuch: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Hardware-Leitfäden: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw wurde für den glatten Krebs 🦀 gebaut, einen schnellen und effizienten KI-Assistenten. Entwickelt von Argenis De La Rosa und der Community. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## ZeroClaw unterstützen + +Wenn ZeroClaw bei deiner Arbeit hilft und du die laufende Entwicklung unterstützen möchtest, kannst du hier spenden: + +Buy Me a Coffee + +### 🙏 Besonderer Dank + +Ein herzliches Dankeschön an die Communitys und Institutionen, die diese Open-Source-Arbeit inspirieren und antreiben: + +- **Harvard University** — für die Förderung intellektueller Neugier und das Verschieben der Grenzen des Möglichen. +- **MIT** — für den Einsatz für offenes Wissen, Open Source und den Glauben, dass Technologie für alle zugänglich sein sollte. +- **Sundai Club** — für die Community, die Energie und den unermüdlichen Antrieb, Dinge zu bauen, die wichtig sind. +- **Die Welt und darüber hinaus** 🌍✨ — an jeden Mitwirkenden, Träumer und Erbauer, der Open Source zu einer Kraft für das Gute macht. Das ist für dich. + +Wir bauen offen, weil die besten Ideen von überall kommen. Wenn du das hier liest, bist du Teil davon. Willkommen. 🦀❤️ + +## Beitragen + +Neu bei ZeroClaw? Suche nach Issues mit dem Label [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — siehe unseren [Beitragsleitfaden](CONTRIBUTING.md#first-time-contributors) für den Einstieg. KI-/Vibe-coded PRs willkommen! 🤖 + +Siehe [CONTRIBUTING.md](CONTRIBUTING.md) und [CLA.md](docs/contributing/cla.md). Implementiere einen Trait, reiche einen PR ein: + +- CI-Workflow-Leitfaden: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Neuer `Provider` → `src/providers/` +- Neuer `Channel` → `src/channels/` +- Neuer `Observer` → `src/observability/` +- Neues `Tool` → `src/tools/` +- Neuer `Memory` → `src/memory/` +- Neuer `Tunnel` → `src/tunnel/` +- Neues `Peripheral` → `src/peripherals/` +- Neuer `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Offizielles Repository & Warnung vor Identitätsdiebstahl + +**Dies ist das einzige offizielle ZeroClaw-Repository:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Jedes andere Repository, jede Organisation, Domain oder jedes Paket, das behauptet, "ZeroClaw" zu sein oder eine Zugehörigkeit zu ZeroClaw Labs impliziert, ist **nicht autorisiert und nicht mit diesem Projekt verbunden**. Bekannte nicht autorisierte Forks werden in [TRADEMARK.md](docs/maintainers/trademark.md) aufgelistet. + +Wenn du auf Identitätsdiebstahl oder Markenrechtsmissbrauch stößt, [eröffne bitte ein Issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Lizenz + +ZeroClaw ist doppelt lizenziert für maximale Offenheit und Schutz der Mitwirkenden: + +| Lizenz | Anwendungsfall | +|---|---| +| [MIT](LICENSE-MIT) | Open Source, Forschung, akademisch, persönliche Nutzung | +| [Apache 2.0](LICENSE-APACHE) | Patentschutz, institutionell, kommerzielle Bereitstellung | + +Du kannst eine der beiden Lizenzen wählen. **Mitwirkende gewähren automatisch Rechte unter beiden** — siehe [CLA.md](docs/contributing/cla.md) für die vollständige Mitwirkendenvereinbarung. + +### Markenrecht + +Der **ZeroClaw**-Name und das Logo sind Marken von ZeroClaw Labs. Diese Lizenz gewährt keine Erlaubnis, sie zu verwenden, um Unterstützung oder Zugehörigkeit zu implizieren. Siehe [TRADEMARK.md](docs/maintainers/trademark.md) für erlaubte und verbotene Verwendungen. + +### Schutz für Mitwirkende + +- Du **behältst das Urheberrecht** deiner Beiträge +- **Patentgewährung** (Apache 2.0) schützt dich vor Patentansprüchen anderer Mitwirkender +- Deine Beiträge werden **dauerhaft** in der Commit-Historie und [NOTICE](NOTICE) zugeordnet +- Keine Markenrechte werden durch Beiträge übertragen + +--- + +**ZeroClaw** — Null Overhead. Null Kompromisse. Überall bereitstellen. Alles austauschen. 🦀 + +## Mitwirkende + + + ZeroClaw contributors + + +Diese Liste wird aus dem GitHub-Mitwirkendengraph generiert und aktualisiert sich automatisch. + +## Stern-Verlauf + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.el.md b/third_party/zeroclaw/README.el.md new file mode 100644 index 0000000..fd45d62 --- /dev/null +++ b/third_party/zeroclaw/README.el.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Προσωπικός Βοηθός Τεχνητής Νοημοσύνης

+ +

+ Μηδενική επιβάρυνση. Μηδενικοί συμβιβασμοί. 100% Rust. 100% Αγνωστικός.
+ ⚡️ Τρέχει σε υλικό $10 με <5MB RAM: Αυτό σημαίνει 99% λιγότερη μνήμη από το OpenClaw και 98% φθηνότερο από ένα Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Δημιουργήθηκε από φοιτητές και μέλη των κοινοτήτων Harvard, MIT και Sundai.Club. +

+ +

+ 🌐 Γλώσσες: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +Το ZeroClaw είναι ένας προσωπικός βοηθός τεχνητής νοημοσύνης που τρέχει στις δικές σας συσκευές. Σας απαντά στα κανάλια που ήδη χρησιμοποιείτε (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work και περισσότερα). Διαθέτει πίνακα ελέγχου web για έλεγχο σε πραγματικό χρόνο και μπορεί να συνδεθεί με περιφερειακά υλικού (ESP32, STM32, Arduino, Raspberry Pi). Το Gateway είναι απλώς το επίπεδο ελέγχου — το προϊόν είναι ο βοηθός. + +Αν θέλετε έναν προσωπικό βοηθό ενός χρήστη που αισθάνεται τοπικός, γρήγορος και πάντα ενεργός, αυτό είναι. + +

+ Ιστοσελίδα · + Τεκμηρίωση · + Αρχιτεκτονική · + Ξεκινήστε · + Μετεγκατάσταση από OpenClaw · + Αντιμετώπιση προβλημάτων · + Discord +

+ +> **Προτεινόμενη ρύθμιση:** εκτελέστε `zeroclaw onboard` στο τερματικό σας. Το ZeroClaw Onboard σας καθοδηγεί βήμα προς βήμα στη ρύθμιση του gateway, του χώρου εργασίας, των καναλιών και του παρόχου. Είναι η συνιστώμενη διαδρομή ρύθμισης και λειτουργεί σε macOS, Linux και Windows (μέσω WSL2). Νέα εγκατάσταση; Ξεκινήστε εδώ: [Ξεκινήστε](#γρήγορη-εκκίνηση-tldr) + +### Πιστοποίηση Συνδρομής (OAuth) + +- **OpenAI Codex** (συνδρομή ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (κλειδί API ή token πιστοποίησης) + +Σημείωση μοντέλου: ενώ υποστηρίζονται πολλοί πάροχοι/μοντέλα, για την καλύτερη εμπειρία χρησιμοποιήστε το ισχυρότερο μοντέλο τελευταίας γενιάς που έχετε στη διάθεσή σας. Δείτε [Onboarding](#γρήγορη-εκκίνηση-tldr). + +Ρύθμιση μοντέλων + CLI: [Αναφορά παρόχων](docs/reference/api/providers-reference.md) +Εναλλαγή προφίλ πιστοποίησης (OAuth vs κλειδιά API) + failover: [Failover μοντέλων](docs/reference/api/providers-reference.md) + +## Εγκατάσταση (συνιστάται) + +Χρόνος εκτέλεσης: Rust stable toolchain. Ένα μόνο δυαδικό αρχείο, χωρίς εξαρτήσεις χρόνου εκτέλεσης. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Εγκατάσταση με ένα κλικ + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +Το `zeroclaw onboard` εκτελείται αυτόματα μετά την εγκατάσταση για τη ρύθμιση του χώρου εργασίας και του παρόχου. + +## Γρήγορη εκκίνηση (TL;DR) + +Πλήρης οδηγός για αρχάριους (πιστοποίηση, σύζευξη, κανάλια): [Ξεκινήστε](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Εγκατάσταση + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Εκκίνηση του gateway (webhook server + web dashboard) +zeroclaw gateway # προεπιλογή: 127.0.0.1:42617 +zeroclaw gateway --port 0 # τυχαία θύρα (ενισχυμένη ασφάλεια) + +# Μιλήστε στον βοηθό +zeroclaw agent -m "Hello, ZeroClaw!" + +# Διαδραστική λειτουργία +zeroclaw agent + +# Εκκίνηση πλήρους αυτόνομου χρόνου εκτέλεσης (gateway + κανάλια + cron + hands) +zeroclaw daemon + +# Έλεγχος κατάστασης +zeroclaw status + +# Εκτέλεση διαγνωστικών +zeroclaw doctor +``` + +Αναβάθμιση; Εκτελέστε `zeroclaw doctor` μετά την ενημέρωση. + +### Από πηγαίο κώδικα (ανάπτυξη) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Εναλλακτική ανάπτυξης (χωρίς καθολική εγκατάσταση):** προθέστε τις εντολές με `cargo run --release --` (παράδειγμα: `cargo run --release -- status`). + +## Μετεγκατάσταση από OpenClaw + +Το ZeroClaw μπορεί να εισάγει τον χώρο εργασίας, τη μνήμη και τη ρύθμιση παραμέτρων του OpenClaw: + +```bash +# Προεπισκόπηση τι θα μετεγκατασταθεί (ασφαλές, μόνο ανάγνωση) +zeroclaw migrate openclaw --dry-run + +# Εκτέλεση της μετεγκατάστασης +zeroclaw migrate openclaw +``` + +Αυτό μετεγκαθιστά τις εγγραφές μνήμης, τα αρχεία χώρου εργασίας και τη ρύθμιση παραμέτρων από `~/.openclaw/` σε `~/.zeroclaw/`. Η ρύθμιση μετατρέπεται αυτόματα από JSON σε TOML. + +## Προεπιλογές ασφάλειας (πρόσβαση DM) + +Το ZeroClaw συνδέεται σε πραγματικές επιφάνειες μηνυμάτων. Αντιμετωπίστε τα εισερχόμενα DM ως μη αξιόπιστη είσοδο. + +Πλήρης οδηγός ασφάλειας: [SECURITY.md](SECURITY.md) + +Προεπιλεγμένη συμπεριφορά σε όλα τα κανάλια: + +- **Σύζευξη DM** (προεπιλογή): οι άγνωστοι αποστολείς λαμβάνουν έναν σύντομο κωδικό σύζευξης και ο bot δεν επεξεργάζεται το μήνυμά τους. +- Εγκρίνετε με: `zeroclaw pairing approve ` (τότε ο αποστολέας προστίθεται σε τοπική λίστα επιτρεπόμενων). +- Τα δημόσια εισερχόμενα DM απαιτούν ρητή ενεργοποίηση στο `config.toml`. +- Εκτελέστε `zeroclaw doctor` για να εντοπίσετε επικίνδυνες ή εσφαλμένες πολιτικές DM. + +**Επίπεδα αυτονομίας:** + +| Επίπεδο | Συμπεριφορά | +|---------|-------------| +| `ReadOnly` | Ο πράκτορας μπορεί να παρατηρεί αλλά όχι να ενεργεί | +| `Supervised` (προεπιλογή) | Ο πράκτορας ενεργεί με έγκριση για λειτουργίες μεσαίου/υψηλού κινδύνου | +| `Full` | Ο πράκτορας ενεργεί αυτόνομα εντός ορίων πολιτικής | + +**Επίπεδα sandboxing:** απομόνωση χώρου εργασίας, αποκλεισμός διέλευσης διαδρομής, λίστες επιτρεπόμενων εντολών, απαγορευμένες διαδρομές (`/etc`, `/root`, `~/.ssh`), περιορισμός ρυθμού (μέγιστες ενέργειες/ώρα, όρια κόστους/ημέρα). + + + + +### 📢 Ανακοινώσεις + +Χρησιμοποιήστε αυτόν τον πίνακα για σημαντικές ειδοποιήσεις (αλλαγές που σπάνε τη συμβατότητα, συμβουλές ασφαλείας, παράθυρα συντήρησης και αποκλεισμοί έκδοσης). + +| Ημερομηνία (UTC) | Επίπεδο | Ειδοποίηση | Ενέργεια | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Κρίσιμο_ | **Δεν** είμαστε συνδεδεμένοι με `openagen/zeroclaw`, `zeroclaw.org` ή `zeroclaw.net`. Οι τομείς `zeroclaw.org` και `zeroclaw.net` δείχνουν αυτή τη στιγμή στο fork `openagen/zeroclaw`, και αυτός ο τομέας/αποθετήριο υποδύονται τον επίσημο ιστότοπο/έργο μας. | Μην εμπιστεύεστε πληροφορίες, δυαδικά αρχεία, εκστρατείες χρηματοδότησης ή ανακοινώσεις από αυτές τις πηγές. Χρησιμοποιήστε μόνο [αυτό το αποθετήριο](https://github.com/zeroclaw-labs/zeroclaw) και τους επαληθευμένους λογαριασμούς μας στα μέσα κοινωνικής δικτύωσης. | +| 2026-02-21 | _Σημαντικό_ | Ο επίσημος ιστότοπός μας είναι πλέον ζωντανός: [zeroclawlabs.ai](https://zeroclawlabs.ai). Ευχαριστούμε για την υπομονή σας ενώ ετοιμάζαμε την εκκίνηση. Εξακολουθούμε να βλέπουμε απόπειρες πλαστοπροσωπίας, οπότε **μην** συμμετέχετε σε καμία επενδυτική ή χρηματοδοτική δραστηριότητα που ισχυρίζεται το όνομα ZeroClaw εκτός αν δημοσιεύεται μέσω των επίσημων καναλιών μας. | Χρησιμοποιήστε [αυτό το αποθετήριο](https://github.com/zeroclaw-labs/zeroclaw) ως τη μοναδική πηγή αλήθειας. Ακολουθήστε [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs) και [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) για επίσημες ενημερώσεις. | +| 2026-02-19 | _Σημαντικό_ | Η Anthropic ενημέρωσε τους Όρους Πιστοποίησης και Χρήσης Διαπιστευτηρίων στις 2026-02-19. Τα OAuth tokens του Claude Code (Free, Pro, Max) προορίζονται αποκλειστικά για το Claude Code και το Claude.ai· η χρήση OAuth tokens από Claude Free/Pro/Max σε οποιοδήποτε άλλο προϊόν, εργαλείο ή υπηρεσία (συμπεριλαμβανομένου του Agent SDK) δεν επιτρέπεται και ενδέχεται να παραβιάζει τους Όρους Χρήσης Καταναλωτή. | Παρακαλούμε αποφύγετε προσωρινά τις ενσωματώσεις Claude Code OAuth για να αποτρέψετε πιθανή απώλεια. Αρχική ρήτρα: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Χαρακτηριστικά + +- **Ελαφρύς χρόνος εκτέλεσης από προεπιλογή** — οι συνήθεις ροές εργασίας CLI και κατάστασης τρέχουν σε φάκελο μνήμης λίγων megabyte σε release builds. +- **Οικονομική ανάπτυξη** — σχεδιασμένο για πλακέτες $10 και μικρές cloud instances, χωρίς βαριές εξαρτήσεις χρόνου εκτέλεσης. +- **Γρήγορες κρύες εκκινήσεις** — ο χρόνος εκτέλεσης Rust με ένα δυαδικό αρχείο κρατά την εκκίνηση εντολών και daemon σχεδόν στιγμιαία. +- **Φορητή αρχιτεκτονική** — ένα δυαδικό αρχείο σε ARM, x86 και RISC-V με εναλλάξιμους παρόχους/κανάλια/εργαλεία. +- **Τοπικό-πρώτα Gateway** — ένα μόνο επίπεδο ελέγχου για sessions, κανάλια, εργαλεία, cron, SOPs και events. +- **Εισερχόμενα πολλαπλών καναλιών** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket και περισσότερα. +- **Ενορχήστρωση πολλαπλών πρακτόρων (Hands)** — αυτόνομα σμήνη πρακτόρων που τρέχουν σε πρόγραμμα και γίνονται πιο έξυπνα με τον χρόνο. +- **Τυπικές Διαδικασίες Λειτουργίας (SOPs)** — αυτοματοποίηση ροών εργασίας βάσει γεγονότων με MQTT, webhook, cron και triggers περιφερειακών. +- **Πίνακας ελέγχου Web** — React 19 + Vite web UI με συνομιλία σε πραγματικό χρόνο, περιηγητή μνήμης, επεξεργαστή ρυθμίσεων, διαχειριστή cron και επιθεωρητή εργαλείων. +- **Περιφερειακά υλικού** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO μέσω του trait `Peripheral`. +- **Εργαλεία πρώτης κατηγορίας** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace και 70+ ακόμη. +- **Hooks κύκλου ζωής** — παρεμβολή και τροποποίηση κλήσεων LLM, εκτελέσεων εργαλείων και μηνυμάτων σε κάθε στάδιο. +- **Πλατφόρμα δεξιοτήτων** — ενσωματωμένες, κοινοτικές και δεξιότητες χώρου εργασίας με έλεγχο ασφαλείας. +- **Υποστήριξη tunnel** — Cloudflare, Tailscale, ngrok, OpenVPN και custom tunnels για απομακρυσμένη πρόσβαση. + +### Γιατί οι ομάδες επιλέγουν το ZeroClaw + +- **Ελαφρύ από προεπιλογή:** μικρό δυαδικό αρχείο Rust, γρήγορη εκκίνηση, χαμηλό αποτύπωμα μνήμης. +- **Ασφαλές από σχεδιασμό:** σύζευξη, αυστηρό sandboxing, ρητές λίστες επιτρεπόμενων, οριοθέτηση χώρου εργασίας. +- **Πλήρως εναλλάξιμο:** τα βασικά συστήματα είναι traits (providers, channels, tools, memory, tunnels). +- **Χωρίς εγκλωβισμό:** υποστήριξη παρόχου συμβατού με OpenAI + pluggable custom endpoints. + +## Στιγμιότυπο Benchmark (ZeroClaw vs OpenClaw, Αναπαραγώγιμο) + +Γρήγορο benchmark τοπικού μηχανήματος (macOS arm64, Φεβ 2026) κανονικοποιημένο για υλικό edge 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Γλώσσα** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Εκκίνηση (0.8GHz core)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Μέγεθος δυαδικού** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Κόστος** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Οποιοδήποτε υλικό $10** | + +> Σημειώσεις: Τα αποτελέσματα του ZeroClaw μετρήθηκαν σε release builds χρησιμοποιώντας `/usr/bin/time -l`. Το OpenClaw απαιτεί Node.js runtime (τυπικά ~390MB επιπλέον επιβάρυνση μνήμης), ενώ το NanoBot απαιτεί Python runtime. Τα PicoClaw και ZeroClaw είναι στατικά δυαδικά. Τα στοιχεία RAM παραπάνω αφορούν μνήμη χρόνου εκτέλεσης· οι απαιτήσεις μεταγλώττισης κατά τον χρόνο κατασκευής είναι υψηλότερες. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Αναπαραγώγιμη τοπική μέτρηση + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Όλα όσα δημιουργήσαμε μέχρι τώρα + +### Βασική πλατφόρμα + +- Επίπεδο ελέγχου Gateway HTTP/WS/SSE με sessions, παρουσία, ρύθμιση, cron, webhooks, web dashboard και σύζευξη. +- Επιφάνεια CLI: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Βρόχος ενορχήστρωσης πράκτορα με αποστολή εργαλείων, κατασκευή prompt, ταξινόμηση μηνυμάτων και φόρτωση μνήμης. +- Μοντέλο session με επιβολή πολιτικής ασφάλειας, επίπεδα αυτονομίας και πύλη έγκρισης. +- Ανθεκτικό περιτύλιγμα παρόχου με failover, retry και δρομολόγηση μοντέλων σε 20+ backends LLM. + +### Κανάλια + +Κανάλια: WhatsApp (native), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Με feature-gate: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Πίνακας ελέγχου Web + +Πίνακας ελέγχου web React 19 + Vite 6 + Tailwind CSS 4 που εξυπηρετείται απευθείας από το Gateway: + +- **Dashboard** — επισκόπηση συστήματος, κατάσταση υγείας, uptime, παρακολούθηση κόστους +- **Agent Chat** — διαδραστική συνομιλία με τον πράκτορα +- **Memory** — περιήγηση και διαχείριση εγγραφών μνήμης +- **Config** — προβολή και επεξεργασία ρυθμίσεων +- **Cron** — διαχείριση προγραμματισμένων εργασιών +- **Tools** — περιήγηση διαθέσιμων εργαλείων +- **Logs** — προβολή αρχείων καταγραφής δραστηριότητας πράκτορα +- **Cost** — χρήση tokens και παρακολούθηση κόστους +- **Doctor** — διαγνωστικά υγείας συστήματος +- **Integrations** — κατάσταση ενσωμάτωσης και ρύθμιση +- **Pairing** — διαχείριση σύζευξης συσκευών + +### Στόχοι firmware + +| Στόχος | Πλατφόρμα | Σκοπός | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | Ασύρματος περιφερειακός πράκτορας | +| ESP32-UI | ESP32 + Display | Πράκτορας με οπτική διεπαφή | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Βιομηχανικό περιφερειακό | +| Arduino | Arduino | Βασική γέφυρα αισθητήρα/ενεργοποιητή | +| Uno Q Bridge | Arduino Uno | Σειριακή γέφυρα προς τον πράκτορα | + +### Εργαλεία + αυτοματοποίηση + +- **Βασικά:** shell, file read/write/edit, git operations, glob search, content search +- **Web:** browser control, web fetch, web search, screenshot, image info, PDF read +- **Ενσωματώσεις:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **Προγραμματισμός:** cron add/remove/update/run, schedule tool +- **Μνήμη:** recall, store, forget, knowledge, project intel +- **Προηγμένα:** delegate (agent-to-agent), swarm, model switch/routing, security ops, cloud ops +- **Υλικό:** board info, memory map, memory read (feature-gated) + +### Χρόνος εκτέλεσης + ασφάλεια + +- **Επίπεδα αυτονομίας:** ReadOnly, Supervised (προεπιλογή), Full. +- **Sandboxing:** απομόνωση χώρου εργασίας, αποκλεισμός διέλευσης διαδρομής, λίστες επιτρεπόμενων εντολών, απαγορευμένες διαδρομές, Landlock (Linux), Bubblewrap. +- **Περιορισμός ρυθμού:** μέγιστες ενέργειες ανά ώρα, μέγιστο κόστος ανά ημέρα (ρυθμιζόμενο). +- **Πύλη έγκρισης:** διαδραστική έγκριση για λειτουργίες μεσαίου/υψηλού κινδύνου. +- **E-stop:** δυνατότητα έκτακτης διακοπής. +- **129+ τεστ ασφαλείας** σε αυτοματοποιημένο CI. + +### Λειτουργίες + πακετάρισμα + +- Πίνακας ελέγχου web που εξυπηρετείται απευθείας από το Gateway. +- Υποστήριξη tunnel: Cloudflare, Tailscale, ngrok, OpenVPN, custom command. +- Docker runtime adapter για containerized εκτέλεση. +- CI/CD: beta (auto on push) → stable (manual dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Προκατασκευασμένα δυαδικά για Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Ρύθμιση παραμέτρων + +Ελάχιστο `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Πλήρης αναφορά ρύθμισης: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Ρύθμιση καναλιών + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Ρύθμιση tunnel + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Λεπτομέρειες: [Αναφορά καναλιών](docs/reference/api/channels-reference.md) · [Αναφορά ρυθμίσεων](docs/reference/api/config-reference.md) + +### Υποστήριξη χρόνου εκτέλεσης (τρέχουσα) + +- **`native`** (προεπιλογή) — άμεση εκτέλεση διεργασίας, ταχύτερη διαδρομή, ιδανική για αξιόπιστα περιβάλλοντα. +- **`docker`** — πλήρης απομόνωση container, επιβαλλόμενες πολιτικές ασφάλειας, απαιτεί Docker. + +Ορίστε `runtime.kind = "docker"` για αυστηρό sandboxing ή απομόνωση δικτύου. + +## Πιστοποίηση Συνδρομής (OpenAI Codex / Claude Code / Gemini) + +Το ZeroClaw υποστηρίζει native προφίλ πιστοποίησης συνδρομής (πολλαπλοί λογαριασμοί, κρυπτογραφημένα σε αδράνεια). + +- Αρχείο αποθήκευσης: `~/.zeroclaw/auth-profiles.json` +- Κλειδί κρυπτογράφησης: `~/.zeroclaw/.secret_key` +- Μορφή αναγνωριστικού προφίλ: `:` (παράδειγμα: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT subscription) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Check / refresh / switch profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Run the agent with subscription auth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Χώρος εργασίας πράκτορα + δεξιότητες + +Ρίζα χώρου εργασίας: `~/.zeroclaw/workspace/` (ρυθμιζόμενο μέσω config). + +Ενσωματωμένα αρχεία prompt: +- `IDENTITY.md` — προσωπικότητα και ρόλος πράκτορα +- `USER.md` — πλαίσιο χρήστη και προτιμήσεις +- `MEMORY.md` — μακροπρόθεσμα γεγονότα και μαθήματα +- `AGENTS.md` — συμβάσεις session και κανόνες αρχικοποίησης +- `SOUL.md` — βασική ταυτότητα και αρχές λειτουργίας + +Δεξιότητες: `~/.zeroclaw/workspace/skills//SKILL.md` ή `SKILL.toml`. + +```bash +# List installed skills +zeroclaw skills list + +# Install from git +zeroclaw skills install https://github.com/user/my-skill.git + +# Security audit before install +zeroclaw skills audit https://github.com/user/my-skill.git + +# Remove a skill +zeroclaw skills remove my-skill +``` + +## Εντολές CLI + +```bash +# Διαχείριση χώρου εργασίας +zeroclaw onboard # Οδηγός καθοδηγούμενης ρύθμισης +zeroclaw status # Εμφάνιση κατάστασης daemon/agent +zeroclaw doctor # Εκτέλεση διαγνωστικών συστήματος + +# Gateway + daemon +zeroclaw gateway # Εκκίνηση gateway server (127.0.0.1:42617) +zeroclaw daemon # Εκκίνηση πλήρους αυτόνομου χρόνου εκτέλεσης + +# Πράκτορας +zeroclaw agent # Διαδραστική λειτουργία συνομιλίας +zeroclaw agent -m "message" # Λειτουργία μεμονωμένου μηνύματος + +# Διαχείριση υπηρεσίας +zeroclaw service install # Εγκατάσταση ως υπηρεσία OS (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Κανάλια +zeroclaw channel list # Λίστα ρυθμισμένων καναλιών +zeroclaw channel doctor # Έλεγχος υγείας καναλιών +zeroclaw channel bind-telegram 123456789 + +# Cron + προγραμματισμός +zeroclaw cron list # Λίστα προγραμματισμένων εργασιών +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Μνήμη +zeroclaw memory list # Λίστα εγγραφών μνήμης +zeroclaw memory get # Ανάκτηση μνήμης +zeroclaw memory stats # Στατιστικά μνήμης + +# Προφίλ πιστοποίησης +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Περιφερειακά υλικού +zeroclaw hardware discover # Σάρωση για συνδεδεμένες συσκευές +zeroclaw peripheral list # Λίστα συνδεδεμένων περιφερειακών +zeroclaw peripheral flash # Flash firmware σε συσκευή + +# Μετεγκατάσταση +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Συμπληρώσεις shell +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Πλήρης αναφορά εντολών: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Προαπαιτούμενα + +
+Windows + +#### Απαιτούμενα + +1. **Visual Studio Build Tools** (παρέχει τον MSVC linker και το Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Κατά την εγκατάσταση (ή μέσω του Visual Studio Installer), επιλέξτε το workload **"Desktop development with C++"**. + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Μετά την εγκατάσταση, ανοίξτε ένα νέο τερματικό και εκτελέστε `rustup default stable` για να βεβαιωθείτε ότι είναι ενεργό το stable toolchain. + +3. **Επαλήθευση** ότι λειτουργούν και τα δύο: + ```powershell + rustc --version + cargo --version + ``` + +#### Προαιρετικά + +- **Docker Desktop** — απαιτείται μόνο αν χρησιμοποιείτε τον [Docker sandboxed runtime](#υποστήριξη-χρόνου-εκτέλεσης-τρέχουσα) (`runtime.kind = "docker"`). Εγκατάσταση μέσω `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Απαιτούμενα + +1. **Βασικά εργαλεία κατασκευής:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Εγκαταστήστε Xcode Command Line Tools: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Δείτε [rustup.rs](https://rustup.rs) για λεπτομέρειες. + +3. **Επαλήθευση** ότι λειτουργούν και τα δύο: + ```bash + rustc --version + cargo --version + ``` + +#### Εγκατάσταση με μία εντολή + +Ή παραλείψτε τα παραπάνω βήματα και εγκαταστήστε τα πάντα (εξαρτήσεις συστήματος, Rust, ZeroClaw) με μία εντολή: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Απαιτήσεις πόρων μεταγλώττισης + +Η κατασκευή από πηγαίο κώδικα χρειάζεται περισσότερους πόρους από την εκτέλεση του τελικού δυαδικού: + +| Πόρος | Ελάχιστο | Συνιστώμενο | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Ελεύθερος δίσκος** | 6 GB | 10 GB+ | + +Αν ο host σας είναι κάτω από το ελάχιστο, χρησιμοποιήστε προκατασκευασμένα δυαδικά: + +```bash +./install.sh --prefer-prebuilt +``` + +Για εγκατάσταση αποκλειστικά δυαδικού χωρίς εναλλακτική πηγαίου κώδικα: + +```bash +./install.sh --prebuilt-only +``` + +#### Προαιρετικά + +- **Docker** — απαιτείται μόνο αν χρησιμοποιείτε τον [Docker sandboxed runtime](#υποστήριξη-χρόνου-εκτέλεσης-τρέχουσα) (`runtime.kind = "docker"`). Εγκατάσταση μέσω του package manager σας ή [docker.com](https://docs.docker.com/engine/install/). + +> **Σημείωση:** Η προεπιλεγμένη `cargo build --release` χρησιμοποιεί `codegen-units=1` για μείωση της μέγιστης πίεσης μεταγλώττισης. Για ταχύτερες κατασκευές σε ισχυρά μηχανήματα, χρησιμοποιήστε `cargo build --profile release-fast`. + +
+ + + +### Προκατασκευασμένα δυαδικά + +Τα assets έκδοσης δημοσιεύονται για: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Κατεβάστε τα τελευταία assets από: + + +## Τεκμηρίωση + +Χρησιμοποιήστε τα όταν έχετε ολοκληρώσει τη ροή onboarding και θέλετε τη βαθύτερη αναφορά. + +- Ξεκινήστε με το [ευρετήριο τεκμηρίωσης](docs/README.md) για πλοήγηση και "τι βρίσκεται πού." +- Διαβάστε την [επισκόπηση αρχιτεκτονικής](docs/architecture.md) για το πλήρες μοντέλο συστήματος. +- Χρησιμοποιήστε την [αναφορά ρυθμίσεων](docs/reference/api/config-reference.md) όταν χρειάζεστε κάθε κλειδί και παράδειγμα. +- Εκτελέστε το Gateway σύμφωνα με το βιβλίο με το [εγχειρίδιο λειτουργίας](docs/ops/operations-runbook.md). +- Ακολουθήστε [ZeroClaw Onboard](#γρήγορη-εκκίνηση-tldr) για καθοδηγούμενη ρύθμιση. +- Αντιμετωπίστε κοινά σφάλματα με τον [οδηγό αντιμετώπισης προβλημάτων](docs/ops/troubleshooting.md). +- Ελέγξτε τις [οδηγίες ασφάλειας](docs/security/README.md) πριν εκθέσετε οτιδήποτε. + +### Αναφορά τεκμηρίωσης + +- Κόμβος τεκμηρίωσης: [docs/README.md](docs/README.md) +- Ενοποιημένος πίνακας περιεχομένων: [docs/SUMMARY.md](docs/SUMMARY.md) +- Αναφορά εντολών: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Αναφορά ρυθμίσεων: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Αναφορά παρόχων: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Αναφορά καναλιών: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Εγχειρίδιο λειτουργίας: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Αντιμετώπιση προβλημάτων: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Τεκμηρίωση συνεργασίας + +- Οδηγός συνεισφοράς: [CONTRIBUTING.md](CONTRIBUTING.md) +- Πολιτική ροής εργασίας PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Οδηγός ροής εργασίας CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Εγχειρίδιο αξιολογητή: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Πολιτική αποκάλυψης ασφάλειας: [SECURITY.md](SECURITY.md) +- Πρότυπο τεκμηρίωσης: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Ανάπτυξη + λειτουργίες + +- Οδηγός ανάπτυξης δικτύου: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Εγχειρίδιο proxy agent: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Οδηγοί υλικού: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +Το ZeroClaw δημιουργήθηκε για τον smooth crab 🦀, έναν γρήγορο και αποδοτικό βοηθό AI. Δημιουργήθηκε από τον Argenis De La Rosa και την κοινότητα. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Υποστήριξη ZeroClaw + +Αν το ZeroClaw βοηθά τη δουλειά σας και θέλετε να υποστηρίξετε τη συνεχιζόμενη ανάπτυξη, μπορείτε να κάνετε δωρεά εδώ: + +Buy Me a Coffee + +### 🙏 Ειδικές Ευχαριστίες + +Ένα εγκάρδιο ευχαριστώ στις κοινότητες και τα ιδρύματα που εμπνέουν και τροφοδοτούν αυτό το έργο ανοιχτού κώδικα: + +- **Harvard University** — για την καλλιέργεια πνευματικής περιέργειας και την ώθηση των ορίων του εφικτού. +- **MIT** — για την υπεράσπιση της ανοιχτής γνώσης, του ανοιχτού κώδικα και της πεποίθησης ότι η τεχνολογία πρέπει να είναι προσβάσιμη σε όλους. +- **Sundai Club** — για την κοινότητα, την ενέργεια και την ακατάπαυστη επιθυμία να χτίζουμε πράγματα που έχουν σημασία. +- **Ο Κόσμος & Πέρα** 🌍✨ — σε κάθε συνεισφέροντα, ονειροπόλο και δημιουργό εκεί έξω που κάνει τον ανοιχτό κώδικα δύναμη για το καλό. Αυτό είναι για εσένα. + +Χτίζουμε ανοιχτά γιατί οι καλύτερες ιδέες έρχονται από παντού. Αν διαβάζεις αυτό, είσαι μέρος του. Καλωσήρθες. 🦀❤️ + +## Συνεισφορά + +Νέος στο ZeroClaw; Ψάξτε για issues με ετικέτα [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — δείτε τον [Οδηγό Συνεισφοράς](CONTRIBUTING.md#first-time-contributors) για το πώς να ξεκινήσετε. PR με AI/vibe-coding καλοδεχούμενα! 🤖 + +Δείτε [CONTRIBUTING.md](CONTRIBUTING.md) και [CLA.md](docs/contributing/cla.md). Υλοποιήστε ένα trait, υποβάλετε ένα PR: + +- Οδηγός ροής εργασίας CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Νέο `Provider` → `src/providers/` +- Νέο `Channel` → `src/channels/` +- Νέο `Observer` → `src/observability/` +- Νέο `Tool` → `src/tools/` +- Νέο `Memory` → `src/memory/` +- Νέο `Tunnel` → `src/tunnel/` +- Νέο `Peripheral` → `src/peripherals/` +- Νέο `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Επίσημο Αποθετήριο & Προειδοποίηση Πλαστοπροσωπίας + +**Αυτό είναι το μόνο επίσημο αποθετήριο ZeroClaw:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Οποιοδήποτε άλλο αποθετήριο, οργανισμός, τομέας ή πακέτο που ισχυρίζεται ότι είναι "ZeroClaw" ή υπονοεί σχέση με τα ZeroClaw Labs είναι **μη εξουσιοδοτημένο και δεν σχετίζεται με αυτό το έργο**. Τα γνωστά μη εξουσιοδοτημένα forks θα αναφέρονται στο [TRADEMARK.md](docs/maintainers/trademark.md). + +Αν αντιμετωπίσετε πλαστοπροσωπία ή κατάχρηση εμπορικού σήματος, παρακαλούμε [ανοίξτε ένα issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Άδεια + +Το ZeroClaw έχει διπλή άδεια για μέγιστη ανοιχτότητα και προστασία συνεισφερόντων: + +| Άδεια | Περίπτωση χρήσης | +|---|---| +| [MIT](LICENSE-MIT) | Ανοιχτός κώδικας, έρευνα, ακαδημαϊκή, προσωπική χρήση | +| [Apache 2.0](LICENSE-APACHE) | Προστασία πατεντών, θεσμική, εμπορική ανάπτυξη | + +Μπορείτε να επιλέξετε οποιαδήποτε άδεια. **Οι συνεισφέροντες παρέχουν αυτόματα δικαιώματα και στις δύο** — δείτε [CLA.md](docs/contributing/cla.md) για την πλήρη συμφωνία συνεισφοράς. + +### Εμπορικό σήμα + +Το όνομα **ZeroClaw** και το λογότυπο είναι εμπορικά σήματα της ZeroClaw Labs. Αυτή η άδεια δεν παρέχει δικαίωμα χρήσης τους για να υπονοήσετε υποστήριξη ή σχέση. Δείτε [TRADEMARK.md](docs/maintainers/trademark.md) για επιτρεπόμενες και απαγορευμένες χρήσεις. + +### Προστασίες Συνεισφερόντων + +- **Διατηρείτε τα πνευματικά δικαιώματα** των συνεισφορών σας +- **Χορήγηση πατεντών** (Apache 2.0) σας προστατεύει από αξιώσεις πατεντών άλλων συνεισφερόντων +- Οι συνεισφορές σας **αποδίδονται μόνιμα** στο ιστορικό commit και στο [NOTICE](NOTICE) +- Δεν μεταβιβάζονται δικαιώματα εμπορικού σήματος με τη συνεισφορά + +--- + +**ZeroClaw** — Μηδενική επιβάρυνση. Μηδενικοί συμβιβασμοί. Ανάπτυξη οπουδήποτε. Εναλλαγή οτιδήποτε. 🦀 + +## Συνεισφέροντες + + + ZeroClaw contributors + + +Αυτή η λίστα δημιουργείται από το γράφημα συνεισφερόντων του GitHub και ενημερώνεται αυτόματα. + +## Ιστορικό Αστεριών + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.es.md b/third_party/zeroclaw/README.es.md new file mode 100644 index 0000000..d190631 --- /dev/null +++ b/third_party/zeroclaw/README.es.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Asistente Personal de IA

+ +

+ Cero sobrecarga. Cero compromisos. 100% Rust. 100% Agnóstico.
+ ⚡️ Funciona en hardware de $10 con <5MB de RAM: ¡99% menos memoria que OpenClaw y 98% más barato que un Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Construido por estudiantes y miembros de las comunidades de Harvard, MIT y Sundai.Club. +

+ +

+ 🌐 Idiomas: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw es un asistente personal de IA que ejecutas en tus propios dispositivos. Te responde en los canales que ya usas (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work y más). Tiene un panel web para control en tiempo real y puede conectarse a periféricos de hardware (ESP32, STM32, Arduino, Raspberry Pi). El Gateway es solo el plano de control — el producto es el asistente. + +Si quieres un asistente personal, de un solo usuario, que se sienta local, rápido y siempre activo, esto es lo que buscas. + +

+ Sitio web · + Documentación · + Arquitectura · + Primeros pasos · + Migración desde OpenClaw · + Solución de problemas · + Discord +

+ +> **Configuración recomendada:** ejecuta `zeroclaw onboard` en tu terminal. ZeroClaw Onboard te guía paso a paso en la configuración del gateway, workspace, canales y proveedor. Es la ruta de configuración recomendada y funciona en macOS, Linux y Windows (vía WSL2). ¿Nueva instalación? Empieza aquí: [Primeros pasos](#inicio-rápido) + +### Autenticación por suscripción (OAuth) + +- **OpenAI Codex** (suscripción ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (clave API o token de autenticación) + +Nota sobre modelos: aunque se soportan muchos proveedores/modelos, para la mejor experiencia usa el modelo de última generación más potente disponible. Ver [Onboarding](#inicio-rápido). + +Configuración de modelos + CLI: [Referencia de proveedores](docs/reference/api/providers-reference.md) +Rotación de perfiles de autenticación (OAuth vs claves API) + failover: [Failover de modelos](docs/reference/api/providers-reference.md) + +## Instalación (recomendada) + +Requisito: toolchain estable de Rust. Un solo binario, sin dependencias de runtime. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Bootstrap con un clic + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` se ejecuta automáticamente después de la instalación para configurar tu workspace y proveedor. + +## Inicio rápido (TL;DR) + +Guía completa para principiantes (autenticación, emparejamiento, canales): [Primeros pasos](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Instalar + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Iniciar el gateway (servidor webhook + panel web) +zeroclaw gateway # por defecto: 127.0.0.1:42617 +zeroclaw gateway --port 0 # puerto aleatorio (seguridad reforzada) + +# Hablar con el asistente +zeroclaw agent -m "Hello, ZeroClaw!" + +# Modo interactivo +zeroclaw agent + +# Iniciar runtime autónomo completo (gateway + canales + cron + hands) +zeroclaw daemon + +# Verificar estado +zeroclaw status + +# Ejecutar diagnósticos +zeroclaw doctor +``` + +¿Actualizando? Ejecuta `zeroclaw doctor` después de actualizar. + +### Desde el código fuente (desarrollo) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Alternativa para desarrollo (sin instalación global):** antepón `cargo run --release --` a los comandos (ejemplo: `cargo run --release -- status`). + +## Migración desde OpenClaw + +ZeroClaw puede importar tu workspace, memoria y configuración de OpenClaw: + +```bash +# Vista previa de lo que se migrará (seguro, solo lectura) +zeroclaw migrate openclaw --dry-run + +# Ejecutar la migración +zeroclaw migrate openclaw +``` + +Esto migra tus entradas de memoria, archivos del workspace y configuración de `~/.openclaw/` a `~/.zeroclaw/`. La configuración se convierte de JSON a TOML automáticamente. + +## Valores predeterminados de seguridad (acceso por DM) + +ZeroClaw se conecta a superficies de mensajería reales. Trata los DMs entrantes como entrada no confiable. + +Guía completa de seguridad: [SECURITY.md](SECURITY.md) + +Comportamiento predeterminado en todos los canales: + +- **Emparejamiento por DM** (predeterminado): los remitentes desconocidos reciben un código de emparejamiento corto y el bot no procesa su mensaje. +- Aprobar con: `zeroclaw pairing approve ` (luego el remitente se agrega a una lista de permitidos local). +- Los DMs públicos entrantes requieren una activación explícita en `config.toml`. +- Ejecuta `zeroclaw doctor` para detectar políticas de DM riesgosas o mal configuradas. + +**Niveles de autonomía:** + +| Nivel | Comportamiento | +|-------|----------------| +| `ReadOnly` | El agente puede observar pero no actuar | +| `Supervised` (predeterminado) | El agente actúa con aprobación para operaciones de riesgo medio/alto | +| `Full` | El agente actúa autónomamente dentro de los límites de la política | + +**Capas de sandboxing:** aislamiento del workspace, bloqueo de traversal de rutas, listas de comandos permitidos, rutas prohibidas (`/etc`, `/root`, `~/.ssh`), limitación de velocidad (máximo de acciones/hora, topes de costo/día). + + + + +### 📢 Anuncios + +Usa este tablero para avisos importantes (cambios incompatibles, avisos de seguridad, ventanas de mantenimiento y bloqueadores de lanzamiento). + +| Fecha (UTC) | Nivel | Aviso | Acción | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Crítico_ | **No estamos afiliados** con `openagen/zeroclaw`, `zeroclaw.org` ni `zeroclaw.net`. Los dominios `zeroclaw.org` y `zeroclaw.net` actualmente apuntan al fork `openagen/zeroclaw`, y ese dominio/repositorio están suplantando nuestro sitio web/proyecto oficial. | No confíes en información, binarios, recaudaciones de fondos o anuncios de esas fuentes. Usa solo [este repositorio](https://github.com/zeroclaw-labs/zeroclaw) y nuestras cuentas sociales verificadas. | +| 2026-02-21 | _Importante_ | Nuestro sitio web oficial ya está en línea: [zeroclawlabs.ai](https://zeroclawlabs.ai). Gracias por tu paciencia mientras preparábamos el lanzamiento. Seguimos viendo intentos de suplantación, así que **no** te unas a ninguna actividad de inversión o recaudación que use el nombre de ZeroClaw a menos que se publique a través de nuestros canales oficiales. | Usa [este repositorio](https://github.com/zeroclaw-labs/zeroclaw) como la única fuente de verdad. Sigue [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Grupo)](https://www.facebook.com/groups/zeroclawlabs) y [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) para actualizaciones oficiales. | +| 2026-02-19 | _Importante_ | Anthropic actualizó los términos de Autenticación y Uso de Credenciales el 2026-02-19. Los tokens OAuth de Claude Code (Free, Pro, Max) están destinados exclusivamente para Claude Code y Claude.ai; usar tokens OAuth de Claude Free/Pro/Max en cualquier otro producto, herramienta o servicio (incluyendo Agent SDK) no está permitido y puede violar los Términos de Servicio del Consumidor. | Por favor, evita temporalmente las integraciones OAuth de Claude Code para prevenir pérdidas potenciales. Cláusula original: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Características destacadas + +- **Runtime ligero por defecto** — los flujos de trabajo comunes de CLI y estado se ejecutan en una envolvente de memoria de pocos megabytes en compilaciones release. +- **Despliegue económico** — diseñado para placas de $10 e instancias pequeñas en la nube, sin dependencias de runtime pesadas. +- **Arranque en frío rápido** — el runtime de Rust con un solo binario mantiene el inicio de comandos y del daemon casi instantáneo. +- **Arquitectura portable** — un binario para ARM, x86 y RISC-V con proveedores/canales/herramientas intercambiables. +- **Gateway local-first** — un solo plano de control para sesiones, canales, herramientas, cron, SOPs y eventos. +- **Bandeja de entrada multicanal** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket y más. +- **Orquestación multi-agente (Hands)** — enjambres de agentes autónomos que se ejecutan según programación y se vuelven más inteligentes con el tiempo. +- **Procedimientos Operativos Estándar (SOPs)** — automatización de flujos de trabajo dirigida por eventos con MQTT, webhook, cron y disparadores de periféricos. +- **Panel web** — interfaz web React 19 + Vite con chat en tiempo real, explorador de memoria, editor de configuración, gestor de cron e inspector de herramientas. +- **Periféricos de hardware** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO a través del trait `Peripheral`. +- **Herramientas de primera clase** — shell, E/S de archivos, navegador, git, web fetch/search, MCP, Jira, Notion, Google Workspace y más de 70 más. +- **Hooks de ciclo de vida** — intercepta y modifica llamadas LLM, ejecuciones de herramientas y mensajes en cada etapa. +- **Plataforma de skills** — skills incluidos, comunitarios y del workspace con auditoría de seguridad. +- **Soporte de túneles** — Cloudflare, Tailscale, ngrok, OpenVPN y túneles personalizados para acceso remoto. + +### Por qué los equipos eligen ZeroClaw + +- **Ligero por defecto:** binario pequeño de Rust, arranque rápido, bajo consumo de memoria. +- **Seguro por diseño:** emparejamiento, sandboxing estricto, listas de permitidos explícitas, alcance del workspace. +- **Totalmente intercambiable:** los sistemas centrales son traits (proveedores, canales, herramientas, memoria, túneles). +- **Sin dependencia de proveedor:** soporte de proveedores compatibles con OpenAI + endpoints personalizados conectables. + +## Resumen de benchmarks (ZeroClaw vs OpenClaw, reproducible) + +Benchmark rápido en máquina local (macOS arm64, febrero 2026) normalizado para hardware edge de 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Lenguaje** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Arranque (core 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Tamaño del binario** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Costo** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Cualquier hardware $10** | + +> Notas: Los resultados de ZeroClaw se miden en compilaciones release usando `/usr/bin/time -l`. OpenClaw requiere el runtime de Node.js (típicamente ~390MB de sobrecarga adicional de memoria), mientras que NanoBot requiere el runtime de Python. PicoClaw y ZeroClaw son binarios estáticos. Las cifras de RAM anteriores son de memoria en runtime; los requisitos de compilación son mayores. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Medición local reproducible + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Todo lo que hemos construido hasta ahora + +### Plataforma central + +- Plano de control Gateway HTTP/WS/SSE con sesiones, presencia, configuración, cron, webhooks, panel web y emparejamiento. +- Superficie CLI: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Bucle de orquestación del agente con despacho de herramientas, construcción de prompts, clasificación de mensajes y carga de memoria. +- Modelo de sesión con aplicación de políticas de seguridad, niveles de autonomía y aprobación condicional. +- Wrapper de proveedor resiliente con failover, reintentos y enrutamiento de modelos a través de más de 20 backends LLM. + +### Canales + +Canales: WhatsApp (nativo), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Habilitados por feature gate: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Panel web + +Panel web React 19 + Vite 6 + Tailwind CSS 4 servido directamente desde el Gateway: + +- **Dashboard** — resumen del sistema, estado de salud, tiempo de actividad, seguimiento de costos +- **Chat del agente** — chat interactivo con el agente +- **Memoria** — explorar y gestionar entradas de memoria +- **Configuración** — ver y editar configuración +- **Cron** — gestionar tareas programadas +- **Herramientas** — explorar herramientas disponibles +- **Registros** — ver registros de actividad del agente +- **Costos** — uso de tokens y seguimiento de costos +- **Doctor** — diagnósticos de salud del sistema +- **Integraciones** — estado y configuración de integraciones +- **Emparejamiento** — gestión de emparejamiento de dispositivos + +### Objetivos de firmware + +| Objetivo | Plataforma | Propósito | +|----------|------------|-----------| +| ESP32 | Espressif ESP32 | Agente periférico inalámbrico | +| ESP32-UI | ESP32 + Display | Agente con interfaz visual | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Periférico industrial | +| Arduino | Arduino | Puente básico de sensores/actuadores | +| Uno Q Bridge | Arduino Uno | Puente serial al agente | + +### Herramientas + automatización + +- **Core:** shell, lectura/escritura/edición de archivos, operaciones git, búsqueda glob, búsqueda de contenido +- **Web:** control de navegador, web fetch, web search, captura de pantalla, información de imagen, lectura de PDF +- **Integraciones:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + conjuntos de herramientas diferidos +- **Programación:** cron add/remove/update/run, herramienta de programación +- **Memoria:** recall, store, forget, knowledge, project intel +- **Avanzado:** delegate (agente a agente), swarm, cambio/enrutamiento de modelos, operaciones de seguridad, operaciones en la nube +- **Hardware:** board info, memory map, memory read (habilitado por feature gate) + +### Runtime + seguridad + +- **Niveles de autonomía:** ReadOnly, Supervised (predeterminado), Full. +- **Sandboxing:** aislamiento del workspace, bloqueo de traversal de rutas, listas de comandos permitidos, rutas prohibidas, Landlock (Linux), Bubblewrap. +- **Limitación de velocidad:** máximo de acciones por hora, máximo de costo por día (configurable). +- **Aprobación condicional:** aprobación interactiva para operaciones de riesgo medio/alto. +- **Parada de emergencia:** capacidad de apagado de emergencia. +- **129+ pruebas de seguridad** en CI automatizado. + +### Operaciones + empaquetado + +- Panel web servido directamente desde el Gateway. +- Soporte de túneles: Cloudflare, Tailscale, ngrok, OpenVPN, comando personalizado. +- Adaptador de runtime Docker para ejecución en contenedores. +- CI/CD: beta (automático al hacer push) → stable (dispatch manual) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Binarios preconstruidos para Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Configuración + +`~/.zeroclaw/config.toml` mínimo: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Referencia completa de configuración: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Configuración de canales + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Configuración de túneles + +```toml +[tunnel] +kind = "cloudflare" # o "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Detalles: [Referencia de canales](docs/reference/api/channels-reference.md) · [Referencia de configuración](docs/reference/api/config-reference.md) + +### Soporte de runtime (actual) + +- **`native`** (predeterminado) — ejecución directa de procesos, la ruta más rápida, ideal para entornos de confianza. +- **`docker`** — aislamiento completo en contenedores, políticas de seguridad forzadas, requiere Docker. + +Establece `runtime.kind = "docker"` para sandboxing estricto o aislamiento de red. + +## Autenticación por suscripción (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw soporta perfiles de autenticación nativos de suscripción (multi-cuenta, cifrados en reposo). + +- Archivo de almacenamiento: `~/.zeroclaw/auth-profiles.json` +- Clave de cifrado: `~/.zeroclaw/.secret_key` +- Formato de id de perfil: `:` (ejemplo: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (suscripción ChatGPT) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Verificar / refrescar / cambiar perfil +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Ejecutar el agente con autenticación por suscripción +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Workspace del agente + skills + +Raíz del workspace: `~/.zeroclaw/workspace/` (configurable vía config). + +Archivos de prompt inyectados: +- `IDENTITY.md` — personalidad y rol del agente +- `USER.md` — contexto y preferencias del usuario +- `MEMORY.md` — hechos y lecciones a largo plazo +- `AGENTS.md` — convenciones de sesión y reglas de inicialización +- `SOUL.md` — identidad central y principios operativos + +Skills: `~/.zeroclaw/workspace/skills//SKILL.md` o `SKILL.toml`. + +```bash +# Listar skills instalados +zeroclaw skills list + +# Instalar desde git +zeroclaw skills install https://github.com/user/my-skill.git + +# Auditoría de seguridad antes de instalar +zeroclaw skills audit https://github.com/user/my-skill.git + +# Eliminar un skill +zeroclaw skills remove my-skill +``` + +## Comandos CLI + +```bash +# Gestión del workspace +zeroclaw onboard # Asistente de configuración guiada +zeroclaw status # Mostrar estado del daemon/agente +zeroclaw doctor # Ejecutar diagnósticos del sistema + +# Gateway + daemon +zeroclaw gateway # Iniciar servidor gateway (127.0.0.1:42617) +zeroclaw daemon # Iniciar runtime autónomo completo + +# Agente +zeroclaw agent # Modo de chat interactivo +zeroclaw agent -m "message" # Modo de mensaje único + +# Gestión de servicios +zeroclaw service install # Instalar como servicio del SO (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Canales +zeroclaw channel list # Listar canales configurados +zeroclaw channel doctor # Verificar salud de los canales +zeroclaw channel bind-telegram 123456789 + +# Cron + programación +zeroclaw cron list # Listar trabajos programados +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memoria +zeroclaw memory list # Listar entradas de memoria +zeroclaw memory get # Recuperar una memoria +zeroclaw memory stats # Estadísticas de memoria + +# Perfiles de autenticación +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Periféricos de hardware +zeroclaw hardware discover # Escanear dispositivos conectados +zeroclaw peripheral list # Listar periféricos conectados +zeroclaw peripheral flash # Flashear firmware al dispositivo + +# Migración +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Completado de shell +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Referencia completa de comandos: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Prerrequisitos + +
+Windows + +#### Requerido + +1. **Visual Studio Build Tools** (proporciona el enlazador MSVC y el SDK de Windows): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Durante la instalación (o a través del Visual Studio Installer), selecciona la carga de trabajo **"Desarrollo de escritorio con C++"**. + +2. **Toolchain de Rust:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Después de la instalación, abre una nueva terminal y ejecuta `rustup default stable` para asegurarte de que el toolchain estable esté activo. + +3. **Verifica** que ambos funcionen: + ```powershell + rustc --version + cargo --version + ``` + +#### Opcional + +- **Docker Desktop** — requerido solo si usas el [runtime sandbox con Docker](#soporte-de-runtime-actual) (`runtime.kind = "docker"`). Instala vía `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Requerido + +1. **Herramientas de compilación esenciales:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Instala Xcode Command Line Tools: `xcode-select --install` + +2. **Toolchain de Rust:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Ver [rustup.rs](https://rustup.rs) para detalles. + +3. **Verifica** que ambos funcionen: + ```bash + rustc --version + cargo --version + ``` + +#### Instalador en una línea + +O salta los pasos anteriores e instala todo (dependencias del sistema, Rust, ZeroClaw) en un solo comando: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Requisitos de recursos para compilación + +Compilar desde el código fuente necesita más recursos que ejecutar el binario resultante: + +| Recurso | Mínimo | Recomendado | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Disco libre**| 6 GB | 10 GB+ | + +Si tu host está por debajo del mínimo, usa binarios preconstruidos: + +```bash +./install.sh --prefer-prebuilt +``` + +Para requerir instalación solo de binarios sin compilación de respaldo: + +```bash +./install.sh --prebuilt-only +``` + +#### Opcional + +- **Docker** — requerido solo si usas el [runtime sandbox con Docker](#soporte-de-runtime-actual) (`runtime.kind = "docker"`). Instala vía tu gestor de paquetes o [docker.com](https://docs.docker.com/engine/install/). + +> **Nota:** El `cargo build --release` predeterminado usa `codegen-units=1` para reducir la presión máxima de compilación. Para compilaciones más rápidas en máquinas potentes, usa `cargo build --profile release-fast`. + +
+ + + +### Binarios preconstruidos + +Los assets de release se publican para: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Descarga los últimos assets desde: + + +## Documentación + +Usa estos recursos cuando hayas pasado el flujo de onboarding y quieras la referencia más profunda. + +- Comienza con el [índice de docs](docs/README.md) para navegación y "qué hay dónde." +- Lee la [visión general de la arquitectura](docs/architecture.md) para el modelo completo del sistema. +- Usa la [referencia de configuración](docs/reference/api/config-reference.md) cuando necesites cada clave y ejemplo. +- Ejecuta el Gateway según el libro con el [runbook operativo](docs/ops/operations-runbook.md). +- Sigue [ZeroClaw Onboard](#inicio-rápido) para una configuración guiada. +- Depura errores comunes con la [guía de solución de problemas](docs/ops/troubleshooting.md). +- Revisa la [guía de seguridad](docs/security/README.md) antes de exponer cualquier cosa. + +### Documentación de referencia + +- Hub de documentación: [docs/README.md](docs/README.md) +- TOC unificado de docs: [docs/SUMMARY.md](docs/SUMMARY.md) +- Referencia de comandos: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Referencia de configuración: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Referencia de proveedores: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Referencia de canales: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Runbook operativo: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Solución de problemas: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Documentación de colaboración + +- Guía de contribución: [CONTRIBUTING.md](CONTRIBUTING.md) +- Política de flujo de trabajo de PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Guía de flujo de trabajo CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Manual del revisor: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Política de divulgación de seguridad: [SECURITY.md](SECURITY.md) +- Plantilla de documentación: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Despliegue + operaciones + +- Guía de despliegue en red: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Manual de agente proxy: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Guías de hardware: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw fue construido para el cangrejo suave 🦀, un asistente de IA rápido y eficiente. Construido por Argenis De La Rosa y la comunidad. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Apoya a ZeroClaw + +Si ZeroClaw ayuda en tu trabajo y quieres apoyar el desarrollo continuo, puedes donar aquí: + +Buy Me a Coffee + +### 🙏 Agradecimientos especiales + +Un sincero agradecimiento a las comunidades e instituciones que inspiran e impulsan este trabajo de código abierto: + +- **Harvard University** — por fomentar la curiosidad intelectual y empujar los límites de lo posible. +- **MIT** — por defender el conocimiento abierto, el código abierto y la creencia de que la tecnología debe ser accesible para todos. +- **Sundai Club** — por la comunidad, la energía y el impulso incansable de construir cosas que importan. +- **El Mundo y Más Allá** 🌍✨ — a cada contribuidor, soñador y constructor que hace del código abierto una fuerza para el bien. Esto es para ti. + +Estamos construyendo en abierto porque las mejores ideas vienen de todas partes. Si estás leyendo esto, eres parte de ello. Bienvenido. 🦀❤️ + +## Contribuir + +¿Nuevo en ZeroClaw? Busca issues etiquetados como [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — consulta nuestra [Guía de contribución](CONTRIBUTING.md#first-time-contributors) para saber cómo empezar. ¡PRs con IA/vibe-coded son bienvenidos! 🤖 + +Ver [CONTRIBUTING.md](CONTRIBUTING.md) y [CLA.md](docs/contributing/cla.md). Implementa un trait, envía un PR: + +- Guía de flujo de trabajo CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Nuevo `Provider` → `src/providers/` +- Nuevo `Channel` → `src/channels/` +- Nuevo `Observer` → `src/observability/` +- Nuevo `Tool` → `src/tools/` +- Nuevo `Memory` → `src/memory/` +- Nuevo `Tunnel` → `src/tunnel/` +- Nuevo `Peripheral` → `src/peripherals/` +- Nuevo `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Repositorio oficial y advertencia de suplantación + +**Este es el único repositorio oficial de ZeroClaw:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Cualquier otro repositorio, organización, dominio o paquete que afirme ser "ZeroClaw" o implique afiliación con ZeroClaw Labs **no está autorizado y no está afiliado con este proyecto**. Los forks no autorizados conocidos se listarán en [TRADEMARK.md](docs/maintainers/trademark.md). + +Si encuentras suplantación o uso indebido de marca, por favor [abre un issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Licencia + +ZeroClaw tiene doble licencia para máxima apertura y protección de los contribuidores: + +| Licencia | Caso de uso | +|---|---| +| [MIT](LICENSE-MIT) | Código abierto, investigación, académico, uso personal | +| [Apache 2.0](LICENSE-APACHE) | Protección de patentes, institucional, despliegue comercial | + +Puedes elegir cualquiera de las licencias. **Los contribuidores otorgan automáticamente derechos bajo ambas** — ver [CLA.md](docs/contributing/cla.md) para el acuerdo completo de contribuidores. + +### Marca registrada + +El nombre y logo de **ZeroClaw** son marcas registradas de ZeroClaw Labs. Esta licencia no otorga permiso para usarlos para implicar respaldo o afiliación. Ver [TRADEMARK.md](docs/maintainers/trademark.md) para usos permitidos y prohibidos. + +### Protecciones para contribuidores + +- **Conservas el copyright** de tus contribuciones +- **Concesión de patentes** (Apache 2.0) te protege de reclamaciones de patentes de otros contribuidores +- Tus contribuciones son **permanentemente atribuidas** en el historial de commits y [NOTICE](NOTICE) +- No se transfieren derechos de marca registrada al contribuir + +--- + +**ZeroClaw** — Cero sobrecarga. Cero compromisos. Despliega en cualquier lugar. Intercambia cualquier cosa. 🦀 + +## Contribuidores + + + ZeroClaw contributors + + +Esta lista se genera a partir del gráfico de contribuidores de GitHub y se actualiza automáticamente. + +## Historial de estrellas + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.fi.md b/third_party/zeroclaw/README.fi.md new file mode 100644 index 0000000..e3a6391 --- /dev/null +++ b/third_party/zeroclaw/README.fi.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Henkilokohtainen tekoalyavustaja

+ +

+ Nolla ylimaaraa. Nolla kompromisseja. 100% Rust. 100% Agnostinen.
+ ⚡️ Toimii $10 laitteistolla alle 5MB RAM:lla: Se on 99% vahemman muistia kuin OpenClaw ja 98% halvempaa kuin Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Rakennettu Harvardin, MIT:n ja Sundai.Club-yhteisöjen opiskelijoiden ja jasenien toimesta. +

+ +

+ 🌐 Kielet: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw on henkilokohtainen tekoalyavustaja, jota kaytat omilla laitteillasi. Se vastaa sinulle jo kayttamillasi kanavilla (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work ja muut). Silla on web-hallintapaneeli reaaliaikaiseen ohjaukseen ja se voi yhdistaa laitteistoperiferioihin (ESP32, STM32, Arduino, Raspberry Pi). Gateway on vain ohjaustaaso — tuote on avustaja. + +Jos haluat henkilokohtaisen, yhden kayttajan avustajan, joka tuntuu paikalliselta, nopealta ja aina paalla olevalta, tama on se. + +

+ Verkkosivusto · + Dokumentaatio · + Arkkitehtuuri · + Aloita · + Siirtyminen OpenClawsta · + Vianetsinta · + Discord +

+ +> **Suositeltu asennus:** suorita `zeroclaw onboard` terminaalissasi. ZeroClaw Onboard opastaa sinut vaihe vaiheelta gatewayn, tyotilan, kanavien ja palveluntarjoajan asennuksessa. Se on suositeltu asennuspolku ja toimii macOS:lla, Linuxilla ja Windowsilla (WSL2:n kautta). Uusi asennus? Aloita tasta: [Aloita](#pikaaloitus-tldr) + +### Tilaustunnistautuminen (OAuth) + +- **OpenAI Codex** (ChatGPT-tilaus) +- **Gemini** (Google OAuth) +- **Anthropic** (API-avain tai tunnistautumistokeni) + +Mallien huomautus: vaikka monia palveluntarjoajia/malleja tuetaan, parhaan kokemuksen saamiseksi kayta vahvinta saatavilla olevaa uusimman sukupolven mallia. Katso [Onboarding](#pikaaloitus-tldr). + +Mallien konfiguraatio + CLI: [Palveluntarjoajien viite](docs/reference/api/providers-reference.md) +Tunnistautumisprofiilin kierto (OAuth vs API-avaimet) + failover: [Mallien failover](docs/reference/api/providers-reference.md) + +## Asennus (suositeltu) + +Ajoymparisto: Rust stable toolchain. Yksi binaari, ei ajoympariston riippuvuuksia. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Yhden napsautuksen asennus + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` suoritetaan automaattisesti asennuksen jalkeen tyotilan ja palveluntarjoajan konfiguroimiseksi. + +## Pikaaloitus (TL;DR) + +Taysi aloittelijan opas (tunnistautuminen, paritus, kanavat): [Aloita](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Asennus + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Kaynnista gateway (webhook-palvelin + web-hallintapaneeli) +zeroclaw gateway # oletus: 127.0.0.1:42617 +zeroclaw gateway --port 0 # satunnainen portti (turvallisuuskovennettu) + +# Puhu avustajalle +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interaktiivinen tila +zeroclaw agent + +# Kaynnista taysi autonominen ajoymparisto (gateway + kanavat + cron + hands) +zeroclaw daemon + +# Tarkista tila +zeroclaw status + +# Suorita diagnostiikka +zeroclaw doctor +``` + +Paivitat? Suorita `zeroclaw doctor` paivityksen jalkeen. + +### Lahdekoodista (kehitys) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Kehitysvaihtoehto (ei globaalia asennusta):** lisaa komentoihin etuliite `cargo run --release --` (esimerkki: `cargo run --release -- status`). + +## Siirtyminen OpenClawsta + +ZeroClaw voi tuoda OpenClaw-tyotilasi, muistisi ja maaritykset: + +```bash +# Esikatsele mita siirretaan (turvallinen, vain luku) +zeroclaw migrate openclaw --dry-run + +# Suorita siirto +zeroclaw migrate openclaw +``` + +Tama siirtaa muistimerkinnot, tyotilan tiedostot ja maaritykset hakemistosta `~/.openclaw/` hakemistoon `~/.zeroclaw/`. Maaritykset muunnetaan automaattisesti JSON:sta TOML:ksi. + +## Turvallisuuden oletusasetukset (DM-paasy) + +ZeroClaw yhdistaa todellisiin viestintapintoihin. Kasittele saapuvia DM-viesteja luottamattomana syotteena. + +Taysi turvallisuusopas: [SECURITY.md](SECURITY.md) + +Oletuskayttaytyminen kaikilla kanavilla: + +- **DM-paritus** (oletus): tuntemattomat lahettajat saavat lyhyen parituskoodin ja botti ei kasittele heidan viestiaan. +- Hyvaksy komennolla: `zeroclaw pairing approve ` (jonka jalkeen lahettaja lisataan paikalliselle sallittujen listalle). +- Julkiset saapuvat DM:t vaativat nimenomaisen opt-in-asetuksen `config.toml`-tiedostossa. +- Suorita `zeroclaw doctor` tunnistaaksesi riskilliset tai vaarinkonfiguroidut DM-kaytannot. + +**Autonomiatasot:** + +| Taso | Kayttaytyminen | +|------|----------------| +| `ReadOnly` | Agentti voi tarkkailla mutta ei toimia | +| `Supervised` (oletus) | Agentti toimii hyvaksynnalla keskitason/korkean riskin toiminnoissa | +| `Full` | Agentti toimii itsenaisesti kaytantorajojen sisalla | + +**Sandboxing-kerrokset:** tyotilan eristys, polun lapikulun esto, komentojen sallittujen listat, kielletyt polut (`/etc`, `/root`, `~/.ssh`), nopeusrajoitus (max toiminnot/tunti, kustannus/paiva-rajoitukset). + + + + +### 📢 Ilmoitukset + +Kayta tata taulua tarkeisiin ilmoituksiin (yhteensopivuutta rikkovat muutokset, turvallisuustiedotteet, yllapitoikkunat ja julkaisun estajat). + +| Paivamaara (UTC) | Taso | Ilmoitus | Toimenpide | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Kriittinen_ | **Emme** ole yhteydessa `openagen/zeroclaw`-, `zeroclaw.org`- tai `zeroclaw.net`-sivustoihin. `zeroclaw.org`- ja `zeroclaw.net`-verkkotunnukset osoittavat talla hetkella `openagen/zeroclaw`-haaraan, ja tuo verkkotunnus/varasto esiintyy virallisen verkkosivustomme/projektimme nimissa. | Ala luota naista lahteista perasin oleviin tietoihin, binaareihin, varainkeruuseen tai ilmoituksiin. Kayta vain [tata varastoa](https://github.com/zeroclaw-labs/zeroclaw) ja vahvistettuja sosiaalisen median tilejamme. | +| 2026-02-21 | _Tarkea_ | Virallinen verkkosivustomme on nyt toiminnassa: [zeroclawlabs.ai](https://zeroclawlabs.ai). Kiitos karsivallisyydestanne julkaisun valmistelun aikana. Nakemme edelleen esiintymisyrityksia, joten **ala** liity mihinkaan sijoitus- tai varainkeruutoimintaan, joka vaittaa ZeroClaw-nimea, ellei se ole julkaistu virallisten kanaviemme kautta. | Kayta [tata varastoa](https://github.com/zeroclaw-labs/zeroclaw) ainoana totuuden lahteena. Seuraa [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs) ja [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) virallisia paivityksia varten. | +| 2026-02-19 | _Tarkea_ | Anthropic paivitti tunnistautumis- ja tunnistetietojen kaytonehdat 2026-02-19. Claude Code OAuth -tokenit (Free, Pro, Max) on tarkoitettu yksinomaan Claude Codelle ja Claude.ai:lle; OAuth-tokenien kayttaminen Claude Free/Pro/Max -palvelusta missaan muussa tuotteessa, tyokalussa tai palvelussa (mukaan lukien Agent SDK) ei ole sallittua ja voi rikkoa kuluttajakayttoehtoja. | Ole hyva ja valta valikaisesti Claude Code OAuth -integraatioita mahdollisen menetyksen estamiseksi. Alkuperainen lauseke: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Kohokodat + +- **Kevyt ajoymparisto oletuksena** — tavalliset CLI- ja tilatyonkulut toimivat muutaman megatavun muistibudjetissa release-buildeissa. +- **Kustannustehokas kayttoönotto** — suunniteltu $10-korteille ja pienille pilvi-instansseille, ilman raskaita ajoympariston riippuvuuksia. +- **Nopeat kylmakaunnistykset** — yhden binaarin Rust-ajoymparisto pitaa komento- ja daemon-kaynnistyksen lahes valittomana. +- **Siirrettava arkkitehtuuri** — yksi binaari ARM-, x86- ja RISC-V-alustoilla vaihdettavilla palveluntarjoajilla/kanavilla/tyokaluilla. +- **Paikallinen-ensin Gateway** — yksi ohjaustaaso istunnoille, kanaville, tyokaluille, cronille, SOP:ille ja tapahtumille. +- **Monikanavainen saapuva** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket ja muut. +- **Moniagentin orkestrointi (Hands)** — autonomiset agenttiparvet, jotka toimivat aikataulutettusti ja alykkyytyvat ajan myota. +- **Vakiotoimintamenettelyt (SOPs)** — tapahtumapohjainen tyonkulun automatisointi MQTT-, webhook-, cron- ja periferia-laukaisijoilla. +- **Web-hallintapaneeli** — React 19 + Vite web-kayttoliittyma reaaliaikaisella chatilla, muistiselaimella, maaritysten muokkaimella, cron-hallinnalla ja tyokalujen tarkastimella. +- **Laitteistoperiferiat** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO `Peripheral`-traitin kautta. +- **Ensiluokkaiset tyokalut** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace ja 70+ lisaa. +- **Elinkaarikoukut** — LLM-kutsujen, tyokalujen suoritusten ja viestien sieppaus ja muokkaus joka vaiheessa. +- **Taitoplattformi** — sisaanrakennetut, yhteison ja tyotilan taidot turvallisuustarkastuksella. +- **Tunnelituki** — Cloudflare, Tailscale, ngrok, OpenVPN ja mukautetut tunnelit etapaasyyn. + +### Miksi tiimit valitsevat ZeroClaw:n + +- **Kevyt oletuksena:** pieni Rust-binaari, nopea kaynnistys, alhainen muistijalanjalki. +- **Turvallinen suunnittelulla:** paritus, tiukka sandboxing, nimenomaiset sallittujen listat, tyotilan rajaus. +- **Taysin vaihdettava:** ydinjarjestelmat ovat traiteja (providers, channels, tools, memory, tunnels). +- **Ei lukkiutumista:** OpenAI-yhteensopiva palveluntarjoajatuki + liitettavat mukautetut paatepisteet. + +## Vertailun tilannekuva (ZeroClaw vs OpenClaw, Toistettava) + +Paikallisen koneen pikavertailu (macOS arm64, helmi 2026) normalisoitu 0.8GHz reunalaitteistolle. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Kieli** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Kaynnistys (0.8GHz core)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Binaarin koko** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Kustannus** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Mika tahansa laitteisto $10** | + +> Huomautukset: ZeroClaw-tulokset mitattu release-buildeilla kayttaen `/usr/bin/time -l`. OpenClaw vaatii Node.js-ajoympariston (tyypillisesti ~390MB ylimaaraista muistikuormaa), kun taas NanoBot vaatii Python-ajoympariston. PicoClaw ja ZeroClaw ovat staattisia binaareja. Yllaolevat RAM-luvut ovat ajoaikaista muistia; kaannosaikaiset vaatimukset ovat korkeammat. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Toistettava paikallinen mittaus + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Kaikki mita olemme rakentaneet tahan mennessa + +### Ydinplattformi + +- Gateway HTTP/WS/SSE -ohjaustaaso istunnoilla, lasnaololla, maarityksilla, cronilla, webhookeilla, web-hallintapaneelilla ja parituksella. +- CLI-pinta: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Agentin orkestroinnin silmukka tyokalujen lahettamisella, kehotteen rakentamisella, viestien luokittelulla ja muistin lataamisella. +- Istuntomalli turvallisuuskaytannon noudattamisella, autonomiatasoilla ja hyvaksyntaporttauksella. +- Kestava palveluntarjoajan kapselointi failoverilla, uudelleenyrityksella ja mallien reitityksella 20+ LLM-taustalle. + +### Kanavat + +Kanavat: WhatsApp (native), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Web-hallintapaneeli + +React 19 + Vite 6 + Tailwind CSS 4 web-hallintapaneeli, jota tarjoillaan suoraan Gatewaysta: + +- **Dashboard** — jarjestelman yleiskatsaus, terveydentila, kaynnissaoloaika, kustannusten seuranta +- **Agent Chat** — interaktiivinen keskustelu agentin kanssa +- **Memory** — muistimerkintöjen selaus ja hallinta +- **Config** — maaritysten katselu ja muokkaus +- **Cron** — ajastettujen tehtavien hallinta +- **Tools** — kaytettavissa olevien tyokalujen selaus +- **Logs** — agentin toimintalokien katselu +- **Cost** — tokenien kaytto ja kustannusten seuranta +- **Doctor** — jarjestelman terveysdiagnostiikka +- **Integrations** — integraatioiden tila ja asennus +- **Pairing** — laiteparituksen hallinta + +### Firmware-kohteet + +| Kohde | Alusta | Tarkoitus | +|-------|--------|-----------| +| ESP32 | Espressif ESP32 | Langaton periferia-agentti | +| ESP32-UI | ESP32 + Display | Agentti visuaalisella kayttoliittymalla | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Teollinen periferia | +| Arduino | Arduino | Perusanturi-/toimilaitesilta | +| Uno Q Bridge | Arduino Uno | Sarjasilta agenttiin | + +### Tyokalut + automatisointi + +- **Ydin:** shell, file read/write/edit, git operations, glob search, content search +- **Web:** browser control, web fetch, web search, screenshot, image info, PDF read +- **Integraatiot:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **Ajastus:** cron add/remove/update/run, schedule tool +- **Muisti:** recall, store, forget, knowledge, project intel +- **Edistyneet:** delegate (agent-to-agent), swarm, model switch/routing, security ops, cloud ops +- **Laitteisto:** board info, memory map, memory read (feature-gated) + +### Ajoymparisto + turvallisuus + +- **Autonomiatasot:** ReadOnly, Supervised (oletus), Full. +- **Sandboxing:** tyotilan eristys, polun lapikulun esto, komentojen sallittujen listat, kielletyt polut, Landlock (Linux), Bubblewrap. +- **Nopeusrajoitus:** max toiminnot tunnissa, max kustannus paivassa (konfiguroitavissa). +- **Hyvaksyntaporttaus:** interaktiivinen hyvaksynta keskitason/korkean riskin toiminnoille. +- **E-stop:** hatapysaytysmahdollisuus. +- **129+ turvallisuustestia** automatisoidussa CI:ssa. + +### Toiminnot + paketointi + +- Web-hallintapaneeli tarjoillaan suoraan Gatewaysta. +- Tunnelituki: Cloudflare, Tailscale, ngrok, OpenVPN, mukautettu komento. +- Docker runtime -adapteri konttiin ajettuun suoritukseen. +- CI/CD: beta (auto on push) → stable (manual dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Valmiit binaarit Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Maaritykset + +Minimaalinen `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Taysi maaritysviite: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Kanavan maaritys + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Tunnelin maaritys + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Lisatietoja: [Kanavaviite](docs/reference/api/channels-reference.md) · [Maaritysviite](docs/reference/api/config-reference.md) + +### Ajoymparistotuki (nykyinen) + +- **`native`** (oletus) — suora prosessin suoritus, nopein polku, ihanteellinen luotetuissa ymparistoissa. +- **`docker`** — taysi konttieristys, pakotetut turvallisuuskaytannot, vaatii Dockerin. + +Aseta `runtime.kind = "docker"` tiukkaan sandboxingiin tai verkon eristykseen. + +## Tilaustunnistautuminen (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw tukee tilausnatiiveja tunnistautumisprofiileja (useita tileja, salattu levossa). + +- Tallennustiedosto: `~/.zeroclaw/auth-profiles.json` +- Salausavain: `~/.zeroclaw/.secret_key` +- Profiilin tunnistemuoto: `:` (esimerkki: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT subscription) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Check / refresh / switch profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Run the agent with subscription auth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Agentin tyotila + taidot + +Tyotilan juuri: `~/.zeroclaw/workspace/` (konfiguroitavissa maaritysten kautta). + +Injektoidut kehotetiedostot: +- `IDENTITY.md` — agentin persoona ja rooli +- `USER.md` — kayttajan konteksti ja mieltymykset +- `MEMORY.md` — pitkaaikaiset tosiasiat ja opit +- `AGENTS.md` — istuntokonventiot ja alustussaannot +- `SOUL.md` — ydinidentiteetti ja toimintaperiaatteet + +Taidot: `~/.zeroclaw/workspace/skills//SKILL.md` tai `SKILL.toml`. + +```bash +# List installed skills +zeroclaw skills list + +# Install from git +zeroclaw skills install https://github.com/user/my-skill.git + +# Security audit before install +zeroclaw skills audit https://github.com/user/my-skill.git + +# Remove a skill +zeroclaw skills remove my-skill +``` + +## CLI-komennot + +```bash +# Tyotilan hallinta +zeroclaw onboard # Opastettu asennusvelho +zeroclaw status # Nayta daemon/agentin tila +zeroclaw doctor # Suorita jarjestelman diagnostiikka + +# Gateway + daemon +zeroclaw gateway # Kaynnista gateway-palvelin (127.0.0.1:42617) +zeroclaw daemon # Kaynnista taysi autonominen ajoymparisto + +# Agentti +zeroclaw agent # Interaktiivinen keskustelutila +zeroclaw agent -m "message" # Yksittaisen viestin tila + +# Palvelun hallinta +zeroclaw service install # Asenna OS-palveluna (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Kanavat +zeroclaw channel list # Listaa konfiguroidut kanavat +zeroclaw channel doctor # Tarkista kanavien terveys +zeroclaw channel bind-telegram 123456789 + +# Cron + ajastus +zeroclaw cron list # Listaa ajastetut tehtavat +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Muisti +zeroclaw memory list # Listaa muistimerkinnot +zeroclaw memory get # Hae muisti +zeroclaw memory stats # Muistin tilastot + +# Tunnistautumisprofiilit +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Laitteistoperiferiat +zeroclaw hardware discover # Etsi yhdistettuja laitteita +zeroclaw peripheral list # Listaa yhdistetyt periferiat +zeroclaw peripheral flash # Flash-ohjelma laitteeseen + +# Siirto +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell-taydennykset +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Taysi komentoreferenssi: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Esivaatimukset + +
+Windows + +#### Vaaditut + +1. **Visual Studio Build Tools** (tarjoaa MSVC-linkerin ja Windows SDK:n): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Asennuksen aikana (tai Visual Studio Installerin kautta) valitse **"Desktop development with C++"** -tyokuorma. + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Asennuksen jalkeen avaa uusi terminaali ja suorita `rustup default stable` varmistaaksesi, etta vakaa toolchain on aktiivinen. + +3. **Vahvista**, etta molemmat toimivat: + ```powershell + rustc --version + cargo --version + ``` + +#### Valinnainen + +- **Docker Desktop** — vaaditaan vain kaytettaessa [Docker sandboxed runtime](#ajoymparistotuki-nykyinen) (`runtime.kind = "docker"`). Asenna komennolla `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Vaaditut + +1. **Kaannostyokalut:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Asenna Xcode Command Line Tools: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Katso [rustup.rs](https://rustup.rs) lisatietoja varten. + +3. **Vahvista**, etta molemmat toimivat: + ```bash + rustc --version + cargo --version + ``` + +#### Yhden rivin asentaja + +Tai ohita yllaolevat vaiheet ja asenna kaikki (jarjestelmariippuvuudet, Rust, ZeroClaw) yhdella komennolla: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Kaannosresurssivaatimukset + +Lahdekoodista rakentaminen vaatii enemman resursseja kuin tuloksena olevan binaarin suorittaminen: + +| Resurssi | Vahimmais | Suositeltu | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Vapaa levy** | 6 GB | 10 GB+ | + +Jos isantasi on vahimmaisvaatimuksen alla, kayta valmiita binaareja: + +```bash +./install.sh --prefer-prebuilt +``` + +Pelkan binaarin asennukseen ilman lahdekoodi-vaihtoehtoa: + +```bash +./install.sh --prebuilt-only +``` + +#### Valinnainen + +- **Docker** — vaaditaan vain kaytettaessa [Docker sandboxed runtime](#ajoymparistotuki-nykyinen) (`runtime.kind = "docker"`). Asenna paketinhallintasi kautta tai [docker.com](https://docs.docker.com/engine/install/). + +> **Huomautus:** Oletus `cargo build --release` kayttaa `codegen-units=1` kaannoshuippupaineen vahentamiseksi. Nopeampiin kaanntöihin tehokkailla koneilla kayta `cargo build --profile release-fast`. + +
+ + + +### Valmiit binaarit + +Julkaisuresurssit julkaistaan seuraaville: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Lataa uusimmat resurssit osoitteesta: + + +## Dokumentaatio + +Kayta naita, kun olet ohittanut onboarding-kulun ja haluat syvemman viitteen. + +- Aloita [dokumentaatioindeksista](docs/README.md) navigointiin ja "mika on missa" -tietoon. +- Lue [arkkitehtuurin yleiskatsaus](docs/architecture.md) taydelliseen jarjestelmamalliin. +- Kayta [maaritysviitetta](docs/reference/api/config-reference.md), kun tarvitset jokaisen avaimen ja esimerkin. +- Suorita Gateway kirjan mukaan [kayttokirjalla](docs/ops/operations-runbook.md). +- Noudata [ZeroClaw Onboard](#pikaaloitus-tldr) -palvelua opastettuun asennukseen. +- Korjaa yleisia vikoja [vianetsintaoppaalla](docs/ops/troubleshooting.md). +- Tarkista [turvallisuusohjeet](docs/security/README.md) ennen kuin paljastat mitaan. + +### Viitedokumentaatio + +- Dokumentaatiokeskus: [docs/README.md](docs/README.md) +- Yhtenaistetty sisallysluettelo: [docs/SUMMARY.md](docs/SUMMARY.md) +- Komentoreferenssi: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Maaritysviite: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Palveluntarjoajien viite: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Kanavaviite: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Kayttokirja: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Vianetsinta: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Yhteistyodokumentaatio + +- Osallistumisopas: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR-tyonkulun kaytanto: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI-tyonkulun opas: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Arvioijan kasikirja: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Turvallisuuden julkistuskaytanto: [SECURITY.md](SECURITY.md) +- Dokumentaatiomalli: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Kayttoönotto + toiminnot + +- Verkkokayyttoönotto-opas: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Proxy-agentin kasikirja: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Laitteisto-oppaat: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw rakennettiin smooth crab 🦀 -kaveria varten, nopea ja tehokas tekoalyavustaja. Rakennettu Argenis De La Rosan ja yhteison toimesta. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Tue ZeroClaw:ta + +Jos ZeroClaw auttaa tyossasi ja haluat tukea jatkuvaa kehitysta, voit lahjoittaa tassa: + +Buy Me a Coffee + +### 🙏 Erityiskiitokset + +Sydamellinen kiitos yhteisöille ja instituutioille, jotka inspiroivat ja ruokkivat tata avoimen lahdekoodin tyota: + +- **Harvard University** — alyllisen uteliaisuuden edistamisesta ja mahdollisuuksien rajojen tyontamisesta. +- **MIT** — avoimen tiedon, avoimen lahdekoodin ja uskon puolustamisesta, etta teknologian tulisi olla kaikkien saatavilla. +- **Sundai Club** — yhteisosta, energiasta ja leppymattomasta halusta rakentaa tarkeita asioita. +- **Maailma ja sen tuolla puolen** 🌍✨ — jokaiselle osallistujalle, haaveilijalle ja rakentajalle, joka tekee avoimesta lahdekoodista hyvan voiman. Tama on sinulle. + +Rakennamme avoimesti, koska parhaat ideat tulevat kaikkialta. Jos luet taman, olet osa sita. Tervetuloa. 🦀❤️ + +## Osallistuminen + +Uusi ZeroClaw:ssa? Etsi issueita merkinnalla [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — katso [Osallistumisoppaamme](CONTRIBUTING.md#first-time-contributors) aloittaaksesi. AI/vibe-koodatut PR:t tervetulleita! 🤖 + +Katso [CONTRIBUTING.md](CONTRIBUTING.md) ja [CLA.md](docs/contributing/cla.md). Toteuta trait, laheta PR: + +- CI-tyonkulun opas: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Uusi `Provider` → `src/providers/` +- Uusi `Channel` → `src/channels/` +- Uusi `Observer` → `src/observability/` +- Uusi `Tool` → `src/tools/` +- Uusi `Memory` → `src/memory/` +- Uusi `Tunnel` → `src/tunnel/` +- Uusi `Peripheral` → `src/peripherals/` +- Uusi `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Virallinen varasto ja esiintymisvaroitus + +**Tama on ainoa virallinen ZeroClaw-varasto:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Mika tahansa muu varasto, organisaatio, verkkotunnus tai paketti, joka vaittaa olevansa "ZeroClaw" tai viittaa yhteyteen ZeroClaw Labsin kanssa, on **luvaton eika liity tahan projektiin**. Tunnetut luvattomat forkit listataan [TRADEMARK.md](docs/maintainers/trademark.md)-tiedostossa. + +Jos kohtaat esiintymista tai tavaramerkin vaarinkayttoa, ole hyva ja [avaa issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Lisenssi + +ZeroClaw on kaksoislisenssoitu maksimaalisen avoimuuden ja osallistujien suojan takaamiseksi: + +| Lisenssi | Kayttotapaus | +|---|---| +| [MIT](LICENSE-MIT) | Avoin lahdekoodi, tutkimus, akateeminen, henkilokohtainen kaytto | +| [Apache 2.0](LICENSE-APACHE) | Patenttisuoja, institutionaalinen, kaupallinen kayttoönotto | + +Voit valita kumman tahansa lisenssin. **Osallistujat myontavat automaattisesti oikeudet molempien alla** — katso [CLA.md](docs/contributing/cla.md) tayden osallistujasopimuksen. + +### Tavaramerkki + +**ZeroClaw**-nimi ja logo ovat ZeroClaw Labsin tavaramerkkeja. Tama lisenssi ei anna lupaa kayttaa niita tuen tai yhteyden vihjamiseen. Katso [TRADEMARK.md](docs/maintainers/trademark.md) sallittujen ja kiellettyjen kayttojen osalta. + +### Osallistujien suojat + +- **Sailytat tekijanoikeuden** osallistumisiisi +- **Patenttimyonnos** (Apache 2.0) suojaa sinua muiden osallistujien patenttivaatimuksilta +- Osallistumisesi ovat **pysyvasti attribuoitu** commit-historiassa ja [NOTICE](NOTICE)-tiedostossa +- Tavaramerkkioikeuksia ei siirreta osallistumalla + +--- + +**ZeroClaw** — Nolla ylimaaraa. Nolla kompromisseja. Kayttoönotto minne tahansa. Vaihda mita tahansa. 🦀 + +## Osallistujat + + + ZeroClaw contributors + + +Tama lista luodaan GitHubin osallistujakaaviosta ja paivittyy automaattisesti. + +## Tahtihistoria + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.fr.md b/third_party/zeroclaw/README.fr.md new file mode 100644 index 0000000..d7c1d00 --- /dev/null +++ b/third_party/zeroclaw/README.fr.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Assistant Personnel IA

+ +

+ Zéro overhead. Zéro compromis. 100% Rust. 100% Agnostique.
+ ⚡️ Fonctionne sur du matériel à $10 avec <5Mo de RAM : 99% de mémoire en moins qu'OpenClaw et 98% moins cher qu'un Mac mini ! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Construit par des étudiants et membres des communautés de Harvard, MIT et Sundai.Club. +

+ +

+ 🌐 Langues : + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw est un assistant personnel IA que vous exécutez sur vos propres appareils. Il vous répond sur les canaux que vous utilisez déjà (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work et plus). Il dispose d'un tableau de bord web pour le contrôle en temps réel et peut se connecter à des périphériques matériels (ESP32, STM32, Arduino, Raspberry Pi). Le Gateway n'est que le plan de contrôle — le produit est l'assistant. + +Si vous voulez un assistant personnel, mono-utilisateur, qui soit local, rapide et toujours disponible, c'est celui-ci. + +

+ Site web · + Documentation · + Architecture · + Premiers pas · + Migration depuis OpenClaw · + Dépannage · + Discord +

+ +> **Configuration recommandée :** exécutez `zeroclaw onboard` dans votre terminal. ZeroClaw Onboard vous guide étape par étape dans la configuration du gateway, du workspace, des canaux et du fournisseur. C'est le chemin de configuration recommandé et fonctionne sur macOS, Linux et Windows (via WSL2). Nouvelle installation ? Commencez ici : [Premiers pas](#démarrage-rapide) + +### Authentification par abonnement (OAuth) + +- **OpenAI Codex** (abonnement ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (clé API ou jeton d'authentification) + +Note sur les modèles : bien que de nombreux fournisseurs/modèles soient supportés, pour la meilleure expérience utilisez le modèle de dernière génération le plus puissant disponible. Voir [Onboarding](#démarrage-rapide). + +Configuration des modèles + CLI : [Référence des fournisseurs](docs/reference/api/providers-reference.md) +Rotation des profils d'authentification (OAuth vs clés API) + failover : [Failover des modèles](docs/reference/api/providers-reference.md) + +## Installation (recommandée) + +Prérequis : toolchain Rust stable. Un seul binaire, aucune dépendance d'exécution. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Bootstrap en un clic + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` s'exécute automatiquement après l'installation pour configurer votre workspace et fournisseur. + +## Démarrage rapide (TL;DR) + +Guide complet pour débutants (authentification, appairage, canaux) : [Premiers pas](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Installer + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Démarrer le gateway (serveur webhook + tableau de bord web) +zeroclaw gateway # par défaut : 127.0.0.1:42617 +zeroclaw gateway --port 0 # port aléatoire (sécurité renforcée) + +# Parler à l'assistant +zeroclaw agent -m "Hello, ZeroClaw!" + +# Mode interactif +zeroclaw agent + +# Démarrer le runtime autonome complet (gateway + canaux + cron + hands) +zeroclaw daemon + +# Vérifier le statut +zeroclaw status + +# Exécuter les diagnostics +zeroclaw doctor +``` + +Mise à jour ? Exécutez `zeroclaw doctor` après la mise à jour. + +### Depuis le code source (développement) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Alternative pour le développement (sans installation globale) :** préfixez les commandes avec `cargo run --release --` (exemple : `cargo run --release -- status`). + +## Migration depuis OpenClaw + +ZeroClaw peut importer votre workspace, mémoire et configuration OpenClaw : + +```bash +# Aperçu de ce qui sera migré (sûr, lecture seule) +zeroclaw migrate openclaw --dry-run + +# Exécuter la migration +zeroclaw migrate openclaw +``` + +Cela migre vos entrées de mémoire, fichiers du workspace et configuration de `~/.openclaw/` vers `~/.zeroclaw/`. La configuration est convertie de JSON en TOML automatiquement. + +## Paramètres de sécurité par défaut (accès DM) + +ZeroClaw se connecte à de vraies surfaces de messagerie. Traitez les DM entrants comme des entrées non fiables. + +Guide complet de sécurité : [SECURITY.md](SECURITY.md) + +Comportement par défaut sur tous les canaux : + +- **Appairage DM** (par défaut) : les expéditeurs inconnus reçoivent un court code d'appairage et le bot ne traite pas leur message. +- Approuver avec : `zeroclaw pairing approve ` (l'expéditeur est alors ajouté à une liste d'autorisation locale). +- Les DM publics entrants nécessitent une activation explicite dans `config.toml`. +- Exécutez `zeroclaw doctor` pour détecter les politiques DM risquées ou mal configurées. + +**Niveaux d'autonomie :** + +| Niveau | Comportement | +|--------|--------------| +| `ReadOnly` | L'agent peut observer mais pas agir | +| `Supervised` (par défaut) | L'agent agit avec approbation pour les opérations à risque moyen/élevé | +| `Full` | L'agent agit de manière autonome dans les limites de la politique | + +**Couches de sandboxing :** isolation du workspace, blocage de la traversée de chemins, listes de commandes autorisées, chemins interdits (`/etc`, `/root`, `~/.ssh`), limitation de débit (max actions/heure, plafonds de coût/jour). + + + + +### 📢 Annonces + +Utilisez ce tableau pour les avis importants (changements incompatibles, avis de sécurité, fenêtres de maintenance et bloqueurs de version). + +| Date (UTC) | Niveau | Avis | Action | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Critique_ | Nous ne sommes **pas affiliés** à `openagen/zeroclaw`, `zeroclaw.org` ou `zeroclaw.net`. Les domaines `zeroclaw.org` et `zeroclaw.net` pointent actuellement vers le fork `openagen/zeroclaw`, et ce domaine/dépôt usurpent l'identité de notre site web/projet officiel. | Ne faites pas confiance aux informations, binaires, collectes de fonds ou annonces provenant de ces sources. Utilisez uniquement [ce dépôt](https://github.com/zeroclaw-labs/zeroclaw) et nos comptes sociaux vérifiés. | +| 2026-02-21 | _Important_ | Notre site web officiel est maintenant en ligne : [zeroclawlabs.ai](https://zeroclawlabs.ai). Merci de votre patience pendant que nous préparions le lancement. Nous continuons de voir des tentatives d'usurpation d'identité, donc ne participez **pas** à des activités d'investissement ou de collecte de fonds utilisant le nom ZeroClaw sauf si elles sont publiées via nos canaux officiels. | Utilisez [ce dépôt](https://github.com/zeroclaw-labs/zeroclaw) comme seule source de vérité. Suivez [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Groupe)](https://www.facebook.com/groups/zeroclawlabs) et [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) pour les mises à jour officielles. | +| 2026-02-19 | _Important_ | Anthropic a mis à jour les conditions d'Authentification et d'Utilisation des Identifiants le 2026-02-19. Les jetons OAuth de Claude Code (Free, Pro, Max) sont destinés exclusivement à Claude Code et Claude.ai ; utiliser des jetons OAuth de Claude Free/Pro/Max dans tout autre produit, outil ou service (y compris Agent SDK) n'est pas autorisé et peut violer les Conditions d'Utilisation du Consommateur. | Veuillez éviter temporairement les intégrations OAuth de Claude Code pour prévenir les pertes potentielles. Clause originale : [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Points forts + +- **Runtime léger par défaut** — les flux de travail courants CLI et statut s'exécutent dans une enveloppe mémoire de quelques mégaoctets en builds release. +- **Déploiement économique** — conçu pour des cartes à $10 et de petites instances cloud, pas de dépendances d'exécution lourdes. +- **Démarrage à froid rapide** — le runtime Rust à binaire unique maintient le démarrage des commandes et du daemon quasi instantané. +- **Architecture portable** — un binaire pour ARM, x86 et RISC-V avec fournisseurs/canaux/outils interchangeables. +- **Gateway local-first** — plan de contrôle unique pour les sessions, canaux, outils, cron, SOPs et événements. +- **Boîte de réception multicanal** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket et plus. +- **Orchestration multi-agent (Hands)** — essaims d'agents autonomes qui s'exécutent selon un planning et deviennent plus intelligents avec le temps. +- **Procédures Opérationnelles Standard (SOPs)** — automatisation des flux de travail pilotée par événements avec MQTT, webhook, cron et déclencheurs de périphériques. +- **Tableau de bord web** — interface web React 19 + Vite avec chat en temps réel, navigateur de mémoire, éditeur de configuration, gestionnaire cron et inspecteur d'outils. +- **Périphériques matériels** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO via le trait `Peripheral`. +- **Outils de première classe** — shell, E/S fichiers, navigateur, git, web fetch/search, MCP, Jira, Notion, Google Workspace et plus de 70 autres. +- **Hooks de cycle de vie** — interceptez et modifiez les appels LLM, les exécutions d'outils et les messages à chaque étape. +- **Plateforme de skills** — skills intégrés, communautaires et du workspace avec audit de sécurité. +- **Support de tunnels** — Cloudflare, Tailscale, ngrok, OpenVPN et tunnels personnalisés pour l'accès distant. + +### Pourquoi les équipes choisissent ZeroClaw + +- **Léger par défaut :** petit binaire Rust, démarrage rapide, faible empreinte mémoire. +- **Sécurisé par conception :** appairage, sandboxing strict, listes d'autorisation explicites, portée du workspace. +- **Entièrement interchangeable :** les systèmes centraux sont des traits (fournisseurs, canaux, outils, mémoire, tunnels). +- **Pas de vendor lock-in :** support de fournisseurs compatibles OpenAI + endpoints personnalisés enfichables. + +## Résumé des benchmarks (ZeroClaw vs OpenClaw, reproductible) + +Benchmark rapide sur machine locale (macOS arm64, fév 2026) normalisé pour du matériel edge à 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Langage** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1Go | > 100Mo | < 10Mo | **< 5Mo** | +| **Démarrage (core 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Taille du binaire** | ~28Mo (dist) | N/A (Scripts) | ~8Mo | **~8.8 Mo** | +| **Coût** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **N'importe quel matériel $10** | + +> Notes : Les résultats de ZeroClaw sont mesurés sur des builds release avec `/usr/bin/time -l`. OpenClaw nécessite le runtime Node.js (typiquement ~390Mo de surcharge mémoire supplémentaire), tandis que NanoBot nécessite le runtime Python. PicoClaw et ZeroClaw sont des binaires statiques. Les chiffres de RAM ci-dessus sont la mémoire à l'exécution ; les besoins de compilation sont plus élevés. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Mesure locale reproductible + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Tout ce que nous avons construit jusqu'ici + +### Plateforme centrale + +- Plan de contrôle Gateway HTTP/WS/SSE avec sessions, présence, configuration, cron, webhooks, tableau de bord web et appairage. +- Surface CLI : `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Boucle d'orchestration de l'agent avec dispatch des outils, construction des prompts, classification des messages et chargement de la mémoire. +- Modèle de session avec application des politiques de sécurité, niveaux d'autonomie et validation conditionnelle. +- Wrapper de fournisseur résilient avec failover, retry et routage des modèles sur plus de 20 backends LLM. + +### Canaux + +Canaux : WhatsApp (natif), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Activés par feature gate : Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Tableau de bord web + +Tableau de bord web React 19 + Vite 6 + Tailwind CSS 4 servi directement depuis le Gateway : + +- **Dashboard** — vue d'ensemble du système, état de santé, uptime, suivi des coûts +- **Chat de l'agent** — chat interactif avec l'agent +- **Mémoire** — parcourir et gérer les entrées de mémoire +- **Configuration** — voir et modifier la configuration +- **Cron** — gérer les tâches planifiées +- **Outils** — parcourir les outils disponibles +- **Logs** — voir les journaux d'activité de l'agent +- **Coûts** — utilisation des tokens et suivi des coûts +- **Doctor** — diagnostics de santé du système +- **Intégrations** — statut et configuration des intégrations +- **Appairage** — gestion de l'appairage des appareils + +### Cibles firmware + +| Cible | Plateforme | Objectif | +|-------|------------|----------| +| ESP32 | Espressif ESP32 | Agent périphérique sans fil | +| ESP32-UI | ESP32 + Display | Agent avec interface visuelle | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Périphérique industriel | +| Arduino | Arduino | Pont capteurs/actionneurs basique | +| Uno Q Bridge | Arduino Uno | Pont série vers l'agent | + +### Outils + automatisation + +- **Core :** shell, lecture/écriture/édition de fichiers, opérations git, recherche glob, recherche de contenu +- **Web :** contrôle du navigateur, web fetch, web search, capture d'écran, informations d'image, lecture PDF +- **Intégrations :** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP :** Model Context Protocol tool wrapper + ensembles d'outils différés +- **Planification :** cron add/remove/update/run, outil de planification +- **Mémoire :** recall, store, forget, knowledge, project intel +- **Avancé :** delegate (agent vers agent), swarm, changement/routage de modèles, opérations de sécurité, opérations cloud +- **Matériel :** board info, memory map, memory read (activé par feature gate) + +### Runtime + sécurité + +- **Niveaux d'autonomie :** ReadOnly, Supervised (par défaut), Full. +- **Sandboxing :** isolation du workspace, blocage de la traversée de chemins, listes de commandes autorisées, chemins interdits, Landlock (Linux), Bubblewrap. +- **Limitation de débit :** max actions par heure, max coût par jour (configurable). +- **Validation conditionnelle :** approbation interactive pour les opérations à risque moyen/élevé. +- **Arrêt d'urgence :** capacité d'arrêt d'urgence. +- **129+ tests de sécurité** en CI automatisé. + +### Opérations + packaging + +- Tableau de bord web servi directement depuis le Gateway. +- Support de tunnels : Cloudflare, Tailscale, ngrok, OpenVPN, commande personnalisée. +- Adaptateur runtime Docker pour exécution conteneurisée. +- CI/CD : beta (automatique au push) → stable (dispatch manuel) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Binaires précompilés pour Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Configuration + +`~/.zeroclaw/config.toml` minimal : + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Référence complète de configuration : [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Configuration des canaux + +**Telegram :** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord :** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack :** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp :** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix :** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal :** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Configuration des tunnels + +```toml +[tunnel] +kind = "cloudflare" # ou "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Détails : [Référence des canaux](docs/reference/api/channels-reference.md) · [Référence de configuration](docs/reference/api/config-reference.md) + +### Support runtime (actuel) + +- **`native`** (par défaut) — exécution directe des processus, chemin le plus rapide, idéal pour les environnements de confiance. +- **`docker`** — isolation complète en conteneur, politiques de sécurité imposées, nécessite Docker. + +Définissez `runtime.kind = "docker"` pour un sandboxing strict ou l'isolation réseau. + +## Authentification par abonnement (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw supporte les profils d'authentification natifs par abonnement (multi-compte, chiffrés au repos). + +- Fichier de stockage : `~/.zeroclaw/auth-profiles.json` +- Clé de chiffrement : `~/.zeroclaw/.secret_key` +- Format d'id de profil : `:` (exemple : `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (abonnement ChatGPT) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Vérifier / rafraîchir / changer de profil +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Exécuter l'agent avec l'authentification par abonnement +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Workspace de l'agent + skills + +Racine du workspace : `~/.zeroclaw/workspace/` (configurable via config). + +Fichiers de prompt injectés : +- `IDENTITY.md` — personnalité et rôle de l'agent +- `USER.md` — contexte et préférences de l'utilisateur +- `MEMORY.md` — faits et leçons à long terme +- `AGENTS.md` — conventions de session et règles d'initialisation +- `SOUL.md` — identité centrale et principes opérationnels + +Skills : `~/.zeroclaw/workspace/skills//SKILL.md` ou `SKILL.toml`. + +```bash +# Lister les skills installés +zeroclaw skills list + +# Installer depuis git +zeroclaw skills install https://github.com/user/my-skill.git + +# Audit de sécurité avant installation +zeroclaw skills audit https://github.com/user/my-skill.git + +# Supprimer un skill +zeroclaw skills remove my-skill +``` + +## Commandes CLI + +```bash +# Gestion du workspace +zeroclaw onboard # Assistant de configuration guidée +zeroclaw status # Afficher le statut du daemon/agent +zeroclaw doctor # Exécuter les diagnostics système + +# Gateway + daemon +zeroclaw gateway # Démarrer le serveur gateway (127.0.0.1:42617) +zeroclaw daemon # Démarrer le runtime autonome complet + +# Agent +zeroclaw agent # Mode chat interactif +zeroclaw agent -m "message" # Mode message unique + +# Gestion des services +zeroclaw service install # Installer comme service OS (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Canaux +zeroclaw channel list # Lister les canaux configurés +zeroclaw channel doctor # Vérifier la santé des canaux +zeroclaw channel bind-telegram 123456789 + +# Cron + planification +zeroclaw cron list # Lister les tâches planifiées +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Mémoire +zeroclaw memory list # Lister les entrées de mémoire +zeroclaw memory get # Récupérer une mémoire +zeroclaw memory stats # Statistiques de la mémoire + +# Profils d'authentification +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Périphériques matériels +zeroclaw hardware discover # Scanner les appareils connectés +zeroclaw peripheral list # Lister les périphériques connectés +zeroclaw peripheral flash # Flasher le firmware sur l'appareil + +# Migration +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Complétion shell +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Référence complète des commandes : [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Prérequis + +
+Windows + +#### Requis + +1. **Visual Studio Build Tools** (fournit le linker MSVC et le SDK Windows) : + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Pendant l'installation (ou via le Visual Studio Installer), sélectionnez la charge de travail **"Développement Desktop en C++"**. + +2. **Toolchain Rust :** + + ```powershell + winget install Rustlang.Rustup + ``` + + Après l'installation, ouvrez un nouveau terminal et exécutez `rustup default stable` pour vous assurer que la toolchain stable est active. + +3. **Vérifiez** que les deux fonctionnent : + ```powershell + rustc --version + cargo --version + ``` + +#### Optionnel + +- **Docker Desktop** — requis uniquement si vous utilisez le [runtime sandbox Docker](#support-runtime-actuel) (`runtime.kind = "docker"`). Installez via `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Requis + +1. **Outils de compilation essentiels :** + - **Linux (Debian/Ubuntu) :** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL) :** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS :** Installez Xcode Command Line Tools : `xcode-select --install` + +2. **Toolchain Rust :** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Voir [rustup.rs](https://rustup.rs) pour les détails. + +3. **Vérifiez** que les deux fonctionnent : + ```bash + rustc --version + cargo --version + ``` + +#### Installateur en une ligne + +Ou passez les étapes ci-dessus et installez tout (dépendances système, Rust, ZeroClaw) en une seule commande : + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Besoins en ressources pour la compilation + +Compiler depuis le code source nécessite plus de ressources que l'exécution du binaire résultant : + +| Ressource | Minimum | Recommandé | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 Go | 4 Go+ | +| **Disque libre**| 6 Go | 10 Go+ | + +Si votre hôte est en dessous du minimum, utilisez les binaires précompilés : + +```bash +./install.sh --prefer-prebuilt +``` + +Pour exiger une installation binaire uniquement sans compilation de secours : + +```bash +./install.sh --prebuilt-only +``` + +#### Optionnel + +- **Docker** — requis uniquement si vous utilisez le [runtime sandbox Docker](#support-runtime-actuel) (`runtime.kind = "docker"`). Installez via votre gestionnaire de paquets ou [docker.com](https://docs.docker.com/engine/install/). + +> **Note :** Le `cargo build --release` par défaut utilise `codegen-units=1` pour réduire la pression maximale de compilation. Pour des builds plus rapides sur des machines puissantes, utilisez `cargo build --profile release-fast`. + +
+ + + +### Binaires précompilés + +Les assets de release sont publiés pour : + +- Linux : `x86_64`, `aarch64`, `armv7` +- macOS : `x86_64`, `aarch64` +- Windows : `x86_64` + +Téléchargez les derniers assets depuis : + + +## Documentation + +Utilisez ces ressources lorsque vous avez dépassé le flux d'onboarding et voulez la référence approfondie. + +- Commencez par l'[index de la documentation](docs/README.md) pour la navigation et "qu'est-ce qui est où." +- Lisez la [vue d'ensemble de l'architecture](docs/architecture.md) pour le modèle complet du système. +- Utilisez la [référence de configuration](docs/reference/api/config-reference.md) quand vous avez besoin de chaque clé et exemple. +- Exécutez le Gateway selon les règles avec le [runbook opérationnel](docs/ops/operations-runbook.md). +- Suivez [ZeroClaw Onboard](#démarrage-rapide) pour une configuration guidée. +- Déboguez les erreurs courantes avec le [guide de dépannage](docs/ops/troubleshooting.md). +- Consultez les [conseils de sécurité](docs/security/README.md) avant d'exposer quoi que ce soit. + +### Documentation de référence + +- Hub de documentation : [docs/README.md](docs/README.md) +- TOC unifiée des docs : [docs/SUMMARY.md](docs/SUMMARY.md) +- Référence des commandes : [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Référence de configuration : [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Référence des fournisseurs : [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Référence des canaux : [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Runbook opérationnel : [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Dépannage : [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Documentation de collaboration + +- Guide de contribution : [CONTRIBUTING.md](CONTRIBUTING.md) +- Politique de workflow PR : [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Guide du workflow CI : [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Manuel du réviseur : [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Politique de divulgation de sécurité : [SECURITY.md](SECURITY.md) +- Modèle de documentation : [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Déploiement + opérations + +- Guide de déploiement réseau : [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Manuel de l'agent proxy : [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Guides matériels : [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw a été construit pour le crabe lisse 🦀, un assistant IA rapide et efficace. Construit par Argenis De La Rosa et la communauté. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Soutenir ZeroClaw + +Si ZeroClaw vous aide dans votre travail et que vous souhaitez soutenir le développement continu, vous pouvez faire un don ici : + +Buy Me a Coffee + +### 🙏 Remerciements spéciaux + +Un sincère remerciement aux communautés et institutions qui inspirent et alimentent ce travail open source : + +- **Harvard University** — pour nourrir la curiosité intellectuelle et repousser les limites du possible. +- **MIT** — pour défendre le savoir ouvert, l'open source et la conviction que la technologie doit être accessible à tous. +- **Sundai Club** — pour la communauté, l'énergie et la volonté incessante de construire des choses qui comptent. +- **Le Monde et Au-delà** 🌍✨ — à chaque contributeur, rêveur et constructeur qui fait de l'open source une force pour le bien. C'est pour vous. + +Nous construisons ouvertement parce que les meilleures idées viennent de partout. Si vous lisez ceci, vous en faites partie. Bienvenue. 🦀❤️ + +## Contribuer + +Nouveau sur ZeroClaw ? Recherchez les issues étiquetées [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — consultez notre [Guide de contribution](CONTRIBUTING.md#first-time-contributors) pour savoir comment commencer. Les PRs IA/vibe-coded sont les bienvenus ! 🤖 + +Voir [CONTRIBUTING.md](CONTRIBUTING.md) et [CLA.md](docs/contributing/cla.md). Implémentez un trait, soumettez un PR : + +- Guide du workflow CI : [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Nouveau `Provider` → `src/providers/` +- Nouveau `Channel` → `src/channels/` +- Nouveau `Observer` → `src/observability/` +- Nouveau `Tool` → `src/tools/` +- Nouveau `Memory` → `src/memory/` +- Nouveau `Tunnel` → `src/tunnel/` +- Nouveau `Peripheral` → `src/peripherals/` +- Nouveau `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Dépôt officiel et avertissement d'usurpation + +**Ceci est le seul dépôt officiel de ZeroClaw :** + +> https://github.com/zeroclaw-labs/zeroclaw + +Tout autre dépôt, organisation, domaine ou package prétendant être "ZeroClaw" ou impliquant une affiliation avec ZeroClaw Labs est **non autorisé et non affilié à ce projet**. Les forks non autorisés connus seront listés dans [TRADEMARK.md](docs/maintainers/trademark.md). + +Si vous rencontrez une usurpation d'identité ou un usage abusif de la marque, veuillez [ouvrir une issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Licence + +ZeroClaw est sous double licence pour une ouverture maximale et la protection des contributeurs : + +| Licence | Cas d'utilisation | +|---|---| +| [MIT](LICENSE-MIT) | Open source, recherche, académique, usage personnel | +| [Apache 2.0](LICENSE-APACHE) | Protection par brevet, institutionnel, déploiement commercial | + +Vous pouvez choisir l'une ou l'autre licence. **Les contributeurs accordent automatiquement des droits sous les deux** — voir [CLA.md](docs/contributing/cla.md) pour l'accord complet des contributeurs. + +### Marque déposée + +Le nom et le logo **ZeroClaw** sont des marques de ZeroClaw Labs. Cette licence n'accorde pas la permission de les utiliser pour impliquer un soutien ou une affiliation. Voir [TRADEMARK.md](docs/maintainers/trademark.md) pour les usages autorisés et interdits. + +### Protections des contributeurs + +- Vous **conservez le copyright** de vos contributions +- **Concession de brevet** (Apache 2.0) vous protège des revendications de brevets d'autres contributeurs +- Vos contributions sont **attribuées de manière permanente** dans l'historique des commits et [NOTICE](NOTICE) +- Aucun droit de marque n'est transféré en contribuant + +--- + +**ZeroClaw** — Zéro overhead. Zéro compromis. Déployez partout. Échangez n'importe quoi. 🦀 + +## Contributeurs + + + ZeroClaw contributors + + +Cette liste est générée à partir du graphique des contributeurs GitHub et se met à jour automatiquement. + +## Historique des étoiles + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.he.md b/third_party/zeroclaw/README.he.md new file mode 100644 index 0000000..94f8626 --- /dev/null +++ b/third_party/zeroclaw/README.he.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — עוזר AI אישי

+ +

+ אפס תקורה. אפס פשרות. 100% Rust. 100% אגנוסטי.
+ ⚡️ רץ על חומרה של $10 עם פחות מ-5MB RAM: זה 99% פחות זיכרון מ-OpenClaw ו-98% זול יותר מ-Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+נבנה על ידי סטודנטים וחברים מקהילות Harvard, MIT ו-Sundai.Club. +

+ +

+ 🌐 שפות: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw הוא עוזר AI אישי שאתה מריץ על המכשירים שלך. הוא עונה לך בערוצים שאתה כבר משתמש בהם (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, ועוד). יש לו לוח בקרה אינטרנטי לשליטה בזמן אמת ויכול להתחבר להתקנים היקפיים (ESP32, STM32, Arduino, Raspberry Pi). ה-Gateway הוא רק מישור הבקרה — המוצר הוא העוזר. + +אם אתה רוצה עוזר אישי למשתמש יחיד שמרגיש מקומי, מהיר ותמיד פעיל, זה הוא. + +

+ אתר · + תיעוד · + ארכיטקטורה · + התחלה · + מיגרציה מ-OpenClaw · + פתרון בעיות · + Discord +

+ +> **הגדרה מועדפת:** הרץ `zeroclaw onboard` בטרמינל שלך. ZeroClaw Onboard מנחה אותך שלב אחר שלב בהגדרת ה-gateway, סביבת העבודה, הערוצים והספק. זהו נתיב ההגדרה המומלץ ועובד על macOS, Linux ו-Windows (דרך WSL2). התקנה חדשה? התחל כאן: [התחלה](#התחלה-מהירה) + +### אימות מנוי (OAuth) + +- **OpenAI Codex** (מנוי ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (מפתח API או אסימון אימות) + +הערה על מודלים: בעוד שספקים/מודלים רבים נתמכים, לחוויה הטובה ביותר השתמש במודל הדור האחרון החזק ביותר הזמין לך. ראה [הכניסה](#התחלה-מהירה). + +הגדרות מודלים + CLI: [מדריך ספקים](docs/reference/api/providers-reference.md) +רוטציית פרופיל אימות (OAuth מול מפתחות API) + מעבר בכשל: [מעבר מודלים בכשל](docs/reference/api/providers-reference.md) + +## התקנה (מומלץ) + +סביבת ריצה: שרשרת כלים יציבה של Rust. בינארי יחיד, ללא תלויות סביבת ריצה. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### התקנה בלחיצה אחת + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` רץ אוטומטית לאחר ההתקנה כדי להגדיר את סביבת העבודה והספק שלך. + +## התחלה מהירה (TL;DR) + +מדריך מתחילים מלא (אימות, צימוד, ערוצים): [התחלה](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Install + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Start the gateway (webhook server + web dashboard) +zeroclaw gateway # default: 127.0.0.1:42617 +zeroclaw gateway --port 0 # random port (security hardened) + +# Talk to the assistant +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interactive mode +zeroclaw agent + +# Start full autonomous runtime (gateway + channels + cron + hands) +zeroclaw daemon + +# Check status +zeroclaw status + +# Run diagnostics +zeroclaw doctor +``` + +משדרג? הרץ `zeroclaw doctor` לאחר העדכון. + +### מקוד מקור (פיתוח) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **חלופת פיתוח (ללא התקנה גלובלית):** הוסף `cargo run --release --` לפני פקודות (דוגמה: `cargo run --release -- status`). + +## מיגרציה מ-OpenClaw + +ZeroClaw יכול לייבא את סביבת העבודה, הזיכרון וההגדרות של OpenClaw שלך: + +```bash +# Preview what will be migrated (safe, read-only) +zeroclaw migrate openclaw --dry-run + +# Run the migration +zeroclaw migrate openclaw +``` + +זה מעביר את רשומות הזיכרון, קבצי סביבת העבודה וההגדרות מ-`~/.openclaw/` ל-`~/.zeroclaw/`. ההגדרות מומרות אוטומטית מ-JSON ל-TOML. + +## ברירות מחדל אבטחה (גישת DM) + +ZeroClaw מתחבר למשטחי הודעות אמיתיים. התייחס ל-DM נכנסים כקלט לא מהימן. + +מדריך אבטחה מלא: [SECURITY.md](SECURITY.md) + +התנהגות ברירת מחדל בכל הערוצים: + +- **צימוד DM** (ברירת מחדל): שולחים לא מוכרים מקבלים קוד צימוד קצר והבוט לא מעבד את ההודעה שלהם. +- אשר עם: `zeroclaw pairing approve ` (ואז השולח נוסף לרשימת היתרים מקומית). +- DM נכנסים ציבוריים דורשים הסכמה מפורשת ב-`config.toml`. +- הרץ `zeroclaw doctor` כדי לחשוף מדיניות DM מסוכנת או שגויה. + +**רמות אוטונומיה:** + +| רמה | התנהגות | +|------|----------| +| `ReadOnly` | הסוכן יכול לצפות אבל לא לפעול | +| `Supervised` (ברירת מחדל) | הסוכן פועל עם אישור לפעולות בסיכון בינוני/גבוה | +| `Full` | הסוכן פועל באופן אוטונומי בגבולות המדיניות | + +**שכבות ארגז חול:** בידוד סביבת עבודה, חסימת מעבר נתיבים, רשימות היתר לפקודות, נתיבים אסורים (`/etc`, `/root`, `~/.ssh`), הגבלת קצב (מקסימום פעולות/שעה, מגבלות עלות/יום). + + + + +### 📢 הודעות + +השתמש בלוח זה להודעות חשובות (שינויים שוברים, ייעוץ אבטחה, חלונות תחזוקה וחוסמי שחרור). + +| תאריך (UTC) | רמה | הודעה | פעולה | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _קריטי_ | אנחנו **לא מזוהים** עם `openagen/zeroclaw`, `zeroclaw.org` או `zeroclaw.net`. הדומיינים `zeroclaw.org` ו-`zeroclaw.net` מפנים כרגע ל-fork `openagen/zeroclaw`, ואותו דומיין/מאגר מתחזים לאתר/פרויקט הרשמי שלנו. | אל תסמוך על מידע, בינאריים, גיוס כספים או הודעות ממקורות אלה. השתמש רק ב[מאגר זה](https://github.com/zeroclaw-labs/zeroclaw) ובחשבונות החברתיים המאומתים שלנו. | +| 2026-02-21 | _חשוב_ | האתר הרשמי שלנו כעת פעיל: [zeroclawlabs.ai](https://zeroclawlabs.ai). תודה על הסבלנות בזמן שהכנו את ההשקה. אנחנו עדיין רואים ניסיונות התחזות, לכן **אל** תצטרפו לפעילות השקעה או גיוס כספים הטוענת לשם ZeroClaw אלא אם היא מפורסמת דרך הערוצים הרשמיים שלנו. | השתמש ב[מאגר זה](https://github.com/zeroclaw-labs/zeroclaw) כמקור האמת היחיד. עקוב אחרי [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs) ו-[Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) לעדכונים רשמיים. | +| 2026-02-19 | _חשוב_ | Anthropic עדכנה את תנאי Authentication and Credential Use ב-2026-02-19. אסימוני Claude Code OAuth (Free, Pro, Max) מיועדים אך ורק ל-Claude Code ול-Claude.ai; שימוש באסימוני OAuth מ-Claude Free/Pro/Max בכל מוצר, כלי או שירות אחר (כולל Agent SDK) אינו מותר ועלול להפר את תנאי השירות לצרכן. | אנא הימנעו זמנית מאינטגרציות Claude Code OAuth כדי למנוע אובדן פוטנציאלי. סעיף מקורי: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## יתרונות עיקריים + +- **סביבת ריצה קלה כברירת מחדל** — תהליכי CLI וסטטוס שגרתיים רצים במעטפת זיכרון של כמה מגה-בייט על בנייות שחרור. +- **פריסה חסכונית** — מתוכנן ללוחות של $10 ומופעי ענן קטנים, ללא תלויות סביבת ריצה כבדות. +- **התחלה קרה מהירה** — סביבת ריצה Rust בבינארי יחיד שומרת על הפעלת פקודות ודמון כמעט מיידית. +- **ארכיטקטורה ניידת** — בינארי אחד על ARM, x86 ו-RISC-V עם ספקים/ערוצים/כלים להחלפה. +- **Gateway מקומי-תחילה** — מישור בקרה יחיד לסשנים, ערוצים, כלים, cron, SOPs ואירועים. +- **תיבת דואר רב-ערוצית** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket, ועוד. +- **תזמור רב-סוכנים (Hands)** — נחילי סוכנים אוטונומיים הפועלים לפי לוח זמנים ומשתפרים עם הזמן. +- **נהלי הפעלה סטנדרטיים (SOPs)** — אוטומציית תהליכי עבודה מונעת אירועים עם MQTT, webhook, cron וטריגרים של התקנים היקפיים. +- **לוח בקרה אינטרנטי** — ממשק משתמש React 19 + Vite עם צ'אט בזמן אמת, דפדפן זיכרון, עורך הגדרות, מנהל cron ומפקח כלים. +- **התקנים היקפיים** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO דרך trait `Peripheral`. +- **כלים מדרגה ראשונה** — shell, קריאה/כתיבה/עריכת קבצים, git, שליפת/חיפוש אינטרנט, MCP, Jira, Notion, Google Workspace, ו-70+ נוספים. +- **הוקים של מחזור חיים** — יירוט ושינוי קריאות LLM, הרצות כלים והודעות בכל שלב. +- **פלטפורמת מיומנויות** — מיומנויות מובנות, קהילתיות וסביבת עבודה עם ביקורת אבטחה. +- **תמיכה במנהרות** — Cloudflare, Tailscale, ngrok, OpenVPN ומנהרות מותאמות לגישה מרחוק. + +### למה צוותים בוחרים ב-ZeroClaw + +- **קל כברירת מחדל:** בינארי Rust קטן, הפעלה מהירה, טביעת רגל זיכרון נמוכה. +- **מאובטח מהתכנון:** צימוד, ארגז חול מחמיר, רשימות היתר מפורשות, תיחום סביבת עבודה. +- **ניתן להחלפה מלאה:** מערכות ליבה הן traits (ספקים, ערוצים, כלים, זיכרון, מנהרות). +- **ללא נעילת ספק:** תמיכה בספקים תואמי OpenAI + נקודות קצה מותאמות הניתנות לחיבור. + +## תמונת מצב של ביצועים (ZeroClaw מול OpenClaw, ניתן לשחזור) + +מדד מהיר על מכונה מקומית (macOS arm64, פברואר 2026) מנורמל לחומרת edge בתדר 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **שפה** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **הפעלה (ליבת 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **גודל בינארי** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **עלות** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **כל חומרה $10** | + +> הערות: תוצאות ZeroClaw נמדדו על בנייות שחרור באמצעות `/usr/bin/time -l`. OpenClaw דורש סביבת ריצה Node.js (בדרך כלל ~390MB תקורת זיכרון נוספת), בעוד NanoBot דורש סביבת ריצה Python. PicoClaw ו-ZeroClaw הם בינאריים סטטיים. נתוני ה-RAM למעלה הם זיכרון סביבת ריצה; דרישות קומפילציה בזמן בנייה גבוהות יותר. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### מדידה מקומית ניתנת לשחזור + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## כל מה שבנינו עד כה + +### פלטפורמת ליבה + +- Gateway HTTP/WS/SSE מישור בקרה עם סשנים, נוכחות, הגדרות, cron, webhooks, לוח בקרה אינטרנטי וצימוד. +- משטח CLI: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- לולאת תזמור סוכן עם שליחת כלים, בניית פרומפט, סיווג הודעות וטעינת זיכרון. +- מודל סשנים עם אכיפת מדיניות אבטחה, רמות אוטונומיה ושער אישור. +- מעטפת ספק עמידה עם מעבר בכשל, ניסיון חוזר וניתוב מודלים על פני 20+ ממשקי LLM. + +### ערוצים + +ערוצים: WhatsApp (מקורי), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +מוגבלי-תכונה: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### לוח בקרה אינטרנטי + +לוח בקרה React 19 + Vite 6 + Tailwind CSS 4 מוגש ישירות מה-Gateway: + +- **לוח בקרה** — סקירת מערכת, מצב בריאות, זמן פעילות, מעקב עלויות +- **צ'אט סוכן** — צ'אט אינטראקטיבי עם הסוכן +- **זיכרון** — דפדוף וניהול רשומות זיכרון +- **הגדרות** — צפייה ועריכת הגדרות +- **Cron** — ניהול משימות מתוזמנות +- **כלים** — דפדוף בכלים זמינים +- **יומנים** — צפייה ביומני פעילות הסוכן +- **עלות** — שימוש בטוקנים ומעקב עלויות +- **דוקטור** — אבחון בריאות המערכת +- **אינטגרציות** — מצב אינטגרציות והגדרה +- **צימוד** — ניהול צימוד מכשירים + +### יעדי קושחה + +| יעד | פלטפורמה | מטרה | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | סוכן היקפי אלחוטי | +| ESP32-UI | ESP32 + Display | סוכן עם ממשק חזותי | +| STM32 Nucleo | STM32 (ARM Cortex-M) | התקן היקפי תעשייתי | +| Arduino | Arduino | גשר חיישן/מפעיל בסיסי | +| Uno Q Bridge | Arduino Uno | גשר סריאלי לסוכן | + +### כלים + אוטומציה + +- **ליבה:** shell, קריאה/כתיבה/עריכת קבצים, פעולות git, חיפוש glob, חיפוש תוכן +- **אינטרנט:** שליטה בדפדפן, web fetch, web search, צילום מסך, מידע תמונה, קריאת PDF +- **אינטגרציות:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** מעטפת כלי Model Context Protocol + סטים של כלים מושהים +- **תזמון:** cron add/remove/update/run, כלי תזמון +- **זיכרון:** recall, store, forget, knowledge, project intel +- **מתקדם:** delegate (סוכן-לסוכן), swarm, החלפת/ניתוב מודל, פעולות אבטחה, פעולות ענן +- **חומרה:** מידע לוח, מפת זיכרון, קריאת זיכרון (מוגבל-תכונה) + +### סביבת ריצה + אבטחה + +- **רמות אוטונומיה:** ReadOnly, Supervised (ברירת מחדל), Full. +- **ארגז חול:** בידוד סביבת עבודה, חסימת מעבר נתיבים, רשימות היתר לפקודות, נתיבים אסורים, Landlock (Linux), Bubblewrap. +- **הגבלת קצב:** מקסימום פעולות בשעה, מקסימום עלות ביום (ניתן להגדרה). +- **שער אישור:** אישור אינטראקטיבי לפעולות בסיכון בינוני/גבוה. +- **עצירת חירום:** יכולת כיבוי חירום. +- **129+ מבחני אבטחה** ב-CI אוטומטי. + +### תפעול + אריזה + +- לוח בקרה אינטרנטי מוגש ישירות מה-Gateway. +- תמיכה במנהרות: Cloudflare, Tailscale, ngrok, OpenVPN, פקודה מותאמת. +- מתאם סביבת ריצה Docker להרצה בקונטיינרים. +- CI/CD: בטא (אוטומטי בדחיפה) → יציב (שליחה ידנית) → Docker, crates.io, Scoop, AUR, Homebrew, ציוץ. +- בינאריים מוכנים מראש ל-Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## הגדרות + +מינימלי `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +מדריך הגדרות מלא: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### הגדרת ערוצים + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### הגדרת מנהרות + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +פרטים: [מדריך ערוצים](docs/reference/api/channels-reference.md) · [מדריך הגדרות](docs/reference/api/config-reference.md) + +### תמיכה בסביבת ריצה (נוכחי) + +- **`native`** (ברירת מחדל) — הרצת תהליך ישירה, הנתיב המהיר ביותר, אידיאלי לסביבות מהימנות. +- **`docker`** — בידוד קונטיינר מלא, מדיניות אבטחה נאכפת, דורש Docker. + +הגדר `runtime.kind = "docker"` לארגז חול מחמיר או בידוד רשת. + +## אימות מנוי (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw תומך בפרופילי אימות מקוריים למנוי (רב-חשבוני, מוצפן במנוחה). + +- קובץ אחסון: `~/.zeroclaw/auth-profiles.json` +- מפתח הצפנה: `~/.zeroclaw/.secret_key` +- פורמט מזהה פרופיל: `:` (דוגמה: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT subscription) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Check / refresh / switch profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Run the agent with subscription auth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## סביבת עבודה של הסוכן + מיומנויות + +שורש סביבת עבודה: `~/.zeroclaw/workspace/` (ניתן להגדרה דרך ההגדרות). + +קבצי פרומפט מוזרקים: +- `IDENTITY.md` — אישיות ותפקיד הסוכן +- `USER.md` — הקשר והעדפות המשתמש +- `MEMORY.md` — עובדות ולקחים לטווח ארוך +- `AGENTS.md` — מוסכמות סשן וכללי אתחול +- `SOUL.md` — זהות ליבה ועקרונות הפעלה + +מיומנויות: `~/.zeroclaw/workspace/skills//SKILL.md` או `SKILL.toml`. + +```bash +# List installed skills +zeroclaw skills list + +# Install from git +zeroclaw skills install https://github.com/user/my-skill.git + +# Security audit before install +zeroclaw skills audit https://github.com/user/my-skill.git + +# Remove a skill +zeroclaw skills remove my-skill +``` + +## פקודות CLI + +```bash +# Workspace management +zeroclaw onboard # Guided setup wizard +zeroclaw status # Show daemon/agent status +zeroclaw doctor # Run system diagnostics + +# Gateway + daemon +zeroclaw gateway # Start gateway server (127.0.0.1:42617) +zeroclaw daemon # Start full autonomous runtime + +# Agent +zeroclaw agent # Interactive chat mode +zeroclaw agent -m "message" # Single message mode + +# Service management +zeroclaw service install # Install as OS service (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Channels +zeroclaw channel list # List configured channels +zeroclaw channel doctor # Check channel health +zeroclaw channel bind-telegram 123456789 + +# Cron + scheduling +zeroclaw cron list # List scheduled jobs +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memory +zeroclaw memory list # List memory entries +zeroclaw memory get # Retrieve a memory +zeroclaw memory stats # Memory statistics + +# Auth profiles +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardware peripherals +zeroclaw hardware discover # Scan for connected devices +zeroclaw peripheral list # List connected peripherals +zeroclaw peripheral flash # Flash firmware to device + +# Migration +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell completions +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +מדריך פקודות מלא: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## דרישות מקדימות + +
+Windows + +#### נדרש + +1. **Visual Studio Build Tools** (מספק את מקשר MSVC ו-Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + במהלך ההתקנה (או דרך Visual Studio Installer), בחר את עומס העבודה **"Desktop development with C++"**. + +2. **שרשרת כלים Rust:** + + ```powershell + winget install Rustlang.Rustup + ``` + + לאחר ההתקנה, פתח טרמינל חדש והרץ `rustup default stable` כדי לוודא ששרשרת הכלים היציבה פעילה. + +3. **אמת** ששניהם עובדים: + ```powershell + rustc --version + cargo --version + ``` + +#### אופציונלי + +- **Docker Desktop** — נדרש רק אם משתמשים ב[סביבת ריצה Docker בארגז חול](#תמיכה-בסביבת-ריצה-נוכחי) (`runtime.kind = "docker"`). התקן דרך `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### נדרש + +1. **כלי בנייה:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** התקן Xcode Command Line Tools: `xcode-select --install` + +2. **שרשרת כלים Rust:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + ראה [rustup.rs](https://rustup.rs) לפרטים. + +3. **אמת** ששניהם עובדים: + ```bash + rustc --version + cargo --version + ``` + +#### מתקין בשורה אחת + +או דלג על השלבים למעלה והתקן הכל (תלויות מערכת, Rust, ZeroClaw) בפקודה אחת: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### דרישות משאבי קומפילציה + +בנייה מקוד מקור דורשת יותר משאבים מהרצת הבינארי המתקבל: + +| משאב | מינימום | מומלץ | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **דיסק פנוי** | 6 GB | 10 GB+ | + +אם המארח שלך מתחת למינימום, השתמש בבינאריים מוכנים מראש: + +```bash +./install.sh --prefer-prebuilt +``` + +כדי לדרוש התקנת בינארי בלבד ללא חלופת מקור: + +```bash +./install.sh --prebuilt-only +``` + +#### אופציונלי + +- **Docker** — נדרש רק אם משתמשים ב[סביבת ריצה Docker בארגז חול](#תמיכה-בסביבת-ריצה-נוכחי) (`runtime.kind = "docker"`). התקן דרך מנהל החבילות שלך או [docker.com](https://docs.docker.com/engine/install/). + +> **הערה:** ברירת המחדל `cargo build --release` משתמשת ב-`codegen-units=1` כדי להפחית לחץ קומפילציה שיא. לבנייות מהירות יותר על מכונות חזקות, השתמש ב-`cargo build --profile release-fast`. + +
+ + + +### בינאריים מוכנים מראש + +נכסי שחרור מפורסמים עבור: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +הורד את הנכסים האחרונים מ: + + +## תיעוד + +השתמש באלה כשעברת את תהליך ההכניסה ורוצה את המדריך המעמיק יותר. + +- התחל עם [אינדקס התיעוד](docs/README.md) לניווט ו"מה נמצא איפה." +- קרא את [סקירת הארכיטקטורה](docs/architecture.md) למודל המערכת המלא. +- השתמש ב[מדריך ההגדרות](docs/reference/api/config-reference.md) כשאתה צריך כל מפתח ודוגמה. +- הפעל את ה-Gateway לפי הספר עם [מדריך התפעול](docs/ops/operations-runbook.md). +- עקוב אחרי [ZeroClaw Onboard](#התחלה-מהירה) להגדרה מונחית. +- אבחן כשלים נפוצים עם [מדריך פתרון בעיות](docs/ops/troubleshooting.md). +- סקור את [הנחיות האבטחה](docs/security/README.md) לפני חשיפת משהו. + +### תיעוד מדריכים + +- מרכז תיעוד: [docs/README.md](docs/README.md) +- תוכן עניינים מאוחד: [docs/SUMMARY.md](docs/SUMMARY.md) +- מדריך פקודות: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- מדריך הגדרות: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- מדריך ספקים: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- מדריך ערוצים: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- מדריך תפעול: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- פתרון בעיות: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### תיעוד שיתוף פעולה + +- מדריך תרומה: [CONTRIBUTING.md](CONTRIBUTING.md) +- מדיניות תהליך PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- מדריך תהליך CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- מדריך סוקר: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- מדיניות חשיפת אבטחה: [SECURITY.md](SECURITY.md) +- תבנית תיעוד: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### פריסה + תפעול + +- מדריך פריסת רשת: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- מדריך סוכן פרוקסי: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- מדריכי חומרה: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw נבנה עבור ה-smooth crab 🦀, עוזר AI מהיר ויעיל. נבנה על ידי Argenis De La Rosa והקהילה. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## תמוך ב-ZeroClaw + +אם ZeroClaw עוזר לעבודה שלך ואתה רוצה לתמוך בפיתוח המתמשך, אתה יכול לתרום כאן: + +Buy Me a Coffee + +### 🙏 תודה מיוחדת + +תודה מכל הלב לקהילות ולמוסדות שמעוררים השראה ומניעים את עבודת הקוד הפתוח הזו: + +- **Harvard University** — על טיפוח סקרנות אינטלקטואלית ודחיפת גבולות האפשרי. +- **MIT** — על קידום ידע פתוח, קוד פתוח והאמונה שטכנולוגיה צריכה להיות נגישה לכולם. +- **Sundai Club** — על הקהילה, האנרגיה והמאמץ הבלתי פוסק לבנות דברים שחשובים. +- **העולם ומעבר** 🌍✨ — לכל תורם, חולם ובונה שם שהופך קוד פתוח לכוח לטובה. זה בשבילכם. + +אנחנו בונים בגלוי כי הרעיונות הטובים ביותר מגיעים מכל מקום. אם אתה קורא את זה, אתה חלק מזה. ברוך הבא. 🦀❤️ + +## תרומה + +חדש ב-ZeroClaw? חפש בעיות עם התווית [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — ראה את [מדריך התרומה](CONTRIBUTING.md#first-time-contributors) שלנו כדי להתחיל. PR של AI/vibe-coded מתקבלים בברכה! 🤖 + +ראה [CONTRIBUTING.md](CONTRIBUTING.md) ו-[CLA.md](docs/contributing/cla.md). ממש trait, שלח PR: + +- מדריך תהליך CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- `Provider` חדש → `src/providers/` +- `Channel` חדש → `src/channels/` +- `Observer` חדש → `src/observability/` +- `Tool` חדש → `src/tools/` +- `Memory` חדש → `src/memory/` +- `Tunnel` חדש → `src/tunnel/` +- `Peripheral` חדש → `src/peripherals/` +- `Skill` חדש → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ מאגר רשמי ואזהרת התחזות + +**זהו מאגר ZeroClaw הרשמי היחיד:** + +> https://github.com/zeroclaw-labs/zeroclaw + +כל מאגר, ארגון, דומיין או חבילה אחרים הטוענים להיות "ZeroClaw" או מרמזים על שיוך ל-ZeroClaw Labs הם **לא מורשים ולא מזוהים עם פרויקט זה**. פורקים לא מורשים ידועים ירשמו ב-[TRADEMARK.md](docs/maintainers/trademark.md). + +אם אתה נתקל בהתחזות או שימוש לרעה בסימן מסחרי, אנא [פתח issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## רישיון + +ZeroClaw מורשה ברישיון כפול לפתיחות מקסימלית והגנה על תורמים: + +| רישיון | מקרה שימוש | +|---|---| +| [MIT](LICENSE-MIT) | קוד פתוח, מחקר, אקדמי, שימוש אישי | +| [Apache 2.0](LICENSE-APACHE) | הגנת פטנטים, מוסדי, פריסה מסחרית | + +אתה יכול לבחור כל רישיון. **תורמים מעניקים זכויות באופן אוטומטי תחת שניהם** — ראה [CLA.md](docs/contributing/cla.md) להסכם התורם המלא. + +### סימן מסחרי + +השם והלוגו של **ZeroClaw** הם סימנים מסחריים של ZeroClaw Labs. רישיון זה אינו מעניק הרשאה להשתמש בהם כדי לרמוז על תמיכה או שיוך. ראה [TRADEMARK.md](docs/maintainers/trademark.md) לשימושים מותרים ואסורים. + +### הגנות על תורמים + +- אתה **שומר על זכויות יוצרים** על תרומותיך +- **הענקת פטנט** (Apache 2.0) מגנה עליך מתביעות פטנט של תורמים אחרים +- תרומותיך **מיוחסות באופן קבוע** בהיסטוריית הקומיטים וב-[NOTICE](NOTICE) +- לא מועברות זכויות סימן מסחרי על ידי תרומה + +--- + +**ZeroClaw** — אפס תקורה. אפס פשרות. פרוס בכל מקום. החלף הכל. 🦀 + +## תורמים + + + ZeroClaw contributors + + +רשימה זו נוצרת מגרף התורמים של GitHub ומתעדכנת אוטומטית. + +## היסטוריית כוכבים + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.hi.md b/third_party/zeroclaw/README.hi.md new file mode 100644 index 0000000..28089cc --- /dev/null +++ b/third_party/zeroclaw/README.hi.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — व्यक्तिगत AI सहायक

+ +

+ शून्य ओवरहेड। शून्य समझौता। 100% Rust। 100% अज्ञेयवादी।
+ ⚡️ $10 के हार्डवेयर पर <5MB RAM के साथ चलता है: यह OpenClaw से 99% कम मेमोरी और Mac mini से 98% सस्ता है! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Harvard, MIT, और Sundai.Club समुदायों के छात्रों और सदस्यों द्वारा निर्मित। +

+ +

+ 🌐 भाषाएँ: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw एक व्यक्तिगत AI सहायक है जिसे आप अपने उपकरणों पर चलाते हैं। यह आपको उन चैनलों पर जवाब देता है जो आप पहले से उपयोग करते हैं (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, और अन्य)। इसमें रियल-टाइम नियंत्रण के लिए एक वेब डैशबोर्ड है और यह हार्डवेयर पेरीफेरल (ESP32, STM32, Arduino, Raspberry Pi) से जुड़ सकता है। Gateway केवल कंट्रोल प्लेन है — उत्पाद सहायक है। + +यदि आप एक व्यक्तिगत, एकल-उपयोगकर्ता सहायक चाहते हैं जो स्थानीय, तेज़ और हमेशा चालू महसूस हो, तो यह है। + +

+ वेबसाइट · + दस्तावेज़ · + आर्किटेक्चर · + शुरू करें · + OpenClaw से माइग्रेशन · + समस्या निवारण · + Discord +

+ +> **पसंदीदा सेटअप:** अपने टर्मिनल में `zeroclaw onboard` चलाएँ। ZeroClaw Onboard आपको gateway, workspace, channels, और provider सेट करने में कदम-दर-कदम मार्गदर्शन करता है। यह अनुशंसित सेटअप पथ है और macOS, Linux, और Windows (WSL2 के माध्यम से) पर काम करता है। नया इंस्टॉल? यहाँ से शुरू करें: [शुरू करें](#त्वरित-शुरुआत) + +### सब्सक्रिप्शन ऑथ (OAuth) + +- **OpenAI Codex** (ChatGPT सब्सक्रिप्शन) +- **Gemini** (Google OAuth) +- **Anthropic** (API key या auth token) + +मॉडल नोट: जबकि कई प्रदाताओं/मॉडलों का समर्थन किया जाता है, सर्वोत्तम अनुभव के लिए अपने पास उपलब्ध सबसे मजबूत नवीनतम पीढ़ी के मॉडल का उपयोग करें। देखें [ऑनबोर्डिंग](#त्वरित-शुरुआत)। + +मॉडल कॉन्फ़िग + CLI: [प्रदाता संदर्भ](docs/reference/api/providers-reference.md) +ऑथ प्रोफ़ाइल रोटेशन (OAuth बनाम API keys) + फ़ेलओवर: [मॉडल फ़ेलओवर](docs/reference/api/providers-reference.md) + +## इंस्टॉल (अनुशंसित) + +रनटाइम: Rust स्थिर टूलचेन। एकल बाइनरी, कोई रनटाइम निर्भरता नहीं। + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### एक-क्लिक बूटस्ट्रैप + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` इंस्टॉल के बाद स्वचालित रूप से चलता है ताकि आपका workspace और provider कॉन्फ़िगर हो सके। + +## त्वरित शुरुआत (TL;DR) + +पूर्ण शुरुआती गाइड (ऑथ, पेयरिंग, चैनल): [शुरू करें](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Install + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Start the gateway (webhook server + web dashboard) +zeroclaw gateway # default: 127.0.0.1:42617 +zeroclaw gateway --port 0 # random port (security hardened) + +# Talk to the assistant +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interactive mode +zeroclaw agent + +# Start full autonomous runtime (gateway + channels + cron + hands) +zeroclaw daemon + +# Check status +zeroclaw status + +# Run diagnostics +zeroclaw doctor +``` + +अपग्रेड कर रहे हैं? अपडेट के बाद `zeroclaw doctor` चलाएँ। + +### स्रोत से (विकास) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **विकास फ़ॉलबैक (कोई ग्लोबल इंस्टॉल नहीं):** कमांड के आगे `cargo run --release --` लगाएँ (उदाहरण: `cargo run --release -- status`)। + +## OpenClaw से माइग्रेशन + +ZeroClaw आपके OpenClaw workspace, मेमोरी, और कॉन्फ़िगरेशन आयात कर सकता है: + +```bash +# Preview what will be migrated (safe, read-only) +zeroclaw migrate openclaw --dry-run + +# Run the migration +zeroclaw migrate openclaw +``` + +यह आपकी मेमोरी प्रविष्टियों, workspace फ़ाइलों, और कॉन्फ़िगरेशन को `~/.openclaw/` से `~/.zeroclaw/` में माइग्रेट करता है। कॉन्फ़िग स्वचालित रूप से JSON से TOML में परिवर्तित हो जाता है। + +## सुरक्षा डिफ़ॉल्ट (DM एक्सेस) + +ZeroClaw वास्तविक मैसेजिंग सतहों से जुड़ता है। इनबाउंड DMs को अविश्वसनीय इनपुट के रूप में मानें। + +पूर्ण सुरक्षा गाइड: [SECURITY.md](SECURITY.md) + +सभी चैनलों पर डिफ़ॉल्ट व्यवहार: + +- **DM पेयरिंग** (डिफ़ॉल्ट): अज्ञात प्रेषकों को एक छोटा पेयरिंग कोड मिलता है और बॉट उनका संदेश प्रोसेस नहीं करता। +- इससे स्वीकृति दें: `zeroclaw pairing approve ` (फिर प्रेषक स्थानीय अनुमति सूची में जोड़ा जाता है)। +- सार्वजनिक इनबाउंड DMs के लिए `config.toml` में स्पष्ट ऑप्ट-इन आवश्यक है। +- जोखिमपूर्ण या गलत कॉन्फ़िगर DM नीतियों को सामने लाने के लिए `zeroclaw doctor` चलाएँ। + +**स्वायत्तता स्तर:** + +| स्तर | व्यवहार | +|-------|----------| +| `ReadOnly` | एजेंट देख सकता है लेकिन कार्य नहीं कर सकता | +| `Supervised` (डिफ़ॉल्ट) | एजेंट मध्यम/उच्च जोखिम संचालन के लिए स्वीकृति के साथ कार्य करता है | +| `Full` | एजेंट नीति सीमाओं के भीतर स्वायत्त रूप से कार्य करता है | + +**सैंडबॉक्सिंग परतें:** workspace आइसोलेशन, पथ ट्रैवर्सल ब्लॉकिंग, कमांड अनुमति सूची, प्रतिबंधित पथ (`/etc`, `/root`, `~/.ssh`), दर सीमित करना (अधिकतम कार्य/घंटा, लागत/दिन सीमा)। + + + + +### 📢 घोषणाएँ + +महत्वपूर्ण सूचनाओं (ब्रेकिंग बदलाव, सुरक्षा सलाह, रखरखाव विंडो, और रिलीज़ ब्लॉकर) के लिए इस बोर्ड का उपयोग करें। + +| तिथि (UTC) | स्तर | सूचना | कार्रवाई | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _गंभीर_ | हम `openagen/zeroclaw`, `zeroclaw.org` या `zeroclaw.net` से **संबद्ध नहीं** हैं। `zeroclaw.org` और `zeroclaw.net` डोमेन वर्तमान में `openagen/zeroclaw` फ़ोर्क की ओर इशारा करते हैं, और वह डोमेन/रिपॉजिटरी हमारी आधिकारिक वेबसाइट/प्रोजेक्ट का रूप धारण कर रहे हैं। | उन स्रोतों से जानकारी, बाइनरी, फंडरेजिंग, या घोषणाओं पर भरोसा न करें। केवल [यह रिपॉजिटरी](https://github.com/zeroclaw-labs/zeroclaw) और हमारे सत्यापित सोशल अकाउंट्स का उपयोग करें। | +| 2026-02-21 | _महत्वपूर्ण_ | हमारी आधिकारिक वेबसाइट अब लाइव है: [zeroclawlabs.ai](https://zeroclawlabs.ai)। लॉन्च की तैयारी करते समय आपके धैर्य के लिए धन्यवाद। हम अभी भी प्रतिरूपण प्रयास देख रहे हैं, इसलिए किसी भी निवेश या फंडरेजिंग गतिविधि में **शामिल न हों** जो ZeroClaw नाम का दावा करती है जब तक कि यह हमारे आधिकारिक चैनलों के माध्यम से प्रकाशित न हो। | [यह रिपॉजिटरी](https://github.com/zeroclaw-labs/zeroclaw) को सत्य के एकमात्र स्रोत के रूप में उपयोग करें। आधिकारिक अपडेट के लिए [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs), और [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) को फ़ॉलो करें। | +| 2026-02-19 | _महत्वपूर्ण_ | Anthropic ने 2026-02-19 को Authentication and Credential Use शर्तें अपडेट कीं। Claude Code OAuth टोकन (Free, Pro, Max) विशेष रूप से Claude Code और Claude.ai के लिए हैं; Claude Free/Pro/Max से OAuth टोकन का किसी अन्य उत्पाद, उपकरण, या सेवा (Agent SDK सहित) में उपयोग अनुमत नहीं है और उपभोक्ता सेवा की शर्तों का उल्लंघन हो सकता है। | संभावित नुकसान को रोकने के लिए कृपया Claude Code OAuth एकीकरण से अस्थायी रूप से बचें। मूल खंड: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use)। | + +## मुख्य विशेषताएँ + +- **डिफ़ॉल्ट रूप से हल्का रनटाइम** — सामान्य CLI और स्थिति वर्कफ़्लो रिलीज़ बिल्ड पर कुछ-मेगाबाइट मेमोरी एन्वेलप में चलते हैं। +- **लागत-कुशल डिप्लॉयमेंट** — $10 बोर्ड और छोटे क्लाउड इंस्टेंस के लिए डिज़ाइन किया गया, कोई भारी रनटाइम निर्भरता नहीं। +- **तेज़ कोल्ड स्टार्ट** — एकल-बाइनरी Rust रनटाइम कमांड और डेमन स्टार्टअप को लगभग तत्काल रखता है। +- **पोर्टेबल आर्किटेक्चर** — ARM, x86, और RISC-V पर एक बाइनरी जिसमें स्वैपेबल प्रदाता/चैनल/उपकरण हैं। +- **लोकल-फर्स्ट Gateway** — सेशन, चैनल, टूल, cron, SOPs, और इवेंट के लिए एकल कंट्रोल प्लेन। +- **मल्टी-चैनल इनबॉक्स** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket, और अन्य। +- **मल्टी-एजेंट ऑर्केस्ट्रेशन (Hands)** — स्वायत्त एजेंट स्वार्म जो शेड्यूल पर चलते हैं और समय के साथ स्मार्ट होते जाते हैं। +- **मानक संचालन प्रक्रियाएँ (SOPs)** — MQTT, webhook, cron, और पेरीफेरल ट्रिगर के साथ इवेंट-ड्रिवन वर्कफ़्लो ऑटोमेशन। +- **वेब डैशबोर्ड** — React 19 + Vite वेब UI जिसमें रियल-टाइम चैट, मेमोरी ब्राउज़र, कॉन्फ़िग एडिटर, cron मैनेजर, और टूल इंस्पेक्टर है। +- **हार्डवेयर पेरीफेरल** — `Peripheral` trait के माध्यम से ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO। +- **प्रथम-श्रेणी उपकरण** — shell, फ़ाइल I/O, browser, git, वेब fetch/search, MCP, Jira, Notion, Google Workspace, और 70+ अन्य। +- **लाइफसाइकल हुक** — हर चरण पर LLM कॉल, टूल निष्पादन, और संदेशों को इंटरसेप्ट और संशोधित करें। +- **स्किल प्लेटफ़ॉर्म** — बंडल, समुदाय, और workspace स्किल जिनमें सुरक्षा ऑडिटिंग है। +- **टनल सपोर्ट** — रिमोट एक्सेस के लिए Cloudflare, Tailscale, ngrok, OpenVPN, और कस्टम टनल। + +### टीमें ZeroClaw क्यों चुनती हैं + +- **डिफ़ॉल्ट रूप से हल्का:** छोटी Rust बाइनरी, तेज़ स्टार्टअप, कम मेमोरी फुटप्रिंट। +- **डिज़ाइन से सुरक्षित:** पेयरिंग, सख्त सैंडबॉक्सिंग, स्पष्ट अनुमति सूचियाँ, workspace स्कोपिंग। +- **पूरी तरह से स्वैपेबल:** कोर सिस्टम traits हैं (providers, channels, tools, memory, tunnels)। +- **कोई लॉक-इन नहीं:** OpenAI-संगत प्रदाता समर्थन + प्लगेबल कस्टम एंडपॉइंट। + +## बेंचमार्क स्नैपशॉट (ZeroClaw बनाम OpenClaw, प्रतिलिपि योग्य) + +स्थानीय मशीन त्वरित बेंचमार्क (macOS arm64, फ़रवरी 2026) 0.8GHz एज हार्डवेयर के लिए सामान्यीकृत। + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **भाषा** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **स्टार्टअप (0.8GHz कोर)** | > 500s | > 30s | < 1s | **< 10ms** | +| **बाइनरी आकार** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **लागत** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **कोई भी हार्डवेयर $10** | + +> नोट: ZeroClaw परिणाम `/usr/bin/time -l` का उपयोग करके रिलीज़ बिल्ड पर मापे गए हैं। OpenClaw को Node.js रनटाइम की आवश्यकता है (आमतौर पर ~390MB अतिरिक्त मेमोरी ओवरहेड), जबकि NanoBot को Python रनटाइम की आवश्यकता है। PicoClaw और ZeroClaw स्टैटिक बाइनरी हैं। ऊपर दिए गए RAM आँकड़े रनटाइम मेमोरी हैं; बिल्ड-टाइम कंपाइलेशन आवश्यकताएँ अधिक हैं। + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### प्रतिलिपि योग्य स्थानीय माप + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## अब तक हमने जो कुछ बनाया है + +### कोर प्लेटफ़ॉर्म + +- Gateway HTTP/WS/SSE कंट्रोल प्लेन जिसमें सेशन, प्रेज़ेंस, कॉन्फ़िग, cron, webhooks, वेब डैशबोर्ड, और पेयरिंग है। +- CLI सरफेस: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`। +- एजेंट ऑर्केस्ट्रेशन लूप जिसमें टूल डिस्पैच, प्रॉम्प्ट निर्माण, संदेश वर्गीकरण, और मेमोरी लोडिंग है। +- सुरक्षा नीति प्रवर्तन, स्वायत्तता स्तर, और अनुमोदन गेटिंग के साथ सेशन मॉडल। +- 20+ LLM बैकएंड पर फ़ेलओवर, रिट्राई, और मॉडल रूटिंग के साथ रेज़िलिएंट प्रदाता रैपर। + +### चैनल + +चैनल: WhatsApp (नेटिव), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk। + +फ़ीचर-गेटेड: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`)। + +### वेब डैशबोर्ड + +React 19 + Vite 6 + Tailwind CSS 4 वेब डैशबोर्ड सीधे Gateway से सर्व किया जाता है: + +- **डैशबोर्ड** — सिस्टम अवलोकन, स्वास्थ्य स्थिति, अपटाइम, लागत ट्रैकिंग +- **एजेंट चैट** — एजेंट के साथ इंटरैक्टिव चैट +- **मेमोरी** — मेमोरी प्रविष्टियाँ ब्राउज़ और प्रबंधित करें +- **कॉन्फ़िग** — कॉन्फ़िगरेशन देखें और संपादित करें +- **Cron** — शेड्यूल किए गए कार्य प्रबंधित करें +- **टूल्स** — उपलब्ध उपकरण ब्राउज़ करें +- **लॉग्स** — एजेंट गतिविधि लॉग देखें +- **लागत** — टोकन उपयोग और लागत ट्रैकिंग +- **डॉक्टर** — सिस्टम स्वास्थ्य डायग्नोस्टिक्स +- **इंटीग्रेशन** — इंटीग्रेशन स्थिति और सेटअप +- **पेयरिंग** — डिवाइस पेयरिंग प्रबंधन + +### फ़र्मवेयर लक्ष्य + +| लक्ष्य | प्लेटफ़ॉर्म | उद्देश्य | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | वायरलेस पेरीफेरल एजेंट | +| ESP32-UI | ESP32 + Display | विज़ुअल इंटरफ़ेस वाला एजेंट | +| STM32 Nucleo | STM32 (ARM Cortex-M) | औद्योगिक पेरीफेरल | +| Arduino | Arduino | बेसिक सेंसर/एक्चुएटर ब्रिज | +| Uno Q Bridge | Arduino Uno | एजेंट के लिए सीरियल ब्रिज | + +### उपकरण + ऑटोमेशन + +- **कोर:** shell, फ़ाइल read/write/edit, git ऑपरेशन, glob search, content search +- **वेब:** ब्राउज़र नियंत्रण, web fetch, web search, screenshot, image info, PDF read +- **इंटीग्रेशन:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol टूल रैपर + डिफ़र्ड टूल सेट +- **शेड्यूलिंग:** cron add/remove/update/run, schedule tool +- **मेमोरी:** recall, store, forget, knowledge, project intel +- **उन्नत:** delegate (एजेंट-टू-एजेंट), swarm, model switch/routing, security ops, cloud ops +- **हार्डवेयर:** board info, memory map, memory read (फ़ीचर-गेटेड) + +### रनटाइम + सुरक्षा + +- **स्वायत्तता स्तर:** ReadOnly, Supervised (डिफ़ॉल्ट), Full। +- **सैंडबॉक्सिंग:** workspace आइसोलेशन, पथ ट्रैवर्सल ब्लॉकिंग, कमांड अनुमति सूचियाँ, प्रतिबंधित पथ, Landlock (Linux), Bubblewrap। +- **दर सीमित:** प्रति घंटे अधिकतम कार्य, प्रति दिन अधिकतम लागत (कॉन्फ़िगर योग्य)। +- **अनुमोदन गेटिंग:** मध्यम/उच्च जोखिम संचालन के लिए इंटरैक्टिव अनुमोदन। +- **आपातकालीन रोक:** आपातकालीन शटडाउन क्षमता। +- **129+ सुरक्षा परीक्षण** स्वचालित CI में। + +### ऑप्स + पैकेजिंग + +- वेब डैशबोर्ड सीधे Gateway से सर्व किया जाता है। +- टनल सपोर्ट: Cloudflare, Tailscale, ngrok, OpenVPN, कस्टम कमांड। +- कंटेनराइज़्ड निष्पादन के लिए Docker रनटाइम एडेप्टर। +- CI/CD: बीटा (पुश पर ऑटो) → स्टेबल (मैनुअल डिस्पैच) → Docker, crates.io, Scoop, AUR, Homebrew, ट्वीट। +- Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64) के लिए प्री-बिल्ट बाइनरी। + + +## कॉन्फ़िगरेशन + +न्यूनतम `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +पूर्ण कॉन्फ़िगरेशन संदर्भ: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md)। + +### चैनल कॉन्फ़िगरेशन + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### टनल कॉन्फ़िगरेशन + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +विवरण: [चैनल संदर्भ](docs/reference/api/channels-reference.md) · [कॉन्फ़िग संदर्भ](docs/reference/api/config-reference.md) + +### रनटाइम सपोर्ट (वर्तमान) + +- **`native`** (डिफ़ॉल्ट) — सीधा प्रोसेस निष्पादन, सबसे तेज़ पथ, विश्वसनीय वातावरण के लिए आदर्श। +- **`docker`** — पूर्ण कंटेनर आइसोलेशन, लागू सुरक्षा नीतियाँ, Docker आवश्यक। + +सख्त सैंडबॉक्सिंग या नेटवर्क आइसोलेशन के लिए `runtime.kind = "docker"` सेट करें। + +## सब्सक्रिप्शन ऑथ (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw सब्सक्रिप्शन-नेटिव ऑथ प्रोफ़ाइल का समर्थन करता है (मल्टी-अकाउंट, रेस्ट पर एन्क्रिप्टेड)। + +- स्टोर फ़ाइल: `~/.zeroclaw/auth-profiles.json` +- एन्क्रिप्शन कुंजी: `~/.zeroclaw/.secret_key` +- प्रोफ़ाइल id फ़ॉर्मेट: `:` (उदाहरण: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT subscription) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Check / refresh / switch profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Run the agent with subscription auth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## एजेंट workspace + स्किल + +Workspace रूट: `~/.zeroclaw/workspace/` (कॉन्फ़िग के माध्यम से कॉन्फ़िगर करने योग्य)। + +इंजेक्ट किए गए प्रॉम्प्ट फ़ाइलें: +- `IDENTITY.md` — एजेंट का व्यक्तित्व और भूमिका +- `USER.md` — उपयोगकर्ता संदर्भ और प्राथमिकताएँ +- `MEMORY.md` — दीर्घकालिक तथ्य और सबक +- `AGENTS.md` — सेशन सम्मेलन और इनिशियलाइज़ेशन नियम +- `SOUL.md` — कोर पहचान और संचालन सिद्धांत + +स्किल: `~/.zeroclaw/workspace/skills//SKILL.md` या `SKILL.toml`। + +```bash +# List installed skills +zeroclaw skills list + +# Install from git +zeroclaw skills install https://github.com/user/my-skill.git + +# Security audit before install +zeroclaw skills audit https://github.com/user/my-skill.git + +# Remove a skill +zeroclaw skills remove my-skill +``` + +## CLI कमांड + +```bash +# Workspace management +zeroclaw onboard # Guided setup wizard +zeroclaw status # Show daemon/agent status +zeroclaw doctor # Run system diagnostics + +# Gateway + daemon +zeroclaw gateway # Start gateway server (127.0.0.1:42617) +zeroclaw daemon # Start full autonomous runtime + +# Agent +zeroclaw agent # Interactive chat mode +zeroclaw agent -m "message" # Single message mode + +# Service management +zeroclaw service install # Install as OS service (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Channels +zeroclaw channel list # List configured channels +zeroclaw channel doctor # Check channel health +zeroclaw channel bind-telegram 123456789 + +# Cron + scheduling +zeroclaw cron list # List scheduled jobs +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memory +zeroclaw memory list # List memory entries +zeroclaw memory get # Retrieve a memory +zeroclaw memory stats # Memory statistics + +# Auth profiles +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardware peripherals +zeroclaw hardware discover # Scan for connected devices +zeroclaw peripheral list # List connected peripherals +zeroclaw peripheral flash # Flash firmware to device + +# Migration +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell completions +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +पूर्ण कमांड संदर्भ: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## पूर्वापेक्षाएँ + +
+Windows + +#### आवश्यक + +1. **Visual Studio Build Tools** (MSVC लिंकर और Windows SDK प्रदान करता है): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + इंस्टॉलेशन के दौरान (या Visual Studio Installer के माध्यम से), **"Desktop development with C++"** वर्कलोड चुनें। + +2. **Rust टूलचेन:** + + ```powershell + winget install Rustlang.Rustup + ``` + + इंस्टॉलेशन के बाद, एक नया टर्मिनल खोलें और `rustup default stable` चलाएँ ताकि स्थिर टूलचेन सक्रिय हो। + +3. **सत्यापित करें** कि दोनों काम कर रहे हैं: + ```powershell + rustc --version + cargo --version + ``` + +#### वैकल्पिक + +- **Docker Desktop** — केवल तभी आवश्यक जब [Docker सैंडबॉक्स्ड रनटाइम](#रनटाइम-सपोर्ट-वर्तमान) (`runtime.kind = "docker"`) का उपयोग कर रहे हों। `winget install Docker.DockerDesktop` से इंस्टॉल करें। + +
+ +
+Linux / macOS + +#### आवश्यक + +1. **बिल्ड एसेंशियल:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Xcode Command Line Tools इंस्टॉल करें: `xcode-select --install` + +2. **Rust टूलचेन:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + विवरण के लिए [rustup.rs](https://rustup.rs) देखें। + +3. **सत्यापित करें** कि दोनों काम कर रहे हैं: + ```bash + rustc --version + cargo --version + ``` + +#### एक-पंक्ति इंस्टॉलर + +या ऊपर के चरणों को छोड़ें और एक ही कमांड में सब कुछ (सिस्टम deps, Rust, ZeroClaw) इंस्टॉल करें: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### कंपाइलेशन संसाधन आवश्यकताएँ + +स्रोत से बिल्ड करने के लिए परिणामी बाइनरी चलाने से अधिक संसाधनों की आवश्यकता होती है: + +| संसाधन | न्यूनतम | अनुशंसित | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **खाली डिस्क** | 6 GB | 10 GB+ | + +यदि आपका होस्ट न्यूनतम से नीचे है, तो प्री-बिल्ट बाइनरी का उपयोग करें: + +```bash +./install.sh --prefer-prebuilt +``` + +बिना सोर्स फ़ॉलबैक के केवल बाइनरी इंस्टॉल की आवश्यकता के लिए: + +```bash +./install.sh --prebuilt-only +``` + +#### वैकल्पिक + +- **Docker** — केवल तभी आवश्यक जब [Docker सैंडबॉक्स्ड रनटाइम](#रनटाइम-सपोर्ट-वर्तमान) (`runtime.kind = "docker"`) का उपयोग कर रहे हों। अपने पैकेज मैनेजर या [docker.com](https://docs.docker.com/engine/install/) से इंस्टॉल करें। + +> **नोट:** डिफ़ॉल्ट `cargo build --release` पीक कंपाइल प्रेशर कम करने के लिए `codegen-units=1` का उपयोग करता है। शक्तिशाली मशीनों पर तेज़ बिल्ड के लिए, `cargo build --profile release-fast` का उपयोग करें। + +
+ + + +### प्री-बिल्ट बाइनरी + +रिलीज़ एसेट इसके लिए प्रकाशित किए जाते हैं: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +नवीनतम एसेट यहाँ से डाउनलोड करें: + + +## दस्तावेज़ + +इनका उपयोग तब करें जब आप ऑनबोर्डिंग प्रवाह से आगे हों और गहरा संदर्भ चाहें। + +- नेविगेशन और "क्या कहाँ है" के लिए [दस्तावेज़ सूचकांक](docs/README.md) से शुरू करें। +- पूर्ण सिस्टम मॉडल के लिए [आर्किटेक्चर अवलोकन](docs/architecture.md) पढ़ें। +- जब आपको हर कुंजी और उदाहरण चाहिए तो [कॉन्फ़िगरेशन संदर्भ](docs/reference/api/config-reference.md) का उपयोग करें। +- [संचालन रनबुक](docs/ops/operations-runbook.md) के अनुसार Gateway चलाएँ। +- मार्गदर्शित सेटअप के लिए [ZeroClaw Onboard](#त्वरित-शुरुआत) का पालन करें। +- [समस्या निवारण गाइड](docs/ops/troubleshooting.md) से सामान्य विफलताओं का निदान करें। +- कुछ भी एक्सपोज़ करने से पहले [सुरक्षा मार्गदर्शन](docs/security/README.md) की समीक्षा करें। + +### संदर्भ दस्तावेज़ + +- दस्तावेज़ हब: [docs/README.md](docs/README.md) +- एकीकृत दस्तावेज़ TOC: [docs/SUMMARY.md](docs/SUMMARY.md) +- कमांड संदर्भ: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- कॉन्फ़िग संदर्भ: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- प्रदाता संदर्भ: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- चैनल संदर्भ: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- संचालन रनबुक: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- समस्या निवारण: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### सहयोग दस्तावेज़ + +- योगदान गाइड: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR वर्कफ़्लो नीति: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI वर्कफ़्लो गाइड: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- समीक्षक प्लेबुक: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- सुरक्षा प्रकटीकरण नीति: [SECURITY.md](SECURITY.md) +- दस्तावेज़ टेम्पलेट: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### डिप्लॉयमेंट + संचालन + +- नेटवर्क डिप्लॉयमेंट गाइड: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- प्रॉक्सी एजेंट प्लेबुक: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- हार्डवेयर गाइड: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw को smooth crab 🦀 के लिए बनाया गया था, एक तेज़ और कुशल AI सहायक। Argenis De La Rosa और समुदाय द्वारा निर्मित। + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## ZeroClaw का समर्थन करें + +यदि ZeroClaw आपके काम में मदद करता है और आप चल रहे विकास का समर्थन करना चाहते हैं, तो आप यहाँ दान कर सकते हैं: + +Buy Me a Coffee + +### 🙏 विशेष धन्यवाद + +उन समुदायों और संस्थानों को हृदय से धन्यवाद जो इस ओपन-सोर्स कार्य को प्रेरित और ईंधन देते हैं: + +- **Harvard University** — बौद्धिक जिज्ञासा को बढ़ावा देने और संभावनाओं की सीमाओं को आगे बढ़ाने के लिए। +- **MIT** — खुले ज्ञान, ओपन सोर्स, और इस विश्वास का समर्थन करने के लिए कि तकनीक सभी के लिए सुलभ होनी चाहिए। +- **Sundai Club** — समुदाय, ऊर्जा, और महत्वपूर्ण चीज़ें बनाने के अथक प्रयास के लिए। +- **दुनिया और उससे परे** 🌍✨ — हर योगदानकर्ता, सपने देखने वाले, और बिल्डर के लिए जो ओपन सोर्स को भलाई की शक्ति बना रहे हैं। यह आपके लिए है। + +हम खुले में बना रहे हैं क्योंकि सबसे अच्छे विचार हर जगह से आते हैं। यदि आप यह पढ़ रहे हैं, तो आप इसका हिस्सा हैं। स्वागत है। 🦀❤️ + +## योगदान + +ZeroClaw में नए हैं? [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) लेबल वाले मुद्दों की तलाश करें — शुरू करने का तरीका जानने के लिए हमारा [योगदान गाइड](CONTRIBUTING.md#first-time-contributors) देखें। AI/vibe-coded PRs का स्वागत है! 🤖 + +[CONTRIBUTING.md](CONTRIBUTING.md) और [CLA.md](docs/contributing/cla.md) देखें। एक trait लागू करें, PR सबमिट करें: + +- CI वर्कफ़्लो गाइड: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- नया `Provider` → `src/providers/` +- नया `Channel` → `src/channels/` +- नया `Observer` → `src/observability/` +- नया `Tool` → `src/tools/` +- नया `Memory` → `src/memory/` +- नया `Tunnel` → `src/tunnel/` +- नया `Peripheral` → `src/peripherals/` +- नया `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ आधिकारिक रिपॉजिटरी और प्रतिरूपण चेतावनी + +**यह एकमात्र आधिकारिक ZeroClaw रिपॉजिटरी है:** + +> https://github.com/zeroclaw-labs/zeroclaw + +कोई भी अन्य रिपॉजिटरी, संगठन, डोमेन, या पैकेज जो "ZeroClaw" होने का दावा करता है या ZeroClaw Labs से संबद्धता का संकेत देता है, **अनधिकृत है और इस प्रोजेक्ट से संबद्ध नहीं है**। ज्ञात अनधिकृत फ़ोर्क [TRADEMARK.md](docs/maintainers/trademark.md) में सूचीबद्ध किए जाएँगे। + +यदि आप प्रतिरूपण या ट्रेडमार्क दुरुपयोग का सामना करते हैं, तो कृपया [एक इश्यू खोलें](https://github.com/zeroclaw-labs/zeroclaw/issues)। + +--- + +## लाइसेंस + +ZeroClaw अधिकतम खुलेपन और योगदानकर्ता सुरक्षा के लिए दोहरे-लाइसेंस प्राप्त है: + +| लाइसेंस | उपयोग का मामला | +|---|---| +| [MIT](LICENSE-MIT) | ओपन-सोर्स, अनुसंधान, अकादमिक, व्यक्तिगत उपयोग | +| [Apache 2.0](LICENSE-APACHE) | पेटेंट सुरक्षा, संस्थागत, वाणिज्यिक डिप्लॉयमेंट | + +आप कोई भी लाइसेंस चुन सकते हैं। **योगदानकर्ता स्वचालित रूप से दोनों के तहत अधिकार प्रदान करते हैं** — पूर्ण योगदानकर्ता समझौते के लिए [CLA.md](docs/contributing/cla.md) देखें। + +### ट्रेडमार्क + +**ZeroClaw** नाम और लोगो ZeroClaw Labs के ट्रेडमार्क हैं। यह लाइसेंस समर्थन या संबद्धता का संकेत देने के लिए इनका उपयोग करने की अनुमति नहीं देता। अनुमत और निषिद्ध उपयोग के लिए [TRADEMARK.md](docs/maintainers/trademark.md) देखें। + +### योगदानकर्ता सुरक्षा + +- आप अपने योगदान का **कॉपीराइट बनाए रखते हैं** +- **पेटेंट अनुदान** (Apache 2.0) आपको अन्य योगदानकर्ताओं द्वारा पेटेंट दावों से बचाता है +- आपके योगदान कमिट इतिहास और [NOTICE](NOTICE) में **स्थायी रूप से श्रेयित** हैं +- योगदान करने से कोई ट्रेडमार्क अधिकार स्थानांतरित नहीं होते + +--- + +**ZeroClaw** — शून्य ओवरहेड। शून्य समझौता। कहीं भी डिप्लॉय करें। कुछ भी स्वैप करें। 🦀 + +## योगदानकर्ता + + + ZeroClaw contributors + + +यह सूची GitHub योगदानकर्ता ग्राफ़ से उत्पन्न होती है और स्वचालित रूप से अपडेट होती है। + +## स्टार इतिहास + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.hu.md b/third_party/zeroclaw/README.hu.md new file mode 100644 index 0000000..39420ae --- /dev/null +++ b/third_party/zeroclaw/README.hu.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Szemelyes MI Asszisztens

+ +

+ Nulla terheles. Nulla kompromisszum. 100% Rust. 100% Agnosztikus.
+ ⚡️ $10-os hardveren fut <5MB RAM-mal: Ez 99%-kal kevesebb memoria, mint az OpenClaw es 98%-kal olcsobb, mint egy Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+A Harvard, MIT es Sundai.Club kozossegek diakjai es tagjai epitettek. +

+ +

+ 🌐 Nyelvek: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +A ZeroClaw egy szemelyes MI asszisztens, amelyet a sajat eszkozeiden futtathatsz. Valaszol a mar hasznalt csatornaidon (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work es meg tobb). Rendelkezik webes vezerlopulttal valos ideju iranyitashoz, es csatlakoztathat hardver periferiakhoz (ESP32, STM32, Arduino, Raspberry Pi). A Gateway csupan a vezerlesi sik — a termek maga az asszisztens. + +Ha szemelyes, egyfelhasznalos asszisztenst szeretnel, ami lokalis, gyors es mindig elerheto, ez az. + +

+ Weboldal · + Dokumentacio · + Architektura · + Kezdes · + Atallas OpenClawrol · + Hibaelharitas · + Discord +

+ +> **Ajanlott beallitas:** futtasd a `zeroclaw onboard` parancsot a terminalban. A ZeroClaw Onboard lepesrol lepesre vegigvezet a gateway, munkater, csatornak es szolgaltato beallitasan. Ez az ajanlott beallitasi ut, es mukodik macOS-en, Linuxon es Windowson (WSL2-n keresztul). Uj telepites? Kezdd itt: [Kezdes](#gyors-inditas-tldr) + +### Elofizetes hitelesites (OAuth) + +- **OpenAI Codex** (ChatGPT elofizetes) +- **Gemini** (Google OAuth) +- **Anthropic** (API kulcs vagy hitelesitesi token) + +Modell megjegyzes: bar sok szolgaltato/modell tamogatott, a legjobb elmeny erdekeben hasznald a legerosebb, legujabb generacios modellt. Lasd [Onboarding](#gyors-inditas-tldr). + +Modellek konfiguracio + CLI: [Szolgaltatoi referencia](docs/reference/api/providers-reference.md) +Auth profil rotacio (OAuth vs API kulcsok) + failover: [Modell failover](docs/reference/api/providers-reference.md) + +## Telepites (ajanlott) + +Futtato kornyezet: Rust stable toolchain. Egyetlen binaris, nincs futtatasi ideju fuggoseg. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Egy kattintasos telepites + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +A `zeroclaw onboard` automatikusan lefut a telepites utan a munkater es szolgaltato konfiguralasakor. + +## Gyors inditas (TL;DR) + +Teljes kezdo utmutato (hitelesites, parositas, csatornak): [Kezdes](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Telepites + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Gateway inditasa (webhook szerver + webes vezerlopult) +zeroclaw gateway # alapertelmezett: 127.0.0.1:42617 +zeroclaw gateway --port 0 # veletlenszeru port (biztonsagi szilarditas) + +# Beszelgess az asszisztenssel +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interaktiv mod +zeroclaw agent + +# Teljes autonom futtatas inditasa (gateway + csatornak + cron + hands) +zeroclaw daemon + +# Allapot ellenorzes +zeroclaw status + +# Diagnosztika futtatasa +zeroclaw doctor +``` + +Frissites? Futtasd a `zeroclaw doctor` parancsot a frissites utan. + +### Forrasbol (fejlesztes) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Fejlesztoi alternativa (globalis telepites nelkul):** a parancsokat prefixeld `cargo run --release --`-vel (pelda: `cargo run --release -- status`). + +## Atallas OpenClawrol + +A ZeroClaw importalhatja az OpenClaw munkateret, memoriat es konfiguraciot: + +```bash +# Elonezet az attelepitendo adatokrol (biztonsagos, csak olvasható) +zeroclaw migrate openclaw --dry-run + +# Migracio futtatasa +zeroclaw migrate openclaw +``` + +Ez migralja a memoriabejegyzeseket, munkater fajlokat es konfiguraciot a `~/.openclaw/` konyvtarbol a `~/.zeroclaw/` konyvtarba. A konfiguracio automatikusan JSON-bol TOML-ra konvertalodik. + +## Biztonsagi alapertelmezesek (DM hozzaferes) + +A ZeroClaw valos uzenetfeluletekkez csatlakozik. Kezeld a bejovo DM-eket nem megbizhato bemenetekkent. + +Teljes biztonsagi utmutato: [SECURITY.md](SECURITY.md) + +Alapertelmezett viselkedes minden csatornan: + +- **DM parositas** (alapertelmezett): az ismeretlen feladok rovid parosito kodot kapnak, es a bot nem dolgozza fel az uzenetuket. +- Jovahagy paranccsal: `zeroclaw pairing approve ` (ezutan a felado felkerul egy lokalis engedelyezesi listara). +- A nyilvanos bejovo DM-ek kifejezett opt-in-t igenyelnek a `config.toml`-ban. +- Futtasd a `zeroclaw doctor` parancsot a kockazatos vagy rosszul konfiguralt DM szabalyzatok feltarasahoz. + +**Autonomia szintek:** + +| Szint | Viselkedes | +|-------|------------| +| `ReadOnly` | Az agens megfigyel, de nem cselekszik | +| `Supervised` (alapertelmezett) | Az agens jovahagyassal cselekszik kozepes/magas kockazatu muveletenel | +| `Full` | Az agens autonoman cselekszik a szabalyzat hataran belul | + +**Sandboxing retegek:** munkater izolalas, utvonal-atjaras blokkolas, parancs engedelyezesi listak, tiltott utvonalak (`/etc`, `/root`, `~/.ssh`), sebessegkorlatozas (max muveletek/ora, koltseg/nap korlatok). + + + + +### 📢 Kozlemenyek + +Hasznald ezt a tablat fontos ertesitesekhez (torekenyen kompatibilis valtozasok, biztonsagi tanacsadok, karbantartasi idosavok es kiadasi blokkolok). + +| Datum (UTC) | Szint | Ertesites | Teendo | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Kritikus_ | **Nem** allunk kapcsolatban az `openagen/zeroclaw`, `zeroclaw.org` vagy `zeroclaw.net` oldalakkal. A `zeroclaw.org` es `zeroclaw.net` domainek jelenleg az `openagen/zeroclaw` fork-ra mutatnak, es az a domain/tarolo megszemelyesiti a hivatalos weboldalunkat/projektunket. | Ne bizz meg az ezekbol a forrasokbol szarmazo informaciokban, binarisokban, adomanygyujtesekben vagy kozlemenyekben. Kizarolag [ezt a tarolot](https://github.com/zeroclaw-labs/zeroclaw) es az ellenorzott kozossegi media fiokjainkat hasznald. | +| 2026-02-21 | _Fontos_ | A hivatalos weboldalunk most mar el: [zeroclawlabs.ai](https://zeroclawlabs.ai). Koszonjuk turelmuket, amig elokeszitettuk az inditast. Meg mindig latunk megszemelyesitesi kiserleteket, ezert **ne** csatlakozz semmilyen befektetesi vagy adomanygyujtesi tevekenyseghez, amely a ZeroClaw nevet hasznalja, hacsak nem a hivatalos csatornainkon keresztul jelenik meg. | Hasznald [ezt a tarolot](https://github.com/zeroclaw-labs/zeroclaw) egyetlen igazsagforraskent. Kovesd az [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs) es [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) oldalakat a hivatalos frissitesekert. | +| 2026-02-19 | _Fontos_ | Az Anthropic frissitette a Hitelesitesi es Hitellevelek Hasznalara vonatkozo felteteleket 2026-02-19-en. A Claude Code OAuth tokenek (Free, Pro, Max) kizarolag a Claude Code es a Claude.ai szamara keszultek; az OAuth tokenek barmely mas termekben, eszkozben vagy szolgaltatasban valo hasznalata (beleertve az Agent SDK-t) nem megengedett es sertheti a Fogyasztoi Szolgaltatasi Felteteleket. | Kerlek ideiglenesen keruld a Claude Code OAuth integraciokat a potencialis veszteseg megelozese erdekeben. Eredeti kikotes: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Fobb jellemzok + +- **Konnyu futtatokornyezet alapertelmezetten** — a szokasos CLI es allapot munkafolyamatok nehany megabajtos memoria burkban futnak release buildekben. +- **Koltseghatekony telepites** — $10-os kartyakhoz es kis cloud peldanyokhoz tervezve, nehez futtatokornyezeti fuggosegek nelkul. +- **Gyors hideg inditas** — az egyetlen binarisbol allo Rust futtatokornyezet szinte azonnali parancs- es daemon-inditast biztosit. +- **Hordozhato architektura** — egy binaris ARM, x86 es RISC-V rendszereken cserelheto szolgaltatok/csatornak/eszkozokkel. +- **Lokalis-eloszor Gateway** — egyetlen vezerlesi sik a munkamenetekhez, csatornakhoz, eszkozokhoz, cron-hoz, SOP-khoz es esemenyekhez. +- **Tobbcsatornas beerkeze** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket es meg tobb. +- **Tobbagens orkesztracio (Hands)** — autonom agens rajok, amelyek utemezetten futnak es idovel okosabbak lesznek. +- **Szabvanyos Muveleti Eljarasok (SOPs)** — esemenyvezeerlt munkafolyamat automatizalas MQTT, webhook, cron es periferia triggerekkel. +- **Webes vezerlopult** — React 19 + Vite webes felulet valos ideju csevegeessel, memoriaboongeszevel, konfiguracioszerkesztovel, cron kezelovel es eszkoz vizsgaloval. +- **Hardver periferiak** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO a `Peripheral` trait-en keresztul. +- **Elso osztalyu eszkozok** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace es 70+ tovabb. +- **Eletciklus hookok** — LLM hivasok, eszkozvegrehajtasok es uzenetek elfogasa es modositasa minden szinten. +- **Kepesseg platform** — beepitett, kozossegi es munkater kepessegek biztonsagi auditalassal. +- **Tunnel tamogatas** — Cloudflare, Tailscale, ngrok, OpenVPN es egyedi tunnelek tavoli hozzafereshez. + +### Miert valasztjak a csapatok a ZeroClaw-t + +- **Konnyu alapertelmezetten:** kis Rust binaris, gyors inditas, alacsony memoriahasznalat. +- **Biztonsagos tervezessel:** parositas, szigoru sandboxing, kifejezett engedelyezesi listak, munkater hatarolás. +- **Teljesen cserelheto:** az alaprendszerek trait-ek (providers, channels, tools, memory, tunnels). +- **Nincs bezartsag:** OpenAI-kompatibilis szolgaltatoi tamogatas + csatlakoztatható egyedi vegpontok. + +## Benchmark pillanatkep (ZeroClaw vs OpenClaw, Reprodukalhato) + +Lokalis gepi gyors benchmark (macOS arm64, 2026 feb.) normalizalva 0.8GHz edge hardverre. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Nyelv** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Inditas (0.8GHz core)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Binaris meret** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Koltseg** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Barmilyen hardver $10** | + +> Megjegyzesek: A ZeroClaw eredmenyek release buildeken merve `/usr/bin/time -l` hasznalataval. Az OpenClaw Node.js futtatokornyezetet igenyel (tipikusan ~390MB memoria terheles), mig a NanoBot Python futtatokornyezetet. A PicoClaw es ZeroClaw statikus binarisok. A fenti RAM adatok futtatasi ideju memoriat mutatnak; a forditasi ideju kovetelmenyek magasabbak. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Reprodukalhato lokalis meres + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Minden, amit eddig epitettunk + +### Alapplatform + +- Gateway HTTP/WS/SSE vezerlesi sik munkamenetekkel, jelenleettel, konfiguracioval, cron-nal, webhookkal, webes vezerlopulttal es parositassal. +- CLI felulet: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Agens orkesztracios hurk eszkoz-kuldessel, prompt epitessel, uzenet osztalyozassal es memoria betoltessel. +- Munkamenet modell biztonsagi szabalyzat ervenyesitessel, autonomia szintekkel es jovahagyasi kapuval. +- Ellenallo szolgaltatoi wrapper failover-rel, ujraprobalassal es modell iranyitassal 20+ LLM backend-en. + +### Csatornak + +Csatornak: WhatsApp (native), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Webes vezerlopult + +React 19 + Vite 6 + Tailwind CSS 4 webes vezerlopult, amelyet kozvetlenul a Gateway szolgaltat ki: + +- **Dashboard** — rendszer attekintes, egeszsegi allapot, uzemido, koltsegkovetes +- **Agent Chat** — interaktiv csevegees az agenssel +- **Memory** — memoriabejegyzesek bongeszese es kezelese +- **Config** — konfiguracio megtekintese es szerkesztese +- **Cron** — utemezett feladatok kezelese +- **Tools** — elerheto eszkozok bongeszese +- **Logs** — agens tevekenysegnaplo megtekintese +- **Cost** — token hasznalat es koltsegkovetes +- **Doctor** — rendszer egeszseugyi diagnosztika +- **Integrations** — integracios allapot es beallitas +- **Pairing** — eszkoz parositas kezeles + +### Firmware celok + +| Cel | Platform | Rendeltetees | +|-----|----------|-------------| +| ESP32 | Espressif ESP32 | Vezetek nelkuli periferia agens | +| ESP32-UI | ESP32 + Display | Agens vizualis feluelettel | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Ipari periferia | +| Arduino | Arduino | Alap szenzor/aktualtor hid | +| Uno Q Bridge | Arduino Uno | Soros hid az agenshez | + +### Eszkozok + automatizalas + +- **Alap:** shell, file read/write/edit, git operations, glob search, content search +- **Web:** browser control, web fetch, web search, screenshot, image info, PDF read +- **Integraciok:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **Utemezes:** cron add/remove/update/run, schedule tool +- **Memoria:** recall, store, forget, knowledge, project intel +- **Halado:** delegate (agent-to-agent), swarm, model switch/routing, security ops, cloud ops +- **Hardver:** board info, memory map, memory read (feature-gated) + +### Futtatokornyezet + biztonsag + +- **Autonomia szintek:** ReadOnly, Supervised (alapertelmezett), Full. +- **Sandboxing:** munkater izolalas, utvonal-atjaras blokkolas, parancs engedelyezesi listak, tiltott utvonalak, Landlock (Linux), Bubblewrap. +- **Sebessegkorlatozas:** max muveletek orankent, max koltseg naponta (konfiguralhato). +- **Jovahagyasi kapu:** interaktiv jovahagy kozepes/magas kockazatu mueveletekhez. +- **E-stop:** veszleallitasi kepesseg. +- **129+ biztonsagi teszt** automatizalt CI-ben. + +### Muveletek + csomagolas + +- Webes vezerlopult kozvetlenul a Gateway-bol kiszolgalva. +- Tunnel tamogatas: Cloudflare, Tailscale, ngrok, OpenVPN, egyedi parancs. +- Docker runtime adapter konterizalt vegrehajtashoz. +- CI/CD: beta (auto on push) → stable (manual dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Elore elkeszitett binarisok Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64) rendszerekhez. + + +## Konfiguracio + +Minimalis `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Teljes konfiguracios referencia: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Csatorna konfiguracio + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Tunnel konfiguracio + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Reszletek: [Csatorna referencia](docs/reference/api/channels-reference.md) · [Konfiguracios referencia](docs/reference/api/config-reference.md) + +### Futtatokornyezet tamogatas (aktualis) + +- **`native`** (alapertelmezett) — kozvetlen folyamat vegrehajtas, leggyorsabb ut, idealis megbizhato kornyezetekhez. +- **`docker`** — teljes kontener izolalas, ervenyesitett biztonsagi szabalyzatok, Docker szukseges. + +Allitsd be a `runtime.kind = "docker"` erteket a szigoru sandboxinghoz vagy halozati izolaciohoz. + +## Elofizetes hitelesites (OpenAI Codex / Claude Code / Gemini) + +A ZeroClaw tamogatja az elofizetes-nativ hitelesitesi profilokat (tobb fiok, titkositva tarolva). + +- Tarolo fajl: `~/.zeroclaw/auth-profiles.json` +- Titkositasi kulcs: `~/.zeroclaw/.secret_key` +- Profil azonosito formatum: `:` (pelda: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT subscription) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Check / refresh / switch profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Run the agent with subscription auth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Agens munkater + kepessegek + +Munkater gyoker: `~/.zeroclaw/workspace/` (konfiguralhato a config-on keresztul). + +Beinjektalt prompt fajlok: +- `IDENTITY.md` — agens szemelyiseg es szerep +- `USER.md` — felhasznaloi kontextus es prefernciak +- `MEMORY.md` — hosszu tavu tenyek es tanulsagok +- `AGENTS.md` — munkamenet konvenciok es inicializalasi szabalyok +- `SOUL.md` — alapveto identitas es mukodesi elvek + +Kepessegek: `~/.zeroclaw/workspace/skills//SKILL.md` vagy `SKILL.toml`. + +```bash +# List installed skills +zeroclaw skills list + +# Install from git +zeroclaw skills install https://github.com/user/my-skill.git + +# Security audit before install +zeroclaw skills audit https://github.com/user/my-skill.git + +# Remove a skill +zeroclaw skills remove my-skill +``` + +## CLI parancsok + +```bash +# Munkater kezeles +zeroclaw onboard # Vezerelt beallitasi varazslo +zeroclaw status # Daemon/agent allapot megjelenites +zeroclaw doctor # Rendszer diagnosztika futtatasa + +# Gateway + daemon +zeroclaw gateway # Gateway szerver inditasa (127.0.0.1:42617) +zeroclaw daemon # Teljes autonom futtatas inditasa + +# Agens +zeroclaw agent # Interaktiv csevegesi mod +zeroclaw agent -m "message" # Egyszeri uzenet mod + +# Szolgaltatas kezeles +zeroclaw service install # Telepites OS szolgaltataskent (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Csatornak +zeroclaw channel list # Konfiguralt csatornak listazasa +zeroclaw channel doctor # Csatorna egeszseg ellenorzes +zeroclaw channel bind-telegram 123456789 + +# Cron + utemezes +zeroclaw cron list # Utemezett feladatok listazasa +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memoria +zeroclaw memory list # Memoriabejegyzesek listazasa +zeroclaw memory get # Memoria lekerese +zeroclaw memory stats # Memoria statisztikak + +# Hitelesitesi profilok +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardver periferiak +zeroclaw hardware discover # Csatlakoztatott eszkozok keresese +zeroclaw peripheral list # Csatlakoztatott periferiak listazasa +zeroclaw peripheral flash # Firmware felirasa eszkozre + +# Migracio +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell kiegeszitesek +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Teljes parancs referencia: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Elofeltetelek + +
+Windows + +#### Szukseges + +1. **Visual Studio Build Tools** (biztositja az MSVC linkert es a Windows SDK-t): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + A telepites soran (vagy a Visual Studio Installer-en keresztul) valaszd a **"Desktop development with C++"** munkafolyamatot. + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + A telepites utan nyiss egy uj terminalt es futtasd a `rustup default stable` parancsot a stabil toolchain aktivalasahoz. + +3. **Ellenorzes**, hogy mindketto mukodik: + ```powershell + rustc --version + cargo --version + ``` + +#### Opcionalis + +- **Docker Desktop** — csak a [Docker sandboxed runtime](#futtatokornyezet-tamogatas-aktualis) hasznalatahoz szukseges (`runtime.kind = "docker"`). Telepites: `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Szukseges + +1. **Epitesi alapeszkozok:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Telepitsd az Xcode Command Line Tools-t: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Reszletekert lasd [rustup.rs](https://rustup.rs). + +3. **Ellenorzes**, hogy mindketto mukodik: + ```bash + rustc --version + cargo --version + ``` + +#### Egyvonalas telepito + +Vagy hagyd ki a fenti lepeseket es telepits mindent (rendszer fuggosegek, Rust, ZeroClaw) egyetlen paranccsal: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Forditasi eroforrasigeny + +A forrasbol valo epites tobb eroforras igenyel, mint az eredmeny binaris futtatasa: + +| Eroforras | Minimum | Ajanlott | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Szabad lemez** | 6 GB | 10 GB+ | + +Ha a gazdageped a minimum alatt van, hasznalj elore elkeszitett binarisokat: + +```bash +./install.sh --prefer-prebuilt +``` + +Kizarolag binaris telepiteshez forras alternativa nelkul: + +```bash +./install.sh --prebuilt-only +``` + +#### Opcionalis + +- **Docker** — csak a [Docker sandboxed runtime](#futtatokornyezet-tamogatas-aktualis) hasznalatahoz szukseges (`runtime.kind = "docker"`). Telepites a csomagkezelodon keresztul vagy [docker.com](https://docs.docker.com/engine/install/). + +> **Megjegyzes:** Az alapertelmezett `cargo build --release` `codegen-units=1` erteket hasznal a csucs forditasi terheles csokkenteseere. Gyorsabb epitesekhez eros gepeken hasznald a `cargo build --profile release-fast` parancsot. + +
+ + + +### Elore elkeszitett binarisok + +Kiadas eszkozok az alabbi platformokra kerulnek kozetetelre: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Toltsd le a legujabb eszkozoket innen: + + +## Dokumentacio + +Hasznald ezeket, ha tuljutottal az onboarding folyamaton es melyebb referenciara van szukseged. + +- Kezdd a [dokumentacios indexszel](docs/README.md) a navigaciohoz es a "mi hol talalhato" informaciohoz. +- Olvasd el az [architektura attekintest](docs/architecture.md) a teljes rendszermodellhez. +- Hasznald a [konfiguracios referenciat](docs/reference/api/config-reference.md), ha minden kulcsra es peldara szukseged van. +- Futtasd a Gateway-t a konyv szerint az [uzemeltetesi kezikonyvvel](docs/ops/operations-runbook.md). +- Kovesd a [ZeroClaw Onboard](#gyors-inditas-tldr) szolgaltatast a vezerelt beallitashoz. +- Hibakeress a gyakori problemakat a [hibaelharitasi utmutatoval](docs/ops/troubleshooting.md). +- Tekintsd at a [biztonsagi utmutatast](docs/security/README.md) mielott barmit is kiteszel. + +### Referencia dokumentaciok + +- Dokumentacios kozpont: [docs/README.md](docs/README.md) +- Egysegesitett tartalomjegyzek: [docs/SUMMARY.md](docs/SUMMARY.md) +- Parancs referencia: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Konfiguracios referencia: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Szolgaltatoi referencia: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Csatorna referencia: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Uzemeltetesi kezikonyv: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Hibaelharitas: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Egyuttmukodesi dokumentaciok + +- Hozzajarulasi utmutato: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR munkafolyamat szabalyzat: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI munkafolyamat utmutato: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Biraloi kezikonyv: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Biztonsagi kozzeteeteli szabalyzat: [SECURITY.md](SECURITY.md) +- Dokumentacios sablon: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Telepites + muveletek + +- Halozati telepitesi utmutato: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Proxy agens kezikonyv: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Hardver utmutatok: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +A ZeroClaw a smooth crab 🦀 szamara keszult, egy gyors es hatekony MI asszisztens. Epitette Argenis De La Rosa es a kozosseg. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Tamogasd a ZeroClaw-t + +Ha a ZeroClaw segiti a munkadat es tamogatni szeretned a folyamatos fejlesztest, itt adomanyozhatsz: + +Buy Me a Coffee + +### 🙏 Kulonos koszonet + +Szivbol jovo koszonet a kozossegeknek es intezmenyeknek, amelyek inspiraljak es taplaljak ezt a nyilt forrasu munkat: + +- **Harvard University** — az intellektualis kivancsiság apolasaert es a lehetosegek hatarainak tolásáert. +- **MIT** — a nyilt tudas, nyilt forras es azon hit bajnokakent, hogy a technologianak mindenki szamara elerheto kell lennie. +- **Sundai Club** — a kozossegert, az energiaert es a szuntelen torekveseert, hogy fontos dolgokat epitsenek. +- **A Vilag es Azon Tul** 🌍✨ — minden hozzajarulonak, almodonak es epitonek, aki a nyilt forrast a jo erdekeben mukodo erove teszi. Ez neked szol. + +Nyiltan epitunk, mert a legjobb otletek mindenhonnan jonnek. Ha ezt olvasod, a resze vagy. Udvozlunk. 🦀❤️ + +## Hozzajarulas + +Uj vagy a ZeroClaw-ban? Keresd a [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) cimkevel ellatott issue-kat — lasd a [Hozzajarulasi utmutatot](CONTRIBUTING.md#first-time-contributors) a kezdeshez. AI/vibe-coded PR-ok szivesen latottak! 🤖 + +Lasd [CONTRIBUTING.md](CONTRIBUTING.md) es [CLA.md](docs/contributing/cla.md). Implementalj egy trait-et, kuuldj be egy PR-t: + +- CI munkafolyamat utmutato: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Uj `Provider` → `src/providers/` +- Uj `Channel` → `src/channels/` +- Uj `Observer` → `src/observability/` +- Uj `Tool` → `src/tools/` +- Uj `Memory` → `src/memory/` +- Uj `Tunnel` → `src/tunnel/` +- Uj `Peripheral` → `src/peripherals/` +- Uj `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Hivatalos tarolo es megszemelyesitesi figyelmeztetes + +**Ez az egyetlen hivatalos ZeroClaw tarolo:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Barmely mas tarolo, szervezet, domain vagy csomag, amely azt allitja, hogy "ZeroClaw" vagy kapcsolatot sugall a ZeroClaw Labs-szal, **jogosulatlan es nem all kapcsolatban ezzel a projekttel**. Az ismert jogosulatlan forkok a [TRADEMARK.md](docs/maintainers/trademark.md) fajlban lesznek felsorolva. + +Ha megszemelyesitessel vagy vedjeggyel valo visszaelessel talalkozol, kerlek [nyiss egy issue-t](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Licenc + +A ZeroClaw kettos licenccel rendelkezik a maximalis nyitottsag es hozzajaruloi vedelem erdekeben: + +| Licenc | Felhasznalasi eset | +|---|---| +| [MIT](LICENSE-MIT) | Nyilt forras, kutatas, akademiai, szemelyes haszanalat | +| [Apache 2.0](LICENSE-APACHE) | Szabadalmi vedelem, intezmenyi, kereskedelmi telepites | + +Barmely licencet valaszthatod. **A hozzajarulok automatikusan mindketto alatt jogot biztositanak** — lasd [CLA.md](docs/contributing/cla.md) a teljes hozzajarulasi megallapodasert. + +### Vedjegy + +A **ZeroClaw** nev es logo a ZeroClaw Labs vedjegyei. Ez a licenc nem ad engedelyt arra, hogy tamogatast vagy kapcsolatot sugalljanak. Lasd [TRADEMARK.md](docs/maintainers/trademark.md) a megengedett es tiltott hasznalati modokert. + +### Hozzajaruloi vedelmek + +- **Megtartod a szerzoi jogot** a hozzajarulasaidon +- **Szabadalmi engedely** (Apache 2.0) vedi meg mas hozzajarulok szabadalmi igenyeitol +- A hozzajarulasaid **veglegesen attribulaltak** a commit tortenelben es a [NOTICE](NOTICE) fajlban +- Nem kerulnek at vedjegyjogok a hozzajarulassal + +--- + +**ZeroClaw** — Nulla terheles. Nulla kompromisszum. Telepites barhova. Csere barmire. 🦀 + +## Hozzajarulok + + + ZeroClaw contributors + + +Ez a lista a GitHub hozzajaruloi grafikonjabol keszul es automatikusan frissul. + +## Csillag tortenelem + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.id.md b/third_party/zeroclaw/README.id.md new file mode 100644 index 0000000..c017b2a --- /dev/null +++ b/third_party/zeroclaw/README.id.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Asisten AI Pribadi

+ +

+ Nol overhead. Nol kompromi. 100% Rust. 100% Agnostik.
+ ⚡️ Berjalan di perangkat keras $10 dengan RAM <5MB: Itu 99% lebih hemat memori dari OpenClaw dan 98% lebih murah dari Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Dibangun oleh mahasiswa dan anggota komunitas Harvard, MIT, dan Sundai.Club. +

+ +

+ 🌐 Bahasa: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw adalah asisten AI pribadi yang Anda jalankan di perangkat sendiri. Ia menjawab Anda melalui saluran yang sudah Anda gunakan (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, dan lainnya). Ia memiliki dasbor web untuk kontrol real-time dan dapat terhubung ke periferal perangkat keras (ESP32, STM32, Arduino, Raspberry Pi). Gateway hanyalah bidang kendali — produknya adalah asisten. + +Jika Anda menginginkan asisten pribadi, pengguna tunggal, yang terasa lokal, cepat, dan selalu aktif, inilah solusinya. + +

+ Situs Web · + Dokumentasi · + Arsitektur · + Memulai · + Migrasi dari OpenClaw · + Pemecahan Masalah · + Discord +

+ +> **Pengaturan yang disarankan:** jalankan `zeroclaw onboard` di terminal Anda. ZeroClaw Onboard memandu Anda langkah demi langkah dalam menyiapkan gateway, workspace, saluran, dan provider. Ini adalah jalur pengaturan yang disarankan dan berfungsi di macOS, Linux, dan Windows (melalui WSL2). Instalasi baru? Mulai di sini: [Memulai](#mulai-cepat) + +### Autentikasi Berlangganan (OAuth) + +- **OpenAI Codex** (langganan ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (kunci API atau token autentikasi) + +Catatan model: meskipun banyak provider/model didukung, untuk pengalaman terbaik gunakan model generasi terbaru terkuat yang tersedia untuk Anda. Lihat [Onboarding](#mulai-cepat). + +Konfigurasi model + CLI: [Referensi Provider](docs/reference/api/providers-reference.md) +Rotasi profil autentikasi (OAuth vs kunci API) + failover: [Failover Model](docs/reference/api/providers-reference.md) + +## Instal (disarankan) + +Runtime: Rust stable toolchain. Biner tunggal, tanpa dependensi runtime. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Bootstrap sekali klik + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` berjalan otomatis setelah instalasi untuk mengonfigurasi workspace dan provider Anda. + +## Mulai cepat (TL;DR) + +Panduan lengkap pemula (autentikasi, pairing, saluran): [Memulai](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Instal + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Mulai gateway (server webhook + dasbor web) +zeroclaw gateway # default: 127.0.0.1:42617 +zeroclaw gateway --port 0 # port acak (keamanan ditingkatkan) + +# Bicara ke asisten +zeroclaw agent -m "Hello, ZeroClaw!" + +# Mode interaktif +zeroclaw agent + +# Mulai runtime otonom penuh (gateway + saluran + cron + hands) +zeroclaw daemon + +# Periksa status +zeroclaw status + +# Jalankan diagnostik +zeroclaw doctor +``` + +Memperbarui? Jalankan `zeroclaw doctor` setelah pembaruan. + +### Dari sumber (pengembangan) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Alternatif dev (tanpa instalasi global):** awali perintah dengan `cargo run --release --` (contoh: `cargo run --release -- status`). + +## Migrasi dari OpenClaw + +ZeroClaw dapat mengimpor workspace, memori, dan konfigurasi OpenClaw Anda: + +```bash +# Pratinjau apa yang akan dimigrasikan (aman, hanya-baca) +zeroclaw migrate openclaw --dry-run + +# Jalankan migrasi +zeroclaw migrate openclaw +``` + +Ini memigrasikan entri memori, file workspace, dan konfigurasi Anda dari `~/.openclaw/` ke `~/.zeroclaw/`. Konfigurasi dikonversi dari JSON ke TOML secara otomatis. + +## Default keamanan (akses DM) + +ZeroClaw terhubung ke permukaan pesan nyata. Perlakukan DM masuk sebagai input tidak tepercaya. + +Panduan keamanan lengkap: [SECURITY.md](SECURITY.md) + +Perilaku default di semua saluran: + +- **Pairing DM** (default): pengirim yang tidak dikenal menerima kode pairing singkat dan bot tidak memproses pesan mereka. +- Setujui dengan: `zeroclaw pairing approve ` (kemudian pengirim ditambahkan ke daftar izin lokal). +- DM masuk publik memerlukan opt-in eksplisit di `config.toml`. +- Jalankan `zeroclaw doctor` untuk menemukan kebijakan DM yang berisiko atau salah konfigurasi. + +**Level otonomi:** + +| Level | Perilaku | +|-------|----------| +| `ReadOnly` | Agen dapat mengamati tetapi tidak bertindak | +| `Supervised` (default) | Agen bertindak dengan persetujuan untuk operasi risiko menengah/tinggi | +| `Full` | Agen bertindak secara otonom dalam batas kebijakan | + +**Lapisan sandboxing:** isolasi workspace, pemblokiran traversal jalur, daftar izin perintah, jalur terlarang (`/etc`, `/root`, `~/.ssh`), pembatasan laju (maksimum tindakan/jam, batas biaya/hari). + + + + +### 📢 Pengumuman + +Gunakan papan ini untuk pemberitahuan penting (perubahan yang merusak, saran keamanan, jendela pemeliharaan, dan pemblokir rilis). + +| Tanggal (UTC) | Level | Pemberitahuan | Tindakan | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Kritis_ | Kami **tidak berafiliasi** dengan `openagen/zeroclaw`, `zeroclaw.org` atau `zeroclaw.net`. Domain `zeroclaw.org` dan `zeroclaw.net` saat ini mengarah ke fork `openagen/zeroclaw`, dan domain/repositori tersebut menyamar sebagai situs web/proyek resmi kami. | Jangan percaya informasi, biner, penggalangan dana, atau pengumuman dari sumber tersebut. Gunakan hanya [repositori ini](https://github.com/zeroclaw-labs/zeroclaw) dan akun sosial terverifikasi kami. | +| 2026-02-21 | _Penting_ | Situs web resmi kami sekarang aktif: [zeroclawlabs.ai](https://zeroclawlabs.ai). Terima kasih atas kesabaran Anda selama kami mempersiapkan peluncuran. Kami masih melihat upaya peniruan, jadi **jangan** bergabung dengan aktivitas investasi atau penggalangan dana yang mengklaim nama ZeroClaw kecuali dipublikasikan melalui saluran resmi kami. | Gunakan [repositori ini](https://github.com/zeroclaw-labs/zeroclaw) sebagai satu-satunya sumber kebenaran. Ikuti [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs), dan [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) untuk pembaruan resmi. | +| 2026-02-19 | _Penting_ | Anthropic memperbarui ketentuan Autentikasi dan Penggunaan Kredensial pada 2026-02-19. Token OAuth Claude Code (Free, Pro, Max) ditujukan secara eksklusif untuk Claude Code dan Claude.ai; menggunakan token OAuth dari Claude Free/Pro/Max di produk, alat, atau layanan lain (termasuk Agent SDK) tidak diizinkan dan dapat melanggar Ketentuan Layanan Konsumen. | Harap sementara hindari integrasi OAuth Claude Code untuk mencegah potensi kerugian. Klausul asli: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Sorotan + +- **Runtime Ringan secara Default** — alur kerja CLI dan status umum berjalan dalam amplop memori beberapa megabyte pada build rilis. +- **Deployment Hemat Biaya** — dirancang untuk board $10 dan instans cloud kecil, tanpa dependensi runtime berat. +- **Cold Start Cepat** — runtime Rust biner tunggal menjaga startup perintah dan daemon hampir instan. +- **Arsitektur Portabel** — satu biner di ARM, x86, dan RISC-V dengan provider/saluran/alat yang dapat ditukar. +- **Gateway Lokal-Pertama** — bidang kendali tunggal untuk sesi, saluran, alat, cron, SOP, dan peristiwa. +- **Inbox multi-saluran** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket, dan lainnya. +- **Orkestrasi multi-agen (Hands)** — swarm agen otonom yang berjalan sesuai jadwal dan semakin pintar seiring waktu. +- **Standard Operating Procedures (SOP)** — otomasi alur kerja berbasis peristiwa dengan MQTT, webhook, cron, dan pemicu periferal. +- **Dasbor Web** — UI web React 19 + Vite dengan obrolan real-time, browser memori, editor konfigurasi, manajer cron, dan inspektor alat. +- **Periferal perangkat keras** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO melalui trait `Peripheral`. +- **Alat kelas satu** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace, dan 70+ lainnya. +- **Hook siklus hidup** — intersep dan modifikasi panggilan LLM, eksekusi alat, dan pesan di setiap tahap. +- **Platform skill** — skill bawaan, komunitas, dan workspace dengan audit keamanan. +- **Dukungan tunnel** — Cloudflare, Tailscale, ngrok, OpenVPN, dan tunnel kustom untuk akses jarak jauh. + +### Mengapa tim memilih ZeroClaw + +- **Ringan secara default:** biner Rust kecil, startup cepat, jejak memori rendah. +- **Aman secara desain:** pairing, sandboxing ketat, daftar izin eksplisit, pelingkupan workspace. +- **Sepenuhnya dapat ditukar:** sistem inti adalah trait (provider, saluran, alat, memori, tunnel). +- **Tanpa lock-in:** dukungan provider kompatibel OpenAI + endpoint kustom pluggable. + +## Cuplikan Benchmark (ZeroClaw vs OpenClaw, Dapat Direproduksi) + +Benchmark cepat mesin lokal (macOS arm64, Feb 2026) dinormalisasi untuk perangkat keras edge 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Bahasa** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Startup (inti 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Ukuran Biner** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Biaya** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Perangkat keras apa pun $10** | + +> Catatan: Hasil ZeroClaw diukur pada build rilis menggunakan `/usr/bin/time -l`. OpenClaw memerlukan runtime Node.js (biasanya ~390MB overhead memori tambahan), sedangkan NanoBot memerlukan runtime Python. PicoClaw dan ZeroClaw adalah biner statis. Angka RAM di atas adalah memori runtime; kebutuhan kompilasi saat build lebih tinggi. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Pengukuran lokal yang dapat direproduksi + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Semua yang telah kami bangun sejauh ini + +### Platform inti + +- Bidang kendali HTTP/WS/SSE Gateway dengan sesi, presence, konfigurasi, cron, webhook, dasbor web, dan pairing. +- Permukaan CLI: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Loop orkestrasi agen dengan dispatch alat, konstruksi prompt, klasifikasi pesan, dan pemuatan memori. +- Model sesi dengan penegakan kebijakan keamanan, level otonomi, dan gating persetujuan. +- Wrapper provider resilient dengan failover, retry, dan routing model di 20+ backend LLM. + +### Saluran + +Saluran: WhatsApp (native), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Dasbor web + +Dasbor web React 19 + Vite 6 + Tailwind CSS 4 yang disajikan langsung dari Gateway: + +- **Dashboard** — ikhtisar sistem, status kesehatan, uptime, pelacakan biaya +- **Agent Chat** — obrolan interaktif dengan agen +- **Memory** — jelajahi dan kelola entri memori +- **Config** — lihat dan edit konfigurasi +- **Cron** — kelola tugas terjadwal +- **Tools** — jelajahi alat yang tersedia +- **Logs** — lihat log aktivitas agen +- **Cost** — penggunaan token dan pelacakan biaya +- **Doctor** — diagnostik kesehatan sistem +- **Integrations** — status integrasi dan pengaturan +- **Pairing** — manajemen pairing perangkat + +### Target firmware + +| Target | Platform | Tujuan | +|--------|----------|--------| +| ESP32 | Espressif ESP32 | Agen periferal nirkabel | +| ESP32-UI | ESP32 + Display | Agen dengan antarmuka visual | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Periferal industri | +| Arduino | Arduino | Jembatan sensor/aktuator dasar | +| Uno Q Bridge | Arduino Uno | Jembatan serial ke agen | + +### Alat + otomasi + +- **Inti:** shell, file read/write/edit, operasi git, glob search, content search +- **Web:** browser control, web fetch, web search, screenshot, image info, PDF read +- **Integrasi:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **Penjadwalan:** cron add/remove/update/run, schedule tool +- **Memori:** recall, store, forget, knowledge, project intel +- **Lanjutan:** delegate (agen-ke-agen), swarm, model switch/routing, security ops, cloud ops +- **Perangkat keras:** board info, memory map, memory read (feature-gated) + +### Runtime + keamanan + +- **Level otonomi:** ReadOnly, Supervised (default), Full. +- **Sandboxing:** isolasi workspace, pemblokiran traversal jalur, daftar izin perintah, jalur terlarang, Landlock (Linux), Bubblewrap. +- **Pembatasan laju:** maksimum tindakan per jam, maksimum biaya per hari (dapat dikonfigurasi). +- **Gating persetujuan:** persetujuan interaktif untuk operasi risiko menengah/tinggi. +- **E-stop:** kemampuan shutdown darurat. +- **129+ tes keamanan** dalam CI otomatis. + +### Ops + pengemasan + +- Dasbor web disajikan langsung dari Gateway. +- Dukungan tunnel: Cloudflare, Tailscale, ngrok, OpenVPN, perintah kustom. +- Adapter runtime Docker untuk eksekusi terkontainerisasi. +- CI/CD: beta (otomatis saat push) → stable (dispatch manual) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Biner pre-built untuk Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Konfigurasi + +Minimal `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Referensi konfigurasi lengkap: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Konfigurasi saluran + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Konfigurasi tunnel + +```toml +[tunnel] +kind = "cloudflare" # atau "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Detail: [Referensi Saluran](docs/reference/api/channels-reference.md) · [Referensi Konfigurasi](docs/reference/api/config-reference.md) + +### Dukungan runtime (saat ini) + +- **`native`** (default) — eksekusi proses langsung, jalur tercepat, ideal untuk lingkungan tepercaya. +- **`docker`** — isolasi kontainer penuh, kebijakan keamanan ditegakkan, memerlukan Docker. + +Atur `runtime.kind = "docker"` untuk sandboxing ketat atau isolasi jaringan. + +## Autentikasi Berlangganan (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw mendukung profil autentikasi native berlangganan (multi-akun, terenkripsi saat istirahat). + +- File penyimpanan: `~/.zeroclaw/auth-profiles.json` +- Kunci enkripsi: `~/.zeroclaw/.secret_key` +- Format id profil: `:` (contoh: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (langganan ChatGPT) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Periksa / refresh / ganti profil +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Jalankan agen dengan auth berlangganan +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Workspace agen + skill + +Root workspace: `~/.zeroclaw/workspace/` (dapat dikonfigurasi melalui config). + +File prompt yang diinjeksi: +- `IDENTITY.md` — kepribadian dan peran agen +- `USER.md` — konteks dan preferensi pengguna +- `MEMORY.md` — fakta dan pelajaran jangka panjang +- `AGENTS.md` — konvensi sesi dan aturan inisialisasi +- `SOUL.md` — identitas inti dan prinsip operasi + +Skill: `~/.zeroclaw/workspace/skills//SKILL.md` atau `SKILL.toml`. + +```bash +# Daftar skill yang terinstal +zeroclaw skills list + +# Instal dari git +zeroclaw skills install https://github.com/user/my-skill.git + +# Audit keamanan sebelum instalasi +zeroclaw skills audit https://github.com/user/my-skill.git + +# Hapus skill +zeroclaw skills remove my-skill +``` + +## Perintah CLI + +```bash +# Manajemen workspace +zeroclaw onboard # Wizard pengaturan terpandu +zeroclaw status # Tampilkan status daemon/agen +zeroclaw doctor # Jalankan diagnostik sistem + +# Gateway + daemon +zeroclaw gateway # Mulai server gateway (127.0.0.1:42617) +zeroclaw daemon # Mulai runtime otonom penuh + +# Agen +zeroclaw agent # Mode obrolan interaktif +zeroclaw agent -m "message" # Mode pesan tunggal + +# Manajemen layanan +zeroclaw service install # Instal sebagai layanan OS (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Saluran +zeroclaw channel list # Daftar saluran yang dikonfigurasi +zeroclaw channel doctor # Periksa kesehatan saluran +zeroclaw channel bind-telegram 123456789 + +# Cron + penjadwalan +zeroclaw cron list # Daftar tugas terjadwal +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memori +zeroclaw memory list # Daftar entri memori +zeroclaw memory get # Ambil memori +zeroclaw memory stats # Statistik memori + +# Profil autentikasi +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Periferal perangkat keras +zeroclaw hardware discover # Pindai perangkat yang terhubung +zeroclaw peripheral list # Daftar periferal yang terhubung +zeroclaw peripheral flash # Flash firmware ke perangkat + +# Migrasi +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Pelengkapan shell +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Referensi perintah lengkap: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Prasyarat + +
+Windows + +#### Diperlukan + +1. **Visual Studio Build Tools** (menyediakan linker MSVC dan Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Selama instalasi (atau melalui Visual Studio Installer), pilih beban kerja **"Desktop development with C++"**. + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Setelah instalasi, buka terminal baru dan jalankan `rustup default stable` untuk memastikan toolchain stabil aktif. + +3. **Verifikasi** keduanya berfungsi: + ```powershell + rustc --version + cargo --version + ``` + +#### Opsional + +- **Docker Desktop** — diperlukan hanya jika menggunakan [runtime Docker sandboxed](#dukungan-runtime-saat-ini) (`runtime.kind = "docker"`). Instal melalui `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Diperlukan + +1. **Build essentials:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Instal Xcode Command Line Tools: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Lihat [rustup.rs](https://rustup.rs) untuk detail. + +3. **Verifikasi** keduanya berfungsi: + ```bash + rustc --version + cargo --version + ``` + +#### Installer Satu Baris + +Atau lewati langkah di atas dan instal semuanya (dependensi sistem, Rust, ZeroClaw) dalam satu perintah: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Kebutuhan sumber daya kompilasi + +Membangun dari sumber memerlukan lebih banyak sumber daya daripada menjalankan biner yang dihasilkan: + +| Sumber Daya | Minimum | Disarankan | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Disk kosong**| 6 GB | 10 GB+ | + +Jika host Anda di bawah minimum, gunakan biner pre-built: + +```bash +./install.sh --prefer-prebuilt +``` + +Untuk memerlukan instalasi hanya-biner tanpa fallback sumber: + +```bash +./install.sh --prebuilt-only +``` + +#### Opsional + +- **Docker** — diperlukan hanya jika menggunakan [runtime Docker sandboxed](#dukungan-runtime-saat-ini) (`runtime.kind = "docker"`). Instal melalui manajer paket Anda atau [docker.com](https://docs.docker.com/engine/install/). + +> **Catatan:** Default `cargo build --release` menggunakan `codegen-units=1` untuk menurunkan tekanan kompilasi puncak. Untuk build lebih cepat di mesin yang kuat, gunakan `cargo build --profile release-fast`. + +
+ + + +### Biner pre-built + +Aset rilis dipublikasikan untuk: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Unduh aset terbaru dari: + + +## Dokumentasi + +Gunakan ini ketika Anda sudah melewati alur onboarding dan menginginkan referensi yang lebih mendalam. + +- Mulai dengan [indeks dokumentasi](docs/README.md) untuk navigasi dan "apa di mana." +- Baca [ikhtisar arsitektur](docs/architecture.md) untuk model sistem lengkap. +- Gunakan [referensi konfigurasi](docs/reference/api/config-reference.md) ketika Anda memerlukan setiap kunci dan contoh. +- Jalankan Gateway sesuai buku dengan [runbook operasional](docs/ops/operations-runbook.md). +- Ikuti [ZeroClaw Onboard](#mulai-cepat) untuk pengaturan terpandu. +- Debug kegagalan umum dengan [panduan pemecahan masalah](docs/ops/troubleshooting.md). +- Tinjau [panduan keamanan](docs/security/README.md) sebelum mengekspos apa pun. + +### Dokumentasi referensi + +- Hub dokumentasi: [docs/README.md](docs/README.md) +- TOC dokumentasi terpadu: [docs/SUMMARY.md](docs/SUMMARY.md) +- Referensi perintah: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Referensi konfigurasi: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Referensi provider: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Referensi saluran: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Runbook operasional: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Pemecahan masalah: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Dokumentasi kolaborasi + +- Panduan kontribusi: [CONTRIBUTING.md](CONTRIBUTING.md) +- Kebijakan alur kerja PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Panduan alur kerja CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Playbook reviewer: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Kebijakan pengungkapan keamanan: [SECURITY.md](SECURITY.md) +- Template dokumentasi: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Deployment + operasi + +- Panduan deployment jaringan: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Playbook proxy agent: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Panduan perangkat keras: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw dibangun untuk smooth crab 🦀, asisten AI yang cepat dan efisien. Dibangun oleh Argenis De La Rosa dan komunitas. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Dukung ZeroClaw + +Jika ZeroClaw membantu pekerjaan Anda dan Anda ingin mendukung pengembangan berkelanjutan, Anda dapat berdonasi di sini: + +Buy Me a Coffee + +### 🙏 Terima Kasih Khusus + +Terima kasih yang tulus kepada komunitas dan institusi yang menginspirasi dan mendorong pekerjaan open-source ini: + +- **Harvard University** — untuk memupuk rasa ingin tahu intelektual dan mendorong batas dari apa yang mungkin. +- **MIT** — untuk memperjuangkan pengetahuan terbuka, open source, dan keyakinan bahwa teknologi harus dapat diakses oleh semua orang. +- **Sundai Club** — untuk komunitas, energi, dan dorongan tanpa henti untuk membangun hal-hal yang penting. +- **Dunia & Seterusnya** 🌍✨ — kepada setiap kontributor, pemimpi, dan pembangun di luar sana yang menjadikan open source sebagai kekuatan untuk kebaikan. Ini untuk kalian. + +Kami membangun secara terbuka karena ide terbaik datang dari mana saja. Jika Anda membaca ini, Anda adalah bagian darinya. Selamat datang. 🦀❤️ + +## Berkontribusi + +Baru di ZeroClaw? Cari isu berlabel [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — lihat [Panduan Kontribusi](CONTRIBUTING.md#first-time-contributors) untuk cara memulai. PR yang dibuat dengan AI/vibe-coded dipersilakan! 🤖 + +Lihat [CONTRIBUTING.md](CONTRIBUTING.md) dan [CLA.md](docs/contributing/cla.md). Implementasikan trait, kirimkan PR: + +- Panduan alur kerja CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- `Provider` baru → `src/providers/` +- `Channel` baru → `src/channels/` +- `Observer` baru → `src/observability/` +- `Tool` baru → `src/tools/` +- `Memory` baru → `src/memory/` +- `Tunnel` baru → `src/tunnel/` +- `Peripheral` baru → `src/peripherals/` +- `Skill` baru → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Repositori Resmi & Peringatan Peniruan + +**Ini adalah satu-satunya repositori resmi ZeroClaw:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Repositori, organisasi, domain, atau paket lain yang mengklaim sebagai "ZeroClaw" atau menyiratkan afiliasi dengan ZeroClaw Labs adalah **tidak sah dan tidak berafiliasi dengan proyek ini**. Fork tidak sah yang diketahui akan terdaftar di [TRADEMARK.md](docs/maintainers/trademark.md). + +Jika Anda menemukan peniruan atau penyalahgunaan merek dagang, silakan [buka isu](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Lisensi + +ZeroClaw memiliki dual-license untuk keterbukaan maksimum dan perlindungan kontributor: + +| Lisensi | Kasus penggunaan | +|---|---| +| [MIT](LICENSE-MIT) | Open-source, riset, akademik, penggunaan pribadi | +| [Apache 2.0](LICENSE-APACHE) | Perlindungan paten, institusional, deployment komersial | + +Anda dapat memilih salah satu lisensi. **Kontributor secara otomatis memberikan hak di bawah keduanya** — lihat [CLA.md](docs/contributing/cla.md) untuk perjanjian kontributor lengkap. + +### Merek Dagang + +Nama dan logo **ZeroClaw** adalah merek dagang dari ZeroClaw Labs. Lisensi ini tidak memberikan izin untuk menggunakannya untuk menyiratkan dukungan atau afiliasi. Lihat [TRADEMARK.md](docs/maintainers/trademark.md) untuk penggunaan yang diizinkan dan dilarang. + +### Perlindungan Kontributor + +- Anda **mempertahankan hak cipta** atas kontribusi Anda +- **Hibah paten** (Apache 2.0) melindungi Anda dari klaim paten oleh kontributor lain +- Kontribusi Anda **secara permanen diatribusikan** dalam riwayat commit dan [NOTICE](NOTICE) +- Tidak ada hak merek dagang yang dialihkan dengan berkontribusi + +--- + +**ZeroClaw** — Nol overhead. Nol kompromi. Deploy di mana saja. Tukar apa saja. 🦀 + +## Kontributor + + + ZeroClaw contributors + + +Daftar ini dihasilkan dari grafik kontributor GitHub dan diperbarui secara otomatis. + +## Riwayat Bintang + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.it.md b/third_party/zeroclaw/README.it.md new file mode 100644 index 0000000..e715fd2 --- /dev/null +++ b/third_party/zeroclaw/README.it.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Assistente Personale IA

+ +

+ Zero overhead. Zero compromessi. 100% Rust. 100% Agnostico.
+ ⚡️ Funziona su hardware da $10 con <5MB di RAM: il 99% in meno di memoria rispetto a OpenClaw e il 98% più economico di un Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Costruito da studenti e membri delle comunità di Harvard, MIT e Sundai.Club. +

+ +

+ 🌐 Lingue: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw è un assistente personale IA che esegui sui tuoi dispositivi. Ti risponde sui canali che già usi (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work e altri). Ha una dashboard web per il controllo in tempo reale e può connettersi a periferiche hardware (ESP32, STM32, Arduino, Raspberry Pi). Il Gateway è solo il piano di controllo — il prodotto è l'assistente. + +Se vuoi un assistente personale, per un singolo utente, che sia locale, veloce e sempre attivo, questo fa per te. + +

+ Sito web · + Documentazione · + Architettura · + Per iniziare · + Migrazione da OpenClaw · + Risoluzione problemi · + Discord +

+ +> **Configurazione consigliata:** esegui `zeroclaw onboard` nel tuo terminale. ZeroClaw Onboard ti guida passo dopo passo nella configurazione del gateway, workspace, canali e provider. È il percorso di configurazione consigliato e funziona su macOS, Linux e Windows (tramite WSL2). Nuova installazione? Inizia qui: [Per iniziare](#avvio-rapido) + +### Autenticazione tramite abbonamento (OAuth) + +- **OpenAI Codex** (abbonamento ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (chiave API o token di autenticazione) + +Nota sui modelli: sebbene siano supportati molti provider/modelli, per la migliore esperienza usa il modello di ultima generazione più potente a tua disposizione. Vedi [Onboarding](#avvio-rapido). + +Configurazione modelli + CLI: [Riferimento provider](docs/reference/api/providers-reference.md) +Rotazione profili di autenticazione (OAuth vs chiavi API) + failover: [Failover modelli](docs/reference/api/providers-reference.md) + +## Installazione (consigliata) + +Requisito: toolchain stabile di Rust. Un singolo binario, nessuna dipendenza di runtime. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Bootstrap con un clic + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` viene eseguito automaticamente dopo l'installazione per configurare il tuo workspace e provider. + +## Avvio rapido (TL;DR) + +Guida completa per principianti (autenticazione, accoppiamento, canali): [Per iniziare](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Installa + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Avvia il gateway (server webhook + dashboard web) +zeroclaw gateway # predefinito: 127.0.0.1:42617 +zeroclaw gateway --port 0 # porta casuale (sicurezza rafforzata) + +# Parla con l'assistente +zeroclaw agent -m "Hello, ZeroClaw!" + +# Modalità interattiva +zeroclaw agent + +# Avvia il runtime autonomo completo (gateway + canali + cron + hands) +zeroclaw daemon + +# Controlla lo stato +zeroclaw status + +# Esegui diagnostica +zeroclaw doctor +``` + +Aggiornamento? Esegui `zeroclaw doctor` dopo l'aggiornamento. + +### Dal codice sorgente (sviluppo) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Alternativa per lo sviluppo (senza installazione globale):** anteponi `cargo run --release --` ai comandi (esempio: `cargo run --release -- status`). + +## Migrazione da OpenClaw + +ZeroClaw può importare il tuo workspace, memoria e configurazione da OpenClaw: + +```bash +# Anteprima di ciò che verrà migrato (sicuro, sola lettura) +zeroclaw migrate openclaw --dry-run + +# Esegui la migrazione +zeroclaw migrate openclaw +``` + +Questo migra le tue voci di memoria, i file del workspace e la configurazione da `~/.openclaw/` a `~/.zeroclaw/`. La configurazione viene convertita da JSON a TOML automaticamente. + +## Impostazioni di sicurezza predefinite (accesso DM) + +ZeroClaw si connette a superfici di messaggistica reali. Tratta i DM in arrivo come input non attendibile. + +Guida completa alla sicurezza: [SECURITY.md](SECURITY.md) + +Comportamento predefinito su tutti i canali: + +- **Accoppiamento DM** (predefinito): i mittenti sconosciuti ricevono un breve codice di accoppiamento e il bot non elabora il loro messaggio. +- Approva con: `zeroclaw pairing approve ` (il mittente viene quindi aggiunto a una allowlist locale). +- I DM pubblici in arrivo richiedono un'attivazione esplicita in `config.toml`. +- Esegui `zeroclaw doctor` per individuare politiche DM rischiose o mal configurate. + +**Livelli di autonomia:** + +| Livello | Comportamento | +|---------|---------------| +| `ReadOnly` | L'agente può osservare ma non agire | +| `Supervised` (predefinito) | L'agente agisce con approvazione per operazioni a rischio medio/alto | +| `Full` | L'agente agisce autonomamente entro i limiti della policy | + +**Livelli di sandboxing:** isolamento del workspace, blocco del traversal dei percorsi, allowlist dei comandi, percorsi proibiti (`/etc`, `/root`, `~/.ssh`), limitazione della velocità (max azioni/ora, tetti di costo/giorno). + + + + +### 📢 Annunci + +Usa questa bacheca per avvisi importanti (breaking change, avvisi di sicurezza, finestre di manutenzione e bloccanti del rilascio). + +| Data (UTC) | Livello | Avviso | Azione | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Critico_ | **Non siamo affiliati** con `openagen/zeroclaw`, `zeroclaw.org` o `zeroclaw.net`. I domini `zeroclaw.org` e `zeroclaw.net` attualmente puntano al fork `openagen/zeroclaw`, e quel dominio/repository stanno impersonando il nostro sito web/progetto ufficiale. | Non fidarti di informazioni, binari, raccolte fondi o annunci da quelle fonti. Usa solo [questo repository](https://github.com/zeroclaw-labs/zeroclaw) e i nostri account social verificati. | +| 2026-02-21 | _Importante_ | Il nostro sito web ufficiale è ora online: [zeroclawlabs.ai](https://zeroclawlabs.ai). Grazie per la pazienza mentre preparavamo il lancio. Continuiamo a vedere tentativi di impersonificazione, quindi **non** partecipare ad attività di investimento o raccolta fondi che usano il nome ZeroClaw a meno che non siano pubblicate attraverso i nostri canali ufficiali. | Usa [questo repository](https://github.com/zeroclaw-labs/zeroclaw) come unica fonte di verità. Segui [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Gruppo)](https://www.facebook.com/groups/zeroclawlabs) e [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) per aggiornamenti ufficiali. | +| 2026-02-19 | _Importante_ | Anthropic ha aggiornato i termini di Autenticazione e Uso delle Credenziali il 2026-02-19. I token OAuth di Claude Code (Free, Pro, Max) sono destinati esclusivamente a Claude Code e Claude.ai; usare token OAuth di Claude Free/Pro/Max in qualsiasi altro prodotto, strumento o servizio (incluso Agent SDK) non è consentito e può violare i Termini di Servizio del Consumatore. | Per favore, evita temporaneamente le integrazioni OAuth di Claude Code per prevenire potenziali perdite. Clausola originale: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Punti di forza + +- **Runtime leggero per impostazione predefinita** — i flussi di lavoro comuni di CLI e stato funzionano in pochi megabyte di memoria nelle build release. +- **Distribuzione economica** — progettato per schede da $10 e piccole istanze cloud, nessuna dipendenza di runtime pesante. +- **Avvio a freddo rapido** — il runtime Rust a binario singolo mantiene l'avvio dei comandi e del daemon quasi istantaneo. +- **Architettura portabile** — un binario per ARM, x86 e RISC-V con provider/canali/strumenti intercambiabili. +- **Gateway local-first** — piano di controllo unico per sessioni, canali, strumenti, cron, SOP ed eventi. +- **Casella di posta multicanale** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket e altri. +- **Orchestrazione multi-agente (Hands)** — sciami di agenti autonomi che funzionano secondo programma e diventano più intelligenti nel tempo. +- **Procedure Operative Standard (SOP)** — automazione dei flussi di lavoro guidata da eventi con MQTT, webhook, cron e trigger dei periferici. +- **Dashboard web** — interfaccia web React 19 + Vite con chat in tempo reale, browser della memoria, editor di configurazione, gestore cron e ispettore degli strumenti. +- **Periferiche hardware** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO tramite il trait `Peripheral`. +- **Strumenti di prima classe** — shell, I/O file, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace e oltre 70 altri. +- **Hook del ciclo di vita** — intercetta e modifica chiamate LLM, esecuzioni di strumenti e messaggi in ogni fase. +- **Piattaforma skill** — skill incluse, della community e del workspace con audit di sicurezza. +- **Supporto tunnel** — Cloudflare, Tailscale, ngrok, OpenVPN e tunnel personalizzati per l'accesso remoto. + +### Perché i team scelgono ZeroClaw + +- **Leggero per impostazione predefinita:** binario Rust piccolo, avvio rapido, basso consumo di memoria. +- **Sicuro per design:** accoppiamento, sandboxing rigoroso, allowlist esplicite, scoping del workspace. +- **Completamente intercambiabile:** i sistemi centrali sono trait (provider, canali, strumenti, memoria, tunnel). +- **Nessun vendor lock-in:** supporto provider compatibili con OpenAI + endpoint personalizzati collegabili. + +## Riepilogo benchmark (ZeroClaw vs OpenClaw, riproducibile) + +Benchmark rapido su macchina locale (macOS arm64, feb 2026) normalizzato per hardware edge a 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Linguaggio** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Avvio (core 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Dimensione binario** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Costo** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Qualsiasi hardware $10** | + +> Note: I risultati di ZeroClaw sono misurati su build release usando `/usr/bin/time -l`. OpenClaw richiede il runtime Node.js (tipicamente ~390MB di overhead di memoria aggiuntivo), mentre NanoBot richiede il runtime Python. PicoClaw e ZeroClaw sono binari statici. I valori di RAM sopra sono memoria a runtime; i requisiti di compilazione sono superiori. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Misurazione locale riproducibile + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Tutto ciò che abbiamo costruito finora + +### Piattaforma centrale + +- Piano di controllo Gateway HTTP/WS/SSE con sessioni, presenza, configurazione, cron, webhook, dashboard web e accoppiamento. +- Superficie CLI: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Loop di orchestrazione dell'agente con dispatch degli strumenti, costruzione dei prompt, classificazione dei messaggi e caricamento della memoria. +- Modello di sessione con applicazione delle policy di sicurezza, livelli di autonomia e approvazione condizionale. +- Wrapper provider resiliente con failover, retry e routing dei modelli su oltre 20 backend LLM. + +### Canali + +Canali: WhatsApp (nativo), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Abilitati tramite feature gate: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Dashboard web + +Dashboard web React 19 + Vite 6 + Tailwind CSS 4 servita direttamente dal Gateway: + +- **Dashboard** — panoramica del sistema, stato di salute, uptime, tracciamento dei costi +- **Chat dell'agente** — chat interattiva con l'agente +- **Memoria** — esplora e gestisci le voci di memoria +- **Configurazione** — visualizza e modifica la configurazione +- **Cron** — gestisci attività programmate +- **Strumenti** — esplora gli strumenti disponibili +- **Log** — visualizza i log di attività dell'agente +- **Costi** — utilizzo dei token e tracciamento dei costi +- **Doctor** — diagnostica della salute del sistema +- **Integrazioni** — stato e configurazione delle integrazioni +- **Accoppiamento** — gestione dell'accoppiamento dei dispositivi + +### Obiettivi firmware + +| Obiettivo | Piattaforma | Scopo | +|-----------|-------------|-------| +| ESP32 | Espressif ESP32 | Agente periferico wireless | +| ESP32-UI | ESP32 + Display | Agente con interfaccia visiva | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Periferico industriale | +| Arduino | Arduino | Ponte base sensori/attuatori | +| Uno Q Bridge | Arduino Uno | Ponte seriale verso l'agente | + +### Strumenti + automazione + +- **Core:** shell, lettura/scrittura/modifica file, operazioni git, ricerca glob, ricerca contenuti +- **Web:** controllo browser, web fetch, web search, screenshot, informazioni immagine, lettura PDF +- **Integrazioni:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + set di strumenti differiti +- **Programmazione:** cron add/remove/update/run, strumento di programmazione +- **Memoria:** recall, store, forget, knowledge, project intel +- **Avanzato:** delegate (agente-a-agente), swarm, cambio/routing modelli, operazioni di sicurezza, operazioni cloud +- **Hardware:** board info, memory map, memory read (abilitato tramite feature gate) + +### Runtime + sicurezza + +- **Livelli di autonomia:** ReadOnly, Supervised (predefinito), Full. +- **Sandboxing:** isolamento del workspace, blocco del traversal dei percorsi, allowlist dei comandi, percorsi proibiti, Landlock (Linux), Bubblewrap. +- **Limitazione della velocità:** max azioni per ora, max costo per giorno (configurabile). +- **Approvazione condizionale:** approvazione interattiva per operazioni a rischio medio/alto. +- **Arresto di emergenza:** capacità di spegnimento di emergenza. +- **129+ test di sicurezza** in CI automatizzato. + +### Operazioni + packaging + +- Dashboard web servita direttamente dal Gateway. +- Supporto tunnel: Cloudflare, Tailscale, ngrok, OpenVPN, comando personalizzato. +- Adattatore runtime Docker per esecuzione in container. +- CI/CD: beta (automatico al push) → stable (dispatch manuale) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Binari precompilati per Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Configurazione + +`~/.zeroclaw/config.toml` minimo: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Riferimento completo della configurazione: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Configurazione dei canali + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Configurazione dei tunnel + +```toml +[tunnel] +kind = "cloudflare" # o "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Dettagli: [Riferimento canali](docs/reference/api/channels-reference.md) · [Riferimento configurazione](docs/reference/api/config-reference.md) + +### Supporto runtime (attuale) + +- **`native`** (predefinito) — esecuzione diretta dei processi, percorso più veloce, ideale per ambienti fidati. +- **`docker`** — isolamento completo in container, policy di sicurezza forzate, richiede Docker. + +Imposta `runtime.kind = "docker"` per sandboxing rigoroso o isolamento di rete. + +## Autenticazione tramite abbonamento (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw supporta profili di autenticazione nativi tramite abbonamento (multi-account, crittografati a riposo). + +- File di archiviazione: `~/.zeroclaw/auth-profiles.json` +- Chiave di crittografia: `~/.zeroclaw/.secret_key` +- Formato id profilo: `:` (esempio: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (abbonamento ChatGPT) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Controlla / aggiorna / cambia profilo +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Esegui l'agente con autenticazione tramite abbonamento +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Workspace dell'agente + skill + +Root del workspace: `~/.zeroclaw/workspace/` (configurabile tramite config). + +File di prompt iniettati: +- `IDENTITY.md` — personalità e ruolo dell'agente +- `USER.md` — contesto e preferenze dell'utente +- `MEMORY.md` — fatti e lezioni a lungo termine +- `AGENTS.md` — convenzioni di sessione e regole di inizializzazione +- `SOUL.md` — identità centrale e principi operativi + +Skill: `~/.zeroclaw/workspace/skills//SKILL.md` o `SKILL.toml`. + +```bash +# Elenca le skill installate +zeroclaw skills list + +# Installa da git +zeroclaw skills install https://github.com/user/my-skill.git + +# Audit di sicurezza prima dell'installazione +zeroclaw skills audit https://github.com/user/my-skill.git + +# Rimuovi una skill +zeroclaw skills remove my-skill +``` + +## Comandi CLI + +```bash +# Gestione del workspace +zeroclaw onboard # Procedura guidata di configurazione +zeroclaw status # Mostra stato del daemon/agente +zeroclaw doctor # Esegui diagnostica del sistema + +# Gateway + daemon +zeroclaw gateway # Avvia server gateway (127.0.0.1:42617) +zeroclaw daemon # Avvia runtime autonomo completo + +# Agente +zeroclaw agent # Modalità chat interattiva +zeroclaw agent -m "message" # Modalità messaggio singolo + +# Gestione servizi +zeroclaw service install # Installa come servizio del SO (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Canali +zeroclaw channel list # Elenca i canali configurati +zeroclaw channel doctor # Controlla la salute dei canali +zeroclaw channel bind-telegram 123456789 + +# Cron + programmazione +zeroclaw cron list # Elenca i lavori programmati +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memoria +zeroclaw memory list # Elenca le voci di memoria +zeroclaw memory get # Recupera una memoria +zeroclaw memory stats # Statistiche della memoria + +# Profili di autenticazione +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Periferiche hardware +zeroclaw hardware discover # Scansiona i dispositivi connessi +zeroclaw peripheral list # Elenca le periferiche connesse +zeroclaw peripheral flash # Flash del firmware sul dispositivo + +# Migrazione +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Completamento shell +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Riferimento completo dei comandi: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Prerequisiti + +
+Windows + +#### Richiesto + +1. **Visual Studio Build Tools** (fornisce il linker MSVC e il Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Durante l'installazione (o tramite il Visual Studio Installer), seleziona il carico di lavoro **"Sviluppo desktop con C++"**. + +2. **Toolchain di Rust:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Dopo l'installazione, apri un nuovo terminale ed esegui `rustup default stable` per assicurarti che la toolchain stabile sia attiva. + +3. **Verifica** che entrambi funzionino: + ```powershell + rustc --version + cargo --version + ``` + +#### Opzionale + +- **Docker Desktop** — necessario solo se usi il [runtime sandbox con Docker](#supporto-runtime-attuale) (`runtime.kind = "docker"`). Installa tramite `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Richiesto + +1. **Strumenti di compilazione essenziali:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Installa Xcode Command Line Tools: `xcode-select --install` + +2. **Toolchain di Rust:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Vedi [rustup.rs](https://rustup.rs) per i dettagli. + +3. **Verifica** che entrambi funzionino: + ```bash + rustc --version + cargo --version + ``` + +#### Installatore in una riga + +Oppure salta i passaggi precedenti e installa tutto (dipendenze di sistema, Rust, ZeroClaw) con un solo comando: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Requisiti di risorse per la compilazione + +Compilare dal codice sorgente richiede più risorse rispetto all'esecuzione del binario risultante: + +| Risorsa | Minimo | Consigliato | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Disco libero**| 6 GB | 10 GB+ | + +Se il tuo host è al di sotto del minimo, usa i binari precompilati: + +```bash +./install.sh --prefer-prebuilt +``` + +Per richiedere l'installazione solo da binari senza compilazione di fallback: + +```bash +./install.sh --prebuilt-only +``` + +#### Opzionale + +- **Docker** — necessario solo se usi il [runtime sandbox con Docker](#supporto-runtime-attuale) (`runtime.kind = "docker"`). Installa tramite il tuo gestore di pacchetti o [docker.com](https://docs.docker.com/engine/install/). + +> **Nota:** Il `cargo build --release` predefinito usa `codegen-units=1` per ridurre la pressione massima di compilazione. Per build più veloci su macchine potenti, usa `cargo build --profile release-fast`. + +
+ + + +### Binari precompilati + +Gli asset di release sono pubblicati per: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Scarica gli ultimi asset da: + + +## Documentazione + +Usa queste risorse quando hai superato il flusso di onboarding e vuoi il riferimento più approfondito. + +- Inizia con l'[indice della documentazione](docs/README.md) per la navigazione e "cosa c'è dove." +- Leggi la [panoramica dell'architettura](docs/architecture.md) per il modello completo del sistema. +- Usa il [riferimento della configurazione](docs/reference/api/config-reference.md) quando hai bisogno di ogni chiave ed esempio. +- Esegui il Gateway secondo il libro con il [runbook operativo](docs/ops/operations-runbook.md). +- Segui [ZeroClaw Onboard](#avvio-rapido) per una configurazione guidata. +- Risolvi errori comuni con la [guida alla risoluzione dei problemi](docs/ops/troubleshooting.md). +- Rivedi la [guida alla sicurezza](docs/security/README.md) prima di esporre qualsiasi cosa. + +### Documentazione di riferimento + +- Hub della documentazione: [docs/README.md](docs/README.md) +- TOC unificato dei docs: [docs/SUMMARY.md](docs/SUMMARY.md) +- Riferimento comandi: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Riferimento configurazione: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Riferimento provider: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Riferimento canali: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Runbook operativo: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Risoluzione problemi: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Documentazione di collaborazione + +- Guida alla contribuzione: [CONTRIBUTING.md](CONTRIBUTING.md) +- Politica del flusso di lavoro PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Guida al flusso di lavoro CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Manuale del revisore: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Politica di divulgazione della sicurezza: [SECURITY.md](SECURITY.md) +- Template della documentazione: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Distribuzione + operazioni + +- Guida alla distribuzione in rete: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Manuale dell'agente proxy: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Guide hardware: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw è stato costruito per il granchio liscio 🦀, un assistente IA veloce ed efficiente. Costruito da Argenis De La Rosa e la comunità. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Supporta ZeroClaw + +Se ZeroClaw ti aiuta nel lavoro e vuoi supportare lo sviluppo continuo, puoi donare qui: + +Buy Me a Coffee + +### 🙏 Ringraziamenti speciali + +Un sentito ringraziamento alle comunità e alle istituzioni che ispirano e alimentano questo lavoro open source: + +- **Harvard University** — per alimentare la curiosità intellettuale e spingere i confini del possibile. +- **MIT** — per difendere la conoscenza aperta, l'open source e la convinzione che la tecnologia debba essere accessibile a tutti. +- **Sundai Club** — per la comunità, l'energia e la spinta instancabile a costruire cose che contano. +- **Il Mondo e Oltre** 🌍✨ — a ogni contributore, sognatore e costruttore che rende l'open source una forza per il bene. Questo è per te. + +Stiamo costruendo apertamente perché le migliori idee vengono da ovunque. Se stai leggendo questo, ne fai parte. Benvenuto. 🦀❤️ + +## Contribuire + +Nuovo su ZeroClaw? Cerca le issue etichettate [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — consulta la nostra [Guida alla contribuzione](CONTRIBUTING.md#first-time-contributors) per sapere come iniziare. PR con IA/vibe-coded sono benvenuti! 🤖 + +Vedi [CONTRIBUTING.md](CONTRIBUTING.md) e [CLA.md](docs/contributing/cla.md). Implementa un trait, invia un PR: + +- Guida al flusso di lavoro CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Nuovo `Provider` → `src/providers/` +- Nuovo `Channel` → `src/channels/` +- Nuovo `Observer` → `src/observability/` +- Nuovo `Tool` → `src/tools/` +- Nuovo `Memory` → `src/memory/` +- Nuovo `Tunnel` → `src/tunnel/` +- Nuovo `Peripheral` → `src/peripherals/` +- Nuovo `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Repository ufficiale e avviso di impersonificazione + +**Questo è l'unico repository ufficiale di ZeroClaw:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Qualsiasi altro repository, organizzazione, dominio o pacchetto che affermi di essere "ZeroClaw" o implichi un'affiliazione con ZeroClaw Labs **non è autorizzato e non è affiliato a questo progetto**. I fork non autorizzati conosciuti saranno elencati in [TRADEMARK.md](docs/maintainers/trademark.md). + +Se incontri impersonificazione o uso improprio del marchio, per favore [apri una issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Licenza + +ZeroClaw ha doppia licenza per massima apertura e protezione dei contributori: + +| Licenza | Caso d'uso | +|---|---| +| [MIT](LICENSE-MIT) | Open source, ricerca, accademico, uso personale | +| [Apache 2.0](LICENSE-APACHE) | Protezione brevetti, istituzionale, distribuzione commerciale | + +Puoi scegliere una delle due licenze. **I contributori concedono automaticamente diritti sotto entrambe** — vedi [CLA.md](docs/contributing/cla.md) per l'accordo completo dei contributori. + +### Marchio + +Il nome e il logo di **ZeroClaw** sono marchi di ZeroClaw Labs. Questa licenza non concede il permesso di usarli per implicare approvazione o affiliazione. Vedi [TRADEMARK.md](docs/maintainers/trademark.md) per gli usi consentiti e proibiti. + +### Protezioni per i contributori + +- **Mantieni il copyright** delle tue contribuzioni +- **Concessione di brevetti** (Apache 2.0) ti protegge da rivendicazioni di brevetti di altri contributori +- Le tue contribuzioni sono **permanentemente attribuite** nella cronologia dei commit e [NOTICE](NOTICE) +- Nessun diritto di marchio viene trasferito contribuendo + +--- + +**ZeroClaw** — Zero overhead. Zero compromessi. Distribuisci ovunque. Scambia qualsiasi cosa. 🦀 + +## Contributori + + + ZeroClaw contributors + + +Questa lista è generata dal grafico dei contributori di GitHub e si aggiorna automaticamente. + +## Cronologia delle stelle + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.ja.md b/third_party/zeroclaw/README.ja.md new file mode 100644 index 0000000..6e4d751 --- /dev/null +++ b/third_party/zeroclaw/README.ja.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — パーソナルAIアシスタント

+ +

+ ゼロオーバーヘッド。ゼロ妥協。100% Rust。100% 非依存。
+ ⚡️ 10ドルのハードウェアで5MB未満のRAMで動作:OpenClawより99%少ないメモリ、Mac miniより98%安い! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+ハーバード大学、MIT、Sundai.Clubコミュニティの学生とメンバーにより構築。 +

+ +

+ 🌐 Languages: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClawは、あなた自身のデバイスで実行するパーソナルAIアシスタントです。既に使用しているチャンネル(WhatsApp、Telegram、Slack、Discord、Signal、iMessage、Matrix、IRC、Email、Bluesky、Nostr、Mattermost、Nextcloud Talk、DingTalk、Lark、QQ、Reddit、LinkedIn、Twitter、MQTT、WeChat Workなど)で応答します。リアルタイム制御用のウェブダッシュボードを備え、ハードウェア周辺機器(ESP32、STM32、Arduino、Raspberry Pi)に接続できます。Gatewayはコントロールプレーンに過ぎず、製品はアシスタントそのものです。 + +ローカルで高速、常時稼働のパーソナルなシングルユーザーアシスタントが必要なら、これがその答えです。 + +

+ ウェブサイト · + ドキュメント · + アーキテクチャ · + はじめに · + OpenClawからの移行 · + トラブルシューティング · + Discord +

+ +> **推奨セットアップ:** ターミナルで `zeroclaw onboard` を実行してください。ZeroClaw Onboardがゲートウェイ、ワークスペース、チャンネル、プロバイダーのセットアップをステップバイステップでガイドします。これは推奨されるセットアップパスで、macOS、Linux、Windows(WSL2経由)で動作します。新規インストール?ここから開始:[はじめに](#クイックスタートtldr) + +### サブスクリプション認証(OAuth) + +- **OpenAI Codex**(ChatGPTサブスクリプション) +- **Gemini**(Google OAuth) +- **Anthropic**(APIキーまたは認証トークン) + +モデルに関する注意:多くのプロバイダー/モデルがサポートされていますが、最良のエクスペリエンスのために、利用可能な最新世代の最も強力なモデルを使用してください。[オンボーディング](#クイックスタートtldr)を参照。 + +モデル設定 + CLI:[プロバイダーリファレンス](docs/reference/api/providers-reference.md) +認証プロファイルローテーション(OAuth vs APIキー)+ フェイルオーバー:[モデルフェイルオーバー](docs/reference/api/providers-reference.md) + +## インストール(推奨) + +ランタイム:Rust stable ツールチェーン。単一バイナリ、ランタイム依存なし。 + +### Homebrew(macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### ワンクリックブートストラップ + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` はインストール後に自動的に実行され、ワークスペースとプロバイダーを設定します。 + +## クイックスタート(TL;DR) + +完全な初心者ガイド(認証、ペアリング、チャンネル):[はじめに](docs/setup-guides/one-click-bootstrap.md) + +```bash +# インストール + オンボード +./install.sh --api-key "sk-..." --provider openrouter + +# ゲートウェイを起動(webhookサーバー + ウェブダッシュボード) +zeroclaw gateway # デフォルト:127.0.0.1:42617 +zeroclaw gateway --port 0 # ランダムポート(セキュリティ強化) + +# アシスタントと会話 +zeroclaw agent -m "Hello, ZeroClaw!" + +# インタラクティブモード +zeroclaw agent + +# フル自律ランタイムを起動(ゲートウェイ + チャンネル + cron + hands) +zeroclaw daemon + +# ステータス確認 +zeroclaw status + +# 診断を実行 +zeroclaw doctor +``` + +アップグレード?更新後に `zeroclaw doctor` を実行してください。 + +### ソースからビルド(開発) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **開発用代替手段(グローバルインストールなし):** コマンドの前に `cargo run --release --` を付けてください(例:`cargo run --release -- status`)。 + +## OpenClawからの移行 + +ZeroClawはOpenClawのワークスペース、メモリ、設定をインポートできます: + +```bash +# 移行内容のプレビュー(安全、読み取り専用) +zeroclaw migrate openclaw --dry-run + +# 移行を実行 +zeroclaw migrate openclaw +``` + +これにより、メモリエントリ、ワークスペースファイル、設定が `~/.openclaw/` から `~/.zeroclaw/` に移行されます。設定はJSONからTOMLに自動変換されます。 + +## セキュリティデフォルト(DMアクセス) + +ZeroClawは実際のメッセージングサービスに接続します。着信DMを信頼できない入力として扱ってください。 + +完全なセキュリティガイド:[SECURITY.md](SECURITY.md) + +すべてのチャンネルのデフォルト動作: + +- **DMペアリング**(デフォルト):不明な送信者には短いペアリングコードが送信され、ボットはメッセージを処理しません。 +- 承認方法:`zeroclaw pairing approve `(送信者がローカル許可リストに追加されます)。 +- パブリック着信DMには `config.toml` での明示的なオプトインが必要です。 +- `zeroclaw doctor` を実行してリスクのある、または設定ミスのあるDMポリシーを検出します。 + +**自律レベル:** + +| レベル | 動作 | +|--------|------| +| `ReadOnly` | エージェントは観察のみで操作不可 | +| `Supervised`(デフォルト) | エージェントは中/高リスク操作時に承認が必要 | +| `Full` | エージェントはポリシー範囲内で自律的に操作 | + +**サンドボックス層:** ワークスペース分離、パストラバーサルブロック、コマンド許可リスト、禁止パス(`/etc`、`/root`、`~/.ssh`)、レート制限(時間あたり最大アクション数、日あたりコスト上限)。 + + + + +### 📢 お知らせ + +このボードは重要な通知(破壊的変更、セキュリティアドバイザリ、メンテナンスウィンドウ、リリースブロッカー)に使用します。 + +| 日付 (UTC) | レベル | 通知 | 対応 | +| ---------- | ------ | ---- | ---- | +| 2026-02-19 | _重大_ | 当プロジェクトは `openagen/zeroclaw`、`zeroclaw.org`、`zeroclaw.net` とは**一切関係ありません**。`zeroclaw.org` と `zeroclaw.net` ドメインは現在 `openagen/zeroclaw` フォークを指しており、そのドメイン/リポジトリは当プロジェクトの公式ウェブサイト/プロジェクトを偽装しています。 | それらのソースからの情報、バイナリ、資金調達、告知を信頼しないでください。[このリポジトリ](https://github.com/zeroclaw-labs/zeroclaw)と認証済みのソーシャルアカウントのみを使用してください。 | +| 2026-02-21 | _重要_ | 公式ウェブサイトが公開されました:[zeroclawlabs.ai](https://zeroclawlabs.ai)。ローンチ準備中のお待ちいただき、ありがとうございます。引き続き偽装行為が確認されていますので、公式チャンネルを通じて公開されない限り、ZeroClawの名前を使った投資や資金調達活動には**参加しないでください**。 | [このリポジトリ](https://github.com/zeroclaw-labs/zeroclaw)を唯一の信頼できる情報源として使用してください。公式アップデートは [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21)、[Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs)、[Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) をフォローしてください。 | +| 2026-02-19 | _重要_ | Anthropicは2026-02-19に認証と資格情報の使用に関する規約を更新しました。Claude Code OAuthトークン(Free、Pro、Max)はClaude CodeおよびClaude.ai専用です。Claude Free/Pro/MaxのOAuthトークンを他の製品、ツール、サービス(Agent SDKを含む)で使用することは許可されておらず、消費者利用規約に違反する可能性があります。 | 潜在的な損失を防ぐため、一時的にClaude Code OAuth統合を避けてください。元の条項:[Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use)。 | + +## ハイライト + +- **デフォルトでリーンなランタイム** — 一般的なCLIとステータスワークフローは、リリースビルドで数メガバイトのメモリエンベロープで実行されます。 +- **コスト効率の良いデプロイ** — 10ドルボードや小規模クラウドインスタンス向けに設計、重量級ランタイム依存なし。 +- **高速コールドスタート** — シングルバイナリRustランタイムにより、コマンドとデーモンの起動がほぼ瞬時。 +- **ポータブルアーキテクチャ** — ARM、x86、RISC-Vにまたがる単一バイナリで、プロバイダー/チャンネル/ツールが交換可能。 +- **ローカルファーストゲートウェイ** — セッション、チャンネル、ツール、cron、SOP、イベントの単一コントロールプレーン。 +- **マルチチャンネル受信箱** — WhatsApp、Telegram、Slack、Discord、Signal、iMessage、Matrix、IRC、Email、Bluesky、Nostr、Mattermost、Nextcloud Talk、DingTalk、Lark、QQ、Reddit、LinkedIn、Twitter、MQTT、WeChat Work、WebSocketなど。 +- **マルチエージェントオーケストレーション(Hands)** — スケジュールに基づいて実行され、時間とともにスマートになる自律エージェントスウォーム。 +- **標準運用手順(SOPs)** — MQTT、webhook、cron、周辺機器トリガーによるイベント駆動ワークフロー自動化。 +- **ウェブダッシュボード** — React 19 + Viteウェブ UIで、リアルタイムチャット、メモリブラウザ、設定エディタ、cronマネージャー、ツールインスペクター。 +- **ハードウェア周辺機器** — `Peripheral` traitを通じてESP32、STM32 Nucleo、Arduino、Raspberry Pi GPIOをサポート。 +- **ファーストクラスツール** — shell、ファイルI/O、ブラウザ、git、ウェブフェッチ/検索、MCP、Jira、Notion、Google Workspaceなど70以上。 +- **ライフサイクルフック** — あらゆる段階でLLM呼び出し、ツール実行、メッセージをインターセプトおよび変更。 +- **スキルプラットフォーム** — バンドル、コミュニティ、ワークスペーススキルとセキュリティ監査。 +- **トンネルサポート** — Cloudflare、Tailscale、ngrok、OpenVPN、カスタムトンネルによるリモートアクセス。 + +### チームがZeroClawを選ぶ理由 + +- **デフォルトでリーン:** 小型Rustバイナリ、高速起動、低メモリフットプリント。 +- **設計によるセキュリティ:** ペアリング、厳格なサンドボックス、明示的な許可リスト、ワークスペーススコーピング。 +- **完全に交換可能:** コアシステムはすべてtrait(プロバイダー、チャンネル、ツール、メモリ、トンネル)。 +- **ロックインなし:** OpenAI互換プロバイダーサポート + プラガブルなカスタムエンドポイント。 + +## ベンチマークスナップショット(ZeroClaw vs OpenClaw、再現可能) + +ローカルマシンクイックベンチマーク(macOS arm64、2026年2月)、0.8GHzエッジハードウェア向けに正規化。 + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **言語** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **起動時間(0.8GHzコア)** | > 500s | > 30s | < 1s | **< 10ms** | +| **バイナリサイズ** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **コスト** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **任意のハードウェア $10** | + +> 注意:ZeroClawの結果はリリースビルドで `/usr/bin/time -l` を使用して測定されています。OpenClawにはNode.jsランタイム(通常約390MBの追加メモリオーバーヘッド)が必要で、NanoBotにはPythonランタイムが必要です。PicoClawとZeroClawは静的バイナリです。上記のRAM数値はランタイムメモリです。ビルド時のコンパイル要件はより高くなります。 + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### 再現可能なローカル測定 + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## これまでに構築したすべて + +### コアプラットフォーム + +- Gateway HTTP/WS/SSEコントロールプレーン:セッション、プレゼンス、設定、cron、webhook、ウェブダッシュボード、ペアリング。 +- CLIサーフェス:`gateway`、`agent`、`onboard`、`doctor`、`status`、`service`、`migrate`、`auth`、`cron`、`channel`、`skills`。 +- エージェントオーケストレーションループ:ツールディスパッチ、プロンプト構築、メッセージ分類、メモリロード。 +- セッションモデル:セキュリティポリシー実行、自律レベル、承認ゲーティング。 +- レジリエントプロバイダーラッパー:20以上のLLMバックエンドにわたるフェイルオーバー、リトライ、モデルルーティング。 + +### チャンネル + +チャンネル:WhatsApp(ネイティブ)、Telegram、Slack、Discord、Signal、iMessage、Matrix、IRC、Email、Bluesky、DingTalk、Lark、Mattermost、Nextcloud Talk、Nostr、QQ、Reddit、LinkedIn、Twitter、MQTT、WeChat Work、WATI、Mochat、Linq、Notion、WebSocket、ClawdTalk。 + +フィーチャーゲート:Matrix(`channel-matrix`)、Lark(`channel-lark`)、Nostr(`channel-nostr`)。 + +### ウェブダッシュボード + +React 19 + Vite 6 + Tailwind CSS 4 ウェブダッシュボード、Gatewayから直接提供: + +- **ダッシュボード** — システム概要、ヘルスステータス、アップタイム、コストトラッキング +- **エージェントチャット** — エージェントとのインタラクティブチャット +- **メモリ** — メモリエントリの閲覧と管理 +- **設定** — 設定の表示と編集 +- **Cron** — スケジュールタスクの管理 +- **ツール** — 利用可能なツールの閲覧 +- **ログ** — エージェントアクティビティログの表示 +- **コスト** — トークン使用量とコストトラッキング +- **Doctor** — システムヘルス診断 +- **インテグレーション** — インテグレーションステータスとセットアップ +- **ペアリング** — デバイスペアリング管理 + +### ファームウェアターゲット + +| ターゲット | プラットフォーム | 用途 | +|------------|------------------|------| +| ESP32 | Espressif ESP32 | ワイヤレス周辺機器エージェント | +| ESP32-UI | ESP32 + Display | ビジュアルインターフェース付きエージェント | +| STM32 Nucleo | STM32 (ARM Cortex-M) | 産業用周辺機器 | +| Arduino | Arduino | 基本センサー/アクチュエーターブリッジ | +| Uno Q Bridge | Arduino Uno | エージェントへのシリアルブリッジ | + +### ツール + 自動化 + +- **コア:** shell、ファイル読み書き/編集、git操作、glob検索、コンテンツ検索 +- **ウェブ:** ブラウザ制御、ウェブフェッチ、ウェブ検索、スクリーンショット、画像情報、PDF読み取り +- **インテグレーション:** Jira、Notion、Google Workspace、Microsoft 365、LinkedIn、Composio、Pushover +- **MCP:** Model Context Protocolツールラッパー + 遅延ツールセット +- **スケジューリング:** cron追加/削除/更新/実行、スケジュールツール +- **メモリ:** 想起、保存、忘却、知識、プロジェクトインテル +- **高度:** 委譲(エージェント間)、スウォーム、モデル切り替え/ルーティング、セキュリティオプス、クラウドオプス +- **ハードウェア:** ボード情報、メモリマップ、メモリ読み取り(フィーチャーゲート) + +### ランタイム + 安全性 + +- **自律レベル:** ReadOnly、Supervised(デフォルト)、Full。 +- **サンドボックス:** ワークスペース分離、パストラバーサルブロック、コマンド許可リスト、禁止パス、Landlock(Linux)、Bubblewrap。 +- **レート制限:** 時間あたり最大アクション数、日あたり最大コスト(設定可能)。 +- **承認ゲーティング:** 中/高リスク操作のインタラクティブ承認。 +- **緊急停止:** 緊急シャットダウン機能。 +- **129以上のセキュリティテスト** が自動化CIに含まれています。 + +### 運用 + パッケージング + +- ウェブダッシュボードはGatewayから直接提供。 +- トンネルサポート:Cloudflare、Tailscale、ngrok、OpenVPN、カスタムコマンド。 +- Dockerランタイムアダプターによるコンテナ化実行。 +- CI/CD:beta(プッシュ時自動)→ stable(手動ディスパッチ)→ Docker、crates.io、Scoop、AUR、Homebrew、tweet。 +- プリビルドバイナリ:Linux(x86_64、aarch64、armv7)、macOS(x86_64、aarch64)、Windows(x86_64)。 + + +## 設定 + +最小 `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +完全な設定リファレンス:[docs/reference/api/config-reference.md](docs/reference/api/config-reference.md)。 + +### チャンネル設定 + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### トンネル設定 + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +詳細:[チャンネルリファレンス](docs/reference/api/channels-reference.md) · [設定リファレンス](docs/reference/api/config-reference.md) + +### ランタイムサポート(現在) + +- **`native`**(デフォルト)— 直接プロセス実行、最速パス、信頼できる環境に最適。 +- **`docker`** — 完全なコンテナ分離、強制セキュリティポリシー、Docker必要。 + +厳格なサンドボックスまたはネットワーク分離には `runtime.kind = "docker"` を設定してください。 + +## サブスクリプション認証(OpenAI Codex / Claude Code / Gemini) + +ZeroClawはサブスクリプションネイティブ認証プロファイル(マルチアカウント、保存時暗号化)をサポートしています。 + +- ストアファイル:`~/.zeroclaw/auth-profiles.json` +- 暗号化キー:`~/.zeroclaw/.secret_key` +- プロファイルIDフォーマット:`:`(例:`openai-codex:work`) + +```bash +# OpenAI Codex OAuth(ChatGPTサブスクリプション) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# チェック / リフレッシュ / プロファイル切り替え +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# サブスクリプション認証でエージェントを実行 +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## エージェントワークスペース + スキル + +ワークスペースルート:`~/.zeroclaw/workspace/`(設定で変更可能)。 + +注入されるプロンプトファイル: +- `IDENTITY.md` — エージェントの人格と役割 +- `USER.md` — ユーザーコンテキストと好み +- `MEMORY.md` — 長期的な事実と教訓 +- `AGENTS.md` — セッション規約と初期化ルール +- `SOUL.md` — コアアイデンティティと運用原則 + +スキル:`~/.zeroclaw/workspace/skills//SKILL.md` または `SKILL.toml`。 + +```bash +# インストール済みスキルの一覧 +zeroclaw skills list + +# gitからインストール +zeroclaw skills install https://github.com/user/my-skill.git + +# インストール前のセキュリティ監査 +zeroclaw skills audit https://github.com/user/my-skill.git + +# スキルの削除 +zeroclaw skills remove my-skill +``` + +## CLIコマンド + +```bash +# ワークスペース管理 +zeroclaw onboard # ガイド付きセットアップウィザード +zeroclaw status # デーモン/エージェントのステータス表示 +zeroclaw doctor # システム診断を実行 + +# ゲートウェイ + デーモン +zeroclaw gateway # ゲートウェイサーバーを起動(127.0.0.1:42617) +zeroclaw daemon # フル自律ランタイムを起動 + +# エージェント +zeroclaw agent # インタラクティブチャットモード +zeroclaw agent -m "message" # 単一メッセージモード + +# サービス管理 +zeroclaw service install # OSサービスとしてインストール(launchd/systemd) +zeroclaw service start|stop|restart|status + +# チャンネル +zeroclaw channel list # 設定済みチャンネルの一覧 +zeroclaw channel doctor # チャンネルヘルスの確認 +zeroclaw channel bind-telegram 123456789 + +# Cron + スケジューリング +zeroclaw cron list # スケジュールタスクの一覧 +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# メモリ +zeroclaw memory list # メモリエントリの一覧 +zeroclaw memory get # メモリの取得 +zeroclaw memory stats # メモリ統計 + +# 認証プロファイル +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# ハードウェア周辺機器 +zeroclaw hardware discover # 接続デバイスのスキャン +zeroclaw peripheral list # 接続周辺機器の一覧 +zeroclaw peripheral flash # デバイスへのファームウェア書き込み + +# 移行 +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# シェル補完 +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +完全なコマンドリファレンス:[docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## 前提条件 + +
+Windows + +#### 必須 + +1. **Visual Studio Build Tools**(MSVCリンカーとWindows SDKを提供): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + インストール時(またはVisual Studioインストーラーで)、**"Desktop development with C++"** ワークロードを選択してください。 + +2. **Rustツールチェーン:** + + ```powershell + winget install Rustlang.Rustup + ``` + + インストール後、新しいターミナルを開いて `rustup default stable` を実行し、stableツールチェーンがアクティブであることを確認してください。 + +3. 両方が動作していることを**確認**: + ```powershell + rustc --version + cargo --version + ``` + +#### オプション + +- **Docker Desktop** — [Dockerサンドボックスランタイム](#ランタイムサポート現在)(`runtime.kind = "docker"`)を使用する場合のみ必要。`winget install Docker.DockerDesktop` でインストール。 + +
+ +
+Linux / macOS + +#### 必須 + +1. **ビルドツール:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Xcodeコマンドラインツールをインストール:`xcode-select --install` + +2. **Rustツールチェーン:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + 詳細は [rustup.rs](https://rustup.rs) を参照。 + +3. 両方が動作していることを**確認**: + ```bash + rustc --version + cargo --version + ``` + +#### ワンラインインストーラー + +または、上記のステップをスキップして、単一コマンドですべてをインストール(システム依存、Rust、ZeroClaw): + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### コンパイルリソース要件 + +ソースからのビルドは、結果のバイナリを実行するよりも多くのリソースが必要です: + +| リソース | 最小 | 推奨 | +| -------- | ---- | ---- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **空きディスク** | 6 GB | 10 GB+ | + +ホストが最小要件を下回る場合、プリビルドバイナリを使用してください: + +```bash +./install.sh --prefer-prebuilt +``` + +ソースフォールバックなしのバイナリのみインストール: + +```bash +./install.sh --prebuilt-only +``` + +#### オプション + +- **Docker** — [Dockerサンドボックスランタイム](#ランタイムサポート現在)(`runtime.kind = "docker"`)を使用する場合のみ必要。パッケージマネージャーまたは [docker.com](https://docs.docker.com/engine/install/) からインストール。 + +> **注意:** デフォルトの `cargo build --release` は `codegen-units=1` を使用してコンパイルのピーク圧力を低減します。強力なマシンでのビルド高速化には `cargo build --profile release-fast` を使用してください。 + +
+ + + +### プリビルドバイナリ + +リリースアセットは以下で公開されています: + +- Linux: `x86_64`、`aarch64`、`armv7` +- macOS: `x86_64`、`aarch64` +- Windows: `x86_64` + +最新アセットはこちらからダウンロード: + + +## ドキュメント + +オンボーディングフローを終えて、より深いリファレンスが必要な場合に使用してください。 + +- ナビゲーションと「どこに何があるか」は[ドキュメントインデックス](docs/README.md)から。 +- [アーキテクチャ概要](docs/architecture.md)で完全なシステムモデルを確認。 +- すべてのキーと例は[設定リファレンス](docs/reference/api/config-reference.md)で。 +- [運用ランブック](docs/ops/operations-runbook.md)に従ってGatewayを実行。 +- [ZeroClaw Onboard](#クイックスタートtldr)でガイド付きセットアップ。 +- [トラブルシューティングガイド](docs/ops/troubleshooting.md)で一般的な障害をデバッグ。 +- 何かを公開する前に[セキュリティガイダンス](docs/security/README.md)を確認。 + +### リファレンスドキュメント + +- ドキュメントハブ:[docs/README.md](docs/README.md) +- 統一ドキュメント目次:[docs/SUMMARY.md](docs/SUMMARY.md) +- コマンドリファレンス:[docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- 設定リファレンス:[docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- プロバイダーリファレンス:[docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- チャンネルリファレンス:[docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- 運用ランブック:[docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- トラブルシューティング:[docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### コラボレーションドキュメント + +- 貢献ガイド:[CONTRIBUTING.md](CONTRIBUTING.md) +- PRワークフローポリシー:[docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CIワークフローガイド:[docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- レビューアープレイブック:[docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- セキュリティ開示ポリシー:[SECURITY.md](SECURITY.md) +- ドキュメントテンプレート:[docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### デプロイ + 運用 + +- ネットワークデプロイガイド:[docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- プロキシエージェントプレイブック:[docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- ハードウェアガイド:[docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClawはsmooth crab 🦀のために構築されました。高速で効率的なAIアシスタント。Argenis De La Rosaとコミュニティによって構築されました。 + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## ZeroClawを支援 + +ZeroClawがあなたの仕事に役立ち、継続的な開発を支援したい場合は、こちらから寄付できます: + +Buy Me a Coffee + +### 🙏 特別な感謝 + +このオープンソースの取り組みにインスピレーションと活力を与えてくれたコミュニティと機関に心からの感謝を: + +- **ハーバード大学** — 知的好奇心を育み、可能性の限界を押し広げてくれたことに感謝。 +- **MIT** — オープンな知識、オープンソース、そしてテクノロジーは誰もがアクセスできるべきという信念を擁護してくれたことに感謝。 +- **Sundai Club** — コミュニティ、エネルギー、そして意味のあるものを構築するための弛まぬ努力に感謝。 +- **世界とその先** 🌍✨ — オープンソースを良い力にしているすべての貢献者、夢想家、構築者へ。これはあなたのためのものです。 + +最高のアイデアはあらゆるところから生まれるため、私たちはオープンに構築しています。これを読んでいるなら、あなたはその一部です。ようこそ。🦀❤️ + +## 貢献 + +ZeroClaw初心者ですか?[`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) ラベルの付いた課題を探してください — 始め方は[貢献ガイド](CONTRIBUTING.md#first-time-contributors)を参照。AI/vibe-coded PRも歓迎します!🤖 + +[CONTRIBUTING.md](CONTRIBUTING.md) と [CLA.md](docs/contributing/cla.md) を参照。traitを実装してPRを提出してください: + +- CIワークフローガイド:[docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- 新 `Provider` → `src/providers/` +- 新 `Channel` → `src/channels/` +- 新 `Observer` → `src/observability/` +- 新 `Tool` → `src/tools/` +- 新 `Memory` → `src/memory/` +- 新 `Tunnel` → `src/tunnel/` +- 新 `Peripheral` → `src/peripherals/` +- 新 `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ 公式リポジトリと偽装警告 + +**これがZeroClawの唯一の公式リポジトリです:** + +> https://github.com/zeroclaw-labs/zeroclaw + +「ZeroClaw」を名乗る、またはZeroClaw Labsとの提携を示唆する他のリポジトリ、組織、ドメイン、パッケージは**無許可であり、本プロジェクトとは無関係です**。既知の無許可フォークは [TRADEMARK.md](docs/maintainers/trademark.md) に記載されます。 + +偽装や商標の悪用を見つけた場合は、[issueを作成](https://github.com/zeroclaw-labs/zeroclaw/issues)してください。 + +--- + +## ライセンス + +ZeroClawは最大限のオープン性と貢献者保護のためにデュアルライセンスです: + +| ライセンス | 用途 | +|------------|------| +| [MIT](LICENSE-MIT) | オープンソース、研究、学術、個人使用 | +| [Apache 2.0](LICENSE-APACHE) | 特許保護、機関、商用デプロイ | + +どちらのライセンスでも選択できます。**貢献者は両方のライセンスの権利を自動的に付与します** — 完全な貢献者契約については [CLA.md](docs/contributing/cla.md) を参照してください。 + +### 商標 + +**ZeroClaw** の名称とロゴはZeroClaw Labsの商標です。このライセンスは、推薦や提携を暗示するための使用許可を付与しません。許可された使用と禁止された使用については [TRADEMARK.md](docs/maintainers/trademark.md) を参照してください。 + +### 貢献者の保護 + +- あなたは貢献の**著作権を保持**します +- **特許付与**(Apache 2.0)により、他の貢献者からの特許請求から保護されます +- あなたの貢献はコミット履歴と [NOTICE](NOTICE) に**永続的に帰属**されます +- 貢献により商標権は移転されません + +--- + +**ZeroClaw** — ゼロオーバーヘッド。ゼロ妥協。どこでもデプロイ。何でも交換。🦀 + +## 貢献者 + + + ZeroClaw contributors + + +このリストはGitHub貢献者グラフから生成され、自動的に更新されます。 + +## Star履歴 + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.ko.md b/third_party/zeroclaw/README.ko.md new file mode 100644 index 0000000..151ceef --- /dev/null +++ b/third_party/zeroclaw/README.ko.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — 개인 AI 어시스턴트

+ +

+ 오버헤드 없음. 타협 없음. 100% Rust. 100% 독립적.
+ ⚡️ $10 하드웨어에서 <5MB RAM으로 실행: OpenClaw보다 99% 적은 메모리, Mac mini보다 98% 저렴! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Harvard, MIT, 그리고 Sundai.Club 커뮤니티의 학생들과 멤버들이 만들었습니다. +

+ +

+ 🌐 언어: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw는 자신의 기기에서 실행하는 개인 AI 어시스턴트입니다. 이미 사용하고 있는 채널(WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work 등)에서 응답합니다. 실시간 제어를 위한 웹 대시보드가 있으며 하드웨어 주변기기(ESP32, STM32, Arduino, Raspberry Pi)에 연결할 수 있습니다. Gateway는 단순한 제어 평면이며, 제품은 어시스턴트 자체입니다. + +로컬에서 빠르고 항상 켜져 있는 개인 단일 사용자 어시스턴트를 원한다면 바로 이것입니다. + +

+ 웹사이트 · + 문서 · + 아키텍처 · + 시작하기 · + OpenClaw에서 마이그레이션 · + 문제 해결 · + Discord +

+ +> **권장 설정:** 터미널에서 `zeroclaw onboard`를 실행하세요. ZeroClaw Onboard가 gateway, workspace, 채널, 제공자 설정을 단계별로 안내합니다. macOS, Linux, Windows(WSL2)에서 작동하는 권장 설정 경로입니다. 새로 설치하시나요? 여기서 시작하세요: [시작하기](#빠른-시작-tldr) + +### Subscription Auth (OAuth) + +- **OpenAI Codex** (ChatGPT 구독) +- **Gemini** (Google OAuth) +- **Anthropic** (API 키 또는 인증 토큰) + +모델 참고: 많은 제공자/모델이 지원되지만, 최상의 경험을 위해 사용 가능한 최신 세대의 가장 강력한 모델을 사용하세요. [온보딩](#빠른-시작-tldr)을 참조하세요. + +모델 구성 + CLI: [Providers reference](docs/reference/api/providers-reference.md) +인증 프로필 교체(OAuth vs API 키) + 장애 조치: [Model failover](docs/reference/api/providers-reference.md) + +## 설치 (권장) + +런타임: Rust stable 툴체인. 단일 바이너리, 런타임 의존성 없음. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### 원클릭 부트스트랩 + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard`는 설치 후 자동으로 실행되어 workspace와 제공자를 구성합니다. + +## 빠른 시작 (TL;DR) + +전체 초보자 가이드(인증, 페어링, 채널): [시작하기](docs/setup-guides/one-click-bootstrap.md) + +```bash +# 설치 + 온보드 +./install.sh --api-key "sk-..." --provider openrouter + +# Gateway 시작 (webhook 서버 + 웹 대시보드) +zeroclaw gateway # 기본값: 127.0.0.1:42617 +zeroclaw gateway --port 0 # 랜덤 포트 (보안 강화) + +# 어시스턴트와 대화 +zeroclaw agent -m "Hello, ZeroClaw!" + +# 대화형 모드 +zeroclaw agent + +# 완전 자율 런타임 시작 (gateway + 채널 + cron + hands) +zeroclaw daemon + +# 상태 확인 +zeroclaw status + +# 진단 실행 +zeroclaw doctor +``` + +업그레이드 하셨나요? 업데이트 후 `zeroclaw doctor`를 실행하세요. + +### 소스에서 빌드 (개발용) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **개발 폴백 (글로벌 설치 없이):** 명령 앞에 `cargo run --release --`를 붙이세요 (예: `cargo run --release -- status`). + +## OpenClaw에서 마이그레이션 + +ZeroClaw는 OpenClaw workspace, 메모리, 구성을 가져올 수 있습니다: + +```bash +# 마이그레이션 대상 미리보기 (안전, 읽기 전용) +zeroclaw migrate openclaw --dry-run + +# 마이그레이션 실행 +zeroclaw migrate openclaw +``` + +이것은 메모리 항목, workspace 파일, 구성을 `~/.openclaw/`에서 `~/.zeroclaw/`로 마이그레이션합니다. 구성은 JSON에서 TOML로 자동 변환됩니다. + +## 보안 기본값 (DM 접근) + +ZeroClaw는 실제 메시징 서비스에 연결됩니다. 수신 DM을 신뢰할 수 없는 입력으로 취급하세요. + +전체 보안 가이드: [SECURITY.md](SECURITY.md) + +모든 채널의 기본 동작: + +- **DM 페어링** (기본값): 알 수 없는 발신자는 짧은 페어링 코드를 받으며 봇은 메시지를 처리하지 않습니다. +- 승인: `zeroclaw pairing approve ` (발신자가 로컬 허용 목록에 추가됩니다). +- 공개 수신 DM은 `config.toml`에서 명시적 옵트인이 필요합니다. +- `zeroclaw doctor`를 실행하여 위험하거나 잘못 구성된 DM 정책을 확인하세요. + +**자율성 수준:** + +| 수준 | 동작 | +|-------|----------| +| `ReadOnly` | 에이전트가 관찰만 할 수 있고 행동하지 않음 | +| `Supervised` (기본값) | 에이전트가 중/고위험 작업에 대해 승인을 받고 행동 | +| `Full` | 에이전트가 정책 범위 내에서 자율적으로 행동 | + +**샌드박싱 계층:** workspace 격리, 경로 탐색 차단, 명령 허용 목록, 금지 경로 (`/etc`, `/root`, `~/.ssh`), 속도 제한 (시간당 최대 작업 수, 일일 비용 상한). + + + + +### 📢 공지사항 + +이 표를 사용하여 중요한 공지사항(호환성 변경, 보안 권고, 유지보수 기간, 릴리스 차단)을 확인하세요. + +| 날짜 (UTC) | 수준 | 공지 | 조치 | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _치명적_ | 우리는 `openagen/zeroclaw`, `zeroclaw.org` 또는 `zeroclaw.net`과 **관련이 없습니다**. `zeroclaw.org`과 `zeroclaw.net` 도메인은 현재 `openagen/zeroclaw` 포크를 가리키고 있으며, 해당 도메인/저장소는 우리의 공식 웹사이트/프로젝트를 사칭하고 있습니다. | 해당 소스의 정보, 바이너리, 모금, 공지를 신뢰하지 마세요. [이 저장소](https://github.com/zeroclaw-labs/zeroclaw)와 검증된 소셜 계정만 사용하세요. | +| 2026-02-21 | _중요_ | 공식 웹사이트가 이제 온라인입니다: [zeroclawlabs.ai](https://zeroclawlabs.ai). 기다려주셔서 감사합니다. 사칭 시도가 여전히 감지되고 있으므로, 공식 채널을 통해 게시되지 않은 ZeroClaw 이름의 투자나 모금 활동에 참여하지 **마세요**. | [이 저장소](https://github.com/zeroclaw-labs/zeroclaw)를 유일한 진실의 원천으로 사용하세요. [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (그룹)](https://www.facebook.com/groups/zeroclawlabs), [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/)을 팔로우하여 공식 업데이트를 받으세요. | +| 2026-02-19 | _중요_ | Anthropic이 2026-02-19에 인증 및 자격증명 사용 약관을 업데이트했습니다. Claude Code OAuth 토큰(Free, Pro, Max)은 Claude Code와 Claude.ai 전용입니다. 다른 제품, 도구 또는 서비스(Agent SDK 포함)에서 Claude Free/Pro/Max OAuth 토큰을 사용하는 것은 허용되지 않으며 소비자 이용약관을 위반할 수 있습니다. | 잠재적 손실을 방지하기 위해 일시적으로 Claude Code OAuth 통합을 피하세요. 원본 조항: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## 주요 특징 + +- **기본 경량 런타임** — 일반적인 CLI 및 상태 워크플로우가 릴리스 빌드에서 몇 메가바이트의 메모리 범위 내에서 실행됩니다. +- **비용 효율적인 배포** — $10 보드와 소규모 클라우드 인스턴스를 위해 설계되었으며, 무거운 런타임 의존성이 없습니다. +- **빠른 콜드 스타트** — 단일 바이너리 Rust 런타임으로 명령 및 데몬 시작이 거의 즉각적입니다. +- **이식 가능한 아키텍처** — 교체 가능한 제공자/채널/도구로 ARM, x86, RISC-V에서 하나의 바이너리. +- **로컬 우선 Gateway** — 세션, 채널, 도구, cron, SOP, 이벤트를 위한 단일 제어 평면. +- **멀티 채널 수신함** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket 등. +- **멀티 에이전트 오케스트레이션 (Hands)** — 스케줄에 따라 실행되고 시간이 지남에 따라 더 똑똑해지는 자율 에이전트 스웜. +- **표준 운영 절차 (SOPs)** — MQTT, webhook, cron, 주변기기 트리거를 통한 이벤트 기반 워크플로우 자동화. +- **웹 대시보드** — 실시간 채팅, 메모리 브라우저, 구성 편집기, cron 관리자, 도구 검사기를 갖춘 React 19 + Vite 웹 UI. +- **하드웨어 주변기기** — `Peripheral` 트레이트를 통한 ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO. +- **일급 도구** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace 등 70개 이상. +- **라이프사이클 훅** — 모든 단계에서 LLM 호출, 도구 실행, 메시지를 가로채고 수정. +- **스킬 플랫폼** — 번들, 커뮤니티, workspace 스킬과 보안 감사. +- **터널 지원** — 원격 접속을 위한 Cloudflare, Tailscale, ngrok, OpenVPN, 사용자 정의 터널. + +### 팀이 ZeroClaw를 선택하는 이유 + +- **기본 경량:** 작은 Rust 바이너리, 빠른 시작, 낮은 메모리 사용. +- **기본 보안:** 페어링, 엄격한 샌드박싱, 명시적 허용 목록, workspace 범위 지정. +- **완전히 교체 가능:** 핵심 시스템이 트레이트(제공자, 채널, 도구, 메모리, 터널). +- **벤더 락인 없음:** OpenAI 호환 제공자 지원 + 플러그 가능한 사용자 정의 엔드포인트. + +## 벤치마크 스냅샷 (ZeroClaw vs OpenClaw, 재현 가능) + +로컬 머신 빠른 벤치마크 (macOS arm64, 2026년 2월) 0.8GHz 엣지 하드웨어로 정규화. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **언어** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **시작 (0.8GHz 코어)** | > 500s | > 30s | < 1s | **< 10ms** | +| **바이너리 크기** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **비용** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **모든 하드웨어 $10** | + +> 참고: ZeroClaw 결과는 `/usr/bin/time -l`을 사용한 릴리스 빌드에서 측정되었습니다. OpenClaw는 Node.js 런타임이 필요하며(일반적으로 ~390MB 추가 메모리 오버헤드), NanoBot은 Python 런타임이 필요합니다. PicoClaw와 ZeroClaw는 정적 바이너리입니다. 위 RAM 수치는 런타임 메모리이며, 빌드 시 컴파일 요구사항은 더 높습니다. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### 재현 가능한 로컬 측정 + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## 지금까지 구축한 모든 것 + +### 핵심 플랫폼 + +- 세션, 프레즌스, 구성, cron, webhook, 웹 대시보드, 페어링을 갖춘 Gateway HTTP/WS/SSE 제어 평면. +- CLI 표면: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- 도구 디스패치, 프롬프트 구성, 메시지 분류, 메모리 로딩을 갖춘 에이전트 오케스트레이션 루프. +- 보안 정책 적용, 자율성 수준, 승인 게이팅을 갖춘 세션 모델. +- 20개 이상의 LLM 백엔드에 걸쳐 장애 조치, 재시도, 모델 라우팅을 갖춘 탄력적 제공자 래퍼. + +### 채널 + +채널: WhatsApp (네이티브), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +기능 게이트: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### 웹 대시보드 + +Gateway에서 직접 제공하는 React 19 + Vite 6 + Tailwind CSS 4 웹 대시보드: + +- **대시보드** — 시스템 개요, 상태, 가동 시간, 비용 추적 +- **에이전트 채팅** — 에이전트와의 대화형 채팅 +- **메모리** — 메모리 항목 탐색 및 관리 +- **구성** — 구성 보기 및 편집 +- **Cron** — 예약된 작업 관리 +- **도구** — 사용 가능한 도구 탐색 +- **로그** — 에이전트 활동 로그 보기 +- **비용** — 토큰 사용량 및 비용 추적 +- **Doctor** — 시스템 상태 진단 +- **통합** — 통합 상태 및 설정 +- **페어링** — 기기 페어링 관리 + +### 펌웨어 대상 + +| 대상 | 플랫폼 | 용도 | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | 무선 주변기기 에이전트 | +| ESP32-UI | ESP32 + Display | 시각적 인터페이스를 갖춘 에이전트 | +| STM32 Nucleo | STM32 (ARM Cortex-M) | 산업용 주변기기 | +| Arduino | Arduino | 기본 센서/액추에이터 브릿지 | +| Uno Q Bridge | Arduino Uno | 에이전트와의 시리얼 브릿지 | + +### 도구 + 자동화 + +- **코어:** shell, file read/write/edit, git operations, glob search, content search +- **웹:** browser control, web fetch, web search, screenshot, image info, PDF read +- **통합:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **스케줄링:** cron add/remove/update/run, schedule tool +- **메모리:** recall, store, forget, knowledge, project intel +- **고급:** delegate (agent-to-agent), swarm, model switch/routing, security ops, cloud ops +- **하드웨어:** board info, memory map, memory read (feature-gated) + +### 런타임 + 안전 + +- **자율성 수준:** ReadOnly, Supervised (기본값), Full. +- **샌드박싱:** workspace 격리, 경로 탐색 차단, 명령 허용 목록, 금지 경로, Landlock (Linux), Bubblewrap. +- **속도 제한:** 시간당 최대 작업 수, 일일 최대 비용 (구성 가능). +- **승인 게이팅:** 중/고위험 작업에 대한 대화형 승인. +- **긴급 정지:** 긴급 종료 기능. +- **129개 이상의 보안 테스트** 자동화된 CI에서. + +### 운영 + 패키징 + +- Gateway에서 직접 제공하는 웹 대시보드. +- 터널 지원: Cloudflare, Tailscale, ngrok, OpenVPN, custom command. +- 컨테이너화된 실행을 위한 Docker 런타임 어댑터. +- CI/CD: beta (push 시 자동) → stable (수동 디스패치) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64)용 사전 빌드 바이너리. + + +## 구성 + +최소 `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +전체 구성 참조: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### 채널 구성 + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### 터널 구성 + +```toml +[tunnel] +kind = "cloudflare" # 또는 "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +상세 정보: [Channel reference](docs/reference/api/channels-reference.md) · [Config reference](docs/reference/api/config-reference.md) + +### 현재 런타임 지원 + +- **`native`** (기본값) — 직접 프로세스 실행, 가장 빠른 경로, 신뢰할 수 있는 환경에 적합. +- **`docker`** — 완전한 컨테이너 격리, 강화된 보안 정책, Docker 필요. + +엄격한 샌드박싱이나 네트워크 격리를 위해 `runtime.kind = "docker"`를 설정하세요. + +## Subscription Auth (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw는 구독 기반 인증 프로필(다중 계정, 저장 시 암호화)을 지원합니다. + +- 저장 파일: `~/.zeroclaw/auth-profiles.json` +- 암호화 키: `~/.zeroclaw/.secret_key` +- 프로필 id 형식: `:` (예: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT 구독) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# 확인 / 갱신 / 프로필 전환 +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# 구독 인증으로 에이전트 실행 +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## 에이전트 workspace + 스킬 + +Workspace 루트: `~/.zeroclaw/workspace/` (구성을 통해 변경 가능). + +주입되는 프롬프트 파일: +- `IDENTITY.md` — 에이전트 성격과 역할 +- `USER.md` — 사용자 컨텍스트와 선호도 +- `MEMORY.md` — 장기 사실과 교훈 +- `AGENTS.md` — 세션 규칙과 초기화 규칙 +- `SOUL.md` — 핵심 정체성과 운영 원칙 + +스킬: `~/.zeroclaw/workspace/skills//SKILL.md` 또는 `SKILL.toml`. + +```bash +# 설치된 스킬 목록 +zeroclaw skills list + +# git에서 설치 +zeroclaw skills install https://github.com/user/my-skill.git + +# 설치 전 보안 감사 +zeroclaw skills audit https://github.com/user/my-skill.git + +# 스킬 제거 +zeroclaw skills remove my-skill +``` + +## CLI 명령어 + +```bash +# Workspace 관리 +zeroclaw onboard # 안내된 설정 마법사 +zeroclaw status # 데몬/에이전트 상태 표시 +zeroclaw doctor # 시스템 진단 실행 + +# Gateway + 데몬 +zeroclaw gateway # Gateway 서버 시작 (127.0.0.1:42617) +zeroclaw daemon # 완전 자율 런타임 시작 + +# 에이전트 +zeroclaw agent # 대화형 채팅 모드 +zeroclaw agent -m "message" # 단일 메시지 모드 + +# 서비스 관리 +zeroclaw service install # OS 서비스로 설치 (launchd/systemd) +zeroclaw service start|stop|restart|status + +# 채널 +zeroclaw channel list # 구성된 채널 목록 +zeroclaw channel doctor # 채널 상태 확인 +zeroclaw channel bind-telegram 123456789 + +# Cron + 스케줄링 +zeroclaw cron list # 예약된 작업 목록 +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# 메모리 +zeroclaw memory list # 메모리 항목 목록 +zeroclaw memory get # 메모리 조회 +zeroclaw memory stats # 메모리 통계 + +# 인증 프로필 +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# 하드웨어 주변기기 +zeroclaw hardware discover # 연결된 기기 스캔 +zeroclaw peripheral list # 연결된 주변기기 목록 +zeroclaw peripheral flash # 기기에 펌웨어 플래시 + +# 마이그레이션 +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# 셸 자동완성 +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +전체 명령어 참조: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## 사전 요구사항 + +
+Windows + +#### 필수 + +1. **Visual Studio Build Tools** (MSVC 링커와 Windows SDK 제공): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + 설치 중(또는 Visual Studio Installer를 통해) **"C++를 사용한 데스크톱 개발"** 워크로드를 선택하세요. + +2. **Rust 툴체인:** + + ```powershell + winget install Rustlang.Rustup + ``` + + 설치 후 새 터미널을 열고 `rustup default stable`을 실행하여 stable 툴체인이 활성화되었는지 확인하세요. + +3. **확인:** 둘 다 작동하는지 확인: + ```powershell + rustc --version + cargo --version + ``` + +#### 선택사항 + +- **Docker Desktop** — [Docker 샌드박스 런타임](#현재-런타임-지원)을 사용하는 경우에만 필요 (`runtime.kind = "docker"`). `winget install Docker.DockerDesktop`으로 설치. + +
+ +
+Linux / macOS + +#### 필수 + +1. **빌드 필수 도구:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Xcode Command Line Tools 설치: `xcode-select --install` + +2. **Rust 툴체인:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + 자세한 내용은 [rustup.rs](https://rustup.rs)를 참조하세요. + +3. **확인:** 둘 다 작동하는지 확인: + ```bash + rustc --version + cargo --version + ``` + +#### 한 줄 설치 + +위 단계를 건너뛰고 모든 것(시스템 의존성, Rust, ZeroClaw)을 한 번에 설치: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### 컴파일 리소스 요구사항 + +소스에서 빌드하려면 결과 바이너리를 실행하는 것보다 더 많은 리소스가 필요합니다: + +| 리소스 | 최소 | 권장 | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **여유 디스크** | 6 GB | 10 GB+ | + +호스트가 최소 사양 미만인 경우 사전 빌드 바이너리를 사용하세요: + +```bash +./install.sh --prefer-prebuilt +``` + +소스 빌드 폴백 없이 바이너리만 설치: + +```bash +./install.sh --prebuilt-only +``` + +#### 선택사항 + +- **Docker** — [Docker 샌드박스 런타임](#현재-런타임-지원)을 사용하는 경우에만 필요 (`runtime.kind = "docker"`). 패키지 관리자 또는 [docker.com](https://docs.docker.com/engine/install/)을 통해 설치. + +> **참고:** 기본 `cargo build --release`는 `codegen-units=1`을 사용하여 피크 컴파일 압력을 낮춥니다. 성능이 좋은 머신에서 더 빠른 빌드를 위해 `cargo build --profile release-fast`를 사용하세요. + +
+ + + +### 사전 빌드 바이너리 + +릴리스 에셋은 다음 플랫폼에 게시됩니다: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +최신 에셋 다운로드: + + +## 문서 + +온보딩을 마친 후 더 깊은 참조가 필요할 때 사용하세요. + +- [문서 인덱스](docs/README.md)에서 탐색과 "무엇이 어디에 있는지"를 확인하세요. +- [아키텍처 개요](docs/architecture.md)에서 전체 시스템 모델을 확인하세요. +- [구성 참조](docs/reference/api/config-reference.md)에서 모든 키와 예제를 확인하세요. +- [운영 런북](docs/ops/operations-runbook.md)으로 Gateway를 운영하세요. +- [ZeroClaw Onboard](#빠른-시작-tldr)를 따라 안내된 설정을 진행하세요. +- [문제 해결 가이드](docs/ops/troubleshooting.md)로 일반적인 오류를 디버그하세요. +- 노출하기 전에 [보안 가이드](docs/security/README.md)를 검토하세요. + +### 참조 문서 + +- 문서 허브: [docs/README.md](docs/README.md) +- 통합 문서 목차: [docs/SUMMARY.md](docs/SUMMARY.md) +- 명령어 참조: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- 구성 참조: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- 제공자 참조: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- 채널 참조: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- 운영 런북: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- 문제 해결: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### 협업 문서 + +- 기여 가이드: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR 워크플로 정책: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI 워크플로 가이드: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- 리뷰어 플레이북: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- 보안 공개 정책: [SECURITY.md](SECURITY.md) +- 문서 템플릿: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### 배포 + 운영 + +- 네트워크 배포 가이드: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- 프록시 에이전트 플레이북: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- 하드웨어 가이드: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw는 빠르고 효율적인 AI 어시스턴트인 smooth crab 🦀을 위해 만들어졌습니다. Argenis De La Rosa와 커뮤니티가 만들었습니다. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## ZeroClaw 지원하기 + +ZeroClaw가 여러분의 작업에 도움이 되었고 지속적인 개발을 지원하고 싶다면 여기에서 기부할 수 있습니다: + +Buy Me a Coffee + +### 🙏 특별 감사 + +이 오픈소스 작업에 영감을 주고 힘을 실어주는 커뮤니티와 기관에 진심으로 감사드립니다: + +- **Harvard University** — 지적 호기심을 키우고 가능성의 한계를 넓혀 주셔서. +- **MIT** — 열린 지식, 오픈소스, 그리고 기술이 모두에게 접근 가능해야 한다는 신념을 옹호해 주셔서. +- **Sundai Club** — 커뮤니티, 에너지, 그리고 의미 있는 것을 만들고자 하는 끊임없는 열정. +- **세계 그리고 그 너머** 🌍✨ — 오픈소스를 선한 힘으로 만드는 모든 기여자, 꿈꾸는 이, 그리고 빌더에게. 이것은 여러분을 위한 것입니다. + +우리는 최고의 아이디어가 모든 곳에서 나오기 때문에 오픈소스로 구축합니다. 이것을 읽고 있다면 여러분도 그 일부입니다. 환영합니다. 🦀❤️ + +## 기여하기 + +ZeroClaw가 처음이신가요? [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) 레이블이 붙은 이슈를 찾아보세요 — 시작하는 방법은 [기여 가이드](CONTRIBUTING.md#first-time-contributors)를 참조하세요. AI/vibe-coded PR도 환영합니다! 🤖 + +[CONTRIBUTING.md](CONTRIBUTING.md)와 [CLA.md](docs/contributing/cla.md)를 참조하세요. 트레이트를 구현하고 PR을 제출하세요: + +- CI 워크플로 가이드: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- 새 `Provider` → `src/providers/` +- 새 `Channel` → `src/channels/` +- 새 `Observer` → `src/observability/` +- 새 `Tool` → `src/tools/` +- 새 `Memory` → `src/memory/` +- 새 `Tunnel` → `src/tunnel/` +- 새 `Peripheral` → `src/peripherals/` +- 새 `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ 공식 저장소 및 사칭 경고 + +**이것이 유일한 공식 ZeroClaw 저장소입니다:** + +> https://github.com/zeroclaw-labs/zeroclaw + +"ZeroClaw"라고 주장하거나 ZeroClaw Labs와의 제휴를 암시하는 다른 저장소, 조직, 도메인 또는 패키지는 **승인되지 않았으며 이 프로젝트와 관련이 없습니다**. 알려진 비인가 포크는 [TRADEMARK.md](docs/maintainers/trademark.md)에 나열됩니다. + +사칭이나 상표 오용을 발견하면 [이슈를 열어](https://github.com/zeroclaw-labs/zeroclaw/issues) 신고해 주세요. + +--- + +## 라이선스 + +ZeroClaw는 최대한의 개방성과 기여자 보호를 위해 듀얼 라이선스가 적용됩니다: + +| 라이선스 | 사용 사례 | +|---|---| +| [MIT](LICENSE-MIT) | 오픈소스, 연구, 학술, 개인 사용 | +| [Apache 2.0](LICENSE-APACHE) | 특허 보호, 기관, 상업 배포 | + +두 라이선스 중 하나를 선택할 수 있습니다. **기여자는 자동으로 두 가지 모두에 대한 권한을 부여합니다** — 전체 기여자 계약은 [CLA.md](docs/contributing/cla.md)를 참조하세요. + +### 상표 + +**ZeroClaw** 이름과 로고는 ZeroClaw Labs의 상표입니다. 이 라이선스는 승인이나 제휴를 암시하기 위해 사용할 권한을 부여하지 않습니다. 허용 및 금지 사용은 [TRADEMARK.md](docs/maintainers/trademark.md)를 참조하세요. + +### 기여자 보호 + +- 기여의 **저작권을 유지**합니다 +- **특허 부여** (Apache 2.0)가 다른 기여자의 특허 청구로부터 보호합니다 +- 기여는 커밋 기록과 [NOTICE](NOTICE)에 **영구적으로 귀속**됩니다 +- 기여함으로써 상표권이 이전되지 않습니다 + +--- + +**ZeroClaw** — 오버헤드 없음. 타협 없음. 어디서나 배포. 무엇이든 교체. 🦀 + +## 기여자 + + + ZeroClaw contributors + + +이 목록은 GitHub 기여자 그래프에서 생성되며 자동으로 업데이트됩니다. + +## 스타 히스토리 + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.md b/third_party/zeroclaw/README.md new file mode 100644 index 0000000..d18fe9a --- /dev/null +++ b/third_party/zeroclaw/README.md @@ -0,0 +1,751 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Personal AI Assistant

+ +

+ Zero overhead. Zero compromise. 100% Rust. 100% Agnostic.
+ ⚡️ Runs on $10 hardware with <5MB RAM: That's 99% less memory than OpenClaw and 98% cheaper than a Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Built by students and members of the Harvard, MIT, and Sundai.Club communities. +

+ +

+ 🌐 Languages: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw is a personal AI assistant you run on your own devices. It answers you on the channels you already use (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, and more). It has a web dashboard for real-time control and can connect to hardware peripherals (ESP32, STM32, Arduino, Raspberry Pi). The Gateway is just the control plane — the product is the assistant. + +If you want a personal, single-user assistant that feels local, fast, and always-on, this is it. + +

+ Website · + Docs · + Architecture · + Getting Started · + Migrating from OpenClaw · + Troubleshoot · + Discord +

+ +> **Preferred setup:** run `zeroclaw onboard` in your terminal. ZeroClaw Onboard guides you step by step through setting up the gateway, workspace, channels, and provider. It is the recommended setup path and works on macOS, Linux, and Windows (via WSL2). New install? Start here: [Getting started](#quick-start) + +### Subscription Auth (OAuth) + +- **OpenAI Codex** (ChatGPT subscription) +- **Gemini** (Google OAuth) +- **Anthropic** (API key or auth token) + +Model note: while many providers/models are supported, for the best experience use the strongest latest-generation model available to you. See [Onboarding](#quick-start). + +Models config + CLI: [Providers reference](docs/reference/api/providers-reference.md) +Auth profile rotation (OAuth vs API keys) + failover: [Model failover](docs/reference/api/providers-reference.md) + +## Install (recommended) + +Runtime: Rust stable toolchain. Single binary, no runtime dependencies. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### One-click bootstrap + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` runs automatically after install to configure your workspace and provider. + +## Quick start (TL;DR) + +Full beginner guide (auth, pairing, channels): [Getting started](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Install + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Start the gateway (webhook server + web dashboard) +zeroclaw gateway # default: 127.0.0.1:42617 +zeroclaw gateway --port 0 # random port (security hardened) + +# Talk to the assistant +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interactive mode +zeroclaw agent + +# Start full autonomous runtime (gateway + channels + cron + hands) +zeroclaw daemon + +# Check status +zeroclaw status + +# Run diagnostics +zeroclaw doctor +``` + +Upgrading? Run `zeroclaw doctor` after updating. + +### From source (development) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Dev fallback (no global install):** prefix commands with `cargo run --release --` (example: `cargo run --release -- status`). + +## Migrating from OpenClaw + +ZeroClaw can import your OpenClaw workspace, memory, and configuration: + +```bash +# Preview what will be migrated (safe, read-only) +zeroclaw migrate openclaw --dry-run + +# Run the migration +zeroclaw migrate openclaw +``` + +This migrates your memory entries, workspace files, and configuration from `~/.openclaw/` to `~/.zeroclaw/`. Config is converted from JSON to TOML automatically. + +## Security defaults (DM access) + +ZeroClaw connects to real messaging surfaces. Treat inbound DMs as untrusted input. + +Full security guide: [SECURITY.md](SECURITY.md) + +Default behavior on all channels: + +- **DM pairing** (default): unknown senders receive a short pairing code and the bot does not process their message. +- Approve with: `zeroclaw pairing approve ` (then the sender is added to a local allowlist). +- Public inbound DMs require an explicit opt-in in `config.toml`. +- Run `zeroclaw doctor` to surface risky or misconfigured DM policies. + +**Autonomy levels:** + +| Level | Behavior | +|-------|----------| +| `ReadOnly` | Agent can observe but not act | +| `Supervised` (default) | Agent acts with approval for medium/high risk operations | +| `Full` | Agent acts autonomously within policy bounds | + +**Sandboxing layers:** workspace isolation, path traversal blocking, command allowlisting, forbidden paths (`/etc`, `/root`, `~/.ssh`), rate limiting (max actions/hour, cost/day caps). + + + + +### 📢 Announcements + +Use this board for important notices (breaking changes, security advisories, maintenance windows, and release blockers). + +| Date (UTC) | Level | Notice | Action | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Critical_ | We are **not affiliated** with `openagen/zeroclaw`, `zeroclaw.org` or `zeroclaw.net`. The `zeroclaw.org` and `zeroclaw.net` domains currently points to the `openagen/zeroclaw` fork, and that domain/repository are impersonating our official website/project. | Do not trust information, binaries, fundraising, or announcements from those sources. Use only [this repository](https://github.com/zeroclaw-labs/zeroclaw) and our verified social accounts. | +| 2026-02-21 | _Important_ | Our official website is now live: [zeroclawlabs.ai](https://zeroclawlabs.ai). Thanks for your patience while we prepared the launch. We are still seeing impersonation attempts, so do **not** join any investment or fundraising activity claiming the ZeroClaw name unless it is published through our official channels. | Use [this repository](https://github.com/zeroclaw-labs/zeroclaw) as the single source of truth. Follow [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs), and [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) for official updates. | +| 2026-02-19 | _Important_ | Anthropic updated the Authentication and Credential Use terms on 2026-02-19. Claude Code OAuth tokens (Free, Pro, Max) are intended exclusively for Claude Code and Claude.ai; using OAuth tokens from Claude Free/Pro/Max in any other product, tool, or service (including Agent SDK) is not permitted and may violate the Consumer Terms of Service. | Please temporarily avoid Claude Code OAuth integrations to prevent potential loss. Original clause: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Highlights + +- **Lean Runtime by Default** — common CLI and status workflows run in a few-megabyte memory envelope on release builds. +- **Cost-Efficient Deployment** — designed for $10 boards and small cloud instances, no heavyweight runtime dependencies. +- **Fast Cold Starts** — single-binary Rust runtime keeps command and daemon startup near-instant. +- **Portable Architecture** — one binary across ARM, x86, and RISC-V with swappable providers/channels/tools. +- **Local-first Gateway** — single control plane for sessions, channels, tools, cron, SOPs, and events. +- **Multi-channel inbox** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket, and more. +- **Multi-agent orchestration (Hands)** — autonomous agent swarms that run on schedule and grow smarter over time. +- **Standard Operating Procedures (SOPs)** — event-driven workflow automation with MQTT, webhook, cron, and peripheral triggers. +- **Web Dashboard** — React 19 + Vite web UI with real-time chat, memory browser, config editor, cron manager, and tool inspector. +- **Hardware peripherals** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO via the `Peripheral` trait. +- **First-class tools** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace, and 70+ more. +- **Lifecycle hooks** — intercept and modify LLM calls, tool executions, and messages at every stage. +- **Skills platform** — bundled, community, and workspace skills with security auditing. +- **Tunnel support** — Cloudflare, Tailscale, ngrok, OpenVPN, and custom tunnels for remote access. + +### Why teams pick ZeroClaw + +- **Lean by default:** small Rust binary, fast startup, low memory footprint. +- **Secure by design:** pairing, strict sandboxing, explicit allowlists, workspace scoping. +- **Fully swappable:** core systems are traits (providers, channels, tools, memory, tunnels). +- **No lock-in:** OpenAI-compatible provider support + pluggable custom endpoints. + +## Benchmark Snapshot (ZeroClaw vs OpenClaw, Reproducible) + +Local machine quick benchmark (macOS arm64, Feb 2026) normalized for 0.8GHz edge hardware. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Language** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Startup (0.8GHz core)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Binary Size** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Cost** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Any hardware $10** | + +> Notes: ZeroClaw results are measured on release builds using `/usr/bin/time -l`. OpenClaw requires Node.js runtime (typically ~390MB additional memory overhead), while NanoBot requires Python runtime. PicoClaw and ZeroClaw are static binaries. The RAM figures above are runtime memory; build-time compilation requirements are higher. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Reproducible local measurement + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Everything we built so far + +### Core platform + +- Gateway HTTP/WS/SSE control plane with sessions, presence, config, cron, webhooks, web dashboard, and pairing. +- CLI surface: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Agent orchestration loop with tool dispatch, prompt construction, message classification, and memory loading. +- Session model with security policy enforcement, autonomy levels, and approval gating. +- Resilient provider wrapper with failover, retry, and model routing across 20+ LLM backends. + +### Channels + +Channels: WhatsApp (native), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Web dashboard + +React 19 + Vite 6 + Tailwind CSS 4 web dashboard served directly from the Gateway: + +- **Dashboard** — system overview, health status, uptime, cost tracking +- **Agent Chat** — interactive chat with the agent +- **Memory** — browse and manage memory entries +- **Config** — view and edit configuration +- **Cron** — manage scheduled tasks +- **Tools** — browse available tools +- **Logs** — view agent activity logs +- **Cost** — token usage and cost tracking +- **Doctor** — system health diagnostics +- **Integrations** — integration status and setup +- **Pairing** — device pairing management + +### Firmware targets + +| Target | Platform | Purpose | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | Wireless peripheral agent | +| ESP32-UI | ESP32 + Display | Agent with visual interface | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Industrial peripheral | +| Arduino | Arduino | Basic sensor/actuator bridge | +| Uno Q Bridge | Arduino Uno | Serial bridge to agent | + +### Tools + automation + +- **Core:** shell, file read/write/edit, git operations, glob search, content search +- **Web:** browser control, web fetch, web search, screenshot, image info, PDF read +- **Integrations:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover, Weather (wttr.in) +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **Scheduling:** cron add/remove/update/run, schedule tool +- **Memory:** recall, store, forget, knowledge, project intel +- **Advanced:** delegate (agent-to-agent), swarm, model switch/routing, security ops, cloud ops +- **Hardware:** board info, memory map, memory read (feature-gated) + +### Runtime + safety + +- **Autonomy levels:** ReadOnly, Supervised (default), Full. +- **Sandboxing:** workspace isolation, path traversal blocking, command allowlists, forbidden paths, Landlock (Linux), Bubblewrap. +- **Rate limiting:** max actions per hour, max cost per day (configurable). +- **Approval gating:** interactive approval for medium/high risk operations. +- **E-stop:** emergency shutdown capability. +- **129+ security tests** in automated CI. + +### Ops + packaging + +- Web dashboard served directly from the Gateway. +- Tunnel support: Cloudflare, Tailscale, ngrok, OpenVPN, custom command. +- Docker runtime adapter for containerized execution. +- CI/CD: beta (auto on push) → stable (manual dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Pre-built binaries for Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Configuration + +Minimal `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Full configuration reference: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Channel configuration + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Tunnel configuration + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Details: [Channel reference](docs/reference/api/channels-reference.md) · [Config reference](docs/reference/api/config-reference.md) + +### Runtime support (current) + +- **`native`** (default) — direct process execution, fastest path, ideal for trusted environments. +- **`docker`** — full container isolation, enforced security policies, requires Docker. + +Set `runtime.kind = "docker"` for strict sandboxing or network isolation. + +## Subscription Auth (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw supports subscription-native auth profiles (multi-account, encrypted at rest). + +- Store file: `~/.zeroclaw/auth-profiles.json` +- Encryption key: `~/.zeroclaw/.secret_key` +- Profile id format: `:` (example: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT subscription) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Check / refresh / switch profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Run the agent with subscription auth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Agent workspace + skills + +Workspace root: `~/.zeroclaw/workspace/` (configurable via config). + +Injected prompt files: +- `IDENTITY.md` — agent personality and role +- `USER.md` — user context and preferences +- `MEMORY.md` — long-term facts and lessons +- `AGENTS.md` — session conventions and initialization rules +- `SOUL.md` — core identity and operating principles + +Skills: `~/.zeroclaw/workspace/skills//SKILL.md` or `SKILL.toml`. + +```bash +# List installed skills +zeroclaw skills list + +# Install from git +zeroclaw skills install https://github.com/user/my-skill.git + +# Security audit before install +zeroclaw skills audit https://github.com/user/my-skill.git + +# Remove a skill +zeroclaw skills remove my-skill +``` + +## CLI commands + +```bash +# Workspace management +zeroclaw onboard # Guided setup wizard +zeroclaw status # Show daemon/agent status +zeroclaw doctor # Run system diagnostics + +# Gateway + daemon +zeroclaw gateway # Start gateway server (127.0.0.1:42617) +zeroclaw daemon # Start full autonomous runtime + +# Agent +zeroclaw agent # Interactive chat mode +zeroclaw agent -m "message" # Single message mode + +# Service management +zeroclaw service install # Install as OS service (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Channels +zeroclaw channel list # List configured channels +zeroclaw channel doctor # Check channel health +zeroclaw channel bind-telegram 123456789 + +# Cron + scheduling +zeroclaw cron list # List scheduled jobs +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memory +zeroclaw memory list # List memory entries +zeroclaw memory get # Retrieve a memory +zeroclaw memory stats # Memory statistics + +# Auth profiles +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardware peripherals +zeroclaw hardware discover # Scan for connected devices +zeroclaw peripheral list # List connected peripherals +zeroclaw peripheral flash # Flash firmware to device + +# Migration +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell completions +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Full commands reference: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + +## Prerequisites + +
+Windows + +#### Required + +1. **Visual Studio Build Tools** (provides the MSVC linker and Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + During installation (or via the Visual Studio Installer), select the **"Desktop development with C++"** workload. + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + After installation, open a new terminal and run `rustup default stable` to ensure the stable toolchain is active. + +3. **Verify** both are working: + ```powershell + rustc --version + cargo --version + ``` + +#### Optional + +- **Docker Desktop** — required only if using the [Docker sandboxed runtime](#runtime-support-current) (`runtime.kind = "docker"`). Install via `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Required + +1. **Build essentials:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Install Xcode Command Line Tools: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + See [rustup.rs](https://rustup.rs) for details. + +3. **Verify** both are working: + ```bash + rustc --version + cargo --version + ``` + +#### One-Line Installer + +Or skip the steps above and install everything (system deps, Rust, ZeroClaw) in a single command: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Compilation resource requirements + +Building from source needs more resources than running the resulting binary: + +| Resource | Minimum | Recommended | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Free disk** | 6 GB | 10 GB+ | + +If your host is below the minimum, use pre-built binaries: + +```bash +./install.sh --prefer-prebuilt +``` + +To require binary-only install with no source fallback: + +```bash +./install.sh --prebuilt-only +``` + +#### Optional + +- **Docker** — required only if using the [Docker sandboxed runtime](#runtime-support-current) (`runtime.kind = "docker"`). Install via your package manager or [docker.com](https://docs.docker.com/engine/install/). + +> **Note:** The default `cargo build --release` uses `codegen-units=1` to lower peak compile pressure. For faster builds on powerful machines, use `cargo build --profile release-fast`. + +
+ +### Pre-built binaries + +Release assets are published for: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Download the latest assets from: + + +## Docs + +Use these when you're past the onboarding flow and want the deeper reference. + +- Start with the [docs index](docs/README.md) for navigation and "what's where." +- Read the [architecture overview](docs/architecture.md) for the full system model. +- Use the [configuration reference](docs/reference/api/config-reference.md) when you need every key and example. +- Run the Gateway by the book with the [operational runbook](docs/ops/operations-runbook.md). +- Follow [ZeroClaw Onboard](#quick-start) for a guided setup. +- Debug common failures with the [troubleshooting guide](docs/ops/troubleshooting.md). +- Review [security guidance](docs/security/README.md) before exposing anything. + +### Reference docs + +- Documentation hub: [docs/README.md](docs/README.md) +- Unified docs TOC: [docs/SUMMARY.md](docs/SUMMARY.md) +- Commands reference: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Config reference: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Providers reference: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Channels reference: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Operations runbook: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Troubleshooting: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Collaboration docs + +- Contribution guide: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR workflow policy: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI workflow guide: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Reviewer playbook: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Security disclosure policy: [SECURITY.md](SECURITY.md) +- Documentation template: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Deployment + operations + +- Network deployment guide: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Proxy agent playbook: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Hardware guides: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw was built for the smooth crab 🦀, a fast and efficient AI assistant. Built by Argenis De La Rosa and the community. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Support ZeroClaw + +If ZeroClaw helps your work and you want to support ongoing development, you can donate here: + +Buy Me a Coffee + +### 🙏 Special Thanks + +A heartfelt thank you to the communities and institutions that inspire and fuel this open-source work: + +- **Harvard University** — for fostering intellectual curiosity and pushing the boundaries of what's possible. +- **MIT** — for championing open knowledge, open source, and the belief that technology should be accessible to everyone. +- **Sundai Club** — for the community, the energy, and the relentless drive to build things that matter. +- **The World & Beyond** 🌍✨ — to every contributor, dreamer, and builder out there making open source a force for good. This is for you. + +We're building in the open because the best ideas come from everywhere. If you're reading this, you're part of it. Welcome. 🦀❤️ + +## Contributing + +New to ZeroClaw? Look for issues labeled [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — see our [Contributing Guide](CONTRIBUTING.md#first-time-contributors) for how to get started. AI/vibe-coded PRs welcome! 🤖 + +See [CONTRIBUTING.md](CONTRIBUTING.md) and [CLA.md](docs/contributing/cla.md). Implement a trait, submit a PR: + +- CI workflow guide: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- New `Provider` → `src/providers/` +- New `Channel` → `src/channels/` +- New `Observer` → `src/observability/` +- New `Tool` → `src/tools/` +- New `Memory` → `src/memory/` +- New `Tunnel` → `src/tunnel/` +- New `Peripheral` → `src/peripherals/` +- New `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Official Repository & Impersonation Warning + +**This is the only official ZeroClaw repository:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Any other repository, organization, domain, or package claiming to be "ZeroClaw" or implying affiliation with ZeroClaw Labs is **unauthorized and not affiliated with this project**. Known unauthorized forks will be listed in [TRADEMARK.md](docs/maintainers/trademark.md). + +If you encounter impersonation or trademark misuse, please [open an issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## License + +ZeroClaw is dual-licensed for maximum openness and contributor protection: + +| License | Use case | +|---|---| +| [MIT](LICENSE-MIT) | Open-source, research, academic, personal use | +| [Apache 2.0](LICENSE-APACHE) | Patent protection, institutional, commercial deployment | + +You may choose either license. **Contributors automatically grant rights under both** — see [CLA.md](docs/contributing/cla.md) for the full contributor agreement. + +### Trademark + +The **ZeroClaw** name and logo are trademarks of ZeroClaw Labs. This license does not grant permission to use them to imply endorsement or affiliation. See [TRADEMARK.md](docs/maintainers/trademark.md) for permitted and prohibited uses. + +### Contributor Protections + +- You **retain copyright** of your contributions +- **Patent grant** (Apache 2.0) shields you from patent claims by other contributors +- Your contributions are **permanently attributed** in commit history and [NOTICE](NOTICE) +- No trademark rights are transferred by contributing + +--- + +**ZeroClaw** — Zero overhead. Zero compromise. Deploy anywhere. Swap anything. 🦀 + +## Contributors + + + ZeroClaw contributors + + +This list is generated from the GitHub contributors graph and updates automatically. + +## Star History + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.nb.md b/third_party/zeroclaw/README.nb.md new file mode 100644 index 0000000..74a10b4 --- /dev/null +++ b/third_party/zeroclaw/README.nb.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Personlig AI-assistent

+ +

+ Null overhead. Null kompromiss. 100% Rust. 100% Agnostisk.
+ ⚡️ Kjorer pa $10 maskinvare med <5MB RAM: Det er 99% mindre minne enn OpenClaw og 98% billigere enn en Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Bygget av studenter og medlemmer av Harvard-, MIT- og Sundai.Club-miljoene. +

+ +

+ 🌐 Sprak: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw er en personlig AI-assistent du kjorer pa dine egne enheter. Den svarer deg pa kanalene du allerede bruker (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work og flere). Den har et nettbasert dashbord for sanntidskontroll og kan kobles til maskinvareperiferiutstyr (ESP32, STM32, Arduino, Raspberry Pi). Gateway er bare kontrollplanet — produktet er assistenten. + +Hvis du onsker en personlig, enkeltbruker-assistent som foler seg lokal, rask og alltid tilgjengelig, er dette den. + +

+ Nettsted · + Dokumentasjon · + Arkitektur · + Kom i gang · + Migrering fra OpenClaw · + Feilsoking · + Discord +

+ +> **Anbefalt oppsett:** kjor `zeroclaw onboard` i terminalen din. ZeroClaw Onboard guider deg steg for steg gjennom oppsett av gateway, arbeidsomrade, kanaler og leverandor. Det er den anbefalte oppsettsveien og fungerer pa macOS, Linux og Windows (via WSL2). Ny installasjon? Start her: [Kom i gang](#hurtigstart) + +### Abonnementsautentisering (OAuth) + +- **OpenAI Codex** (ChatGPT-abonnement) +- **Gemini** (Google OAuth) +- **Anthropic** (API-nokkel eller autentiseringstoken) + +Modellmerknad: selv om mange leverandorer/modeller stotter, for best opplevelse bruk den sterkeste siste-generasjons modellen tilgjengelig for deg. Se [Onboarding](#hurtigstart). + +Modellkonfigurasjon + CLI: [Leverandorreferanse](docs/reference/api/providers-reference.md) +Autentiseringsprofil-rotasjon (OAuth vs API-nokler) + failover: [Modell-failover](docs/reference/api/providers-reference.md) + +## Installasjon (anbefalt) + +Kjoretidemiljo: Rust stabil verktoyskjede. Enkel binarfil, ingen kjoretidesavhengigheter. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Ett-klikks oppstart + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` kjorer automatisk etter installasjon for a konfigurere arbeidsomradet og leverandoren din. + +## Hurtigstart (TL;DR) + +Full nybegynnerguide (autentisering, paring, kanaler): [Kom i gang](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Installer + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Start gateway (webhook-server + nettbasert dashbord) +zeroclaw gateway # standard: 127.0.0.1:42617 +zeroclaw gateway --port 0 # tilfeldig port (sikkerhetsskarmet) + +# Snakk med assistenten +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interaktiv modus +zeroclaw agent + +# Start full autonom kjoretidemiljo (gateway + kanaler + cron + hands) +zeroclaw daemon + +# Sjekk status +zeroclaw status + +# Kjor diagnostikk +zeroclaw doctor +``` + +Oppgraderer? Kjor `zeroclaw doctor` etter oppdatering. + +### Fra kildekode (utvikling) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Utvikler-fallback (ingen global installasjon):** prefiks kommandoer med `cargo run --release --` (eksempel: `cargo run --release -- status`). + +## Migrering fra OpenClaw + +ZeroClaw kan importere ditt OpenClaw-arbeidsomrade, minne og konfigurasjon: + +```bash +# Forhandsvis hva som vil bli migrert (trygt, skrivebeskyttet) +zeroclaw migrate openclaw --dry-run + +# Kjor migreringen +zeroclaw migrate openclaw +``` + +Dette migrerer minneoppforinger, arbeidsomradefiler og konfigurasjon fra `~/.openclaw/` til `~/.zeroclaw/`. Konfigurasjon konverteres automatisk fra JSON til TOML. + +## Sikkerhetsstandarder (DM-tilgang) + +ZeroClaw kobler til ekte meldingsflater. Behandle innkommende DM-er som upalitelig inndata. + +Full sikkerhetsguide: [SECURITY.md](SECURITY.md) + +Standardoppforsel pa alle kanaler: + +- **DM-paring** (standard): ukjente avsendere mottar en kort paringskode og boten behandler ikke meldingen deres. +- Godkjenn med: `zeroclaw pairing approve ` (deretter legges avsenderen til en lokal tillatelesliste). +- Offentlige innkommende DM-er krever en eksplisitt opt-in i `config.toml`. +- Kjor `zeroclaw doctor` for a avdekke risikable eller feilkonfigurerte DM-policyer. + +**Autonominiva:** + +| Niva | Oppforsel | +|------|-----------| +| `ReadOnly` | Agenten kan observere men ikke handle | +| `Supervised` (standard) | Agenten handler med godkjenning for medium/hoy-risiko operasjoner | +| `Full` | Agenten handler autonomt innenfor policygrenser | + +**Sandkasselag:** arbeidsomradeisolasjon, stiblokkering, kommandotillatelselister, forbudte stier (`/etc`, `/root`, `~/.ssh`), hastighetsbegrensning (maks handlinger/time, kostnad/dag-tak). + + + + +### Kunngoringer + +Bruk denne tavlen for viktige meldinger (brytende endringer, sikkerhetsrad, vedlikeholdsvinduer og utgivelsesblokkeringer). + +| Dato (UTC) | Niva | Merknad | Handling | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Kritisk_ | Vi er **ikke tilknyttet** `openagen/zeroclaw`, `zeroclaw.org` eller `zeroclaw.net`. Domenene `zeroclaw.org` og `zeroclaw.net` peker for oyeblikket til `openagen/zeroclaw`-forken, og dette domenet/repositoriet utgir seg for a vaere vart offisielle nettsted/prosjekt. | Ikke stol pa informasjon, binarfiler, innsamlinger eller kunngoringer fra disse kildene. Bruk kun [dette repositoriet](https://github.com/zeroclaw-labs/zeroclaw) og vare verifiserte sosiale kontoer. | +| 2026-02-21 | _Viktig_ | Vart offisielle nettsted er na live: [zeroclawlabs.ai](https://zeroclawlabs.ai). Takk for talmodigheten mens vi forberedte lanseringen. Vi ser fortsatt etterligningsforsok, sa **ikke** bli med pa noen investerings- eller innsamlingsaktivitet som hevder ZeroClaw-navnet med mindre det er publisert gjennom vare offisielle kanaler. | Bruk [dette repositoriet](https://github.com/zeroclaw-labs/zeroclaw) som eneste sannhetskilde. Folg [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Gruppe)](https://www.facebook.com/groups/zeroclawlabs) og [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) for offisielle oppdateringer. | +| 2026-02-19 | _Viktig_ | Anthropic oppdaterte vilkarene for autentisering og legitimasjonsbruk 2026-02-19. Claude Code OAuth-tokens (Free, Pro, Max) er utelukkende ment for Claude Code og Claude.ai; bruk av OAuth-tokens fra Claude Free/Pro/Max i andre produkter, verktoy eller tjenester (inkludert Agent SDK) er ikke tillatt og kan bryte forbruksvilkarene. | Vennligst unnga Claude Code OAuth-integrasjoner midlertidig for a forhindre potensielt tap. Opprinnelig klausul: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Hoydepunkter + +- **Slank kjoretidemiljo som standard** — vanlige CLI- og statusarbeidsflyter kjorer i en fa-megabyte minneramme pa release-bygg. +- **Kostnadseffektiv distribusjon** — designet for $10-kort og sma skyinstanser, ingen tunge kjoretidesavhengigheter. +- **Raske kaldstarter** — enkel-binar Rust-kjoretidemiljo holder kommando- og daemonoppstart naer oydblikkelig. +- **Portabel arkitektur** — en binarfil pa tvers av ARM, x86 og RISC-V med byttbare leverandorer/kanaler/verktoy. +- **Lokal-forst Gateway** — enkelt kontrollplan for sesjoner, kanaler, verktoy, cron, SOP-er og hendelser. +- **Multikanal-innboks** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket og flere. +- **Multi-agent-orkestrering (Hands)** — autonome agentsverm som kjorer etter tidsplan og blir smartere over tid. +- **Standard Operating Procedures (SOPs)** — hendelsesdrevet arbeidsflytautomatisering med MQTT, webhook, cron og periferielle utlosere. +- **Nettbasert dashbord** — React 19 + Vite nettgrensesnitt med sanntidschat, minneleser, konfigurasjonsredigeringsverktoy, cron-behandler og verktoyinspektoring. +- **Maskinvareperiferiutstyr** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO via `Peripheral`-traitet. +- **Forsterangs verktoy** — shell, fil-I/O, nettleser, git, web fetch/search, MCP, Jira, Notion, Google Workspace og 70+ flere. +- **Livssyklus-hooks** — fang opp og modifiser LLM-kall, verktoyutforelser og meldinger pa hvert trinn. +- **Ferdighetsplattform** — medfoldgende, fellesskaps- og arbeidsomrade-ferdigheter med sikkerhetsgransking. +- **Tunnelstotte** — Cloudflare, Tailscale, ngrok, OpenVPN og egendefinerte tunneler for fjerntilgang. + +### Hvorfor team velger ZeroClaw + +- **Slank som standard:** liten Rust-binarfil, rask oppstart, lavt minneforbruk. +- **Sikker fra grunnen:** paring, streng sandkassing, eksplisitte tillateleslister, arbeidsomradeomfang. +- **Fullt byttbart:** kjernesystemer er traits (leverandorer, kanaler, verktoy, minne, tunneler). +- **Ingen innlasing:** OpenAI-kompatibel leverandorstotte + pluggbare egendefinerte endepunkter. + +## Ytelsessammenligning (ZeroClaw vs OpenClaw, reproduserbar) + +Lokal maskin hurtigtest (macOS arm64, feb 2026) normalisert for 0.8GHz kantmaskinvare. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Sprak** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Oppstart (0.8GHz-kjerne)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Binarstorrelse** | ~28MB (dist) | N/A (Skript) | ~8MB | **~8.8 MB** | +| **Kostnad** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Enhver maskinvare $10** | + +> Merknader: ZeroClaw-resultater er malt pa release-bygg med `/usr/bin/time -l`. OpenClaw krever Node.js-kjoretidemiljo (typisk ~390MB ekstra minneoverhead), mens NanoBot krever Python-kjoretidemiljo. PicoClaw og ZeroClaw er statiske binarfiler. RAM-tallene ovenfor er kjoretidesminne; byggetidskompileringskrav er hoyere. + +

+ ZeroClaw vs OpenClaw-sammenligning +

+ +### Reproduserbar lokal maling + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Alt vi har bygget sa langt + +### Kjerneplattform + +- Gateway HTTP/WS/SSE-kontrollplan med sesjoner, tilstedevaerelse, konfigurasjon, cron, webhooks, nettbasert dashbord og paring. +- CLI-overflate: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Agentorkestreringssloyfe med verktoyutsendelse, prompt-konstruksjon, meldingsklassifisering og minnelasting. +- Sesjonsmodell med sikkerhetspolicy-handhevelse, autonominiva og godkjenningsstyring. +- Robust leverandorwrapper med failover, retry og modellruting pa tvers av 20+ LLM-backends. + +### Kanaler + +Kanaler: WhatsApp (native), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Funksjonsbaserte: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Nettbasert dashbord + +React 19 + Vite 6 + Tailwind CSS 4 nettbasert dashbord servert direkte fra Gateway: + +- **Dashbord** — systemoversikt, helsestatus, oppetid, kostnadssporing +- **Agentchat** — interaktiv chat med agenten +- **Minne** — bla gjennom og administrer minneoppforinger +- **Konfigurasjon** — vis og rediger konfigurasjon +- **Cron** — administrer planlagte oppgaver +- **Verktoy** — bla gjennom tilgjengelige verktoy +- **Logger** — vis agentaktivitetslogger +- **Kostnad** — tokenbruk og kostnadssporing +- **Doktor** — systemhelsediagnostikk +- **Integrasjoner** — integrasjonsstatus og oppsett +- **Paring** — enhetsparingsadministrasjon + +### Firmwaremal + +| Mal | Plattform | Formal | +|-----|-----------|--------| +| ESP32 | Espressif ESP32 | Tradlos periferiagent | +| ESP32-UI | ESP32 + Skjerm | Agent med visuelt grensesnitt | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Industriell periferi | +| Arduino | Arduino | Grunnleggende sensor/aktuatorbro | +| Uno Q Bridge | Arduino Uno | Seriell bro til agent | + +### Verktoy + automatisering + +- **Kjerne:** shell, fillesing/skriving/redigering, git-operasjoner, glob-sok, innholdssok +- **Nett:** nettleserkontroll, web fetch, web search, skjermbilde, bildeinformasjon, PDF-lesing +- **Integrasjoner:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol verktoy-wrapper + utsatte verktoysamlinger +- **Planlegging:** cron legg til/fjern/oppdater/kjor, planleggingsverktoy +- **Minne:** recall, store, forget, knowledge, project intel +- **Avansert:** delegate (agent-til-agent), swarm, modellbytte/-ruting, sikkerhetsoperasjoner, skyoperasjoner +- **Maskinvare:** board info, memory map, memory read (funksjonsbasert) + +### Kjoretidemiljo + sikkerhet + +- **Autonominiva:** ReadOnly, Supervised (standard), Full. +- **Sandkassing:** arbeidsomradeisolasjon, stiblokkering, kommandotillatelselister, forbudte stier, Landlock (Linux), Bubblewrap. +- **Hastighetsbegrensning:** maks handlinger per time, maks kostnad per dag (konfigurerbart). +- **Godkjenningsstyring:** interaktiv godkjenning for medium/hoy-risiko operasjoner. +- **Nodstopp:** mulighet for nodavslutning. +- **129+ sikkerhetstester** i automatisert CI. + +### Drift + pakking + +- Nettbasert dashbord servert direkte fra Gateway. +- Tunnelstotte: Cloudflare, Tailscale, ngrok, OpenVPN, egendefinert kommando. +- Docker kjoretidemiljoadapter for kontainerisert utforelse. +- CI/CD: beta (auto pa push) -> stabil (manuell utsendelse) -> Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Forhandsbygde binarfiler for Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Konfigurasjon + +Minimal `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Full konfigurasjonsreferanse: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Kanalkonfigurasjon + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Tunnelkonfigurasjon + +```toml +[tunnel] +kind = "cloudflare" # eller "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Detaljer: [Kanalreferanse](docs/reference/api/channels-reference.md) · [Konfigurasjonsreferanse](docs/reference/api/config-reference.md) + +### Kjoretidestotte (gjeldende) + +- **`native`** (standard) — direkte prosessutforelse, raskeste sti, ideell for palitelige miljoer. +- **`docker`** — full kontainerisolasjon, handhevede sikkerhetspolicyer, krever Docker. + +Sett `runtime.kind = "docker"` for streng sandkassing eller nettverksisolasjon. + +## Abonnementsautentisering (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw stotter abonnements-native autentiseringsprofiler (multi-konto, kryptert i hvile). + +- Lagringsfil: `~/.zeroclaw/auth-profiles.json` +- Krypteringsnokkel: `~/.zeroclaw/.secret_key` +- Profil-ID-format: `:` (eksempel: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT-abonnement) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Sjekk / oppdater / bytt profil +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Kjor agenten med abonnementsautentisering +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Agentarbeidsomrade + ferdigheter + +Arbeidsomraderot: `~/.zeroclaw/workspace/` (konfigurerbar via konfigurasjon). + +Injiserte prompt-filer: +- `IDENTITY.md` — agentpersonlighet og rolle +- `USER.md` — brukerkontekst og preferanser +- `MEMORY.md` — langtidsfakta og laerdommer +- `AGENTS.md` — sesjonskonvensjoner og initialiseringsregler +- `SOUL.md` — kjerneidentitet og driftsprinsipper + +Ferdigheter: `~/.zeroclaw/workspace/skills//SKILL.md` eller `SKILL.toml`. + +```bash +# List installerte ferdigheter +zeroclaw skills list + +# Installer fra git +zeroclaw skills install https://github.com/user/my-skill.git + +# Sikkerhetsgransking for installasjon +zeroclaw skills audit https://github.com/user/my-skill.git + +# Fjern en ferdighet +zeroclaw skills remove my-skill +``` + +## CLI-kommandoer + +```bash +# Arbeidsomradeadministrasjon +zeroclaw onboard # Veiledet oppsettveiviser +zeroclaw status # Vis daemon/agentstatus +zeroclaw doctor # Kjor systemdiagnostikk + +# Gateway + daemon +zeroclaw gateway # Start gateway-server (127.0.0.1:42617) +zeroclaw daemon # Start full autonom kjoretidemiljo + +# Agent +zeroclaw agent # Interaktiv chatmodus +zeroclaw agent -m "melding" # Enkeltmeldingsmodus + +# Tjenesteadministrasjon +zeroclaw service install # Installer som OS-tjeneste (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Kanaler +zeroclaw channel list # List konfigurerte kanaler +zeroclaw channel doctor # Sjekk kanalhelse +zeroclaw channel bind-telegram 123456789 + +# Cron + planlegging +zeroclaw cron list # List planlagte jobber +zeroclaw cron add "*/5 * * * *" --prompt "Sjekk systemhelse" +zeroclaw cron remove + +# Minne +zeroclaw memory list # List minneoppforinger +zeroclaw memory get # Hent et minne +zeroclaw memory stats # Minnestatistikk + +# Autentiseringsprofiler +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Maskinvareperiferiutstyr +zeroclaw hardware discover # Sok etter tilkoblede enheter +zeroclaw peripheral list # List tilkoblede periferienheter +zeroclaw peripheral flash # Flash firmware til enhet + +# Migrering +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell-fullforinger +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Full kommandoreferanse: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Forutsetninger + +
+Windows + +#### Pakrevd + +1. **Visual Studio Build Tools** (gir MSVC-linker og Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Under installasjon (eller via Visual Studio Installer), velg arbeidsbelastningen **"Desktop development with C++"**. + +2. **Rust-verktoyskjede:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Etter installasjon, apne en ny terminal og kjor `rustup default stable` for a sikre at den stabile verktoyskjeden er aktiv. + +3. **Verifiser** at begge fungerer: + ```powershell + rustc --version + cargo --version + ``` + +#### Valgfritt + +- **Docker Desktop** — kun pakrevd ved bruk av [Docker-sandkassekjoretidemiljo](#kjoretidestotte-gjeldende) (`runtime.kind = "docker"`). Installer via `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Pakrevd + +1. **Byggeverktoyer:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Installer Xcode Command Line Tools: `xcode-select --install` + +2. **Rust-verktoyskjede:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Se [rustup.rs](https://rustup.rs) for detaljer. + +3. **Verifiser** at begge fungerer: + ```bash + rustc --version + cargo --version + ``` + +#### En-linje installasjon + +Eller hopp over stegene ovenfor og installer alt (systemavhengigheter, Rust, ZeroClaw) med en enkelt kommando: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Kompileringsressurskrav + +Bygging fra kildekode krever mer ressurser enn a kjore den resulterende binarfilen: + +| Ressurs | Minimum | Anbefalt | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Ledig disk** | 6 GB | 10 GB+ | + +Hvis verten din er under minimum, bruk forhandsbygde binarfiler: + +```bash +./install.sh --prefer-prebuilt +``` + +For a kreve kun binarinstallasjon uten kildekodefallback: + +```bash +./install.sh --prebuilt-only +``` + +#### Valgfritt + +- **Docker** — kun pakrevd ved bruk av [Docker-sandkassekjoretidemiljo](#kjoretidestotte-gjeldende) (`runtime.kind = "docker"`). Installer via pakkebehandleren din eller [docker.com](https://docs.docker.com/engine/install/). + +> **Merk:** Standard `cargo build --release` bruker `codegen-units=1` for a senke topp-kompileringstrykk. For raskere bygg pa kraftige maskiner, bruk `cargo build --profile release-fast`. + +
+ + + +### Forhandsbygde binarfiler + +Utgivelsesfiler publiseres for: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Last ned de nyeste filene fra: + + +## Dokumentasjon + +Bruk disse nar du er forbi onboarding-flyten og onsker dypere referanse. + +- Start med [dokumentasjonsindeksen](docs/README.md) for navigasjon og "hva er hvor." +- Les [arkitekturoversikten](docs/architecture.md) for den fullstendige systemmodellen. +- Bruk [konfigurasjonsreferansen](docs/reference/api/config-reference.md) nar du trenger hver nokkel og eksempel. +- Kjor Gateway etter boken med [driftshandboken](docs/ops/operations-runbook.md). +- Folg [ZeroClaw Onboard](#hurtigstart) for et veiledet oppsett. +- Feilsok vanlige problemer med [feilsokingsguiden](docs/ops/troubleshooting.md). +- Gjennga [sikkerhetsveiledning](docs/security/README.md) for du eksponerer noe. + +### Referansedokumentasjon + +- Dokumentasjonshub: [docs/README.md](docs/README.md) +- Samlet innholdsfortegnelse: [docs/SUMMARY.md](docs/SUMMARY.md) +- Kommandoreferanse: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Konfigurasjonsreferanse: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Leverandorreferanse: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Kanalreferanse: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Driftshandbok: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Feilsoking: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Samarbeidsdokumentasjon + +- Bidragsguide: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR-arbeidsflyts-policy: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI-arbeidsflytguide: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Anmelderhandbok: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Sikkerhetsavsloring: [SECURITY.md](SECURITY.md) +- Dokumentasjonsmal: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Distribusjon + drift + +- Nettverksdistribusjonsguide: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Proxy-agenthandbok: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Maskinvareguider: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw ble bygget for den smidige krabben 🦀, en rask og effektiv AI-assistent. Bygget av Argenis De La Rosa og fellesskapet. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Stott ZeroClaw + +Hvis ZeroClaw hjelper arbeidet ditt og du onsker a stotte pagaende utvikling, kan du donere her: + +Buy Me a Coffee + +### Spesiell takk + +En hjertelig takk til miljoene og institusjonene som inspirerer og driver dette open source-arbeidet: + +- **Harvard University** — for a fremme intellektuell nysgjerrighet og flytte grensene for hva som er mulig. +- **MIT** — for a fremme apen kunnskap, apen kildekode og troen pa at teknologi bor vaere tilgjengelig for alle. +- **Sundai Club** — for fellesskapet, energien og den uboyelige driven til a bygge ting som betyr noe. +- **Verden og videre** 🌍✨ — til hver bidragsyter, drommer og bygger der ute som gjor open source til en kraft for det gode. Dette er for dere. + +Vi bygger i det apne fordi de beste ideene kommer fra overalt. Hvis du leser dette, er du en del av det. Velkommen. 🦀❤️ + +## Bidra + +Ny til ZeroClaw? Se etter issues merket [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — se var [Bidragsguide](CONTRIBUTING.md#first-time-contributors) for hvordan du kommer i gang. AI/vibe-kodede PR-er er velkomne! 🤖 + +Se [CONTRIBUTING.md](CONTRIBUTING.md) og [CLA.md](docs/contributing/cla.md). Implementer et trait, send inn en PR: + +- CI-arbeidsflytguide: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Ny `Provider` -> `src/providers/` +- Ny `Channel` -> `src/channels/` +- Ny `Observer` -> `src/observability/` +- Nytt `Tool` -> `src/tools/` +- Nytt `Memory` -> `src/memory/` +- Ny `Tunnel` -> `src/tunnel/` +- Ny `Peripheral` -> `src/peripherals/` +- Ny `Skill` -> `~/.zeroclaw/workspace/skills//` + + + + +## Offisielt repository og etterligningsadvarsel + +**Dette er det eneste offisielle ZeroClaw-repositoriet:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Ethvert annet repository, organisasjon, domene eller pakke som hevder a vaere "ZeroClaw" eller antyder tilknytning til ZeroClaw Labs er **uautorisert og ikke tilknyttet dette prosjektet**. Kjente uautoriserte forker vil bli listet i [TRADEMARK.md](docs/maintainers/trademark.md). + +Hvis du stoter pa etterligning eller varemerkemisbruk, vennligst [opprett en issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Lisens + +ZeroClaw er dobbelt-lisensiert for maksimal apenhet og bidragsyterbeskyttelse: + +| Lisens | Bruksomrade | +|---|---| +| [MIT](LICENSE-MIT) | Open source, forskning, akademisk, personlig bruk | +| [Apache 2.0](LICENSE-APACHE) | Patentbeskyttelse, institusjonell, kommersiell distribusjon | + +Du kan velge begge lisenser. **Bidragsytere gir automatisk rettigheter under begge** — se [CLA.md](docs/contributing/cla.md) for den fullstendige bidragsyteravtalen. + +### Varemerke + +**ZeroClaw**-navnet og logoen er varemerker for ZeroClaw Labs. Denne lisensen gir ikke tillatelse til a bruke dem for a antyde stotte eller tilknytning. Se [TRADEMARK.md](docs/maintainers/trademark.md) for tillatt og forbudt bruk. + +### Bidragsyterbeskyttelse + +- Du **beholder opphavsretten** til dine bidrag +- **Patentbevilgning** (Apache 2.0) beskytter deg mot patentkrav fra andre bidragsytere +- Dine bidrag er **permanent attribuert** i commit-historikk og [NOTICE](NOTICE) +- Ingen varemerkerettigheter overdrages ved a bidra + +--- + +**ZeroClaw** — Null overhead. Null kompromiss. Distribuer overalt. Bytt hva som helst. 🦀 + +## Bidragsytere + + + ZeroClaw-bidragsytere + + +Denne listen genereres fra GitHub-bidragsytergrafen og oppdateres automatisk. + +## Stjernehistorikk + +

+ + + + + Stjernehistorikk-diagram + + +

diff --git a/third_party/zeroclaw/README.nl.md b/third_party/zeroclaw/README.nl.md new file mode 100644 index 0000000..270f8e5 --- /dev/null +++ b/third_party/zeroclaw/README.nl.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Persoonlijke AI-Assistent

+ +

+ Nul overhead. Nul compromis. 100% Rust. 100% Agnostisch.
+ ⚡️ Draait op $10 hardware met <5MB RAM: Dat is 99% minder geheugen dan OpenClaw en 98% goedkoper dan een Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Gebouwd door studenten en leden van de Harvard-, MIT- en Sundai.Club-gemeenschappen. +

+ +

+ 🌐 Talen: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw is een persoonlijke AI-assistent die je op je eigen apparaten draait. Hij beantwoordt je op de kanalen die je al gebruikt (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work en meer). Het heeft een webdashboard voor realtime controle en kan verbinding maken met hardware-randapparatuur (ESP32, STM32, Arduino, Raspberry Pi). De Gateway is slechts het besturingsvlak — het product is de assistent. + +Als je een persoonlijke, single-user assistent wilt die lokaal, snel en altijd beschikbaar aanvoelt — dit is het. + +

+ Website · + Documentatie · + Architectuur · + Aan de slag · + Migreren van OpenClaw · + Probleemoplossing · + Discord +

+ +> **Aanbevolen setup:** voer `zeroclaw onboard` uit in je terminal. ZeroClaw Onboard begeleidt je stap voor stap door het instellen van de gateway, workspace, kanalen en provider. Het is het aanbevolen installatiepad en werkt op macOS, Linux en Windows (via WSL2). Nieuwe installatie? Begin hier: [Aan de slag](#snelle-start) + +### Abonnementsauthenticatie (OAuth) + +- **OpenAI Codex** (ChatGPT-abonnement) +- **Gemini** (Google OAuth) +- **Anthropic** (API-sleutel of autorisatietoken) + +Modelopmerking: hoewel veel providers/modellen worden ondersteund, gebruik voor de beste ervaring het sterkste beschikbare model van de nieuwste generatie. Zie [Onboarding](#snelle-start). + +Modelconfiguratie + CLI: [Providers-referentie](docs/reference/api/providers-reference.md) +Autorisatieprofiel-rotatie (OAuth vs API-sleutels) + failover: [Model-failover](docs/reference/api/providers-reference.md) + +## Installatie (aanbevolen) + +Runtime: stabiele Rust-toolchain. Enkel binair bestand, geen runtime-afhankelijkheden. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Installatie met één klik + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` wordt automatisch uitgevoerd na installatie om je workspace en provider te configureren. + +## Snelle start (TL;DR) + +Volledige beginnersgids (authenticatie, koppeling, kanalen): [Aan de slag](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Installatie + onboarding +./install.sh --api-key "sk-..." --provider openrouter + +# Start de gateway (webhook-server + webdashboard) +zeroclaw gateway # standaard: 127.0.0.1:42617 +zeroclaw gateway --port 0 # willekeurige poort (beveiligingsversterkt) + +# Praat met de assistent +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interactieve modus +zeroclaw agent + +# Start volledige autonome runtime (gateway + kanalen + cron + hands) +zeroclaw daemon + +# Controleer status +zeroclaw status + +# Voer diagnostiek uit +zeroclaw doctor +``` + +Bijwerken? Voer `zeroclaw doctor` uit na het updaten. + +### Vanuit broncode (ontwikkeling) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Dev-fallback (geen globale installatie):** voeg `cargo run --release --` voor commando's toe (voorbeeld: `cargo run --release -- status`). + +## Migreren van OpenClaw + +ZeroClaw kan je OpenClaw-workspace, geheugen en configuratie importeren: + +```bash +# Voorbeeld van wat gemigreerd wordt (veilig, alleen-lezen) +zeroclaw migrate openclaw --dry-run + +# Voer de migratie uit +zeroclaw migrate openclaw +``` + +Dit migreert je geheugenregistraties, workspace-bestanden en configuratie van `~/.openclaw/` naar `~/.zeroclaw/`. Configuratie wordt automatisch geconverteerd van JSON naar TOML. + +## Standaard beveiligingsinstellingen (DM-toegang) + +ZeroClaw verbindt met echte berichtenplatforms. Behandel inkomende DM's als onbetrouwbare invoer. + +Volledige beveiligingsgids: [SECURITY.md](SECURITY.md) + +Standaardgedrag op alle kanalen: + +- **DM-koppeling** (standaard): onbekende afzenders ontvangen een korte koppelingscode en de bot verwerkt hun bericht niet. +- Goedkeuren met: `zeroclaw pairing approve ` (vervolgens wordt de afzender toegevoegd aan een lokale allowlist). +- Publieke inkomende DM's vereisen een expliciete opt-in in `config.toml`. +- Voer `zeroclaw doctor` uit om riskante of verkeerd geconfigureerde DM-beleidsregels te detecteren. + +**Autonomieniveaus:** + +| Niveau | Gedrag | +|--------|--------| +| `ReadOnly` | Agent kan observeren maar niet handelen | +| `Supervised` (standaard) | Agent handelt met goedkeuring voor medium/hoog risico-operaties | +| `Full` | Agent handelt autonoom binnen beleidsgrenzen | + +**Sandboxing-lagen:** workspace-isolatie, padtraversatieblokkering, commando-allowlisting, verboden paden (`/etc`, `/root`, `~/.ssh`), snelheidsbeperking (max acties/uur, kosten/dag-limieten). + + + + +### 📢 Aankondigingen + +Gebruik dit bord voor belangrijke mededelingen (breaking changes, beveiligingsadviezen, onderhoudsvensters en release-blokkers). + +| Datum (UTC) | Niveau | Mededeling | Actie | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Kritiek_ | We zijn **niet gelieerd** aan `openagen/zeroclaw`, `zeroclaw.org` of `zeroclaw.net`. De domeinen `zeroclaw.org` en `zeroclaw.net` verwijzen momenteel naar de `openagen/zeroclaw`-fork, en dat domein/repository doet zich voor als onze officiële website/project. | Vertrouw geen informatie, binaire bestanden, fondswerving of aankondigingen van die bronnen. Gebruik alleen [dit repository](https://github.com/zeroclaw-labs/zeroclaw) en onze geverifieerde sociale accounts. | +| 2026-02-21 | _Belangrijk_ | Onze officiële website is nu live: [zeroclawlabs.ai](https://zeroclawlabs.ai). Bedankt voor je geduld terwijl we de lancering voorbereidden. We zien nog steeds imitatiepogingen, dus **doe niet** mee aan investeringen of fondsenwerving die de ZeroClaw-naam claimt, tenzij deze gepubliceerd is via onze officiële kanalen. | Gebruik [dit repository](https://github.com/zeroclaw-labs/zeroclaw) als de enige bron van waarheid. Volg [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Groep)](https://www.facebook.com/groups/zeroclawlabs) en [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) voor officiële updates. | +| 2026-02-19 | _Belangrijk_ | Anthropic heeft de voorwaarden voor authenticatie en gebruik van inloggegevens bijgewerkt op 2026-02-19. Claude Code OAuth-tokens (Free, Pro, Max) zijn uitsluitend bedoeld voor Claude Code en Claude.ai; het gebruik van OAuth-tokens van Claude Free/Pro/Max in elk ander product, tool of service (inclusief Agent SDK) is niet toegestaan en kan de Consumentenvoorwaarden schenden. | Vermijd tijdelijk Claude Code OAuth-integraties om potentieel verlies te voorkomen. Originele clausule: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Hoogtepunten + +- **Lichte runtime standaard** — veelvoorkomende CLI- en statusworkflows draaien in een geheugenomvang van enkele megabytes op release-builds. +- **Kostenefficiënte implementatie** — ontworpen voor $10-borden en kleine cloud-instances, geen zware runtime-afhankelijkheden. +- **Snelle koude starts** — single-binary Rust-runtime houdt het opstarten van commando's en daemon vrijwel instant. +- **Draagbare architectuur** — één binair bestand voor ARM, x86 en RISC-V met verwisselbare providers/kanalen/tools. +- **Lokale gateway** — enkel besturingsvlak voor sessies, kanalen, tools, cron, SOP's en events. +- **Multi-channel inbox** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket en meer. +- **Multi-agent-orkestratie (Hands)** — autonome agentenzwermen die op schema draaien en na verloop van tijd slimmer worden. +- **Standaard Operationele Procedures (SOP's)** — event-gedreven workflowautomatisering met MQTT-, webhook-, cron- en periferie-triggers. +- **Webdashboard** — React 19 + Vite web-UI met realtime chat, geheugenbrowser, configuratie-editor, cron-manager en tool-inspector. +- **Hardware-randapparatuur** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO via de `Peripheral`-trait. +- **Eersteklas tools** — shell, bestands-I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace en 70+ meer. +- **Lifecycle-hooks** — onderschep en wijzig LLM-aanroepen, tool-uitvoeringen en berichten in elke fase. +- **Skills-platform** — ingebouwde, community- en workspace-skills met beveiligingsaudit. +- **Tunnelondersteuning** — Cloudflare, Tailscale, ngrok, OpenVPN en aangepaste tunnels voor externe toegang. + +### Waarom teams kiezen voor ZeroClaw + +- **Licht standaard:** klein Rust-binair bestand, snelle opstart, laag geheugengebruik. +- **Veilig by design:** koppeling, strikte sandboxing, expliciete allowlists, workspace-scoping. +- **Volledig verwisselbaar:** kernsystemen zijn traits (providers, kanalen, tools, geheugen, tunnels). +- **Geen vendor lock-in:** OpenAI-compatibele provider-ondersteuning + inplugbare aangepaste endpoints. + +## Benchmark-overzicht (ZeroClaw vs OpenClaw, reproduceerbaar) + +Snelle lokale benchmark (macOS arm64, feb 2026) genormaliseerd voor 0.8GHz edge-hardware. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Taal** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Opstart (0.8GHz core)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Binaire grootte** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Kosten** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Elke hardware $10** | + +> Opmerkingen: ZeroClaw-resultaten zijn gemeten op release-builds met `/usr/bin/time -l`. OpenClaw vereist Node.js-runtime (typisch ~390MB extra geheugenoverhead), terwijl NanoBot Python-runtime vereist. PicoClaw en ZeroClaw zijn statische binaries. De RAM-cijfers hierboven zijn runtime-geheugen; compilatievereisten zijn hoger. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Reproduceerbare lokale meting + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Alles wat we tot nu toe hebben gebouwd + +### Kernplatform + +- Gateway HTTP/WS/SSE besturingsvlak met sessies, aanwezigheid, configuratie, cron, webhooks, webdashboard en koppeling. +- CLI-oppervlak: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Agent-orkestratielus met tool-dispatch, promptconstructie, berichtclassificatie en geheugen laden. +- Sessiemodel met beveiligingsbeleid-handhaving, autonomieniveaus en goedkeuringspoorten. +- Veerkrachtige provider-wrapper met failover, retry en modelrouting over 20+ LLM-backends. + +### Kanalen + +Kanalen: WhatsApp (natief), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Webdashboard + +React 19 + Vite 6 + Tailwind CSS 4 webdashboard geserveerd direct vanuit de Gateway: + +- **Dashboard** — systeemoverzicht, gezondheidsstatus, uptime, kostentracking +- **Agent Chat** — interactieve chat met de agent +- **Geheugen** — bladeren en beheren van geheugenregistraties +- **Configuratie** — bekijken en bewerken van configuratie +- **Cron** — beheer van geplande taken +- **Tools** — bladeren door beschikbare tools +- **Logs** — bekijken van agent-activiteitslogs +- **Kosten** — tokengebruik en kostentracking +- **Doctor** — systeemgezondheidsdiagnostiek +- **Integraties** — integratiestatus en setup +- **Koppeling** — apparaatkoppelingsbeheer + +### Firmware-doelen + +| Doel | Platform | Doel | +|------|----------|------| +| ESP32 | Espressif ESP32 | Draadloze perifere agent | +| ESP32-UI | ESP32 + Display | Agent met visuele interface | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Industriële periferie | +| Arduino | Arduino | Basis sensor/actuator-brug | +| Uno Q Bridge | Arduino Uno | Seriële brug naar agent | + +### Tools + automatisering + +- **Kern:** shell, bestand lezen/schrijven/bewerken, git-operaties, glob-zoekopdracht, inhoudszoekopdracht +- **Web:** browserbediening, web fetch, webzoekopdracht, screenshot, afbeeldingsinfo, PDF lezen +- **Integraties:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool-wrapper + uitgestelde toolsets +- **Planning:** cron add/remove/update/run, planningstool +- **Geheugen:** recall, store, forget, knowledge, project intel +- **Geavanceerd:** delegate (agent-to-agent), swarm, model switch/routing, security ops, cloud ops +- **Hardware:** board info, memory map, memory read (feature-gated) + +### Runtime + veiligheid + +- **Autonomieniveaus:** ReadOnly, Supervised (standaard), Full. +- **Sandboxing:** workspace-isolatie, padtraversatieblokkering, commando-allowlists, verboden paden, Landlock (Linux), Bubblewrap. +- **Snelheidsbeperking:** max acties per uur, max kosten per dag (configureerbaar). +- **Goedkeuringspoort:** interactieve goedkeuring voor medium/hoog risico-operaties. +- **E-stop:** noodstopfunctionaliteit. +- **129+ beveiligingstests** in geautomatiseerd CI. + +### Ops + verpakking + +- Webdashboard geserveerd direct vanuit de Gateway. +- Tunnelondersteuning: Cloudflare, Tailscale, ngrok, OpenVPN, aangepast commando. +- Docker runtime-adapter voor gecontaineriseerde uitvoering. +- CI/CD: beta (auto bij push) → stable (handmatige dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Voorgebouwde binaries voor Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Configuratie + +Minimale `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Volledige configuratiereferentie: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Kanaalconfiguratie + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Tunnelconfiguratie + +```toml +[tunnel] +kind = "cloudflare" # of "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Details: [Kanaalreferentie](docs/reference/api/channels-reference.md) · [Configuratiereferentie](docs/reference/api/config-reference.md) + +### Runtime-ondersteuning (huidig) + +- **`native`** (standaard) — directe procesuitvoering, snelste pad, ideaal voor vertrouwde omgevingen. +- **`docker`** — volledige containerisolatie, afgedwongen beveiligingsbeleid, vereist Docker. + +Stel `runtime.kind = "docker"` in voor strikte sandboxing of netwerkisolatie. + +## Abonnementsauthenticatie (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw ondersteunt native abonnementsautorisatieprofielen (meerdere accounts, versleuteld in rust). + +- Opslagbestand: `~/.zeroclaw/auth-profiles.json` +- Versleutelingssleutel: `~/.zeroclaw/.secret_key` +- Profiel-ID-formaat: `:` (voorbeeld: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT-abonnement) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Controleer / ververs / wissel profiel +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Agent draaien met abonnementsauth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Agent-workspace + skills + +Workspace-root: `~/.zeroclaw/workspace/` (configureerbaar via config). + +Geïnjecteerde promptbestanden: +- `IDENTITY.md` — persoonlijkheid en rol van de agent +- `USER.md` — gebruikerscontext en voorkeuren +- `MEMORY.md` — langetermijnfeiten en lessen +- `AGENTS.md` — sessieconventies en initialisatieregels +- `SOUL.md` — kernidentiteit en operationele principes + +Skills: `~/.zeroclaw/workspace/skills//SKILL.md` of `SKILL.toml`. + +```bash +# Lijst geïnstalleerde skills +zeroclaw skills list + +# Installeer vanuit git +zeroclaw skills install https://github.com/user/my-skill.git + +# Beveiligingsaudit voor installatie +zeroclaw skills audit https://github.com/user/my-skill.git + +# Verwijder een skill +zeroclaw skills remove my-skill +``` + +## CLI-commando's + +```bash +# Workspace-beheer +zeroclaw onboard # Begeleide installatiewizard +zeroclaw status # Toon daemon/agent-status +zeroclaw doctor # Voer systeemdiagnostiek uit + +# Gateway + daemon +zeroclaw gateway # Start gateway-server (127.0.0.1:42617) +zeroclaw daemon # Start volledige autonome runtime + +# Agent +zeroclaw agent # Interactieve chatmodus +zeroclaw agent -m "message" # Enkele berichtmodus + +# Servicebeheer +zeroclaw service install # Installeer als OS-service (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Kanalen +zeroclaw channel list # Lijst geconfigureerde kanalen +zeroclaw channel doctor # Controleer kanaalgezondheid +zeroclaw channel bind-telegram 123456789 + +# Cron + planning +zeroclaw cron list # Lijst geplande taken +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Geheugen +zeroclaw memory list # Lijst geheugenregistraties +zeroclaw memory get # Haal een geheugenitem op +zeroclaw memory stats # Geheugenstatistieken + +# Autorisatieprofielen +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardware-randapparatuur +zeroclaw hardware discover # Scan verbonden apparaten +zeroclaw peripheral list # Lijst verbonden randapparatuur +zeroclaw peripheral flash # Flash firmware naar apparaat + +# Migratie +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell-aanvullingen +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Volledige commandoreferentie: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Vereisten + +
+Windows + +#### Vereist + +1. **Visual Studio Build Tools** (biedt de MSVC-linker en Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Selecteer tijdens de installatie (of via de Visual Studio Installer) de **"Desktop development with C++"** workload. + +2. **Rust-toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Open na installatie een nieuwe terminal en voer `rustup default stable` uit om te verzekeren dat de stabiele toolchain actief is. + +3. **Controleer** of beide werken: + ```powershell + rustc --version + cargo --version + ``` + +#### Optioneel + +- **Docker Desktop** — alleen vereist bij gebruik van de [Docker-sandboxed runtime](#runtime-ondersteuning-huidig) (`runtime.kind = "docker"`). Installeer via `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Vereist + +1. **Bouwtools:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Installeer Xcode Command Line Tools: `xcode-select --install` + +2. **Rust-toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Zie [rustup.rs](https://rustup.rs) voor details. + +3. **Controleer** of beide werken: + ```bash + rustc --version + cargo --version + ``` + +#### Eenregelige installer + +Of sla bovenstaande stappen over en installeer alles (systeemafhankelijkheden, Rust, ZeroClaw) in één commando: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Compilatieresource-vereisten + +Bouwen vanuit broncode heeft meer resources nodig dan het draaien van het resulterende binaire bestand: + +| Resource | Minimum | Aanbevolen | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Vrije schijf** | 6 GB | 10 GB+ | + +Als je host onder het minimum zit, gebruik dan voorgebouwde binaries: + +```bash +./install.sh --prefer-prebuilt +``` + +Om alleen binaire installatie te forceren zonder broncode-fallback: + +```bash +./install.sh --prebuilt-only +``` + +#### Optioneel + +- **Docker** — alleen vereist bij gebruik van de [Docker-sandboxed runtime](#runtime-ondersteuning-huidig) (`runtime.kind = "docker"`). Installeer via je pakketbeheerder of [docker.com](https://docs.docker.com/engine/install/). + +> **Opmerking:** De standaard `cargo build --release` gebruikt `codegen-units=1` om piekcompiledruk te verlagen. Voor snellere builds op krachtige machines, gebruik `cargo build --profile release-fast`. + +
+ + + +### Voorgebouwde binaries + +Release-assets worden gepubliceerd voor: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Download de nieuwste assets van: + + +## Documentatie + +Gebruik deze wanneer je voorbij de onboarding bent en diepere referentie wilt. + +- Begin met de [documentatie-index](docs/README.md) voor navigatie en "wat staat waar." +- Lees het [architectuuroverzicht](docs/architecture.md) voor het volledige systeemmodel. +- Gebruik de [configuratiereferentie](docs/reference/api/config-reference.md) wanneer je elke sleutel en elk voorbeeld nodig hebt. +- Draai de Gateway volgens het [operationele draaiboek](docs/ops/operations-runbook.md). +- Volg [ZeroClaw Onboard](#snelle-start) voor een begeleide setup. +- Debug veelvoorkomende fouten met de [probleemoplossingsgids](docs/ops/troubleshooting.md). +- Bekijk de [beveiligingsrichtlijnen](docs/security/README.md) voordat je iets blootstelt. + +### Referentiedocumentatie + +- Documentatiehub: [docs/README.md](docs/README.md) +- Uniforme inhoudsopgave: [docs/SUMMARY.md](docs/SUMMARY.md) +- Commandoreferentie: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Configuratiereferentie: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Providerreferentie: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Kanaalreferentie: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Operationeel draaiboek: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Probleemoplossing: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Samenwerkingsdocumentatie + +- Bijdragegids: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR-workflowbeleid: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI-workflowgids: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Reviewer-draaiboek: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Beveiligingsonthullingsbeleid: [SECURITY.md](SECURITY.md) +- Documentatiesjabloon: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Implementatie + operaties + +- Netwerkimplementatiegids: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Proxy-agent-draaiboek: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Hardwaregidsen: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw is gebouwd voor de smooth crab 🦀, een snelle en efficiënte AI-assistent. Gebouwd door Argenis De La Rosa en de gemeenschap. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Steun ZeroClaw + +Als ZeroClaw je werk helpt en je de voortdurende ontwikkeling wilt steunen, kun je hier doneren: + +Buy Me a Coffee + +### 🙏 Speciale dank + +Een hartelijk dankjewel aan de gemeenschappen en instellingen die dit open-source werk inspireren en voeden: + +- **Harvard University** — voor het bevorderen van intellectuele nieuwsgierigheid en het verleggen van de grenzen van het mogelijke. +- **MIT** — voor het verdedigen van open kennis, open source en het geloof dat technologie voor iedereen toegankelijk moet zijn. +- **Sundai Club** — voor de gemeenschap, de energie en de onvermoeibare drang om dingen te bouwen die ertoe doen. +- **De wereld en verder** 🌍✨ — aan elke bijdrager, dromer en bouwer die open source een kracht ten goede maakt. Dit is voor jou. + +We bouwen in het open omdat de beste ideeën overal vandaan komen. Als je dit leest, ben je er onderdeel van. Welkom. 🦀❤️ + +## Bijdragen + +Nieuw bij ZeroClaw? Zoek naar issues gelabeld [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — zie onze [Bijdragegids](CONTRIBUTING.md#first-time-contributors) om te beginnen. AI/vibe-coded PR's welkom! 🤖 + +Zie [CONTRIBUTING.md](CONTRIBUTING.md) en [CLA.md](docs/contributing/cla.md). Implementeer een trait, dien een PR in: + +- CI-workflowgids: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Nieuwe `Provider` → `src/providers/` +- Nieuw `Channel` → `src/channels/` +- Nieuwe `Observer` → `src/observability/` +- Nieuwe `Tool` → `src/tools/` +- Nieuw `Memory` → `src/memory/` +- Nieuwe `Tunnel` → `src/tunnel/` +- Nieuw `Peripheral` → `src/peripherals/` +- Nieuwe `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Officieel repository & waarschuwing tegen imitatie + +**Dit is het enige officiële ZeroClaw-repository:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Elk ander repository, organisatie, domein of pakket dat beweert "ZeroClaw" te zijn of een relatie met ZeroClaw Labs impliceert, is **ongeautoriseerd en niet gelieerd aan dit project**. Bekende ongeautoriseerde forks worden vermeld in [TRADEMARK.md](docs/maintainers/trademark.md). + +Als je imitatie of merkmisbruik tegenkomt, [open dan een issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Licentie + +ZeroClaw heeft een dubbele licentie voor maximale openheid en bescherming van bijdragers: + +| Licentie | Gebruiksscenario | +|----------|-------------------| +| [MIT](LICENSE-MIT) | Open-source, onderzoek, academisch, persoonlijk gebruik | +| [Apache 2.0](LICENSE-APACHE) | Octrooi-bescherming, institutioneel, commerciële implementatie | + +Je kunt een van beide licenties kiezen. **Bijdragers verlenen automatisch rechten onder beide** — zie [CLA.md](docs/contributing/cla.md) voor de volledige bijdrager-overeenkomst. + +### Handelsmerk + +De **ZeroClaw**-naam en het logo zijn handelsmerken van ZeroClaw Labs. Deze licentie verleent geen toestemming om ze te gebruiken om goedkeuring of affiliatie te impliceren. Zie [TRADEMARK.md](docs/maintainers/trademark.md) voor toegestaan en verboden gebruik. + +### Bijdragerbescherming + +- Je **behoudt het auteursrecht** op je bijdragen +- **Octrooiverlening** (Apache 2.0) beschermt je tegen octrooiclaims van andere bijdragers +- Je bijdragen worden **permanent toegeschreven** in de commitgeschiedenis en [NOTICE](NOTICE) +- Er worden geen handelsmerkrechten overgedragen door bij te dragen + +--- + +**ZeroClaw** — Nul overhead. Nul compromis. Implementeer overal. Wissel alles. 🦀 + +## Bijdragers + + + ZeroClaw contributors + + +Deze lijst wordt gegenereerd vanuit de GitHub-bijdragersgrafiek en wordt automatisch bijgewerkt. + +## Sterrengeschiedenis + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.pl.md b/third_party/zeroclaw/README.pl.md new file mode 100644 index 0000000..935f41c --- /dev/null +++ b/third_party/zeroclaw/README.pl.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Osobisty Asystent AI

+ +

+ Zero narzutu. Zero kompromisów. 100% Rust. 100% Agnostyczny.
+ ⚡️ Działa na sprzęcie za $10 z <5MB RAM: To 99% mniej pamięci niż OpenClaw i 98% taniej niż Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Stworzone przez studentów i członków społeczności Harvard, MIT i Sundai.Club. +

+ +

+ 🌐 Języki: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw to osobisty asystent AI, który uruchamiasz na własnych urządzeniach. Odpowiada na kanałach, których już używasz (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work i więcej). Posiada panel webowy do kontroli w czasie rzeczywistym i może łączyć się z peryferiami sprzętowymi (ESP32, STM32, Arduino, Raspberry Pi). Gateway to tylko warstwa sterowania — produktem jest asystent. + +Jeśli szukasz osobistego, jednoosobowego asystenta, który działa lokalnie, szybko i jest zawsze dostępny — to jest to. + +

+ Strona internetowa · + Dokumentacja · + Architektura · + Rozpocznij · + Migracja z OpenClaw · + Rozwiązywanie problemów · + Discord +

+ +> **Zalecana konfiguracja:** uruchom `zeroclaw onboard` w terminalu. ZeroClaw Onboard prowadzi Cię krok po kroku przez konfigurację gateway, workspace, kanałów i dostawcy. Jest to zalecana ścieżka konfiguracji i działa na macOS, Linux i Windows (przez WSL2). Nowa instalacja? Zacznij tutaj: [Rozpocznij](#szybki-start) + +### Uwierzytelnianie subskrypcyjne (OAuth) + +- **OpenAI Codex** (subskrypcja ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (klucz API lub token autoryzacyjny) + +Uwaga dotycząca modeli: chociaż obsługiwanych jest wielu dostawców/modeli, dla najlepszego doświadczenia używaj najsilniejszego dostępnego modelu najnowszej generacji. Zobacz [Onboarding](#szybki-start). + +Konfiguracja modeli + CLI: [Dokumentacja dostawców](docs/reference/api/providers-reference.md) +Rotacja profili autoryzacyjnych (OAuth vs klucze API) + failover: [Failover modeli](docs/reference/api/providers-reference.md) + +## Instalacja (zalecana) + +Środowisko uruchomieniowe: stabilny toolchain Rust. Pojedynczy plik binarny, brak zależności runtime. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Instalacja jednym kliknięciem + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` uruchamia się automatycznie po instalacji, aby skonfigurować workspace i dostawcę. + +## Szybki start (TL;DR) + +Pełny przewodnik dla początkujących (autoryzacja, parowanie, kanały): [Rozpocznij](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Instalacja + onboarding +./install.sh --api-key "sk-..." --provider openrouter + +# Uruchom gateway (serwer webhook + panel webowy) +zeroclaw gateway # domyślnie: 127.0.0.1:42617 +zeroclaw gateway --port 0 # losowy port (wzmocnione bezpieczeństwo) + +# Porozmawiaj z asystentem +zeroclaw agent -m "Hello, ZeroClaw!" + +# Tryb interaktywny +zeroclaw agent + +# Uruchom pełne autonomiczne środowisko (gateway + kanały + cron + hands) +zeroclaw daemon + +# Sprawdź status +zeroclaw status + +# Uruchom diagnostykę +zeroclaw doctor +``` + +Aktualizujesz? Uruchom `zeroclaw doctor` po aktualizacji. + +### Ze źródła (rozwój) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Tryb deweloperski (bez globalnej instalacji):** poprzedź komendy `cargo run --release --` (przykład: `cargo run --release -- status`). + +## Migracja z OpenClaw + +ZeroClaw może zaimportować Twój workspace, pamięć i konfigurację OpenClaw: + +```bash +# Podgląd tego, co zostanie zmigrowane (bezpieczne, tylko odczyt) +zeroclaw migrate openclaw --dry-run + +# Uruchom migrację +zeroclaw migrate openclaw +``` + +Migruje wpisy pamięci, pliki workspace i konfigurację z `~/.openclaw/` do `~/.zeroclaw/`. Konfiguracja jest automatycznie konwertowana z JSON do TOML. + +## Domyślne ustawienia bezpieczeństwa (dostęp DM) + +ZeroClaw łączy się z prawdziwymi platformami komunikacyjnymi. Traktuj przychodzące DM jako niezaufane dane wejściowe. + +Pełny przewodnik bezpieczeństwa: [SECURITY.md](SECURITY.md) + +Domyślne zachowanie na wszystkich kanałach: + +- **Parowanie DM** (domyślne): nieznani nadawcy otrzymują krótki kod parowania i bot nie przetwarza ich wiadomości. +- Zatwierdź za pomocą: `zeroclaw pairing approve ` (wtedy nadawca jest dodawany do lokalnej listy dozwolonych). +- Publiczne przychodzące DM wymagają jawnej zgody w `config.toml`. +- Uruchom `zeroclaw doctor`, aby wykryć ryzykowne lub błędnie skonfigurowane polityki DM. + +**Poziomy autonomii:** + +| Poziom | Zachowanie | +|--------|------------| +| `ReadOnly` | Agent może obserwować, ale nie działać | +| `Supervised` (domyślny) | Agent działa z zatwierdzeniem dla operacji średniego/wysokiego ryzyka | +| `Full` | Agent działa autonomicznie w granicach polityki | + +**Warstwy sandboxingu:** izolacja workspace, blokowanie przechodzenia ścieżek, lista dozwolonych poleceń, zabronione ścieżki (`/etc`, `/root`, `~/.ssh`), ograniczenie szybkości (maks. akcji/godzinę, limity kosztów/dzień). + + + + +### 📢 Ogłoszenia + +Użyj tej tablicy do ważnych ogłoszeń (zmiany łamiące, porady bezpieczeństwa, okna serwisowe i blokery wydań). + +| Data (UTC) | Poziom | Ogłoszenie | Działanie | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Krytyczny_ | **Nie jesteśmy powiązani** z `openagen/zeroclaw`, `zeroclaw.org` ani `zeroclaw.net`. Domeny `zeroclaw.org` i `zeroclaw.net` obecnie kierują do forka `openagen/zeroclaw`, a ta domena/repozytorium podszywają się pod naszą oficjalną stronę/projekt. | Nie ufaj informacjom, plikom binarnym, zbiórkom funduszy ani ogłoszeniom z tych źródeł. Używaj wyłącznie [tego repozytorium](https://github.com/zeroclaw-labs/zeroclaw) i naszych zweryfikowanych kont społecznościowych. | +| 2026-02-21 | _Ważny_ | Nasza oficjalna strona internetowa jest teraz dostępna: [zeroclawlabs.ai](https://zeroclawlabs.ai). Dziękujemy za cierpliwość podczas przygotowywania premiery. Nadal obserwujemy próby podszywania się, więc **nie** dołączaj do żadnych inwestycji ani zbiórek funduszy pod nazwą ZeroClaw, chyba że zostały opublikowane przez nasze oficjalne kanały. | Używaj [tego repozytorium](https://github.com/zeroclaw-labs/zeroclaw) jako jedynego źródła prawdy. Śledź [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Grupa)](https://www.facebook.com/groups/zeroclawlabs) i [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) po oficjalne aktualizacje. | +| 2026-02-19 | _Ważny_ | Anthropic zaktualizował warunki uwierzytelniania i użytkowania poświadczeń 2026-02-19. Tokeny OAuth Claude Code (Free, Pro, Max) są przeznaczone wyłącznie dla Claude Code i Claude.ai; używanie tokenów OAuth z Claude Free/Pro/Max w jakimkolwiek innym produkcie, narzędziu lub usłudze (w tym Agent SDK) nie jest dozwolone i może naruszać Warunki korzystania z usługi. | Proszę tymczasowo unikać integracji OAuth Claude Code, aby zapobiec potencjalnym stratom. Oryginalna klauzula: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Najważniejsze cechy + +- **Lekkie środowisko uruchomieniowe domyślnie** — typowe workflow CLI i statusu działają w kopercie pamięci kilku megabajtów na buildach release. +- **Ekonomiczne wdrożenie** — zaprojektowane dla płytek za $10 i małych instancji chmurowych, bez ciężkich zależności runtime. +- **Szybki zimny start** — jednoplikowe środowisko Rust utrzymuje start komend i demona niemal natychmiastowy. +- **Przenośna architektura** — jeden plik binarny na ARM, x86 i RISC-V z wymiennymi dostawcami/kanałami/narzędziami. +- **Gateway lokalny** — pojedyncza warstwa sterowania dla sesji, kanałów, narzędzi, cron, SOP i zdarzeń. +- **Wielokanałowa skrzynka odbiorcza** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket i więcej. +- **Orkiestracja wielu agentów (Hands)** — autonomiczne roje agentów, które działają według harmonogramu i stają się inteligentniejsze z czasem. +- **Standardowe Procedury Operacyjne (SOP)** — automatyzacja workflow sterowana zdarzeniami z wyzwalaczami MQTT, webhook, cron i peryferiami. +- **Panel webowy** — interfejs React 19 + Vite z czatem w czasie rzeczywistym, przeglądarką pamięci, edytorem konfiguracji, menedżerem cron i inspektorem narzędzi. +- **Peryferia sprzętowe** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO przez trait `Peripheral`. +- **Narzędzia pierwszej klasy** — shell, plik I/O, przeglądarka, git, web fetch/search, MCP, Jira, Notion, Google Workspace i 70+ więcej. +- **Hooki cyklu życia** — przechwytuj i modyfikuj wywołania LLM, wykonania narzędzi i wiadomości na każdym etapie. +- **Platforma umiejętności** — wbudowane, społecznościowe i workspace skills z audytem bezpieczeństwa. +- **Obsługa tuneli** — Cloudflare, Tailscale, ngrok, OpenVPN i niestandardowe tunele do zdalnego dostępu. + +### Dlaczego zespoły wybierają ZeroClaw + +- **Lekki domyślnie:** mały plik binarny Rust, szybki start, niskie zużycie pamięci. +- **Bezpieczny z założenia:** parowanie, ścisły sandboxing, jawne listy dozwolonych, izolacja workspace. +- **W pełni wymienny:** podstawowe systemy to traity (dostawcy, kanały, narzędzia, pamięć, tunele). +- **Brak vendor lock-in:** obsługa dostawców kompatybilnych z OpenAI + podłączalne niestandardowe endpointy. + +## Porównanie wydajności (ZeroClaw vs OpenClaw, odtwarzalne) + +Szybki benchmark na maszynie lokalnej (macOS arm64, luty 2026) znormalizowany dla sprzętu edge 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Język** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Start (rdzeń 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Rozmiar binarki** | ~28MB (dist) | N/A (Skrypty) | ~8MB | **~8.8 MB** | +| **Koszt** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Dowolny sprzęt $10** | + +> Uwagi: Wyniki ZeroClaw są mierzone na buildach release przy użyciu `/usr/bin/time -l`. OpenClaw wymaga środowiska Node.js (typowo ~390MB dodatkowego narzutu pamięci), natomiast NanoBot wymaga środowiska Python. PicoClaw i ZeroClaw to statyczne pliki binarne. Powyższe wartości RAM dotyczą pamięci runtime; wymagania kompilacji są wyższe. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Odtwarzalny pomiar lokalny + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Wszystko, co do tej pory zbudowaliśmy + +### Platforma podstawowa + +- Gateway HTTP/WS/SSE warstwa sterowania z sesjami, obecnością, konfiguracją, cron, webhookami, panelem webowym i parowaniem. +- Interfejs CLI: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Pętla orkiestracji agenta z dispatchem narzędzi, konstrukcją promptów, klasyfikacją wiadomości i ładowaniem pamięci. +- Model sesji z egzekwowaniem polityki bezpieczeństwa, poziomami autonomii i bramkowaniem zatwierdzeń. +- Odporny wrapper dostawcy z failoverem, ponawianiem i routingiem modeli na 20+ backendach LLM. + +### Kanały + +Kanały: WhatsApp (natywny), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Za bramkami feature: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Panel webowy + +Panel webowy React 19 + Vite 6 + Tailwind CSS 4 serwowany bezpośrednio z Gateway: + +- **Dashboard** — przegląd systemu, status zdrowia, uptime, śledzenie kosztów +- **Czat z agentem** — interaktywny czat z agentem +- **Pamięć** — przeglądanie i zarządzanie wpisami pamięci +- **Konfiguracja** — podgląd i edycja konfiguracji +- **Cron** — zarządzanie zaplanowanymi zadaniami +- **Narzędzia** — przeglądanie dostępnych narzędzi +- **Logi** — podgląd logów aktywności agenta +- **Koszty** — użycie tokenów i śledzenie kosztów +- **Doctor** — diagnostyka zdrowia systemu +- **Integracje** — status i konfiguracja integracji +- **Parowanie** — zarządzanie parowaniem urządzeń + +### Cele firmware + +| Cel | Platforma | Przeznaczenie | +|-----|-----------|---------------| +| ESP32 | Espressif ESP32 | Bezprzewodowy agent peryferyjny | +| ESP32-UI | ESP32 + Wyświetlacz | Agent z interfejsem wizualnym | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Peryferia przemysłowe | +| Arduino | Arduino | Podstawowy mostek czujników/aktuatorów | +| Uno Q Bridge | Arduino Uno | Mostek szeregowy do agenta | + +### Narzędzia + automatyzacja + +- **Podstawowe:** shell, odczyt/zapis/edycja plików, operacje git, wyszukiwanie glob, wyszukiwanie treści +- **Web:** sterowanie przeglądarką, web fetch, wyszukiwanie web, zrzut ekranu, info o obrazie, odczyt PDF +- **Integracje:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** wrapper narzędzi Model Context Protocol + odroczone zestawy narzędzi +- **Planowanie:** cron add/remove/update/run, narzędzie planowania +- **Pamięć:** recall, store, forget, knowledge, project intel +- **Zaawansowane:** delegate (agent-to-agent), swarm, model switch/routing, security ops, cloud ops +- **Sprzęt:** board info, memory map, memory read (za bramką feature) + +### Środowisko uruchomieniowe + bezpieczeństwo + +- **Poziomy autonomii:** ReadOnly, Supervised (domyślny), Full. +- **Sandboxing:** izolacja workspace, blokowanie przechodzenia ścieżek, listy dozwolonych poleceń, zabronione ścieżki, Landlock (Linux), Bubblewrap. +- **Ograniczenie szybkości:** maks. akcji na godzinę, maks. koszt na dzień (konfigurowalne). +- **Bramkowanie zatwierdzeń:** interaktywne zatwierdzanie operacji średniego/wysokiego ryzyka. +- **E-stop:** możliwość awaryjnego wyłączenia. +- **129+ testów bezpieczeństwa** w automatycznym CI. + +### Operacje + pakowanie + +- Panel webowy serwowany bezpośrednio z Gateway. +- Obsługa tuneli: Cloudflare, Tailscale, ngrok, OpenVPN, niestandardowe polecenie. +- Adapter runtime Docker do konteneryzowanego wykonywania. +- CI/CD: beta (auto na push) → stable (ręczny dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Gotowe pliki binarne dla Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Konfiguracja + +Minimalna `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Pełna dokumentacja konfiguracji: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Konfiguracja kanałów + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Konfiguracja tunelu + +```toml +[tunnel] +kind = "cloudflare" # lub "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Szczegóły: [Dokumentacja kanałów](docs/reference/api/channels-reference.md) · [Dokumentacja konfiguracji](docs/reference/api/config-reference.md) + +### Obsługa runtime (aktualnie) + +- **`native`** (domyślny) — bezpośrednie wykonywanie procesów, najszybsza ścieżka, idealne dla zaufanych środowisk. +- **`docker`** — pełna izolacja kontenerowa, wymuszone polityki bezpieczeństwa, wymaga Docker. + +Ustaw `runtime.kind = "docker"` dla ścisłego sandboxingu lub izolacji sieciowej. + +## Uwierzytelnianie subskrypcyjne (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw obsługuje natywne profile autoryzacyjne subskrypcji (wiele kont, szyfrowanie w spoczynku). + +- Plik przechowywania: `~/.zeroclaw/auth-profiles.json` +- Klucz szyfrowania: `~/.zeroclaw/.secret_key` +- Format ID profilu: `:` (przykład: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (subskrypcja ChatGPT) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Sprawdź / odśwież / przełącz profil +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Uruchom agenta z autoryzacją subskrypcji +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Workspace agenta + umiejętności + +Katalog główny workspace: `~/.zeroclaw/workspace/` (konfigurowalne przez config). + +Wstrzykiwane pliki promptów: +- `IDENTITY.md` — osobowość i rola agenta +- `USER.md` — kontekst i preferencje użytkownika +- `MEMORY.md` — długoterminowe fakty i lekcje +- `AGENTS.md` — konwencje sesji i reguły inicjalizacji +- `SOUL.md` — podstawowa tożsamość i zasady działania + +Umiejętności: `~/.zeroclaw/workspace/skills//SKILL.md` lub `SKILL.toml`. + +```bash +# Lista zainstalowanych umiejętności +zeroclaw skills list + +# Instalacja z git +zeroclaw skills install https://github.com/user/my-skill.git + +# Audyt bezpieczeństwa przed instalacją +zeroclaw skills audit https://github.com/user/my-skill.git + +# Usuń umiejętność +zeroclaw skills remove my-skill +``` + +## Komendy CLI + +```bash +# Zarządzanie workspace +zeroclaw onboard # Kreator konfiguracji z przewodnikiem +zeroclaw status # Pokaż status demona/agenta +zeroclaw doctor # Uruchom diagnostykę systemu + +# Gateway + demon +zeroclaw gateway # Uruchom serwer gateway (127.0.0.1:42617) +zeroclaw daemon # Uruchom pełne autonomiczne środowisko + +# Agent +zeroclaw agent # Tryb interaktywnego czatu +zeroclaw agent -m "message" # Tryb pojedynczej wiadomości + +# Zarządzanie usługami +zeroclaw service install # Zainstaluj jako usługę OS (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Kanały +zeroclaw channel list # Lista skonfigurowanych kanałów +zeroclaw channel doctor # Sprawdź zdrowie kanałów +zeroclaw channel bind-telegram 123456789 + +# Cron + planowanie +zeroclaw cron list # Lista zaplanowanych zadań +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Pamięć +zeroclaw memory list # Lista wpisów pamięci +zeroclaw memory get # Pobierz wspomnienie +zeroclaw memory stats # Statystyki pamięci + +# Profile autoryzacyjne +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Peryferia sprzętowe +zeroclaw hardware discover # Skanuj podłączone urządzenia +zeroclaw peripheral list # Lista podłączonych peryferiów +zeroclaw peripheral flash # Flash firmware na urządzenie + +# Migracja +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Uzupełnianie powłoki +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Pełna dokumentacja komend: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Wymagania wstępne + +
+Windows + +#### Wymagane + +1. **Visual Studio Build Tools** (zapewnia linker MSVC i Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Podczas instalacji (lub przez Visual Studio Installer) wybierz workload **"Desktop development with C++"**. + +2. **Toolchain Rust:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Po instalacji otwórz nowy terminal i uruchom `rustup default stable`, aby upewnić się, że aktywny jest stabilny toolchain. + +3. **Sprawdź**, czy oba działają: + ```powershell + rustc --version + cargo --version + ``` + +#### Opcjonalne + +- **Docker Desktop** — wymagany tylko przy użyciu [runtime Docker z sandboxem](#obsługa-runtime-aktualnie) (`runtime.kind = "docker"`). Zainstaluj przez `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Wymagane + +1. **Narzędzia budowania:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Zainstaluj Xcode Command Line Tools: `xcode-select --install` + +2. **Toolchain Rust:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Zobacz [rustup.rs](https://rustup.rs) po szczegóły. + +3. **Sprawdź**, czy oba działają: + ```bash + rustc --version + cargo --version + ``` + +#### Instalator jednoliniowy + +Lub pomiń powyższe kroki i zainstaluj wszystko (zależności systemowe, Rust, ZeroClaw) jednym poleceniem: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Wymagania zasobów kompilacji + +Budowanie ze źródła wymaga więcej zasobów niż uruchamianie wynikowego pliku binarnego: + +| Zasób | Minimum | Zalecane | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Wolne miejsce** | 6 GB | 10 GB+ | + +Jeśli Twój host jest poniżej minimum, użyj gotowych plików binarnych: + +```bash +./install.sh --prefer-prebuilt +``` + +Aby wymusić instalację wyłącznie z pliku binarnego, bez fallbacku na źródło: + +```bash +./install.sh --prebuilt-only +``` + +#### Opcjonalne + +- **Docker** — wymagany tylko przy użyciu [runtime Docker z sandboxem](#obsługa-runtime-aktualnie) (`runtime.kind = "docker"`). Zainstaluj przez menedżer pakietów lub [docker.com](https://docs.docker.com/engine/install/). + +> **Uwaga:** Domyślny `cargo build --release` używa `codegen-units=1`, aby obniżyć szczytowe obciążenie kompilacji. Dla szybszych buildów na mocnych maszynach użyj `cargo build --profile release-fast`. + +
+ + + +### Gotowe pliki binarne + +Zasoby wydań są publikowane dla: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Pobierz najnowsze zasoby z: + + +## Dokumentacja + +Używaj tych, gdy przeszedłeś już przez onboarding i chcesz głębszej dokumentacji. + +- Zacznij od [indeksu dokumentacji](docs/README.md), aby zobaczyć nawigację i „co gdzie jest." +- Przeczytaj [przegląd architektury](docs/architecture.md), aby poznać pełny model systemu. +- Użyj [dokumentacji konfiguracji](docs/reference/api/config-reference.md), gdy potrzebujesz każdego klucza i przykładu. +- Uruchom Gateway zgodnie z [podręcznikiem operacyjnym](docs/ops/operations-runbook.md). +- Postępuj zgodnie z [ZeroClaw Onboard](#szybki-start) dla konfiguracji z przewodnikiem. +- Debuguj typowe awarie z [przewodnikiem rozwiązywania problemów](docs/ops/troubleshooting.md). +- Przejrzyj [wskazówki bezpieczeństwa](docs/security/README.md) przed wystawieniem czegokolwiek. + +### Dokumentacja referencyjna + +- Centrum dokumentacji: [docs/README.md](docs/README.md) +- Ujednolicony spis treści: [docs/SUMMARY.md](docs/SUMMARY.md) +- Dokumentacja komend: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Dokumentacja konfiguracji: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Dokumentacja dostawców: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Dokumentacja kanałów: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Podręcznik operacyjny: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Rozwiązywanie problemów: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Dokumentacja współpracy + +- Przewodnik kontrybutora: [CONTRIBUTING.md](CONTRIBUTING.md) +- Polityka workflow PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Przewodnik workflow CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Podręcznik recenzenta: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Polityka ujawniania bezpieczeństwa: [SECURITY.md](SECURITY.md) +- Szablon dokumentacji: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Wdrożenie + operacje + +- Przewodnik wdrożenia sieciowego: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Podręcznik agenta proxy: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Przewodniki sprzętowe: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw został zbudowany dla smooth crab 🦀, szybkiego i wydajnego asystenta AI. Stworzony przez Argenisa De La Rosę i społeczność. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Wesprzyj ZeroClaw + +Jeśli ZeroClaw pomaga w Twojej pracy i chcesz wesprzeć dalszy rozwój, możesz przekazać darowiznę tutaj: + +Buy Me a Coffee + +### 🙏 Specjalne podziękowania + +Serdeczne podziękowania dla społeczności i instytucji, które inspirują i napędzają tę pracę open-source: + +- **Harvard University** — za wspieranie ciekawości intelektualnej i przesuwanie granic tego, co możliwe. +- **MIT** — za promowanie otwartej wiedzy, open source i przekonania, że technologia powinna być dostępna dla wszystkich. +- **Sundai Club** — za społeczność, energię i nieustanny zapał do budowania rzeczy, które mają znaczenie. +- **Świat i dalej** 🌍✨ — dla każdego kontrybutora, marzyciela i twórcy, który sprawia, że open source jest siłą dobra. To dla Ciebie. + +Budujemy w otwartości, ponieważ najlepsze pomysły pochodzą zewsząd. Jeśli to czytasz, jesteś tego częścią. Witaj. 🦀❤️ + +## Współtworzenie + +Nowy w ZeroClaw? Szukaj issues oznaczonych [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — zobacz nasz [Przewodnik kontrybutora](CONTRIBUTING.md#first-time-contributors), aby dowiedzieć się jak zacząć. PR-y z AI/vibe-coded mile widziane! 🤖 + +Zobacz [CONTRIBUTING.md](CONTRIBUTING.md) i [CLA.md](docs/contributing/cla.md). Zaimplementuj trait, wyślij PR: + +- Przewodnik workflow CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Nowy `Provider` → `src/providers/` +- Nowy `Channel` → `src/channels/` +- Nowy `Observer` → `src/observability/` +- Nowy `Tool` → `src/tools/` +- Nowy `Memory` → `src/memory/` +- Nowy `Tunnel` → `src/tunnel/` +- Nowy `Peripheral` → `src/peripherals/` +- Nowy `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Oficjalne repozytorium i ostrzeżenie przed podszywaniem się + +**To jest jedyne oficjalne repozytorium ZeroClaw:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Każde inne repozytorium, organizacja, domena lub pakiet twierdzący, że jest "ZeroClaw" lub sugerujący powiązanie z ZeroClaw Labs jest **nieautoryzowany i niepowiązany z tym projektem**. Znane nieautoryzowane forki będą wymienione w [TRADEMARK.md](docs/maintainers/trademark.md). + +Jeśli napotkasz podszywanie się lub nadużycie znaku towarowego, proszę [otwórz zgłoszenie](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Licencja + +ZeroClaw jest podwójnie licencjonowany dla maksymalnej otwartości i ochrony kontrybutorów: + +| Licencja | Przypadek użycia | +|----------|------------------| +| [MIT](LICENSE-MIT) | Open-source, badania, akademia, użytek osobisty | +| [Apache 2.0](LICENSE-APACHE) | Ochrona patentowa, instytucjonalne, wdrożenia komercyjne | + +Możesz wybrać dowolną licencję. **Kontrybutorzy automatycznie udzielają praw na obie** — zobacz [CLA.md](docs/contributing/cla.md) po pełną umowę kontrybutora. + +### Znak towarowy + +Nazwa **ZeroClaw** i logo są znakami towarowymi ZeroClaw Labs. Ta licencja nie udziela pozwolenia na ich używanie w celu sugerowania poparcia lub powiązania. Zobacz [TRADEMARK.md](docs/maintainers/trademark.md) po dozwolone i zabronione użycia. + +### Ochrona kontrybutorów + +- **Zachowujesz prawa autorskie** do swoich wkładów +- **Udzielenie patentu** (Apache 2.0) chroni Cię przed roszczeniami patentowymi innych kontrybutorów +- Twoje wkłady są **trwale przypisane** w historii commitów i [NOTICE](NOTICE) +- Żadne prawa do znaku towarowego nie są przenoszone przez współtworzenie + +--- + +**ZeroClaw** — Zero narzutu. Zero kompromisów. Wdrażaj wszędzie. Wymieniaj wszystko. 🦀 + +## Kontrybutorzy + + + ZeroClaw contributors + + +Ta lista jest generowana z grafu kontrybutorów GitHub i aktualizuje się automatycznie. + +## Historia gwiazdek + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.pt.md b/third_party/zeroclaw/README.pt.md new file mode 100644 index 0000000..aa007db --- /dev/null +++ b/third_party/zeroclaw/README.pt.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Assistente Pessoal de IA

+ +

+ Zero overhead. Zero compromisso. 100% Rust. 100% Agnóstico.
+ ⚡️ Roda em hardware de $10 com <5MB de RAM: 99% menos memória que o OpenClaw e 98% mais barato que um Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Construído por estudantes e membros das comunidades de Harvard, MIT e Sundai.Club. +

+ +

+ 🌐 Idiomas: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw é um assistente pessoal de IA que você executa nos seus próprios dispositivos. Ele responde nos canais que você já usa (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work e mais). Tem um painel web para controle em tempo real e pode se conectar a periféricos de hardware (ESP32, STM32, Arduino, Raspberry Pi). O Gateway é apenas o plano de controle — o produto é o assistente. + +Se você quer um assistente pessoal, para um único usuário, que seja local, rápido e sempre ativo, é isso. + +

+ Site · + Documentação · + Arquitetura · + Primeiros passos · + Migração do OpenClaw · + Solução de problemas · + Discord +

+ +> **Configuração preferida:** execute `zeroclaw onboard` no seu terminal. O ZeroClaw Onboard guia você passo a passo na configuração do gateway, workspace, canais e provedor. É o caminho de configuração recomendado e funciona no macOS, Linux e Windows (via WSL2). Nova instalação? Comece aqui: [Primeiros passos](#início-rápido) + +### Autenticação por assinatura (OAuth) + +- **OpenAI Codex** (assinatura ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (chave API ou token de autenticação) + +Nota sobre modelos: embora muitos provedores/modelos sejam suportados, para a melhor experiência use o modelo de última geração mais poderoso disponível para você. Veja [Onboarding](#início-rápido). + +Configuração de modelos + CLI: [Referência de provedores](docs/reference/api/providers-reference.md) +Rotação de perfis de autenticação (OAuth vs chaves API) + failover: [Failover de modelos](docs/reference/api/providers-reference.md) + +## Instalação (recomendada) + +Requisito: toolchain estável do Rust. Um único binário, sem dependências de runtime. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Bootstrap com um clique + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` executa automaticamente após a instalação para configurar seu workspace e provedor. + +## Início rápido (TL;DR) + +Guia completo para iniciantes (autenticação, pareamento, canais): [Primeiros passos](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Instalar + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Iniciar o gateway (servidor webhook + painel web) +zeroclaw gateway # padrão: 127.0.0.1:42617 +zeroclaw gateway --port 0 # porta aleatória (segurança reforçada) + +# Falar com o assistente +zeroclaw agent -m "Hello, ZeroClaw!" + +# Modo interativo +zeroclaw agent + +# Iniciar runtime autônomo completo (gateway + canais + cron + hands) +zeroclaw daemon + +# Verificar status +zeroclaw status + +# Executar diagnósticos +zeroclaw doctor +``` + +Atualizando? Execute `zeroclaw doctor` após atualizar. + +### A partir do código-fonte (desenvolvimento) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Alternativa para desenvolvimento (sem instalação global):** prefixe comandos com `cargo run --release --` (exemplo: `cargo run --release -- status`). + +## Migração do OpenClaw + +O ZeroClaw pode importar seu workspace, memória e configuração do OpenClaw: + +```bash +# Pré-visualizar o que será migrado (seguro, somente leitura) +zeroclaw migrate openclaw --dry-run + +# Executar a migração +zeroclaw migrate openclaw +``` + +Isso migra suas entradas de memória, arquivos do workspace e configuração de `~/.openclaw/` para `~/.zeroclaw/`. A configuração é convertida de JSON para TOML automaticamente. + +## Padrões de segurança (acesso por DM) + +O ZeroClaw conecta-se a superfícies de mensagens reais. Trate DMs recebidas como entrada não confiável. + +Guia completo de segurança: [SECURITY.md](SECURITY.md) + +Comportamento padrão em todos os canais: + +- **Pareamento por DM** (padrão): remetentes desconhecidos recebem um código de pareamento curto e o bot não processa sua mensagem. +- Aprovar com: `zeroclaw pairing approve ` (então o remetente é adicionado a uma lista de permitidos local). +- DMs públicas recebidas requerem uma ativação explícita em `config.toml`. +- Execute `zeroclaw doctor` para detectar políticas de DM arriscadas ou mal configuradas. + +**Níveis de autonomia:** + +| Nível | Comportamento | +|-------|---------------| +| `ReadOnly` | O agente pode observar mas não agir | +| `Supervised` (padrão) | O agente age com aprovação para operações de risco médio/alto | +| `Full` | O agente age autonomamente dentro dos limites da política | + +**Camadas de sandboxing:** isolamento do workspace, bloqueio de traversal de caminhos, listas de comandos permitidos, caminhos proibidos (`/etc`, `/root`, `~/.ssh`), limitação de taxa (máximo de ações/hora, limites de custo/dia). + + + + +### 📢 Anúncios + +Use este quadro para avisos importantes (mudanças incompatíveis, avisos de segurança, janelas de manutenção e bloqueadores de lançamento). + +| Data (UTC) | Nível | Aviso | Ação | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Crítico_ | **Não somos afiliados** a `openagen/zeroclaw`, `zeroclaw.org` ou `zeroclaw.net`. Os domínios `zeroclaw.org` e `zeroclaw.net` atualmente apontam para o fork `openagen/zeroclaw`, e esse domínio/repositório estão se passando pelo nosso site/projeto oficial. | Não confie em informações, binários, arrecadações de fundos ou anúncios dessas fontes. Use apenas [este repositório](https://github.com/zeroclaw-labs/zeroclaw) e nossas contas sociais verificadas. | +| 2026-02-21 | _Importante_ | Nosso site oficial agora está no ar: [zeroclawlabs.ai](https://zeroclawlabs.ai). Obrigado pela paciência enquanto preparávamos o lançamento. Continuamos vendo tentativas de falsificação, então **não** participe de atividades de investimento ou arrecadação de fundos usando o nome ZeroClaw, a menos que sejam publicadas através dos nossos canais oficiais. | Use [este repositório](https://github.com/zeroclaw-labs/zeroclaw) como a única fonte de verdade. Siga [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Grupo)](https://www.facebook.com/groups/zeroclawlabs) e [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) para atualizações oficiais. | +| 2026-02-19 | _Importante_ | A Anthropic atualizou os termos de Autenticação e Uso de Credenciais em 2026-02-19. Os tokens OAuth do Claude Code (Free, Pro, Max) são destinados exclusivamente ao Claude Code e Claude.ai; usar tokens OAuth do Claude Free/Pro/Max em qualquer outro produto, ferramenta ou serviço (incluindo Agent SDK) não é permitido e pode violar os Termos de Serviço do Consumidor. | Por favor, evite temporariamente as integrações OAuth do Claude Code para prevenir perdas potenciais. Cláusula original: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Destaques + +- **Runtime leve por padrão** — fluxos de trabalho comuns de CLI e status rodam em poucos megabytes de memória em builds release. +- **Implantação econômica** — projetado para placas de $10 e instâncias pequenas na nuvem, sem dependências pesadas de runtime. +- **Cold start rápido** — runtime Rust com binário único mantém a inicialização de comandos e do daemon quase instantânea. +- **Arquitetura portável** — um binário para ARM, x86 e RISC-V com provedores/canais/ferramentas intercambiáveis. +- **Gateway local-first** — plano de controle único para sessões, canais, ferramentas, cron, SOPs e eventos. +- **Caixa de entrada multicanal** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket e mais. +- **Orquestração multi-agente (Hands)** — enxames de agentes autônomos que rodam por agendamento e ficam mais inteligentes com o tempo. +- **Procedimentos Operacionais Padrão (SOPs)** — automação de fluxos de trabalho orientada por eventos com MQTT, webhook, cron e gatilhos de periféricos. +- **Painel web** — interface web React 19 + Vite com chat em tempo real, navegador de memória, editor de configuração, gerenciador de cron e inspetor de ferramentas. +- **Periféricos de hardware** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO via trait `Peripheral`. +- **Ferramentas de primeira classe** — shell, E/S de arquivos, navegador, git, web fetch/search, MCP, Jira, Notion, Google Workspace e mais de 70 outras. +- **Hooks de ciclo de vida** — intercepte e modifique chamadas LLM, execuções de ferramentas e mensagens em cada estágio. +- **Plataforma de skills** — skills incluídos, comunitários e do workspace com auditoria de segurança. +- **Suporte a túneis** — Cloudflare, Tailscale, ngrok, OpenVPN e túneis personalizados para acesso remoto. + +### Por que equipes escolhem o ZeroClaw + +- **Leve por padrão:** binário Rust pequeno, inicialização rápida, baixo consumo de memória. +- **Seguro por design:** pareamento, sandboxing rigoroso, listas de permissão explícitas, escopo do workspace. +- **Totalmente intercambiável:** sistemas centrais são traits (provedores, canais, ferramentas, memória, túneis). +- **Sem vendor lock-in:** suporte a provedores compatíveis com OpenAI + endpoints personalizados plugáveis. + +## Resumo de benchmarks (ZeroClaw vs OpenClaw, reproduzível) + +Benchmark rápido em máquina local (macOS arm64, fev 2026) normalizado para hardware edge de 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Linguagem** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Inicialização (core 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Tamanho do binário** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Custo** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Qualquer hardware $10** | + +> Notas: Os resultados do ZeroClaw são medidos em builds release usando `/usr/bin/time -l`. O OpenClaw requer o runtime Node.js (tipicamente ~390MB de overhead adicional de memória), enquanto o NanoBot requer o runtime Python. PicoClaw e ZeroClaw são binários estáticos. Os valores de RAM acima são memória em runtime; os requisitos de compilação são maiores. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Medição local reproduzível + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Tudo o que construímos até agora + +### Plataforma central + +- Plano de controle Gateway HTTP/WS/SSE com sessões, presença, configuração, cron, webhooks, painel web e pareamento. +- Superfície CLI: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Loop de orquestração do agente com despacho de ferramentas, construção de prompts, classificação de mensagens e carregamento de memória. +- Modelo de sessão com aplicação de políticas de segurança, níveis de autonomia e aprovação condicional. +- Wrapper de provedor resiliente com failover, retry e roteamento de modelos em mais de 20 backends LLM. + +### Canais + +Canais: WhatsApp (nativo), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Habilitados por feature gate: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Painel web + +Painel web React 19 + Vite 6 + Tailwind CSS 4 servido diretamente pelo Gateway: + +- **Dashboard** — visão geral do sistema, status de saúde, uptime, rastreamento de custos +- **Chat do agente** — chat interativo com o agente +- **Memória** — navegar e gerenciar entradas de memória +- **Configuração** — visualizar e editar configuração +- **Cron** — gerenciar tarefas agendadas +- **Ferramentas** — navegar ferramentas disponíveis +- **Logs** — visualizar logs de atividade do agente +- **Custos** — uso de tokens e rastreamento de custos +- **Doctor** — diagnósticos de saúde do sistema +- **Integrações** — status e configuração de integrações +- **Pareamento** — gerenciamento de pareamento de dispositivos + +### Alvos de firmware + +| Alvo | Plataforma | Propósito | +|------|------------|-----------| +| ESP32 | Espressif ESP32 | Agente periférico sem fio | +| ESP32-UI | ESP32 + Display | Agente com interface visual | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Periférico industrial | +| Arduino | Arduino | Ponte básica de sensores/atuadores | +| Uno Q Bridge | Arduino Uno | Ponte serial para o agente | + +### Ferramentas + automação + +- **Core:** shell, leitura/escrita/edição de arquivos, operações git, busca glob, busca de conteúdo +- **Web:** controle de navegador, web fetch, web search, captura de tela, informação de imagem, leitura de PDF +- **Integrações:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + conjuntos de ferramentas deferidos +- **Agendamento:** cron add/remove/update/run, ferramenta de agendamento +- **Memória:** recall, store, forget, knowledge, project intel +- **Avançado:** delegate (agente para agente), swarm, troca/roteamento de modelos, operações de segurança, operações na nuvem +- **Hardware:** board info, memory map, memory read (habilitado por feature gate) + +### Runtime + segurança + +- **Níveis de autonomia:** ReadOnly, Supervised (padrão), Full. +- **Sandboxing:** isolamento do workspace, bloqueio de traversal de caminhos, listas de comandos permitidos, caminhos proibidos, Landlock (Linux), Bubblewrap. +- **Limitação de taxa:** máximo de ações por hora, máximo de custo por dia (configurável). +- **Aprovação condicional:** aprovação interativa para operações de risco médio/alto. +- **Parada de emergência:** capacidade de desligamento de emergência. +- **129+ testes de segurança** em CI automatizado. + +### Operações + empacotamento + +- Painel web servido diretamente pelo Gateway. +- Suporte a túneis: Cloudflare, Tailscale, ngrok, OpenVPN, comando personalizado. +- Adaptador de runtime Docker para execução em contêineres. +- CI/CD: beta (automático no push) → stable (dispatch manual) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Binários pré-construídos para Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Configuração + +`~/.zeroclaw/config.toml` mínimo: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Referência completa de configuração: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Configuração de canais + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Configuração de túneis + +```toml +[tunnel] +kind = "cloudflare" # ou "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Detalhes: [Referência de canais](docs/reference/api/channels-reference.md) · [Referência de configuração](docs/reference/api/config-reference.md) + +### Suporte de runtime (atual) + +- **`native`** (padrão) — execução direta de processos, caminho mais rápido, ideal para ambientes confiáveis. +- **`docker`** — isolamento completo em contêineres, políticas de segurança forçadas, requer Docker. + +Defina `runtime.kind = "docker"` para sandboxing rigoroso ou isolamento de rede. + +## Autenticação por assinatura (OpenAI Codex / Claude Code / Gemini) + +O ZeroClaw suporta perfis de autenticação nativos de assinatura (multi-conta, criptografados em repouso). + +- Arquivo de armazenamento: `~/.zeroclaw/auth-profiles.json` +- Chave de criptografia: `~/.zeroclaw/.secret_key` +- Formato de id do perfil: `:` (exemplo: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (assinatura ChatGPT) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Verificar / atualizar / trocar perfil +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Executar o agente com autenticação por assinatura +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Workspace do agente + skills + +Raiz do workspace: `~/.zeroclaw/workspace/` (configurável via config). + +Arquivos de prompt injetados: +- `IDENTITY.md` — personalidade e papel do agente +- `USER.md` — contexto e preferências do usuário +- `MEMORY.md` — fatos e lições de longo prazo +- `AGENTS.md` — convenções de sessão e regras de inicialização +- `SOUL.md` — identidade central e princípios operacionais + +Skills: `~/.zeroclaw/workspace/skills//SKILL.md` ou `SKILL.toml`. + +```bash +# Listar skills instalados +zeroclaw skills list + +# Instalar do git +zeroclaw skills install https://github.com/user/my-skill.git + +# Auditoria de segurança antes de instalar +zeroclaw skills audit https://github.com/user/my-skill.git + +# Remover um skill +zeroclaw skills remove my-skill +``` + +## Comandos CLI + +```bash +# Gerenciamento do workspace +zeroclaw onboard # Assistente de configuração guiada +zeroclaw status # Mostrar status do daemon/agente +zeroclaw doctor # Executar diagnósticos do sistema + +# Gateway + daemon +zeroclaw gateway # Iniciar servidor gateway (127.0.0.1:42617) +zeroclaw daemon # Iniciar runtime autônomo completo + +# Agente +zeroclaw agent # Modo de chat interativo +zeroclaw agent -m "message" # Modo de mensagem única + +# Gerenciamento de serviços +zeroclaw service install # Instalar como serviço do SO (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Canais +zeroclaw channel list # Listar canais configurados +zeroclaw channel doctor # Verificar saúde dos canais +zeroclaw channel bind-telegram 123456789 + +# Cron + agendamento +zeroclaw cron list # Listar trabalhos agendados +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memória +zeroclaw memory list # Listar entradas de memória +zeroclaw memory get # Recuperar uma memória +zeroclaw memory stats # Estatísticas de memória + +# Perfis de autenticação +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Periféricos de hardware +zeroclaw hardware discover # Escanear dispositivos conectados +zeroclaw peripheral list # Listar periféricos conectados +zeroclaw peripheral flash # Flashear firmware no dispositivo + +# Migração +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Completação de shell +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Referência completa de comandos: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Pré-requisitos + +
+Windows + +#### Obrigatório + +1. **Visual Studio Build Tools** (fornece o linker MSVC e o SDK do Windows): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Durante a instalação (ou pelo Visual Studio Installer), selecione a carga de trabalho **"Desenvolvimento para desktop com C++"**. + +2. **Toolchain do Rust:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Após a instalação, abra um novo terminal e execute `rustup default stable` para garantir que o toolchain estável esteja ativo. + +3. **Verifique** que ambos estão funcionando: + ```powershell + rustc --version + cargo --version + ``` + +#### Opcional + +- **Docker Desktop** — necessário apenas se usar o [runtime sandbox com Docker](#suporte-de-runtime-atual) (`runtime.kind = "docker"`). Instale via `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Obrigatório + +1. **Ferramentas de compilação essenciais:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Instale o Xcode Command Line Tools: `xcode-select --install` + +2. **Toolchain do Rust:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Veja [rustup.rs](https://rustup.rs) para detalhes. + +3. **Verifique** que ambos estão funcionando: + ```bash + rustc --version + cargo --version + ``` + +#### Instalador em uma linha + +Ou pule os passos acima e instale tudo (dependências do sistema, Rust, ZeroClaw) em um único comando: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Requisitos de recursos para compilação + +Compilar a partir do código-fonte precisa de mais recursos do que executar o binário resultante: + +| Recurso | Mínimo | Recomendado | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Disco livre**| 6 GB | 10 GB+ | + +Se seu host está abaixo do mínimo, use binários pré-construídos: + +```bash +./install.sh --prefer-prebuilt +``` + +Para exigir instalação somente de binários sem compilação de fallback: + +```bash +./install.sh --prebuilt-only +``` + +#### Opcional + +- **Docker** — necessário apenas se usar o [runtime sandbox com Docker](#suporte-de-runtime-atual) (`runtime.kind = "docker"`). Instale via seu gerenciador de pacotes ou [docker.com](https://docs.docker.com/engine/install/). + +> **Nota:** O `cargo build --release` padrão usa `codegen-units=1` para reduzir a pressão máxima de compilação. Para builds mais rápidos em máquinas potentes, use `cargo build --profile release-fast`. + +
+ + + +### Binários pré-construídos + +Os assets de release são publicados para: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Baixe os últimos assets em: + + +## Documentação + +Use estes recursos quando tiver passado pelo fluxo de onboarding e quiser a referência mais aprofundada. + +- Comece com o [índice de docs](docs/README.md) para navegação e "o que está onde." +- Leia a [visão geral da arquitetura](docs/architecture.md) para o modelo completo do sistema. +- Use a [referência de configuração](docs/reference/api/config-reference.md) quando precisar de cada chave e exemplo. +- Execute o Gateway conforme o livro com o [runbook operacional](docs/ops/operations-runbook.md). +- Siga o [ZeroClaw Onboard](#início-rápido) para uma configuração guiada. +- Depure falhas comuns com o [guia de solução de problemas](docs/ops/troubleshooting.md). +- Revise a [orientação de segurança](docs/security/README.md) antes de expor qualquer coisa. + +### Documentação de referência + +- Hub de documentação: [docs/README.md](docs/README.md) +- TOC unificado de docs: [docs/SUMMARY.md](docs/SUMMARY.md) +- Referência de comandos: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Referência de configuração: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Referência de provedores: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Referência de canais: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Runbook operacional: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Solução de problemas: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Documentação de colaboração + +- Guia de contribuição: [CONTRIBUTING.md](CONTRIBUTING.md) +- Política de fluxo de trabalho de PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Guia de fluxo de trabalho CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Manual do revisor: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Política de divulgação de segurança: [SECURITY.md](SECURITY.md) +- Template de documentação: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Implantação + operações + +- Guia de implantação em rede: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Manual de agente proxy: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Guias de hardware: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +O ZeroClaw foi construído para o caranguejo suave 🦀, um assistente de IA rápido e eficiente. Construído por Argenis De La Rosa e a comunidade. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Apoie o ZeroClaw + +Se o ZeroClaw ajuda no seu trabalho e você quer apoiar o desenvolvimento contínuo, pode doar aqui: + +Buy Me a Coffee + +### 🙏 Agradecimentos especiais + +Um sincero agradecimento às comunidades e instituições que inspiram e impulsionam este trabalho de código aberto: + +- **Harvard University** — por fomentar a curiosidade intelectual e empurrar os limites do possível. +- **MIT** — por defender o conhecimento aberto, o código aberto e a crença de que a tecnologia deve ser acessível a todos. +- **Sundai Club** — pela comunidade, a energia e o impulso incansável de construir coisas que importam. +- **O Mundo e Além** 🌍✨ — a cada contribuidor, sonhador e construtor que faz do código aberto uma força para o bem. Isto é para você. + +Estamos construindo abertamente porque as melhores ideias vêm de todos os lugares. Se você está lendo isto, faz parte disso. Bem-vindo. 🦀❤️ + +## Contribuir + +Novo no ZeroClaw? Procure issues rotulados como [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — veja nosso [Guia de contribuição](CONTRIBUTING.md#first-time-contributors) para saber como começar. PRs com IA/vibe-coded são bem-vindos! 🤖 + +Veja [CONTRIBUTING.md](CONTRIBUTING.md) e [CLA.md](docs/contributing/cla.md). Implemente um trait, envie um PR: + +- Guia de fluxo de trabalho CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Novo `Provider` → `src/providers/` +- Novo `Channel` → `src/channels/` +- Novo `Observer` → `src/observability/` +- Novo `Tool` → `src/tools/` +- Novo `Memory` → `src/memory/` +- Novo `Tunnel` → `src/tunnel/` +- Novo `Peripheral` → `src/peripherals/` +- Novo `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Repositório oficial e aviso de falsificação + +**Este é o único repositório oficial do ZeroClaw:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Qualquer outro repositório, organização, domínio ou pacote que afirme ser "ZeroClaw" ou implique afiliação com ZeroClaw Labs **não é autorizado e não é afiliado a este projeto**. Forks não autorizados conhecidos serão listados em [TRADEMARK.md](docs/maintainers/trademark.md). + +Se encontrar falsificação ou uso indevido de marca, por favor [abra um issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Licença + +O ZeroClaw tem licença dupla para máxima abertura e proteção dos contribuidores: + +| Licença | Caso de uso | +|---|---| +| [MIT](LICENSE-MIT) | Código aberto, pesquisa, acadêmico, uso pessoal | +| [Apache 2.0](LICENSE-APACHE) | Proteção de patentes, institucional, implantação comercial | + +Você pode escolher qualquer uma das licenças. **Os contribuidores automaticamente concedem direitos sob ambas** — veja [CLA.md](docs/contributing/cla.md) para o acordo completo de contribuidores. + +### Marca registrada + +O nome e logo do **ZeroClaw** são marcas registradas da ZeroClaw Labs. Esta licença não concede permissão para usá-los para implicar endosso ou afiliação. Veja [TRADEMARK.md](docs/maintainers/trademark.md) para usos permitidos e proibidos. + +### Proteções para contribuidores + +- Você **mantém o copyright** das suas contribuições +- **Concessão de patentes** (Apache 2.0) protege você de reclamações de patentes de outros contribuidores +- Suas contribuições são **permanentemente atribuídas** no histórico de commits e [NOTICE](NOTICE) +- Nenhum direito de marca registrada é transferido ao contribuir + +--- + +**ZeroClaw** — Zero overhead. Zero compromisso. Implante em qualquer lugar. Troque qualquer coisa. 🦀 + +## Contribuidores + + + ZeroClaw contributors + + +Esta lista é gerada a partir do gráfico de contribuidores do GitHub e é atualizada automaticamente. + +## Histórico de estrelas + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.ro.md b/third_party/zeroclaw/README.ro.md new file mode 100644 index 0000000..a8fe095 --- /dev/null +++ b/third_party/zeroclaw/README.ro.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Asistent AI Personal

+ +

+ Zero overhead. Zero compromisuri. 100% Rust. 100% Agnostic.
+ ⚡️ Rulează pe hardware de $10 cu <5MB RAM: Cu 99% mai puțină memorie decât OpenClaw și cu 98% mai ieftin decât un Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Construit de studenți și membri ai comunităților Harvard, MIT și Sundai.Club. +

+ +

+ 🌐 Limbi: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw este un asistent AI personal pe care îl rulezi pe propriile dispozitive. Îți răspunde pe canalele pe care le folosești deja (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work și altele). Are un panou web pentru control în timp real și se poate conecta la periferice hardware (ESP32, STM32, Arduino, Raspberry Pi). Gateway-ul este doar planul de control — produsul este asistentul. + +Dacă vrei un asistent personal, pentru un singur utilizator, care se simte local, rapid și mereu activ, acesta este. + +

+ Site web · + Documentație · + Arhitectură · + Începe · + Migrare de la OpenClaw · + Depanare · + Discord +

+ +> **Configurare recomandată:** rulează `zeroclaw onboard` în terminalul tău. ZeroClaw Onboard te ghidează pas cu pas prin configurarea gateway-ului, workspace-ului, canalelor și provider-ului. Este calea de configurare recomandată și funcționează pe macOS, Linux și Windows (prin WSL2). Instalare nouă? Începe aici: [Începe](#pornire-rapidă) + +### Autentificare prin abonament (OAuth) + +- **OpenAI Codex** (abonament ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (cheie API sau token de autentificare) + +Notă despre modele: deși sunt suportate multe provider-e/modele, pentru cea mai bună experiență folosește cel mai puternic model de ultimă generație disponibil. Vezi [Onboarding](#pornire-rapidă). + +Configurare modele + CLI: [Referință Providers](docs/reference/api/providers-reference.md) +Rotație profil de autentificare (OAuth vs chei API) + failover: [Failover model](docs/reference/api/providers-reference.md) + +## Instalare (recomandat) + +Runtime: Rust stable toolchain. Binar unic, fără dependențe de runtime. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Bootstrap cu un clic + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` rulează automat după instalare pentru a configura workspace-ul și provider-ul. + +## Pornire rapidă (TL;DR) + +Ghid complet pentru începători (autentificare, asociere, canale): [Începe](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Instalare + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Pornește gateway-ul (server webhook + panou web) +zeroclaw gateway # implicit: 127.0.0.1:42617 +zeroclaw gateway --port 0 # port aleatoriu (securitate îmbunătățită) + +# Vorbește cu asistentul +zeroclaw agent -m "Hello, ZeroClaw!" + +# Mod interactiv +zeroclaw agent + +# Pornește runtime-ul autonom complet (gateway + canale + cron + hands) +zeroclaw daemon + +# Verifică starea +zeroclaw status + +# Rulează diagnostice +zeroclaw doctor +``` + +Actualizezi? Rulează `zeroclaw doctor` după actualizare. + +### Din sursă (dezvoltare) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Alternativă dev (fără instalare globală):** prefixează comenzile cu `cargo run --release --` (exemplu: `cargo run --release -- status`). + +## Migrarea de la OpenClaw + +ZeroClaw poate importa workspace-ul, memoria și configurația OpenClaw: + +```bash +# Previzualizează ce va fi migrat (sigur, doar citire) +zeroclaw migrate openclaw --dry-run + +# Rulează migrarea +zeroclaw migrate openclaw +``` + +Aceasta migrează intrările de memorie, fișierele workspace și configurația din `~/.openclaw/` în `~/.zeroclaw/`. Configurația este convertită automat din JSON în TOML. + +## Setări implicite de securitate (acces DM) + +ZeroClaw se conectează la suprafețe de mesagerie reale. Tratează DM-urile primite ca intrare neîncredere. + +Ghid complet de securitate: [SECURITY.md](SECURITY.md) + +Comportament implicit pe toate canalele: + +- **Asociere DM** (implicit): expeditorii necunoscuți primesc un cod scurt de asociere și bot-ul nu procesează mesajul lor. +- Aprobă cu: `zeroclaw pairing approve ` (apoi expeditorul este adăugat pe o listă de permisiuni locală). +- DM-urile publice primite necesită un opt-in explicit în `config.toml`. +- Rulează `zeroclaw doctor` pentru a identifica politici DM riscante sau configurate greșit. + +**Niveluri de autonomie:** + +| Nivel | Comportament | +|-------|----------| +| `ReadOnly` | Agentul poate observa dar nu poate acționa | +| `Supervised` (implicit) | Agentul acționează cu aprobare pentru operațiuni de risc mediu/ridicat | +| `Full` | Agentul acționează autonom în limitele politicii | + +**Straturi de sandboxing:** izolarea workspace-ului, blocarea traversării căilor, liste de permisiuni pentru comenzi, căi interzise (`/etc`, `/root`, `~/.ssh`), limitare de rată (acțiuni maxime/oră, limite de cost/zi). + + + + +### 📢 Anunțuri + +Folosește acest panou pentru notificări importante (schimbări care rup compatibilitatea, avize de securitate, ferestre de mentenanță și blocaje de lansare). + +| Data (UTC) | Nivel | Notificare | Acțiune | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Critic_ | Nu suntem **afiliați** cu `openagen/zeroclaw`, `zeroclaw.org` sau `zeroclaw.net`. Domeniile `zeroclaw.org` și `zeroclaw.net` indică în prezent fork-ul `openagen/zeroclaw`, iar acel domeniu/depozit se dă drept site-ul/proiectul nostru oficial. | Nu aveți încredere în informații, binare, strângeri de fonduri sau anunțuri din acele surse. Folosiți doar [acest depozit](https://github.com/zeroclaw-labs/zeroclaw) și conturile noastre sociale verificate. | +| 2026-02-21 | _Important_ | Site-ul nostru oficial este acum activ: [zeroclawlabs.ai](https://zeroclawlabs.ai). Mulțumim pentru răbdare în timp ce pregăteam lansarea. Încă observăm tentative de uzurpare a identității, așa că **nu** vă alăturați activităților de investiții sau strângere de fonduri care revendică numele ZeroClaw, decât dacă sunt publicate prin canalele noastre oficiale. | Folosiți [acest depozit](https://github.com/zeroclaw-labs/zeroclaw) ca singura sursă de adevăr. Urmăriți [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs) și [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) pentru actualizări oficiale. | +| 2026-02-19 | _Important_ | Anthropic a actualizat termenii de Autentificare și Utilizare a Credențialelor pe 2026-02-19. Token-urile OAuth Claude Code (Free, Pro, Max) sunt destinate exclusiv Claude Code și Claude.ai; utilizarea token-urilor OAuth din Claude Free/Pro/Max în orice alt produs, instrument sau serviciu (inclusiv Agent SDK) nu este permisă și poate încălca Termenii Serviciului pentru Consumatori. | Vă rugăm să evitați temporar integrările OAuth Claude Code pentru a preveni pierderi potențiale. Clauza originală: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Puncte forte + +- **Runtime ușor implicit** — fluxurile comune CLI și de stare rulează într-un plic de memorie de câțiva megabytes pe build-urile de lansare. +- **Implementare eficientă din punct de vedere al costurilor** — proiectat pentru plăci de $10 și instanțe cloud mici, fără dependențe runtime grele. +- **Porniri la rece rapide** — runtime-ul Rust cu binar unic menține pornirea comenzilor și daemon-ului aproape instantanee. +- **Arhitectură portabilă** — un singur binar pe ARM, x86 și RISC-V cu provider-e/canale/instrumente interschimbabile. +- **Gateway local-first** — plan de control unic pentru sesiuni, canale, instrumente, cron, SOP-uri și evenimente. +- **Inbox multi-canal** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket și altele. +- **Orchestrare multi-agent (Hands)** — roiuri de agenți autonomi care rulează programat și devin mai inteligenți în timp. +- **Proceduri Operaționale Standard (SOP-uri)** — automatizare de fluxuri de lucru bazată pe evenimente cu MQTT, webhook, cron și declanșatoare periferice. +- **Panou Web** — UI web React 19 + Vite cu chat în timp real, browser de memorie, editor de configurare, manager cron și inspector de instrumente. +- **Periferice hardware** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO prin trait-ul `Peripheral`. +- **Instrumente de primă clasă** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace și 70+ altele. +- **Hook-uri de ciclu de viață** — interceptează și modifică apelurile LLM, execuțiile de instrumente și mesajele la fiecare etapă. +- **Platformă de skill-uri** — skill-uri incluse, comunitare și de workspace cu audit de securitate. +- **Suport tunnel** — Cloudflare, Tailscale, ngrok, OpenVPN și tuneluri personalizate pentru acces la distanță. + +### De ce echipele aleg ZeroClaw + +- **Ușor implicit:** binar Rust mic, pornire rapidă, amprentă de memorie redusă. +- **Sigur prin design:** asociere, sandboxing strict, liste de permisiuni explicite, limitarea workspace-ului. +- **Complet interschimbabil:** sistemele de bază sunt trait-uri (provider-e, canale, instrumente, memorie, tuneluri). +- **Fără lock-in:** suport provider compatibil OpenAI + endpoint-uri personalizate conectabile. + +## Instantaneu Benchmark (ZeroClaw vs OpenClaw, Reproductibil) + +Benchmark rapid pe mașină locală (macOS arm64, feb 2026) normalizat pentru hardware edge 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Limbaj** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Pornire (nucleu 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Dimensiune binar** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Cost** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Orice hardware $10** | + +> Note: Rezultatele ZeroClaw sunt măsurate pe build-uri de lansare folosind `/usr/bin/time -l`. OpenClaw necesită runtime Node.js (de obicei ~390MB overhead suplimentar de memorie), în timp ce NanoBot necesită runtime Python. PicoClaw și ZeroClaw sunt binare statice. Cifrele RAM de mai sus sunt memorie runtime; cerințele de compilare în timpul build-ului sunt mai mari. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Măsurare locală reproductibilă + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Tot ce am construit până acum + +### Platformă de bază + +- Plan de control HTTP/WS/SSE Gateway cu sesiuni, prezență, configurare, cron, webhook-uri, panou web și asociere. +- Suprafață CLI: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Buclă de orchestrare agent cu dispatch de instrumente, construcție de prompt, clasificare de mesaje și încărcare de memorie. +- Model de sesiune cu aplicarea politicii de securitate, niveluri de autonomie și aprobare condiționată. +- Wrapper provider rezilient cu failover, reîncercare și rutare de modele pe 20+ backend-uri LLM. + +### Canale + +Canale: WhatsApp (nativ), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Panou web + +Panou web React 19 + Vite 6 + Tailwind CSS 4 servit direct din Gateway: + +- **Dashboard** — prezentare generală a sistemului, stare de sănătate, uptime, urmărire costuri +- **Agent Chat** — chat interactiv cu agentul +- **Memory** — navighează și gestionează intrările de memorie +- **Config** — vizualizează și editează configurația +- **Cron** — gestionează sarcinile programate +- **Tools** — navighează instrumentele disponibile +- **Logs** — vizualizează jurnalele de activitate ale agentului +- **Cost** — utilizarea token-urilor și urmărirea costurilor +- **Doctor** — diagnostice de sănătate a sistemului +- **Integrations** — starea integrărilor și configurare +- **Pairing** — gestionarea asocierii dispozitivelor + +### Ținte firmware + +| Țintă | Platformă | Scop | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | Agent periferic wireless | +| ESP32-UI | ESP32 + Display | Agent cu interfață vizuală | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Periferic industrial | +| Arduino | Arduino | Punte senzor/actuator de bază | +| Uno Q Bridge | Arduino Uno | Punte serială către agent | + +### Instrumente + automatizare + +- **De bază:** shell, file read/write/edit, operații git, glob search, content search +- **Web:** browser control, web fetch, web search, screenshot, image info, PDF read +- **Integrări:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **Programare:** cron add/remove/update/run, schedule tool +- **Memorie:** recall, store, forget, knowledge, project intel +- **Avansat:** delegate (agent-la-agent), swarm, model switch/routing, security ops, cloud ops +- **Hardware:** board info, memory map, memory read (feature-gated) + +### Runtime + siguranță + +- **Niveluri de autonomie:** ReadOnly, Supervised (implicit), Full. +- **Sandboxing:** izolarea workspace-ului, blocarea traversării căilor, liste de permisiuni pentru comenzi, căi interzise, Landlock (Linux), Bubblewrap. +- **Limitare de rată:** acțiuni maxime pe oră, cost maxim pe zi (configurabil). +- **Aprobare condiționată:** aprobare interactivă pentru operațiuni de risc mediu/ridicat. +- **E-stop:** capacitate de oprire de urgență. +- **129+ teste de securitate** în CI automatizat. + +### Ops + împachetare + +- Panou web servit direct din Gateway. +- Suport tunnel: Cloudflare, Tailscale, ngrok, OpenVPN, comandă personalizată. +- Adaptor runtime Docker pentru execuție containerizată. +- CI/CD: beta (automat la push) → stable (dispatch manual) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Binare pre-construite pentru Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Configurare + +Minimal `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Referință completă de configurare: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Configurare canale + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Configurare tunnel + +```toml +[tunnel] +kind = "cloudflare" # sau "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Detalii: [Referință canale](docs/reference/api/channels-reference.md) · [Referință configurare](docs/reference/api/config-reference.md) + +### Suport runtime (curent) + +- **`native`** (implicit) — execuție directă a procesului, cea mai rapidă cale, ideală pentru medii de încredere. +- **`docker`** — izolare completă în container, politici de securitate aplicate, necesită Docker. + +Setează `runtime.kind = "docker"` pentru sandboxing strict sau izolare de rețea. + +## Autentificare prin abonament (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw suportă profiluri de autentificare native abonament (multi-cont, criptate în repaus). + +- Fișier de stocare: `~/.zeroclaw/auth-profiles.json` +- Cheie de criptare: `~/.zeroclaw/.secret_key` +- Format id profil: `:` (exemplu: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (abonament ChatGPT) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Verifică / reîmprospătează / schimbă profilul +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Rulează agentul cu autentificare prin abonament +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Workspace agent + skill-uri + +Rădăcina workspace: `~/.zeroclaw/workspace/` (configurabilă prin config). + +Fișiere prompt injectate: +- `IDENTITY.md` — personalitatea și rolul agentului +- `USER.md` — contextul și preferințele utilizatorului +- `MEMORY.md` — fapte și lecții pe termen lung +- `AGENTS.md` — convenții de sesiune și reguli de inițializare +- `SOUL.md` — identitate de bază și principii operaționale + +Skill-uri: `~/.zeroclaw/workspace/skills//SKILL.md` sau `SKILL.toml`. + +```bash +# Listează skill-urile instalate +zeroclaw skills list + +# Instalează din git +zeroclaw skills install https://github.com/user/my-skill.git + +# Audit de securitate înainte de instalare +zeroclaw skills audit https://github.com/user/my-skill.git + +# Elimină un skill +zeroclaw skills remove my-skill +``` + +## Comenzi CLI + +```bash +# Gestionarea workspace-ului +zeroclaw onboard # Asistent de configurare ghidată +zeroclaw status # Afișează starea daemon/agent +zeroclaw doctor # Rulează diagnostice de sistem + +# Gateway + daemon +zeroclaw gateway # Pornește serverul gateway (127.0.0.1:42617) +zeroclaw daemon # Pornește runtime-ul autonom complet + +# Agent +zeroclaw agent # Mod chat interactiv +zeroclaw agent -m "message" # Mod mesaj unic + +# Gestionarea serviciilor +zeroclaw service install # Instalează ca serviciu OS (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Canale +zeroclaw channel list # Listează canalele configurate +zeroclaw channel doctor # Verifică sănătatea canalelor +zeroclaw channel bind-telegram 123456789 + +# Cron + programare +zeroclaw cron list # Listează sarcinile programate +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memorie +zeroclaw memory list # Listează intrările de memorie +zeroclaw memory get # Recuperează o memorie +zeroclaw memory stats # Statistici memorie + +# Profiluri de autentificare +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Periferice hardware +zeroclaw hardware discover # Scanează dispozitivele conectate +zeroclaw peripheral list # Listează perifericele conectate +zeroclaw peripheral flash # Încarcă firmware pe dispozitiv + +# Migrare +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Completări shell +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Referință completă comenzi: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Cerințe preliminare + +
+Windows + +#### Necesare + +1. **Visual Studio Build Tools** (furnizează linker-ul MSVC și Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + În timpul instalării (sau prin Visual Studio Installer), selectează sarcina de lucru **"Desktop development with C++"**. + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + După instalare, deschide un terminal nou și rulează `rustup default stable` pentru a te asigura că toolchain-ul stabil este activ. + +3. **Verifică** că ambele funcționează: + ```powershell + rustc --version + cargo --version + ``` + +#### Opțional + +- **Docker Desktop** — necesar doar dacă folosești [runtime-ul Docker sandboxed](#suport-runtime-curent) (`runtime.kind = "docker"`). Instalează prin `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Necesare + +1. **Build essentials:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Instalează Xcode Command Line Tools: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Vezi [rustup.rs](https://rustup.rs) pentru detalii. + +3. **Verifică** că ambele funcționează: + ```bash + rustc --version + cargo --version + ``` + +#### Instalator cu o singură linie + +Sau sări peste pașii de mai sus și instalează totul (dependențe sistem, Rust, ZeroClaw) cu o singură comandă: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Cerințe de resurse pentru compilare + +Construirea din sursă necesită mai multe resurse decât rularea binarului rezultat: + +| Resursă | Minimum | Recomandat | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Disc liber** | 6 GB | 10 GB+ | + +Dacă gazda ta este sub minimum, folosește binare pre-construite: + +```bash +./install.sh --prefer-prebuilt +``` + +Pentru a impune instalare doar cu binar, fără fallback sursă: + +```bash +./install.sh --prebuilt-only +``` + +#### Opțional + +- **Docker** — necesar doar dacă folosești [runtime-ul Docker sandboxed](#suport-runtime-curent) (`runtime.kind = "docker"`). Instalează prin managerul de pachete sau [docker.com](https://docs.docker.com/engine/install/). + +> **Notă:** `cargo build --release` implicit folosește `codegen-units=1` pentru a reduce presiunea maximă de compilare. Pentru build-uri mai rapide pe mașini puternice, folosește `cargo build --profile release-fast`. + +
+ + + +### Binare pre-construite + +Resursele de lansare sunt publicate pentru: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Descarcă cele mai recente resurse de la: + + +## Documentație + +Folosește-le când ai trecut de fluxul de onboarding și vrei referința mai detaliată. + +- Începe cu [indexul documentației](docs/README.md) pentru navigare și „ce este unde." +- Citește [prezentarea arhitecturii](docs/architecture.md) pentru modelul complet al sistemului. +- Folosește [referința de configurare](docs/reference/api/config-reference.md) când ai nevoie de fiecare cheie și exemplu. +- Rulează Gateway-ul conform [runbook-ului operațional](docs/ops/operations-runbook.md). +- Urmează [ZeroClaw Onboard](#pornire-rapidă) pentru configurare ghidată. +- Depanează eșecurile comune cu [ghidul de depanare](docs/ops/troubleshooting.md). +- Revizuiește [ghidul de securitate](docs/security/README.md) înainte de a expune ceva. + +### Documentație de referință + +- Hub documentație: [docs/README.md](docs/README.md) +- TOC documentație unificată: [docs/SUMMARY.md](docs/SUMMARY.md) +- Referință comenzi: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Referință configurare: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Referință providers: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Referință canale: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Runbook operațional: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Depanare: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Documentație de colaborare + +- Ghid de contribuție: [CONTRIBUTING.md](CONTRIBUTING.md) +- Politica fluxului de lucru PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Ghid flux de lucru CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Playbook recenzent: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Politica de divulgare a securității: [SECURITY.md](SECURITY.md) +- Șablon documentație: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Implementare + operațiuni + +- Ghid de implementare în rețea: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Playbook proxy agent: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Ghiduri hardware: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw a fost construit pentru smooth crab 🦀, un asistent AI rapid și eficient. Construit de Argenis De La Rosa și comunitate. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Susține ZeroClaw + +Dacă ZeroClaw te ajută în muncă și vrei să susții dezvoltarea continuă, poți dona aici: + +Buy Me a Coffee + +### 🙏 Mulțumiri Speciale + +Mulțumiri sincere comunităților și instituțiilor care inspiră și alimentează această muncă open-source: + +- **Harvard University** — pentru cultivarea curiozității intelectuale și extinderea limitelor posibilului. +- **MIT** — pentru promovarea cunoștințelor deschise, open source și credința că tehnologia ar trebui să fie accesibilă tuturor. +- **Sundai Club** — pentru comunitate, energie și dorința neîncetată de a construi lucruri care contează. +- **Lumea și Dincolo** 🌍✨ — fiecărui contributor, visător și constructor care face din open source o forță a binelui. Aceasta este pentru voi. + +Construim deschis pentru că cele mai bune idei vin de peste tot. Dacă citești asta, faci parte din asta. Bine ai venit. 🦀❤️ + +## Contribuție + +Nou la ZeroClaw? Caută probleme etichetate [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — vezi [Ghidul de Contribuție](CONTRIBUTING.md#first-time-contributors) pentru cum să începi. PR-urile create cu AI/vibe-coded sunt binevenite! 🤖 + +Vezi [CONTRIBUTING.md](CONTRIBUTING.md) și [CLA.md](docs/contributing/cla.md). Implementează un trait, trimite un PR: + +- Ghid flux de lucru CI: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- `Provider` nou → `src/providers/` +- `Channel` nou → `src/channels/` +- `Observer` nou → `src/observability/` +- `Tool` nou → `src/tools/` +- `Memory` nou → `src/memory/` +- `Tunnel` nou → `src/tunnel/` +- `Peripheral` nou → `src/peripherals/` +- `Skill` nou → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Depozit Oficial & Avertisment de Uzurpare + +**Acesta este singurul depozit oficial ZeroClaw:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Orice alt depozit, organizație, domeniu sau pachet care pretinde a fi „ZeroClaw" sau implică afiliere cu ZeroClaw Labs este **neautorizat și nu este afiliat cu acest proiect**. Fork-urile neautorizate cunoscute vor fi listate în [TRADEMARK.md](docs/maintainers/trademark.md). + +Dacă întâmpini uzurpare de identitate sau utilizare abuzivă a mărcii comerciale, te rugăm [deschide o problemă](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Licență + +ZeroClaw este dual-licențiat pentru deschidere maximă și protecția contributorilor: + +| Licență | Caz de utilizare | +|---|---| +| [MIT](LICENSE-MIT) | Open-source, cercetare, academic, utilizare personală | +| [Apache 2.0](LICENSE-APACHE) | Protecție brevete, instituțional, implementare comercială | + +Poți alege oricare licență. **Contributorii acordă automat drepturi sub ambele** — vezi [CLA.md](docs/contributing/cla.md) pentru acordul complet al contributorului. + +### Marcă comercială + +Numele și logo-ul **ZeroClaw** sunt mărci comerciale ale ZeroClaw Labs. Această licență nu acordă permisiunea de a le folosi pentru a implica aprobare sau afiliere. Vezi [TRADEMARK.md](docs/maintainers/trademark.md) pentru utilizări permise și interzise. + +### Protecții pentru contributori + +- **Păstrezi drepturile de autor** ale contribuțiilor tale +- **Acordarea de brevete** (Apache 2.0) te protejează de revendicări de brevete ale altor contributori +- Contribuțiile tale sunt **atribuite permanent** în istoricul commit-urilor și [NOTICE](NOTICE) +- Nu se transferă drepturi de marcă comercială prin contribuție + +--- + +**ZeroClaw** — Zero overhead. Zero compromisuri. Implementează oriunde. Schimbă orice. 🦀 + +## Contributori + + + ZeroClaw contributors + + +Această listă este generată din graficul contributorilor GitHub și se actualizează automat. + +## Istoricul Stelelor + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.ru.md b/third_party/zeroclaw/README.ru.md new file mode 100644 index 0000000..6e55731 --- /dev/null +++ b/third_party/zeroclaw/README.ru.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Персональный ИИ-ассистент

+ +

+ Нулевые накладные расходы. Нулевые компромиссы. 100% Rust. 100% Агностик.
+ ⚡️ Работает на оборудовании за $10 с <5МБ ОЗУ: это на 99% меньше памяти, чем OpenClaw, и на 98% дешевле Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Создано студентами и участниками сообществ Harvard, MIT и Sundai.Club. +

+ +

+ 🌐 Языки: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw — это персональный ИИ-ассистент, который вы запускаете на своих устройствах. Он отвечает вам в каналах, которые вы уже используете (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work и другие). У него есть веб-панель для управления в реальном времени, и он может подключаться к аппаратным периферийным устройствам (ESP32, STM32, Arduino, Raspberry Pi). Gateway — это просто панель управления, а продукт — это ассистент. + +Если вам нужен персональный однопользовательский ассистент, который ощущается локальным, быстрым и всегда включённым — это он. + +

+ Веб-сайт · + Документация · + Архитектура · + Начало работы · + Миграция с OpenClaw · + Устранение неполадок · + Discord +

+ +> **Рекомендуемая настройка:** выполните `zeroclaw onboard` в терминале. ZeroClaw Onboard пошагово проведёт вас через настройку gateway, рабочего пространства, каналов и провайдера. Это рекомендуемый путь настройки, работающий на macOS, Linux и Windows (через WSL2). Новая установка? Начните здесь: [Начало работы](#быстрый-старт) + +### Аутентификация по подписке (OAuth) + +- **OpenAI Codex** (подписка ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (API-ключ или токен аутентификации) + +Примечание о моделях: хотя поддерживается множество провайдеров/моделей, для лучшего опыта используйте самую мощную модель последнего поколения, доступную вам. См. [Онбординг](#быстрый-старт). + +Конфигурация моделей + CLI: [Справочник провайдеров](docs/reference/api/providers-reference.md) +Ротация профилей аутентификации (OAuth vs API-ключи) + переключение при сбое: [Переключение моделей при сбое](docs/reference/api/providers-reference.md) + +## Установка (рекомендуется) + +Среда выполнения: стабильный набор инструментов Rust. Один бинарный файл, без зависимостей времени выполнения. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Установка в один клик + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` запускается автоматически после установки для настройки рабочего пространства и провайдера. + +## Быстрый старт (TL;DR) + +Полное руководство для начинающих (аутентификация, сопряжение, каналы): [Начало работы](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Install + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Start the gateway (webhook server + web dashboard) +zeroclaw gateway # default: 127.0.0.1:42617 +zeroclaw gateway --port 0 # random port (security hardened) + +# Talk to the assistant +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interactive mode +zeroclaw agent + +# Start full autonomous runtime (gateway + channels + cron + hands) +zeroclaw daemon + +# Check status +zeroclaw status + +# Run diagnostics +zeroclaw doctor +``` + +Обновляетесь? Выполните `zeroclaw doctor` после обновления. + +### Из исходного кода (для разработки) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Альтернатива для разработки (без глобальной установки):** добавляйте перед командами `cargo run --release --` (пример: `cargo run --release -- status`). + +## Миграция с OpenClaw + +ZeroClaw может импортировать ваше рабочее пространство, память и конфигурацию OpenClaw: + +```bash +# Preview what will be migrated (safe, read-only) +zeroclaw migrate openclaw --dry-run + +# Run the migration +zeroclaw migrate openclaw +``` + +Это переносит ваши записи памяти, файлы рабочего пространства и конфигурацию из `~/.openclaw/` в `~/.zeroclaw/`. Конфигурация автоматически конвертируется из JSON в TOML. + +## Настройки безопасности по умолчанию (доступ через ЛС) + +ZeroClaw подключается к реальным поверхностям обмена сообщениями. Относитесь к входящим ЛС как к ненадёжному вводу. + +Полное руководство по безопасности: [SECURITY.md](SECURITY.md) + +Поведение по умолчанию на всех каналах: + +- **Сопряжение ЛС** (по умолчанию): неизвестные отправители получают короткий код сопряжения, и бот не обрабатывает их сообщение. +- Одобрение через: `zeroclaw pairing approve ` (затем отправитель добавляется в локальный список разрешённых). +- Публичные входящие ЛС требуют явного включения в `config.toml`. +- Выполните `zeroclaw doctor` для выявления рискованных или неправильно настроенных политик ЛС. + +**Уровни автономности:** + +| Уровень | Поведение | +|---------|-----------| +| `ReadOnly` | Агент может наблюдать, но не действовать | +| `Supervised` (по умолчанию) | Агент действует с одобрением для операций среднего/высокого риска | +| `Full` | Агент действует автономно в рамках политики | + +**Слои изоляции:** изоляция рабочего пространства, блокировка обхода путей, списки разрешённых команд, запрещённые пути (`/etc`, `/root`, `~/.ssh`), ограничение частоты (макс. действий/час, лимиты стоимости/день). + + + + +### 📢 Объявления + +Используйте эту доску для важных уведомлений (критические изменения, рекомендации по безопасности, окна обслуживания и блокеры релизов). + +| Дата (UTC) | Уровень | Уведомление | Действие | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Критический_ | Мы **не связаны** с `openagen/zeroclaw`, `zeroclaw.org` или `zeroclaw.net`. Домены `zeroclaw.org` и `zeroclaw.net` в настоящее время указывают на форк `openagen/zeroclaw`, и этот домен/репозиторий выдают себя за наш официальный сайт/проект. | Не доверяйте информации, бинарным файлам, сбору средств или объявлениям из этих источников. Используйте только [этот репозиторий](https://github.com/zeroclaw-labs/zeroclaw) и наши верифицированные аккаунты в социальных сетях. | +| 2026-02-21 | _Важный_ | Наш официальный сайт теперь доступен: [zeroclawlabs.ai](https://zeroclawlabs.ai). Спасибо за терпение, пока мы готовили запуск. Мы по-прежнему видим попытки имитации, поэтому **не** присоединяйтесь к каким-либо инвестиционным или фандрайзинговым активностям, использующим имя ZeroClaw, если они не опубликованы через наши официальные каналы. | Используйте [этот репозиторий](https://github.com/zeroclaw-labs/zeroclaw) как единственный источник истины. Следите за обновлениями в [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs) и [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/). | +| 2026-02-19 | _Важный_ | Anthropic обновила условия Authentication and Credential Use 2026-02-19. Токены Claude Code OAuth (Free, Pro, Max) предназначены исключительно для Claude Code и Claude.ai; использование токенов OAuth от Claude Free/Pro/Max в любом другом продукте, инструменте или сервисе (включая Agent SDK) не разрешено и может нарушать Условия обслуживания потребителей. | Пожалуйста, временно избегайте интеграций Claude Code OAuth для предотвращения потенциальных потерь. Оригинальный пункт: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Основные возможности + +- **Лёгкая среда выполнения по умолчанию** — типичные CLI и статусные рабочие процессы выполняются в оболочке памяти в несколько мегабайт на релизных сборках. +- **Экономичное развёртывание** — разработан для плат за $10 и небольших облачных инстансов, без тяжёлых зависимостей среды выполнения. +- **Быстрый холодный старт** — однобинарная среда выполнения Rust обеспечивает почти мгновенный запуск команд и демона. +- **Портативная архитектура** — один бинарный файл для ARM, x86 и RISC-V с заменяемыми провайдерами/каналами/инструментами. +- **Локальный Gateway** — единая панель управления для сессий, каналов, инструментов, cron, SOP и событий. +- **Многоканальный почтовый ящик** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket и другие. +- **Многоагентная оркестрация (Hands)** — автономные рои агентов, работающие по расписанию и становящиеся умнее со временем. +- **Стандартные операционные процедуры (SOPs)** — событийная автоматизация рабочих процессов с MQTT, webhook, cron и триггерами периферийных устройств. +- **Веб-панель** — веб-интерфейс React 19 + Vite с чатом в реальном времени, браузером памяти, редактором конфигурации, менеджером cron и инспектором инструментов. +- **Аппаратные периферийные устройства** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO через трейт `Peripheral`. +- **Первоклассные инструменты** — shell, файловый I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace и 70+ других. +- **Хуки жизненного цикла** — перехват и модификация вызовов LLM, выполнения инструментов и сообщений на каждом этапе. +- **Платформа навыков** — встроенные, общественные и навыки рабочего пространства с аудитом безопасности. +- **Поддержка туннелей** — Cloudflare, Tailscale, ngrok, OpenVPN и пользовательские туннели для удалённого доступа. + +### Почему команды выбирают ZeroClaw + +- **Лёгкий по умолчанию:** маленький бинарный файл Rust, быстрый запуск, малый объём памяти. +- **Безопасный по дизайну:** сопряжение, строгая изоляция, явные списки разрешений, области рабочего пространства. +- **Полностью заменяемый:** основные системы — это трейты (провайдеры, каналы, инструменты, память, туннели). +- **Без привязки к вендору:** поддержка провайдеров, совместимых с OpenAI + подключаемые пользовательские эндпоинты. + +## Снимок бенчмарков (ZeroClaw vs OpenClaw, воспроизводимый) + +Быстрый бенчмарк на локальной машине (macOS arm64, февраль 2026), нормализованный для edge-оборудования на 0.8 ГГц. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Язык** | TypeScript | Python | Go | **Rust** | +| **ОЗУ** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Запуск (ядро 0.8 ГГц)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Размер бинарного файла** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Стоимость** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Любое оборудование $10** | + +> Примечания: результаты ZeroClaw измерены на релизных сборках с использованием `/usr/bin/time -l`. OpenClaw требует среду выполнения Node.js (обычно ~390 МБ дополнительных накладных расходов памяти), а NanoBot требует среду выполнения Python. PicoClaw и ZeroClaw — статические бинарные файлы. Показатели ОЗУ выше — это память времени выполнения; требования к компиляции при сборке выше. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Воспроизводимое локальное измерение + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Всё, что мы построили + +### Основная платформа + +- Gateway HTTP/WS/SSE панель управления с сессиями, присутствием, конфигурацией, cron, вебхуками, веб-панелью и сопряжением. +- CLI поверхность: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Цикл оркестрации агента с диспетчеризацией инструментов, построением промптов, классификацией сообщений и загрузкой памяти. +- Модель сессий с применением политики безопасности, уровнями автономности и шлюзом одобрения. +- Устойчивая обёртка провайдера с переключением при сбое, повторными попытками и маршрутизацией моделей через 20+ бэкендов LLM. + +### Каналы + +Каналы: WhatsApp (нативный), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +За feature-флагами: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Веб-панель + +Веб-панель React 19 + Vite 6 + Tailwind CSS 4, подаваемая непосредственно из Gateway: + +- **Панель управления** — обзор системы, состояние здоровья, время безотказной работы, отслеживание стоимости +- **Чат с агентом** — интерактивный чат с агентом +- **Память** — просмотр и управление записями памяти +- **Конфигурация** — просмотр и редактирование конфигурации +- **Cron** — управление запланированными задачами +- **Инструменты** — просмотр доступных инструментов +- **Логи** — просмотр журналов активности агента +- **Стоимость** — использование токенов и отслеживание стоимости +- **Доктор** — диагностика здоровья системы +- **Интеграции** — статус интеграций и настройка +- **Сопряжение** — управление сопряжением устройств + +### Целевые прошивки + +| Цель | Платформа | Назначение | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | Беспроводной периферийный агент | +| ESP32-UI | ESP32 + Display | Агент с визуальным интерфейсом | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Промышленное периферийное устройство | +| Arduino | Arduino | Базовый мост датчик/актуатор | +| Uno Q Bridge | Arduino Uno | Последовательный мост к агенту | + +### Инструменты + автоматизация + +- **Основные:** shell, чтение/запись/редактирование файлов, операции git, поиск glob, поиск по содержимому +- **Веб:** управление браузером, web fetch, web search, скриншоты, информация об изображении, чтение PDF +- **Интеграции:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** обёртка инструментов Model Context Protocol + отложенные наборы инструментов +- **Планирование:** cron add/remove/update/run, инструмент расписания +- **Память:** recall, store, forget, knowledge, project intel +- **Продвинутые:** delegate (агент-агенту), swarm, переключение/маршрутизация моделей, операции безопасности, облачные операции +- **Оборудование:** информация о плате, карта памяти, чтение памяти (за feature-флагом) + +### Среда выполнения + безопасность + +- **Уровни автономности:** ReadOnly, Supervised (по умолчанию), Full. +- **Изоляция:** изоляция рабочего пространства, блокировка обхода путей, списки разрешённых команд, запрещённые пути, Landlock (Linux), Bubblewrap. +- **Ограничение частоты:** макс. действий в час, макс. стоимость в день (настраиваемые). +- **Шлюз одобрения:** интерактивное одобрение для операций среднего/высокого риска. +- **Аварийная остановка:** возможность экстренного отключения. +- **129+ тестов безопасности** в автоматизированном CI. + +### Операции + упаковка + +- Веб-панель подаётся непосредственно из Gateway. +- Поддержка туннелей: Cloudflare, Tailscale, ngrok, OpenVPN, пользовательская команда. +- Docker-адаптер среды выполнения для контейнеризованного выполнения. +- CI/CD: бета (авто при push) → стабильный (ручной запуск) → Docker, crates.io, Scoop, AUR, Homebrew, твит. +- Предсобранные бинарные файлы для Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Конфигурация + +Минимальный `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Полный справочник конфигурации: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Конфигурация каналов + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Конфигурация туннелей + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Подробности: [Справочник каналов](docs/reference/api/channels-reference.md) · [Справочник конфигурации](docs/reference/api/config-reference.md) + +### Поддержка среды выполнения (текущая) + +- **`native`** (по умолчанию) — прямое выполнение процесса, самый быстрый путь, идеально для доверенных сред. +- **`docker`** — полная контейнерная изоляция, принудительные политики безопасности, требуется Docker. + +Установите `runtime.kind = "docker"` для строгой изоляции или сетевой изоляции. + +## Аутентификация по подписке (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw поддерживает нативные профили аутентификации по подписке (мультиаккаунт, шифрование в состоянии покоя). + +- Файл хранилища: `~/.zeroclaw/auth-profiles.json` +- Ключ шифрования: `~/.zeroclaw/.secret_key` +- Формат id профиля: `:` (пример: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT subscription) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Check / refresh / switch profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Run the agent with subscription auth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Рабочее пространство агента + навыки + +Корень рабочего пространства: `~/.zeroclaw/workspace/` (настраивается через конфигурацию). + +Внедряемые файлы промптов: +- `IDENTITY.md` — личность и роль агента +- `USER.md` — контекст и предпочтения пользователя +- `MEMORY.md` — долгосрочные факты и уроки +- `AGENTS.md` — соглашения сессий и правила инициализации +- `SOUL.md` — основная идентичность и принципы работы + +Навыки: `~/.zeroclaw/workspace/skills//SKILL.md` или `SKILL.toml`. + +```bash +# List installed skills +zeroclaw skills list + +# Install from git +zeroclaw skills install https://github.com/user/my-skill.git + +# Security audit before install +zeroclaw skills audit https://github.com/user/my-skill.git + +# Remove a skill +zeroclaw skills remove my-skill +``` + +## Команды CLI + +```bash +# Workspace management +zeroclaw onboard # Guided setup wizard +zeroclaw status # Show daemon/agent status +zeroclaw doctor # Run system diagnostics + +# Gateway + daemon +zeroclaw gateway # Start gateway server (127.0.0.1:42617) +zeroclaw daemon # Start full autonomous runtime + +# Agent +zeroclaw agent # Interactive chat mode +zeroclaw agent -m "message" # Single message mode + +# Service management +zeroclaw service install # Install as OS service (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Channels +zeroclaw channel list # List configured channels +zeroclaw channel doctor # Check channel health +zeroclaw channel bind-telegram 123456789 + +# Cron + scheduling +zeroclaw cron list # List scheduled jobs +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memory +zeroclaw memory list # List memory entries +zeroclaw memory get # Retrieve a memory +zeroclaw memory stats # Memory statistics + +# Auth profiles +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardware peripherals +zeroclaw hardware discover # Scan for connected devices +zeroclaw peripheral list # List connected peripherals +zeroclaw peripheral flash # Flash firmware to device + +# Migration +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell completions +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Полный справочник команд: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Предварительные требования + +
+Windows + +#### Обязательные + +1. **Visual Studio Build Tools** (предоставляет линкер MSVC и Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Во время установки (или через Visual Studio Installer) выберите рабочую нагрузку **"Desktop development with C++"**. + +2. **Набор инструментов Rust:** + + ```powershell + winget install Rustlang.Rustup + ``` + + После установки откройте новый терминал и выполните `rustup default stable`, чтобы убедиться, что стабильный набор инструментов активен. + +3. **Проверьте**, что оба работают: + ```powershell + rustc --version + cargo --version + ``` + +#### Необязательные + +- **Docker Desktop** — требуется только при использовании [изолированной среды выполнения Docker](#поддержка-среды-выполнения-текущая) (`runtime.kind = "docker"`). Установите через `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Обязательные + +1. **Средства сборки:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Установите Xcode Command Line Tools: `xcode-select --install` + +2. **Набор инструментов Rust:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Подробности на [rustup.rs](https://rustup.rs). + +3. **Проверьте**, что оба работают: + ```bash + rustc --version + cargo --version + ``` + +#### Однострочный установщик + +Или пропустите шаги выше и установите всё (системные зависимости, Rust, ZeroClaw) одной командой: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Требования к ресурсам для компиляции + +Сборка из исходного кода требует больше ресурсов, чем запуск результирующего бинарного файла: + +| Ресурс | Минимум | Рекомендуемый | +| -------------- | ------- | ----------- | +| **ОЗУ + swap** | 2 GB | 4 GB+ | +| **Свободное место на диске** | 6 GB | 10 GB+ | + +Если ваш хост ниже минимума, используйте предсобранные бинарные файлы: + +```bash +./install.sh --prefer-prebuilt +``` + +Чтобы требовать установку только бинарного файла без сборки из исходников: + +```bash +./install.sh --prebuilt-only +``` + +#### Необязательные + +- **Docker** — требуется только при использовании [изолированной среды выполнения Docker](#поддержка-среды-выполнения-текущая) (`runtime.kind = "docker"`). Установите через менеджер пакетов или [docker.com](https://docs.docker.com/engine/install/). + +> **Примечание:** По умолчанию `cargo build --release` использует `codegen-units=1` для снижения пиковой нагрузки при компиляции. Для более быстрой сборки на мощных машинах используйте `cargo build --profile release-fast`. + +
+ + + +### Предсобранные бинарные файлы + +Артефакты релизов публикуются для: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Скачайте последние артефакты: + + +## Документация + +Используйте это, когда вы прошли онбординг и хотите более глубокий справочник. + +- Начните с [индекса документации](docs/README.md) для навигации и «что где». +- Прочитайте [обзор архитектуры](docs/architecture.md) для полной модели системы. +- Используйте [справочник конфигурации](docs/reference/api/config-reference.md), когда вам нужен каждый ключ и пример. +- Управляйте Gateway по инструкции с [операционным руководством](docs/ops/operations-runbook.md). +- Следуйте [ZeroClaw Onboard](#быстрый-старт) для управляемой настройки. +- Устраняйте типичные сбои с помощью [руководства по устранению неполадок](docs/ops/troubleshooting.md). +- Ознакомьтесь с [руководством по безопасности](docs/security/README.md) перед открытием чего-либо. + +### Справочная документация + +- Хаб документации: [docs/README.md](docs/README.md) +- Единое оглавление: [docs/SUMMARY.md](docs/SUMMARY.md) +- Справочник команд: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Справочник конфигурации: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Справочник провайдеров: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Справочник каналов: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Операционное руководство: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Устранение неполадок: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Документация по сотрудничеству + +- Руководство по участию: [CONTRIBUTING.md](CONTRIBUTING.md) +- Политика рабочего процесса PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Руководство по CI-процессу: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Руководство рецензента: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Политика раскрытия уязвимостей: [SECURITY.md](SECURITY.md) +- Шаблон документации: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Развёртывание + операции + +- Руководство по сетевому развёртыванию: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Руководство по прокси-агенту: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Руководства по оборудованию: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw был создан для smooth crab 🦀 — быстрого и эффективного ИИ-ассистента. Создан Argenis De La Rosa и сообществом. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Поддержите ZeroClaw + +Если ZeroClaw помогает вашей работе и вы хотите поддержать дальнейшую разработку, вы можете пожертвовать здесь: + +Buy Me a Coffee + +### 🙏 Особая благодарность + +Сердечная благодарность сообществам и институтам, которые вдохновляют и питают эту работу с открытым исходным кодом: + +- **Harvard University** — за развитие интеллектуального любопытства и расширение границ возможного. +- **MIT** — за продвижение открытых знаний, открытого кода и веры в то, что технологии должны быть доступны каждому. +- **Sundai Club** — за сообщество, энергию и неустанное стремление создавать вещи, которые имеют значение. +- **Мир и далее** 🌍✨ — каждому участнику, мечтателю и создателю, делающему открытый код силой добра. Это для вас. + +Мы строим открыто, потому что лучшие идеи приходят отовсюду. Если вы это читаете, вы часть этого. Добро пожаловать. 🦀❤️ + +## Участие + +Новичок в ZeroClaw? Ищите задачи с меткой [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — см. наше [Руководство по участию](CONTRIBUTING.md#first-time-contributors) для начала. AI/vibe-coded PR приветствуются! 🤖 + +См. [CONTRIBUTING.md](CONTRIBUTING.md) и [CLA.md](docs/contributing/cla.md). Реализуйте трейт, отправьте PR: + +- Руководство по CI-процессу: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Новый `Provider` → `src/providers/` +- Новый `Channel` → `src/channels/` +- Новый `Observer` → `src/observability/` +- Новый `Tool` → `src/tools/` +- Новый `Memory` → `src/memory/` +- Новый `Tunnel` → `src/tunnel/` +- Новый `Peripheral` → `src/peripherals/` +- Новый `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Официальный репозиторий и предупреждение об имитации + +**Это единственный официальный репозиторий ZeroClaw:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Любой другой репозиторий, организация, домен или пакет, претендующий на звание «ZeroClaw» или подразумевающий связь с ZeroClaw Labs, является **неавторизованным и не связанным с этим проектом**. Известные неавторизованные форки будут перечислены в [TRADEMARK.md](docs/maintainers/trademark.md). + +Если вы столкнётесь с имитацией или неправомерным использованием товарного знака, пожалуйста, [откройте issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Лицензия + +ZeroClaw распространяется под двойной лицензией для максимальной открытости и защиты участников: + +| Лицензия | Случай использования | +|---|---| +| [MIT](LICENSE-MIT) | Открытый код, исследования, академическое, личное использование | +| [Apache 2.0](LICENSE-APACHE) | Патентная защита, институциональное, коммерческое развёртывание | + +Вы можете выбрать любую лицензию. **Участники автоматически предоставляют права по обеим** — см. [CLA.md](docs/contributing/cla.md) для полного соглашения участника. + +### Товарный знак + +Название и логотип **ZeroClaw** являются товарными знаками ZeroClaw Labs. Эта лицензия не предоставляет разрешения на их использование для подразумевания одобрения или принадлежности. См. [TRADEMARK.md](docs/maintainers/trademark.md) для разрешённых и запрещённых использований. + +### Защита участников + +- Вы **сохраняете авторские права** на свои вклады +- **Патентное предоставление** (Apache 2.0) защищает вас от патентных претензий других участников +- Ваши вклады **постоянно атрибутированы** в истории коммитов и [NOTICE](NOTICE) +- Никакие права на товарный знак не передаются при участии + +--- + +**ZeroClaw** — Нулевые накладные расходы. Нулевые компромиссы. Развёртывайте где угодно. Заменяйте что угодно. 🦀 + +## Участники + + + ZeroClaw contributors + + +Этот список генерируется из графа участников GitHub и обновляется автоматически. + +## История звёзд + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.sv.md b/third_party/zeroclaw/README.sv.md new file mode 100644 index 0000000..839d46f --- /dev/null +++ b/third_party/zeroclaw/README.sv.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Personlig AI-assistent

+ +

+ Noll overhead. Noll kompromiss. 100% Rust. 100% Agnostisk.
+ ⚡️ Körs på $10-hårdvara med <5MB RAM: Det är 99% mindre minne än OpenClaw och 98% billigare än en Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Byggt av studenter och medlemmar i Harvard-, MIT- och Sundai.Club-gemenskaperna. +

+ +

+ 🌐 Språk: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw är en personlig AI-assistent som du kör på dina egna enheter. Den svarar dig via de kanaler du redan använder (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work med flera). Den har en webbpanel för realtidskontroll och kan ansluta till hårdvaruperiferienheter (ESP32, STM32, Arduino, Raspberry Pi). Gateway är bara kontrollplanet — produkten är assistenten. + +Om du vill ha en personlig, enanvändarassistent som känns lokal, snabb och alltid tillgänglig, är det här lösningen. + +

+ Webbplats · + Dokumentation · + Arkitektur · + Kom igång · + Migrera från OpenClaw · + Felsökning · + Discord +

+ +> **Rekommenderad konfiguration:** kör `zeroclaw onboard` i din terminal. ZeroClaw Onboard guidar dig steg för steg genom att konfigurera gateway, arbetsyta, kanaler och leverantör. Det är den rekommenderade installationsvägen och fungerar på macOS, Linux och Windows (via WSL2). Ny installation? Börja här: [Kom igång](#snabbstart) + +### Prenumerationsautentisering (OAuth) + +- **OpenAI Codex** (ChatGPT-prenumeration) +- **Gemini** (Google OAuth) +- **Anthropic** (API-nyckel eller autentiseringstoken) + +Modellnotering: även om många leverantörer/modeller stöds, använd den starkaste senaste generationens modell som är tillgänglig för dig för bästa upplevelse. Se [Onboarding](#snabbstart). + +Modellkonfiguration + CLI: [Leverantörsreferens](docs/reference/api/providers-reference.md) +Autentiseringsprofil-rotation (OAuth vs API-nycklar) + failover: [Modell-failover](docs/reference/api/providers-reference.md) + +## Installation (rekommenderad) + +Körmiljö: Rust stable toolchain. Enda binär, inga körtidsberoenden. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Ett-klicks-installation + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` körs automatiskt efter installationen för att konfigurera din arbetsyta och leverantör. + +## Snabbstart + +Fullständig nybörjarguide (autentisering, parkoppling, kanaler): [Kom igång](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Installera + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Starta gateway (webhook-server + webbpanel) +zeroclaw gateway # standard: 127.0.0.1:42617 +zeroclaw gateway --port 0 # slumpmässig port (säkerhetshärdad) + +# Prata med assistenten +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interaktivt läge +zeroclaw agent + +# Starta full autonom körmiljö (gateway + kanaler + cron + hands) +zeroclaw daemon + +# Kontrollera status +zeroclaw status + +# Kör diagnostik +zeroclaw doctor +``` + +Uppgraderar du? Kör `zeroclaw doctor` efter uppdatering. + +### Från källkod (utveckling) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Utvecklar-fallback (ingen global installation):** prefixera kommandon med `cargo run --release --` (exempel: `cargo run --release -- status`). + +## Migrera från OpenClaw + +ZeroClaw kan importera din OpenClaw-arbetsyta, minne och konfiguration: + +```bash +# Förhandsgranska vad som migreras (säkert, skrivskyddat) +zeroclaw migrate openclaw --dry-run + +# Kör migreringen +zeroclaw migrate openclaw +``` + +Detta migrerar dina minnesposter, arbetsytefiler och konfiguration från `~/.openclaw/` till `~/.zeroclaw/`. Konfiguration konverteras automatiskt från JSON till TOML. + +## Säkerhetsstandarder (DM-åtkomst) + +ZeroClaw ansluter till riktiga meddelandeytor. Behandla inkommande DM som opålitlig indata. + +Fullständig säkerhetsguide: [SECURITY.md](SECURITY.md) + +Standardbeteende på alla kanaler: + +- **DM-parkoppling** (standard): okända avsändare får en kort parkopplingskod och boten behandlar inte deras meddelande. +- Godkänn med: `zeroclaw pairing approve ` (sedan läggs avsändaren till i en lokal tillåtlista). +- Offentliga inkommande DM kräver ett explicit opt-in i `config.toml`. +- Kör `zeroclaw doctor` för att hitta riskfyllda eller felkonfigurerade DM-policyer. + +**Autonominivåer:** + +| Nivå | Beteende | +|------|----------| +| `ReadOnly` | Agenten kan observera men inte agera | +| `Supervised` (standard) | Agenten agerar med godkännande för medel-/högriskoperationer | +| `Full` | Agenten agerar autonomt inom policygränser | + +**Sandboxlager:** arbetsyteisolering, sökvägstraversblockering, kommandotillåtlistor, förbjudna sökvägar (`/etc`, `/root`, `~/.ssh`), hastighetsbegränsning (max åtgärder/timme, kostnad/dag-gränser). + + + + +### 📢 Meddelanden + +Använd denna tavla för viktiga meddelanden (brytande ändringar, säkerhetsrådgivningar, underhållsfönster och releaseblockerare). + +| Datum (UTC) | Nivå | Meddelande | Åtgärd | +| ----------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Kritisk_ | Vi är **inte affilierade** med `openagen/zeroclaw`, `zeroclaw.org` eller `zeroclaw.net`. Domänerna `zeroclaw.org` och `zeroclaw.net` pekar för närvarande till `openagen/zeroclaw`-forken, och den domänen/repositoryt utger sig för att vara vår officiella webbplats/projekt. | Lita inte på information, binärer, insamlingar eller meddelanden från dessa källor. Använd bara [detta repository](https://github.com/zeroclaw-labs/zeroclaw) och våra verifierade sociala konton. | +| 2026-02-21 | _Viktigt_ | Vår officiella webbplats är nu live: [zeroclawlabs.ai](https://zeroclawlabs.ai). Tack för ert tålamod medan vi förberedde lanseringen. Vi ser fortfarande imitationsförsök, så **gå inte** med i några investerings- eller insamlingsaktiviteter som hävdar ZeroClaw-namnet om de inte publicerats via våra officiella kanaler. | Använd [detta repository](https://github.com/zeroclaw-labs/zeroclaw) som enda sanningskälla. Följ [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Grupp)](https://www.facebook.com/groups/zeroclawlabs) och [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) för officiella uppdateringar. | +| 2026-02-19 | _Viktigt_ | Anthropic uppdaterade villkoren för autentisering och inloggningsanvändning 2026-02-19. Claude Code OAuth-tokens (Free, Pro, Max) är avsedda uteslutande för Claude Code och Claude.ai; att använda OAuth-tokens från Claude Free/Pro/Max i någon annan produkt, verktyg eller tjänst (inklusive Agent SDK) är inte tillåtet och kan bryta mot Consumer Terms of Service. | Undvik tillfälligt Claude Code OAuth-integrationer för att förhindra potentiell förlust. Originalklausul: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Höjdpunkter + +- **Lean körmiljö som standard** — vanliga CLI- och statusarbetsflöden körs i ett fåmegabyte-minnesutrymme på release-byggen. +- **Kostnadseffektiv distribution** — designad för $10-kort och små molninstanser, inga tunga körtidsberoenden. +- **Snabba kallstarter** — enkel binär Rust-körmiljö håller kommando- och daemon-uppstart nära ögonblicklig. +- **Portabel arkitektur** — en binär över ARM, x86 och RISC-V med utbytbara providers/channels/tools. +- **Lokal-först Gateway** — enda kontrollplan för sessioner, kanaler, verktyg, cron, SOP:er och händelser. +- **Multikanalinkorg** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket med flera. +- **Multiagentorkestrering (Hands)** — autonoma agentsvärmar som körs på schema och blir smartare med tiden. +- **Standardoperationsprocedurer (SOPs)** — händelsedriven arbetsflödesautomatisering med MQTT, webhook, cron och periferiutlösare. +- **Webbpanel** — React 19 + Vite webb-UI med realtidschatt, minnesutforskare, konfigurationsredigerare, cron-hanterare och verktygsinspektor. +- **Hårdvaruperiferienheter** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO via `Peripheral`-traiten. +- **Förstklassiga verktyg** — shell, fil-I/O, webbläsare, git, web fetch/search, MCP, Jira, Notion, Google Workspace och 70+ fler. +- **Livscykelkrokar** — fånga upp och modifiera LLM-anrop, verktygsexekveringar och meddelanden i varje steg. +- **Färdighetsplattform** — medföljande, community- och arbetsytefärdigheter med säkerhetsgranskning. +- **Tunnelstöd** — Cloudflare, Tailscale, ngrok, OpenVPN och anpassade tunnlar för fjärråtkomst. + +### Varför team väljer ZeroClaw + +- **Lean som standard:** liten Rust-binär, snabb start, lågt minnesavtryck. +- **Säker från grunden:** parkoppling, strikt sandboxning, explicita tillåtlistor, arbetsyteavgränsning. +- **Fullt utbytbar:** kärnssystem är traits (providers, channels, tools, memory, tunnels). +- **Inget leverantörslås:** OpenAI-kompatibelt leverantörsstöd + pluggbara anpassade endpoints. + +## Benchmarkögonblicksbild (ZeroClaw vs OpenClaw, Reproducerbar) + +Lokal maskin-snabbtest (macOS arm64, feb 2026) normaliserat för 0.8GHz edge-hårdvara. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Språk** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Uppstart (0.8GHz kärna)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Binärstorlek** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Kostnad** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Vilken hårdvara som helst $10** | + +> Noteringar: ZeroClaw-resultat mäts på release-byggen med `/usr/bin/time -l`. OpenClaw kräver Node.js-körmiljö (typiskt ~390MB extra minnesoverhead), medan NanoBot kräver Python-körmiljö. PicoClaw och ZeroClaw är statiska binärer. RAM-siffrorna ovan är körtidsminne; kompileringskrav vid byggtid är högre. + +

+ ZeroClaw vs OpenClaw jämförelse +

+ +### Reproducerbar lokal mätning + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Allt vi byggt hittills + +### Kärnplattform + +- Gateway HTTP/WS/SSE-kontrollplan med sessioner, närvaro, konfiguration, cron, webhooks, webbpanel och parkoppling. +- CLI-yta: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Agentorkestreringsloop med verktygsdistribution, promptkonstruktion, meddelandeklassificering och minnesinläsning. +- Sessionsmodell med säkerhetspolicyefterlevnad, autonominivåer och godkännandeportar. +- Motståndskraftig leverantörswrapper med failover, retry och modellroutning över 20+ LLM-backends. + +### Kanaler + +Kanaler: WhatsApp (nativ), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Funktionsgated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Webbpanel + +React 19 + Vite 6 + Tailwind CSS 4 webbpanel serverad direkt från Gateway: + +- **Dashboard** — systemöversikt, hälsostatus, drifttid, kostnadsspårning +- **Agentchatt** — interaktiv chatt med agenten +- **Minne** — bläddra och hantera minnesposter +- **Konfiguration** — visa och redigera konfiguration +- **Cron** — hantera schemalagda uppgifter +- **Verktyg** — bläddra tillgängliga verktyg +- **Loggar** — visa agentaktivitetsloggar +- **Kostnad** — tokenanvändning och kostnadsspårning +- **Doktor** — systemhälsodiagnostik +- **Integrationer** — integrationsstatus och konfiguration +- **Parkoppling** — hantering av enhetsparkoppling + +### Firmware-mål + +| Mål | Plattform | Syfte | +|-----|-----------|-------| +| ESP32 | Espressif ESP32 | Trådlös periferienhetagent | +| ESP32-UI | ESP32 + Display | Agent med visuellt gränssnitt | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Industriell periferienhet | +| Arduino | Arduino | Grundläggande sensor-/aktuatorbrygga | +| Uno Q Bridge | Arduino Uno | Seriell brygga till agent | + +### Verktyg + automatisering + +- **Kärna:** shell, filläsning/skrivning/redigering, git-operationer, glob-sökning, innehållssökning +- **Webb:** webbläsarkontroll, web fetch, webbsökning, skärmdump, bildinformation, PDF-läsning +- **Integrationer:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol-verktygs-wrapper + uppskjutna verktygsuppsättningar +- **Schemaläggning:** cron add/remove/update/run, schemaverktyg +- **Minne:** recall, store, forget, knowledge, project intel +- **Avancerat:** delegate (agent-till-agent), swarm, modellväxling/routing, säkerhetsoperationer, molnoperationer +- **Hårdvara:** board info, memory map, memory read (funktionsgated) + +### Körmiljö + säkerhet + +- **Autonominivåer:** ReadOnly, Supervised (standard), Full. +- **Sandboxning:** arbetsyteisolering, sökvägstraversblockering, kommandotillåtlistor, förbjudna sökvägar, Landlock (Linux), Bubblewrap. +- **Hastighetsbegränsning:** max åtgärder per timme, max kostnad per dag (konfigurerbart). +- **Godkännandeportar:** interaktivt godkännande för medel-/högriskoperationer. +- **E-stopp:** nödavstängningskapacitet. +- **129+ säkerhetstester** i automatiserad CI. + +### Drift + paketering + +- Webbpanel serverad direkt från Gateway. +- Tunnelstöd: Cloudflare, Tailscale, ngrok, OpenVPN, anpassat kommando. +- Docker-körmiljöadapter för containeriserad exekvering. +- CI/CD: beta (automatiskt vid push) → stable (manuell dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Förbyggda binärer för Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Konfiguration + +Minimal `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Fullständig konfigurationsreferens: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Kanalkonfiguration + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Tunnelkonfiguration + +```toml +[tunnel] +kind = "cloudflare" # eller "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Detaljer: [Kanalreferens](docs/reference/api/channels-reference.md) · [Konfigurationsreferens](docs/reference/api/config-reference.md) + +### Körmiljöstöd (nuvarande) + +- **`native`** (standard) — direkt processexekvering, snabbaste vägen, idealisk för betrodda miljöer. +- **`docker`** — full containerisolering, tvingade säkerhetspolicyer, kräver Docker. + +Ställ in `runtime.kind = "docker"` för strikt sandboxning eller nätverksisolering. + +## Prenumerationsautentisering (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw stöder prenumerationsnativa autentiseringsprofiler (multikonto, krypterat i vila). + +- Lagringsfil: `~/.zeroclaw/auth-profiles.json` +- Krypteringsnyckel: `~/.zeroclaw/.secret_key` +- Profil-ID-format: `:` (exempel: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT-prenumeration) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Kontrollera / uppdatera / byt profil +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Kör agenten med prenumerationsautentisering +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Agentarbetsyta + färdigheter + +Arbetsyterot: `~/.zeroclaw/workspace/` (konfigurerbart via config). + +Injicerade promptfiler: +- `IDENTITY.md` — agentpersonlighet och roll +- `USER.md` — användarkontext och preferenser +- `MEMORY.md` — långtidsfakta och lärdomar +- `AGENTS.md` — sessionskonventioner och initieringsregler +- `SOUL.md` — kärnidentitet och operationsprinciper + +Färdigheter: `~/.zeroclaw/workspace/skills//SKILL.md` eller `SKILL.toml`. + +```bash +# Lista installerade färdigheter +zeroclaw skills list + +# Installera från git +zeroclaw skills install https://github.com/user/my-skill.git + +# Säkerhetsgranskning före installation +zeroclaw skills audit https://github.com/user/my-skill.git + +# Ta bort en färdighet +zeroclaw skills remove my-skill +``` + +## CLI-kommandon + +```bash +# Arbetsytehantering +zeroclaw onboard # Guidad installationsguide +zeroclaw status # Visa daemon-/agentstatus +zeroclaw doctor # Kör systemdiagnostik + +# Gateway + daemon +zeroclaw gateway # Starta gateway-server (127.0.0.1:42617) +zeroclaw daemon # Starta full autonom körmiljö + +# Agent +zeroclaw agent # Interaktivt chattläge +zeroclaw agent -m "message" # Enstaka meddelandeläge + +# Tjänstehantering +zeroclaw service install # Installera som OS-tjänst (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Kanaler +zeroclaw channel list # Lista konfigurerade kanaler +zeroclaw channel doctor # Kontrollera kanalhälsa +zeroclaw channel bind-telegram 123456789 + +# Cron + schemaläggning +zeroclaw cron list # Lista schemalagda jobb +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Minne +zeroclaw memory list # Lista minnesposter +zeroclaw memory get # Hämta ett minne +zeroclaw memory stats # Minnesstatistik + +# Autentiseringsprofiler +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hårdvaruperiferienheter +zeroclaw hardware discover # Sök efter anslutna enheter +zeroclaw peripheral list # Lista anslutna periferienheter +zeroclaw peripheral flash # Flasha firmware till enhet + +# Migrering +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell-kompletteringar +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Fullständig kommandoreferens: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Förutsättningar + +
+Windows + +#### Obligatoriskt + +1. **Visual Studio Build Tools** (tillhandahåller MSVC-länkaren och Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Under installationen (eller via Visual Studio Installer), välj arbetsbelastningen **"Desktop development with C++"**. + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Efter installationen, öppna en ny terminal och kör `rustup default stable` för att säkerställa att stable-toolchainen är aktiv. + +3. **Verifiera** att båda fungerar: + ```powershell + rustc --version + cargo --version + ``` + +#### Valfritt + +- **Docker Desktop** — krävs bara om du använder [Docker sandboxad körmiljö](#körmiljöstöd-nuvarande) (`runtime.kind = "docker"`). Installera via `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Obligatoriskt + +1. **Byggverktyg:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Installera Xcode Command Line Tools: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Se [rustup.rs](https://rustup.rs) för detaljer. + +3. **Verifiera** att båda fungerar: + ```bash + rustc --version + cargo --version + ``` + +#### Enradsinstallerare + +Eller hoppa över stegen ovan och installera allt (systemberoenden, Rust, ZeroClaw) med ett enda kommando: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Kompileringsresurskrav + +Att bygga från källkod kräver mer resurser än att köra den resulterande binären: + +| Resurs | Minimum | Rekommenderat | +| -------------- | ------- | ------------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Ledigt disk**| 6 GB | 10 GB+ | + +Om din värd ligger under minimum, använd förbyggda binärer: + +```bash +./install.sh --prefer-prebuilt +``` + +För att kräva enbart binärinstallation utan källkods-fallback: + +```bash +./install.sh --prebuilt-only +``` + +#### Valfritt + +- **Docker** — krävs bara om du använder [Docker sandboxad körmiljö](#körmiljöstöd-nuvarande) (`runtime.kind = "docker"`). Installera via din pakethanterare eller [docker.com](https://docs.docker.com/engine/install/). + +> **Notering:** Standard `cargo build --release` använder `codegen-units=1` för att minska toppkompileringstrycket. För snabbare byggen på kraftfulla maskiner, använd `cargo build --profile release-fast`. + +
+ + + +### Förbyggda binärer + +Release-tillgångar publiceras för: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Ladda ner de senaste tillgångarna från: + + +## Dokumentation + +Använd dessa när du är förbi onboarding-flödet och vill ha den djupare referensen. + +- Börja med [dokumentationsindexet](docs/README.md) för navigering och "vad finns var." +- Läs [arkitekturöversikten](docs/architecture.md) för den fullständiga systemmodellen. +- Använd [konfigurationsreferensen](docs/reference/api/config-reference.md) när du behöver varje nyckel och exempel. +- Kör Gateway enligt boken med [operationsrunbook](docs/ops/operations-runbook.md). +- Följ [ZeroClaw Onboard](#snabbstart) för en guidad installation. +- Felsök vanliga problem med [felsökningsguiden](docs/ops/troubleshooting.md). +- Granska [säkerhetsvägledning](docs/security/README.md) innan du exponerar något. + +### Referensdokumentation + +- Dokumentationshubb: [docs/README.md](docs/README.md) +- Enhetlig dokumentations-TOC: [docs/SUMMARY.md](docs/SUMMARY.md) +- Kommandoreferens: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Konfigurationsreferens: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Leverantörsreferens: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Kanalreferens: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Operationsrunbook: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Felsökning: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Samarbetsdokumentation + +- Bidragsguide: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR-arbetsflödespolicy: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI-arbetsflödesguide: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Granskningsplaybook: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Säkerhetsutlämnandepolicy: [SECURITY.md](SECURITY.md) +- Dokumentationsmall: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Distribution + drift + +- Nätverksdistributionsguide: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Proxy-agentplaybook: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Hårdvaruguider: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw byggdes för smooth crab 🦀, en snabb och effektiv AI-assistent. Byggd av Argenis De La Rosa och gemenskapen. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Stöd ZeroClaw + +Om ZeroClaw hjälper ditt arbete och du vill stödja pågående utveckling kan du donera här: + +Buy Me a Coffee + +### 🙏 Särskilt tack + +Ett hjärtligt tack till de gemenskaper och institutioner som inspirerar och driver detta open source-arbete: + +- **Harvard University** — för att främja intellektuell nyfikenhet och tänja gränserna för vad som är möjligt. +- **MIT** — för att försvara öppen kunskap, öppen källkod och tron att teknologi bör vara tillgänglig för alla. +- **Sundai Club** — för gemenskapen, energin och den outtröttliga driften att bygga saker som spelar roll. +- **Världen & bortom** 🌍✨ — till varje bidragsgivare, drömmare och byggare där ute som gör öppen källkod till en kraft för gott. Det här är för er. + +Vi bygger öppet eftersom de bästa idéerna kommer från överallt. Om du läser detta är du en del av det. Välkommen. 🦀❤️ + +## Bidra + +Ny till ZeroClaw? Leta efter ärenden märkta [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — se vår [Bidragsguide](CONTRIBUTING.md#first-time-contributors) för hur du kommer igång. AI/vibe-kodade PR:er är välkomna! 🤖 + +Se [CONTRIBUTING.md](CONTRIBUTING.md) och [CLA.md](docs/contributing/cla.md). Implementera en trait, skicka in en PR: + +- CI-arbetsflödesguide: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Ny `Provider` → `src/providers/` +- Ny `Channel` → `src/channels/` +- Ny `Observer` → `src/observability/` +- Nytt `Tool` → `src/tools/` +- Nytt `Memory` → `src/memory/` +- Ny `Tunnel` → `src/tunnel/` +- Ny `Peripheral` → `src/peripherals/` +- Ny `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Officiellt repository & varning för imitation + +**Detta är det enda officiella ZeroClaw-repositoryt:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Alla andra repositorier, organisationer, domäner eller paket som hävdar att vara "ZeroClaw" eller antyder anslutning till ZeroClaw Labs är **obehöriga och inte affilierade med detta projekt**. Kända obehöriga forkar listas i [TRADEMARK.md](docs/maintainers/trademark.md). + +Om du stöter på imitation eller varumärkesmissbruk, vänligen [öppna ett ärende](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Licens + +ZeroClaw är dubbellicensierat för maximal öppenhet och bidragsgivarskydd: + +| Licens | Användningsfall | +|--------|-----------------| +| [MIT](LICENSE-MIT) | Öppen källkod, forskning, akademiskt, personligt bruk | +| [Apache 2.0](LICENSE-APACHE) | Patentskydd, institutionell, kommersiell distribution | + +Du kan välja endera licens. **Bidragsgivare beviljar automatiskt rättigheter under båda** — se [CLA.md](docs/contributing/cla.md) för det fullständiga bidragsgivaravtalet. + +### Varumärke + +**ZeroClaw**-namnet och logotypen är varumärken som tillhör ZeroClaw Labs. Denna licens beviljar inte tillstånd att använda dem för att antyda stöd eller anslutning. Se [TRADEMARK.md](docs/maintainers/trademark.md) för tillåtna och förbjudna användningar. + +### Bidragsgivarskydd + +- Du **behåller upphovsrätten** till dina bidrag +- **Patentbeviljande** (Apache 2.0) skyddar dig från patentkrav från andra bidragsgivare +- Dina bidrag är **permanent tillskrivna** i commit-historik och [NOTICE](NOTICE) +- Inga varumärkesrättigheter överförs genom att bidra + +--- + +**ZeroClaw** — Noll overhead. Noll kompromiss. Distribuera var som helst. Byt ut vad som helst. 🦀 + +## Bidragsgivare + + + ZeroClaw-bidragsgivare + + +Denna lista genereras från GitHub-bidragsgivargrafen och uppdateras automatiskt. + +## Stjärnhistorik + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.th.md b/third_party/zeroclaw/README.th.md new file mode 100644 index 0000000..97f84e8 --- /dev/null +++ b/third_party/zeroclaw/README.th.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — ผู้ช่วย AI ส่วนตัว

+ +

+ ไม่มีโอเวอร์เฮด ไม่มีการประนีประนอม 100% Rust 100% ไม่ผูกมัด
+ ⚡️ ทำงานบนฮาร์ดแวร์ $10 ด้วย RAM <5MB: นั่นคือหน่วยความจำน้อยกว่า OpenClaw 99% และราคาถูกกว่า Mac mini 98%! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+สร้างโดยนักศึกษาและสมาชิกจากชุมชน Harvard, MIT, และ Sundai.Club +

+ +

+ 🌐 ภาษา: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw คือผู้ช่วย AI ส่วนตัวที่คุณรันบนอุปกรณ์ของคุณเอง มันตอบคุณผ่านช่องทางที่คุณใช้อยู่แล้ว (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work และอื่นๆ) มีแดชบอร์ดเว็บสำหรับการควบคุมแบบเรียลไทม์และสามารถเชื่อมต่อกับอุปกรณ์ต่อพ่วง (ESP32, STM32, Arduino, Raspberry Pi) Gateway เป็นเพียง control plane — ผลิตภัณฑ์คือผู้ช่วย + +หากคุณต้องการผู้ช่วยส่วนตัว ผู้ใช้คนเดียว ที่รู้สึกเหมือนอยู่ในเครื่อง เร็ว และพร้อมใช้งานตลอดเวลา นี่คือมัน + +

+ เว็บไซต์ · + เอกสาร · + สถาปัตยกรรม · + เริ่มต้นใช้งาน · + ย้ายจาก OpenClaw · + แก้ไขปัญหา · + Discord +

+ +> **การตั้งค่าที่แนะนำ:** รัน `zeroclaw onboard` ในเทอร์มินัลของคุณ ZeroClaw Onboard จะแนะนำคุณทีละขั้นตอนในการตั้งค่า gateway, workspace, ช่องทาง และ provider เป็นเส้นทางการตั้งค่าที่แนะนำและใช้งานได้บน macOS, Linux และ Windows (ผ่าน WSL2) ติดตั้งใหม่? เริ่มที่นี่: [เริ่มต้นใช้งาน](#เริ่มต้นอย่างรวดเร็ว) + +### การยืนยันตัวตนแบบสมัครสมาชิก (OAuth) + +- **OpenAI Codex** (สมัครสมาชิก ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (API key หรือ auth token) + +หมายเหตุเกี่ยวกับโมเดล: แม้จะรองรับ provider/โมเดลหลายตัว แต่เพื่อประสบการณ์ที่ดีที่สุด ให้ใช้โมเดลรุ่นล่าสุดที่แข็งแกร่งที่สุดที่คุณมี ดู [Onboarding](#เริ่มต้นอย่างรวดเร็ว) + +การตั้งค่าโมเดล + CLI: [อ้างอิง Provider](docs/reference/api/providers-reference.md) +การหมุนเวียนโปรไฟล์การยืนยันตัวตน (OAuth vs API keys) + failover: [Model failover](docs/reference/api/providers-reference.md) + +## ติดตั้ง (แนะนำ) + +Runtime: Rust stable toolchain ไบนารีเดียว ไม่มี runtime dependencies + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Bootstrap คลิกเดียว + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` จะรันโดยอัตโนมัติหลังติดตั้งเพื่อกำหนดค่า workspace และ provider ของคุณ + +## เริ่มต้นอย่างรวดเร็ว (TL;DR) + +คู่มือสำหรับผู้เริ่มต้นฉบับสมบูรณ์ (การยืนยันตัวตน, pairing, ช่องทาง): [เริ่มต้นใช้งาน](docs/setup-guides/one-click-bootstrap.md) + +```bash +# ติดตั้ง + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# เริ่ม gateway (เซิร์ฟเวอร์ webhook + แดชบอร์ดเว็บ) +zeroclaw gateway # ค่าเริ่มต้น: 127.0.0.1:42617 +zeroclaw gateway --port 0 # พอร์ตสุ่ม (ความปลอดภัยเพิ่มขึ้น) + +# พูดคุยกับผู้ช่วย +zeroclaw agent -m "Hello, ZeroClaw!" + +# โหมดโต้ตอบ +zeroclaw agent + +# เริ่ม runtime อัตโนมัติเต็มรูปแบบ (gateway + ช่องทาง + cron + hands) +zeroclaw daemon + +# ตรวจสอบสถานะ +zeroclaw status + +# รันการวินิจฉัย +zeroclaw doctor +``` + +กำลังอัปเกรด? รัน `zeroclaw doctor` หลังจากอัปเดต + +### จากซอร์ส (สำหรับนักพัฒนา) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **ทางเลือกสำหรับนักพัฒนา (ไม่ต้องติดตั้งแบบ global):** นำหน้าคำสั่งด้วย `cargo run --release --` (ตัวอย่าง: `cargo run --release -- status`) + +## การย้ายจาก OpenClaw + +ZeroClaw สามารถนำเข้า workspace, หน่วยความจำ และการกำหนดค่าจาก OpenClaw ของคุณ: + +```bash +# ดูตัวอย่างสิ่งที่จะถูกย้าย (ปลอดภัย, อ่านอย่างเดียว) +zeroclaw migrate openclaw --dry-run + +# รันการย้าย +zeroclaw migrate openclaw +``` + +สิ่งนี้จะย้ายรายการหน่วยความจำ ไฟล์ workspace และการกำหนดค่าจาก `~/.openclaw/` ไปยัง `~/.zeroclaw/` การกำหนดค่าจะถูกแปลงจาก JSON เป็น TOML โดยอัตโนมัติ + +## ค่าเริ่มต้นด้านความปลอดภัย (การเข้าถึง DM) + +ZeroClaw เชื่อมต่อกับพื้นผิวการส่งข้อความจริง ถือว่า DM ขาเข้าเป็นข้อมูลที่ไม่น่าเชื่อถือ + +คู่มือความปลอดภัยฉบับเต็ม: [SECURITY.md](SECURITY.md) + +พฤติกรรมเริ่มต้นบนทุกช่องทาง: + +- **DM pairing** (ค่าเริ่มต้น): ผู้ส่งที่ไม่รู้จักจะได้รับรหัส pairing สั้นๆ และบอทจะไม่ประมวลผลข้อความของพวกเขา +- อนุมัติด้วย: `zeroclaw pairing approve ` (จากนั้นผู้ส่งจะถูกเพิ่มในรายการอนุญาตในเครื่อง) +- DM ขาเข้าสาธารณะต้องมีการเลือกเข้าร่วมอย่างชัดเจนใน `config.toml` +- รัน `zeroclaw doctor` เพื่อค้นหานโยบาย DM ที่เสี่ยงหรือกำหนดค่าผิด + +**ระดับความเป็นอัตโนมัติ:** + +| ระดับ | พฤติกรรม | +|-------|----------| +| `ReadOnly` | เอเจนต์สามารถสังเกตแต่ไม่สามารถดำเนินการ | +| `Supervised` (ค่าเริ่มต้น) | เอเจนต์ดำเนินการโดยมีการอนุมัติสำหรับการดำเนินการที่มีความเสี่ยงปานกลาง/สูง | +| `Full` | เอเจนต์ดำเนินการอย่างอัตโนมัติภายในขอบเขตนโยบาย | + +**ชั้นของ sandboxing:** การแยก workspace, การบล็อก path traversal, รายการอนุญาตคำสั่ง, เส้นทางที่ห้าม (`/etc`, `/root`, `~/.ssh`), การจำกัดอัตรา (การดำเนินการสูงสุด/ชั่วโมง, ขีดจำกัดค่าใช้จ่าย/วัน) + + + + +### 📢 ประกาศ + +ใช้บอร์ดนี้สำหรับประกาศสำคัญ (การเปลี่ยนแปลงที่ทำลาย, คำแนะนำด้านความปลอดภัย, ช่วงเวลาบำรุงรักษา และตัวบล็อกการปล่อย) + +| วันที่ (UTC) | ระดับ | ประกาศ | การดำเนินการ | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _วิกฤต_ | เรา**ไม่มีส่วนเกี่ยวข้อง**กับ `openagen/zeroclaw`, `zeroclaw.org` หรือ `zeroclaw.net` โดเมน `zeroclaw.org` และ `zeroclaw.net` ปัจจุบันชี้ไปที่ fork `openagen/zeroclaw` และโดเมน/repository เหล่านั้นกำลังปลอมตัวเป็นเว็บไซต์/โปรเจกต์อย่างเป็นทางการของเรา | อย่าเชื่อถือข้อมูล ไบนารี การระดมทุน หรือประกาศจากแหล่งเหล่านั้น ใช้เฉพาะ[repository นี้](https://github.com/zeroclaw-labs/zeroclaw)และบัญชีโซเชียลที่ได้รับการยืนยันของเรา | +| 2026-02-21 | _สำคัญ_ | เว็บไซต์อย่างเป็นทางการของเราพร้อมใช้งานแล้ว: [zeroclawlabs.ai](https://zeroclawlabs.ai) ขอบคุณสำหรับความอดทนขณะที่เราเตรียมการเปิดตัว เรายังคงเห็นความพยายามในการแอบอ้าง ดังนั้น**อย่า**เข้าร่วมกิจกรรมการลงทุนหรือระดมทุนที่อ้างชื่อ ZeroClaw เว้นแต่จะเผยแพร่ผ่านช่องทางอย่างเป็นทางการของเรา | ใช้[repository นี้](https://github.com/zeroclaw-labs/zeroclaw)เป็นแหล่งข้อมูลที่เชื่อถือได้เพียงแหล่งเดียว ติดตาม [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs) และ [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) สำหรับอัปเดตอย่างเป็นทางการ | +| 2026-02-19 | _สำคัญ_ | Anthropic อัปเดตข้อกำหนดการยืนยันตัวตนและการใช้ข้อมูลรับรองเมื่อ 2026-02-19 โทเค็น OAuth ของ Claude Code (Free, Pro, Max) มีไว้สำหรับ Claude Code และ Claude.ai โดยเฉพาะ การใช้โทเค็น OAuth จาก Claude Free/Pro/Max ในผลิตภัณฑ์ เครื่องมือ หรือบริการอื่น (รวมถึง Agent SDK) ไม่ได้รับอนุญาตและอาจละเมิดข้อกำหนดบริการสำหรับผู้บริโภค | โปรดหลีกเลี่ยงการรวม OAuth ของ Claude Code ชั่วคราวเพื่อป้องกันการสูญเสียที่อาจเกิดขึ้น ข้อความต้นฉบับ: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use) | + +## จุดเด่น + +- **Runtime ที่เบาเป็นค่าเริ่มต้น** — เวิร์กโฟลว์ CLI และสถานะทั่วไปทำงานในซองหน่วยความจำไม่กี่เมกะไบต์บน release builds +- **Deployment ที่คุ้มค่า** — ออกแบบสำหรับบอร์ด $10 และอินสแตนซ์คลาวด์ขนาดเล็ก ไม่มี runtime dependencies ที่หนัก +- **Cold Start ที่รวดเร็ว** — runtime Rust ไบนารีเดียวทำให้การเริ่มต้นคำสั่งและ daemon เกือบจะทันที +- **สถาปัตยกรรมที่พกพาได้** — ไบนารีเดียวข้าม ARM, x86 และ RISC-V พร้อม provider/ช่องทาง/เครื่องมือที่สลับได้ +- **Gateway แบบ Local-first** — control plane เดียวสำหรับ sessions, ช่องทาง, เครื่องมือ, cron, SOPs และเหตุการณ์ +- **กล่องข้อความหลายช่องทาง** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket และอื่นๆ +- **การจัดการหลายเอเจนต์ (Hands)** — ฝูงเอเจนต์อัตโนมัติที่ทำงานตามกำหนดเวลาและฉลาดขึ้นตามเวลา +- **Standard Operating Procedures (SOPs)** — การทำงานอัตโนมัติของเวิร์กโฟลว์ที่ขับเคลื่อนด้วยเหตุการณ์ด้วย MQTT, webhook, cron และทริกเกอร์อุปกรณ์ต่อพ่วง +- **แดชบอร์ดเว็บ** — UI เว็บ React 19 + Vite พร้อมแชทเรียลไทม์, เบราว์เซอร์หน่วยความจำ, ตัวแก้ไขการกำหนดค่า, ตัวจัดการ cron และตัวตรวจสอบเครื่องมือ +- **อุปกรณ์ต่อพ่วง** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO ผ่าน trait `Peripheral` +- **เครื่องมือชั้นหนึ่ง** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace และ 70+ อื่นๆ +- **Hook วงจรชีวิต** — สกัดกั้นและแก้ไขการเรียก LLM, การทำงานของเครื่องมือ และข้อความในทุกขั้นตอน +- **แพลตฟอร์ม skill** — skill ที่รวมมา, ชุมชน และ workspace พร้อมการตรวจสอบความปลอดภัย +- **รองรับ tunnel** — Cloudflare, Tailscale, ngrok, OpenVPN และ tunnel แบบกำหนดเองสำหรับการเข้าถึงระยะไกล + +### ทำไมทีมถึงเลือก ZeroClaw + +- **เบาเป็นค่าเริ่มต้น:** ไบนารี Rust ขนาดเล็ก เริ่มต้นเร็ว footprint หน่วยความจำต่ำ +- **ปลอดภัยตามการออกแบบ:** pairing, sandboxing ที่เข้มงวด, รายการอนุญาตที่ชัดเจน, การกำหนดขอบเขต workspace +- **สลับได้ทั้งหมด:** ระบบหลักเป็น traits (providers, ช่องทาง, เครื่องมือ, หน่วยความจำ, tunnels) +- **ไม่มี lock-in:** รองรับ provider ที่เข้ากันได้กับ OpenAI + endpoint แบบกำหนดเองที่เสียบได้ + +## สรุป Benchmark (ZeroClaw vs OpenClaw, ทำซ้ำได้) + +Benchmark เร็วบนเครื่องท้องถิ่น (macOS arm64, ก.พ. 2026) ปรับมาตรฐานสำหรับฮาร์ดแวร์ edge 0.8GHz + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **ภาษา** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Startup (แกน 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **ขนาดไบนารี** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **ค่าใช้จ่าย** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **ฮาร์ดแวร์ใดก็ได้ $10** | + +> หมายเหตุ: ผลลัพธ์ ZeroClaw วัดจาก release builds โดยใช้ `/usr/bin/time -l` OpenClaw ต้องการ runtime Node.js (โดยทั่วไป ~390MB overhead หน่วยความจำเพิ่มเติม) ในขณะที่ NanoBot ต้องการ runtime Python PicoClaw และ ZeroClaw เป็นไบนารีแบบ static ตัวเลข RAM ด้านบนเป็นหน่วยความจำ runtime ความต้องการการคอมไพล์ตอน build สูงกว่า + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### การวัดในเครื่องที่ทำซ้ำได้ + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## ทุกสิ่งที่เราสร้างมาจนถึงตอนนี้ + +### แพลตฟอร์มหลัก + +- Control plane HTTP/WS/SSE ของ Gateway พร้อม sessions, presence, การกำหนดค่า, cron, webhooks, แดชบอร์ดเว็บ และ pairing +- พื้นผิว CLI: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills` +- ลูปการจัดการเอเจนต์พร้อม tool dispatch, การสร้าง prompt, การจำแนกข้อความ และการโหลดหน่วยความจำ +- โมเดล session พร้อมการบังคับใช้นโยบายความปลอดภัย ระดับความเป็นอัตโนมัติ และ approval gating +- Wrapper provider ที่ยืดหยุ่นพร้อม failover, retry และ model routing ข้าม 20+ LLM backends + +### ช่องทาง + +ช่องทาง: WhatsApp (native), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`) + +### แดชบอร์ดเว็บ + +แดชบอร์ดเว็บ React 19 + Vite 6 + Tailwind CSS 4 ให้บริการโดยตรงจาก Gateway: + +- **Dashboard** — ภาพรวมระบบ สถานะสุขภาพ uptime การติดตามค่าใช้จ่าย +- **Agent Chat** — แชทโต้ตอบกับเอเจนต์ +- **Memory** — เรียกดูและจัดการรายการหน่วยความจำ +- **Config** — ดูและแก้ไขการกำหนดค่า +- **Cron** — จัดการงานที่กำหนดเวลา +- **Tools** — เรียกดูเครื่องมือที่มี +- **Logs** — ดูบันทึกกิจกรรมเอเจนต์ +- **Cost** — การใช้โทเค็นและการติดตามค่าใช้จ่าย +- **Doctor** — การวินิจฉัยสุขภาพระบบ +- **Integrations** — สถานะการรวมและการตั้งค่า +- **Pairing** — การจัดการ pairing อุปกรณ์ + +### เป้าหมาย firmware + +| เป้าหมาย | แพลตฟอร์ม | วัตถุประสงค์ | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | เอเจนต์อุปกรณ์ต่อพ่วงไร้สาย | +| ESP32-UI | ESP32 + Display | เอเจนต์พร้อมอินเทอร์เฟซภาพ | +| STM32 Nucleo | STM32 (ARM Cortex-M) | อุปกรณ์ต่อพ่วงอุตสาหกรรม | +| Arduino | Arduino | บริดจ์เซ็นเซอร์/แอคชูเอเตอร์พื้นฐาน | +| Uno Q Bridge | Arduino Uno | บริดจ์ซีเรียลไปยังเอเจนต์ | + +### เครื่องมือ + การทำงานอัตโนมัติ + +- **หลัก:** shell, file read/write/edit, การดำเนินการ git, glob search, content search +- **เว็บ:** browser control, web fetch, web search, screenshot, image info, PDF read +- **การรวม:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **การกำหนดเวลา:** cron add/remove/update/run, schedule tool +- **หน่วยความจำ:** recall, store, forget, knowledge, project intel +- **ขั้นสูง:** delegate (เอเจนต์-ต่อ-เอเจนต์), swarm, model switch/routing, security ops, cloud ops +- **ฮาร์ดแวร์:** board info, memory map, memory read (feature-gated) + +### Runtime + ความปลอดภัย + +- **ระดับความเป็นอัตโนมัติ:** ReadOnly, Supervised (ค่าเริ่มต้น), Full +- **Sandboxing:** การแยก workspace, การบล็อก path traversal, รายการอนุญาตคำสั่ง, เส้นทางที่ห้าม, Landlock (Linux), Bubblewrap +- **การจำกัดอัตรา:** การดำเนินการสูงสุดต่อชั่วโมง ค่าใช้จ่ายสูงสุดต่อวัน (กำหนดค่าได้) +- **Approval gating:** การอนุมัติแบบโต้ตอบสำหรับการดำเนินการที่มีความเสี่ยงปานกลาง/สูง +- **E-stop:** ความสามารถในการปิดระบบฉุกเฉิน +- **129+ การทดสอบความปลอดภัย** ใน CI อัตโนมัติ + +### Ops + การแพ็กเกจ + +- แดชบอร์ดเว็บให้บริการโดยตรงจาก Gateway +- รองรับ tunnel: Cloudflare, Tailscale, ngrok, OpenVPN, คำสั่งกำหนดเอง +- Docker runtime adapter สำหรับการทำงานแบบ containerized +- CI/CD: beta (อัตโนมัติเมื่อ push) → stable (dispatch แบบ manual) → Docker, crates.io, Scoop, AUR, Homebrew, tweet +- ไบนารี pre-built สำหรับ Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64) + + +## การกำหนดค่า + +ขั้นต่ำ `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +อ้างอิงการกำหนดค่าฉบับเต็ม: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) + +### การกำหนดค่าช่องทาง + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### การกำหนดค่า tunnel + +```toml +[tunnel] +kind = "cloudflare" # หรือ "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +รายละเอียด: [อ้างอิงช่องทาง](docs/reference/api/channels-reference.md) · [อ้างอิงการกำหนดค่า](docs/reference/api/config-reference.md) + +### รองรับ runtime (ปัจจุบัน) + +- **`native`** (ค่าเริ่มต้น) — การทำงานแบบ process โดยตรง เส้นทางที่เร็วที่สุด เหมาะสำหรับสภาพแวดล้อมที่เชื่อถือได้ +- **`docker`** — การแยก container เต็มรูปแบบ นโยบายความปลอดภัยที่บังคับใช้ ต้องการ Docker + +ตั้ง `runtime.kind = "docker"` สำหรับ sandboxing ที่เข้มงวดหรือการแยกเครือข่าย + +## การยืนยันตัวตนแบบสมัครสมาชิก (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw รองรับโปรไฟล์การยืนยันตัวตนแบบ subscription-native (หลายบัญชี, เข้ารหัสเมื่อเก็บ) + +- ไฟล์จัดเก็บ: `~/.zeroclaw/auth-profiles.json` +- คีย์เข้ารหัส: `~/.zeroclaw/.secret_key` +- รูปแบบ id โปรไฟล์: `:` (ตัวอย่าง: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (สมัครสมาชิก ChatGPT) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# ตรวจสอบ / refresh / สลับโปรไฟล์ +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# รันเอเจนต์ด้วย auth แบบสมัครสมาชิก +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Workspace เอเจนต์ + skill + +Root workspace: `~/.zeroclaw/workspace/` (กำหนดค่าได้ผ่าน config) + +ไฟล์ prompt ที่ inject: +- `IDENTITY.md` — บุคลิกภาพและบทบาทของเอเจนต์ +- `USER.md` — บริบทและความชอบของผู้ใช้ +- `MEMORY.md` — ข้อเท็จจริงและบทเรียนระยะยาว +- `AGENTS.md` — ข้อตกลง session และกฎการเริ่มต้น +- `SOUL.md` — อัตลักษณ์หลักและหลักการดำเนินงาน + +Skills: `~/.zeroclaw/workspace/skills//SKILL.md` หรือ `SKILL.toml` + +```bash +# แสดงรายการ skill ที่ติดตั้ง +zeroclaw skills list + +# ติดตั้งจาก git +zeroclaw skills install https://github.com/user/my-skill.git + +# ตรวจสอบความปลอดภัยก่อนติดตั้ง +zeroclaw skills audit https://github.com/user/my-skill.git + +# ลบ skill +zeroclaw skills remove my-skill +``` + +## คำสั่ง CLI + +```bash +# การจัดการ workspace +zeroclaw onboard # วิซาร์ดการตั้งค่าแบบแนะนำ +zeroclaw status # แสดงสถานะ daemon/เอเจนต์ +zeroclaw doctor # รันการวินิจฉัยระบบ + +# Gateway + daemon +zeroclaw gateway # เริ่มเซิร์ฟเวอร์ gateway (127.0.0.1:42617) +zeroclaw daemon # เริ่ม runtime อัตโนมัติเต็มรูปแบบ + +# เอเจนต์ +zeroclaw agent # โหมดแชทโต้ตอบ +zeroclaw agent -m "message" # โหมดข้อความเดียว + +# การจัดการบริการ +zeroclaw service install # ติดตั้งเป็นบริการ OS (launchd/systemd) +zeroclaw service start|stop|restart|status + +# ช่องทาง +zeroclaw channel list # แสดงรายการช่องทางที่กำหนดค่า +zeroclaw channel doctor # ตรวจสอบสุขภาพช่องทาง +zeroclaw channel bind-telegram 123456789 + +# Cron + การกำหนดเวลา +zeroclaw cron list # แสดงรายการงานที่กำหนดเวลา +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# หน่วยความจำ +zeroclaw memory list # แสดงรายการหน่วยความจำ +zeroclaw memory get # ดึงหน่วยความจำ +zeroclaw memory stats # สถิติหน่วยความจำ + +# โปรไฟล์การยืนยันตัวตน +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# อุปกรณ์ต่อพ่วง +zeroclaw hardware discover # สแกนอุปกรณ์ที่เชื่อมต่อ +zeroclaw peripheral list # แสดงรายการอุปกรณ์ต่อพ่วงที่เชื่อมต่อ +zeroclaw peripheral flash # แฟลช firmware ไปยังอุปกรณ์ + +# การย้าย +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# การเติมเต็ม shell +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +อ้างอิงคำสั่งฉบับเต็ม: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## ข้อกำหนดเบื้องต้น + +
+Windows + +#### จำเป็น + +1. **Visual Studio Build Tools** (ให้ linker MSVC และ Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + ระหว่างการติดตั้ง (หรือผ่าน Visual Studio Installer) เลือก workload **"Desktop development with C++"** + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + หลังติดตั้ง เปิดเทอร์มินัลใหม่และรัน `rustup default stable` เพื่อให้แน่ใจว่า toolchain ที่เสถียรใช้งานอยู่ + +3. **ตรวจสอบ** ว่าทั้งสองใช้งานได้: + ```powershell + rustc --version + cargo --version + ``` + +#### ไม่บังคับ + +- **Docker Desktop** — จำเป็นเฉพาะเมื่อใช้ [Docker sandboxed runtime](#รองรับ-runtime-ปัจจุบัน) (`runtime.kind = "docker"`) ติดตั้งผ่าน `winget install Docker.DockerDesktop` + +
+ +
+Linux / macOS + +#### จำเป็น + +1. **Build essentials:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** ติดตั้ง Xcode Command Line Tools: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + ดู [rustup.rs](https://rustup.rs) สำหรับรายละเอียด + +3. **ตรวจสอบ** ว่าทั้งสองใช้งานได้: + ```bash + rustc --version + cargo --version + ``` + +#### ตัวติดตั้งบรรทัดเดียว + +หรือข้ามขั้นตอนด้านบนและติดตั้งทุกอย่าง (dependencies ระบบ, Rust, ZeroClaw) ในคำสั่งเดียว: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### ข้อกำหนดทรัพยากรการคอมไพล์ + +การ build จากซอร์สต้องการทรัพยากรมากกว่าการรันไบนารีที่ได้: + +| ทรัพยากร | ขั้นต่ำ | แนะนำ | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **พื้นที่ว่าง** | 6 GB | 10 GB+ | + +หากโฮสต์ของคุณต่ำกว่าขั้นต่ำ ใช้ไบนารี pre-built: + +```bash +./install.sh --prefer-prebuilt +``` + +เพื่อต้องการการติดตั้งแบบไบนารีเท่านั้นโดยไม่มี fallback ซอร์ส: + +```bash +./install.sh --prebuilt-only +``` + +#### ไม่บังคับ + +- **Docker** — จำเป็นเฉพาะเมื่อใช้ [Docker sandboxed runtime](#รองรับ-runtime-ปัจจุบัน) (`runtime.kind = "docker"`) ติดตั้งผ่านตัวจัดการแพ็กเกจของคุณหรือ [docker.com](https://docs.docker.com/engine/install/) + +> **หมายเหตุ:** `cargo build --release` เริ่มต้นใช้ `codegen-units=1` เพื่อลดความดันการคอมไพล์สูงสุด สำหรับ build ที่เร็วขึ้นบนเครื่องที่แรง ใช้ `cargo build --profile release-fast` + +
+ + + +### ไบนารี pre-built + +Release assets เผยแพร่สำหรับ: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +ดาวน์โหลด assets ล่าสุดจาก: + + +## เอกสาร + +ใช้เมื่อคุณผ่านขั้นตอน onboarding แล้วและต้องการอ้างอิงที่ลึกกว่า + +- เริ่มด้วย[สารบัญเอกสาร](docs/README.md)สำหรับการนำทางและ "อะไรอยู่ที่ไหน" +- อ่าน[ภาพรวมสถาปัตยกรรม](docs/architecture.md)สำหรับโมเดลระบบทั้งหมด +- ใช้[อ้างอิงการกำหนดค่า](docs/reference/api/config-reference.md)เมื่อคุณต้องการทุก key และตัวอย่าง +- รัน Gateway ตามหนังสือด้วย[runbook การดำเนินงาน](docs/ops/operations-runbook.md) +- ทำตาม [ZeroClaw Onboard](#เริ่มต้นอย่างรวดเร็ว) สำหรับการตั้งค่าแบบแนะนำ +- แก้ไขปัญหาที่พบบ่อยด้วย[คู่มือแก้ไขปัญหา](docs/ops/troubleshooting.md) +- ตรวจสอบ[แนวทางความปลอดภัย](docs/security/README.md)ก่อนเปิดเผยสิ่งใด + +### เอกสารอ้างอิง + +- ศูนย์กลางเอกสาร: [docs/README.md](docs/README.md) +- TOC เอกสารรวม: [docs/SUMMARY.md](docs/SUMMARY.md) +- อ้างอิงคำสั่ง: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- อ้างอิงการกำหนดค่า: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- อ้างอิง provider: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- อ้างอิงช่องทาง: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Runbook การดำเนินงาน: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- การแก้ไขปัญหา: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### เอกสารความร่วมมือ + +- คู่มือการมีส่วนร่วม: [CONTRIBUTING.md](CONTRIBUTING.md) +- นโยบาย PR workflow: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- คู่มือ CI workflow: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Playbook ผู้ตรวจสอบ: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- นโยบายเปิดเผยความปลอดภัย: [SECURITY.md](SECURITY.md) +- เทมเพลตเอกสาร: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Deployment + การดำเนินงาน + +- คู่มือ deployment เครือข่าย: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Playbook proxy agent: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- คู่มือฮาร์ดแวร์: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw ถูกสร้างสำหรับ smooth crab 🦀 ผู้ช่วย AI ที่เร็วและมีประสิทธิภาพ สร้างโดย Argenis De La Rosa และชุมชน + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## สนับสนุน ZeroClaw + +หาก ZeroClaw ช่วยงานของคุณและคุณต้องการสนับสนุนการพัฒนาต่อเนื่อง คุณสามารถบริจาคที่นี่: + +Buy Me a Coffee + +### 🙏 ขอขอบคุณเป็นพิเศษ + +ขอขอบคุณจากใจจริงถึงชุมชนและสถาบันที่สร้างแรงบันดาลใจและขับเคลื่อนงาน open-source นี้: + +- **Harvard University** — สำหรับการส่งเสริมความอยากรู้ทางปัญญาและผลักดันขอบเขตของสิ่งที่เป็นไปได้ +- **MIT** — สำหรับการสนับสนุนความรู้เปิด open source และความเชื่อว่าเทคโนโลยีควรเข้าถึงได้สำหรับทุกคน +- **Sundai Club** — สำหรับชุมชน พลังงาน และแรงผลักดันอย่างไม่หยุดหย่อนในการสร้างสิ่งที่สำคัญ +- **โลก & เหนือกว่า** 🌍✨ — ถึงผู้มีส่วนร่วม นักฝัน และผู้สร้างทุกคนที่ทำให้ open source เป็นพลังเพื่อสิ่งดีๆ นี่สำหรับคุณ + +เราสร้างแบบเปิดเพราะไอเดียที่ดีที่สุดมาจากทุกที่ หากคุณอ่านสิ่งนี้ คุณเป็นส่วนหนึ่งของมัน ยินดีต้อนรับ 🦀❤️ + +## การมีส่วนร่วม + +ใหม่กับ ZeroClaw? มองหา issues ที่มีป้ายกำกับ [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — ดู[คู่มือการมีส่วนร่วม](CONTRIBUTING.md#first-time-contributors)สำหรับวิธีเริ่มต้น ยินดีรับ PR ที่สร้างด้วย AI/vibe-coded! 🤖 + +ดู [CONTRIBUTING.md](CONTRIBUTING.md) และ [CLA.md](docs/contributing/cla.md) ใช้งาน trait แล้วส่ง PR: + +- คู่มือ CI workflow: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- `Provider` ใหม่ → `src/providers/` +- `Channel` ใหม่ → `src/channels/` +- `Observer` ใหม่ → `src/observability/` +- `Tool` ใหม่ → `src/tools/` +- `Memory` ใหม่ → `src/memory/` +- `Tunnel` ใหม่ → `src/tunnel/` +- `Peripheral` ใหม่ → `src/peripherals/` +- `Skill` ใหม่ → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Repository อย่างเป็นทางการ & คำเตือนการแอบอ้าง + +**นี่คือ repository อย่างเป็นทางการเพียงแห่งเดียวของ ZeroClaw:** + +> https://github.com/zeroclaw-labs/zeroclaw + +repository, องค์กร, โดเมน หรือแพ็กเกจอื่นใดที่อ้างว่าเป็น "ZeroClaw" หรือบ่งบอกถึงการเกี่ยวข้องกับ ZeroClaw Labs นั้น**ไม่ได้รับอนุญาตและไม่มีส่วนเกี่ยวข้องกับโปรเจกต์นี้** Fork ที่ไม่ได้รับอนุญาตที่ทราบจะถูกระบุไว้ใน [TRADEMARK.md](docs/maintainers/trademark.md) + +หากคุณพบการแอบอ้างหรือการใช้เครื่องหมายการค้าในทางที่ผิด โปรด[เปิด issue](https://github.com/zeroclaw-labs/zeroclaw/issues) + +--- + +## สัญญาอนุญาต + +ZeroClaw มี dual-license เพื่อความเปิดกว้างสูงสุดและการปกป้องผู้มีส่วนร่วม: + +| สัญญาอนุญาต | กรณีการใช้งาน | +|---|---| +| [MIT](LICENSE-MIT) | Open-source, วิจัย, วิชาการ, ใช้ส่วนตัว | +| [Apache 2.0](LICENSE-APACHE) | การปกป้องสิทธิบัตร, สถาบัน, deployment เชิงพาณิชย์ | + +คุณสามารถเลือกสัญญาอนุญาตใดก็ได้ **ผู้มีส่วนร่วมให้สิทธิ์โดยอัตโนมัติภายใต้ทั้งสอง** — ดู [CLA.md](docs/contributing/cla.md) สำหรับข้อตกลงผู้มีส่วนร่วมฉบับเต็ม + +### เครื่องหมายการค้า + +ชื่อและโลโก้ **ZeroClaw** เป็นเครื่องหมายการค้าของ ZeroClaw Labs สัญญาอนุญาตนี้ไม่ให้สิทธิ์ในการใช้เพื่อบ่งบอกถึงการรับรองหรือการเกี่ยวข้อง ดู [TRADEMARK.md](docs/maintainers/trademark.md) สำหรับการใช้งานที่อนุญาตและห้าม + +### การปกป้องผู้มีส่วนร่วม + +- คุณ**คงสิทธิ์ลิขสิทธิ์**ของผลงานของคุณ +- **การให้สิทธิ์สิทธิบัตร** (Apache 2.0) ปกป้องคุณจากการเรียกร้องสิทธิบัตรโดยผู้มีส่วนร่วมคนอื่น +- ผลงานของคุณ**ได้รับการระบุอย่างถาวร**ในประวัติ commit และ [NOTICE](NOTICE) +- ไม่มีสิทธิ์เครื่องหมายการค้าที่ถ่ายโอนโดยการมีส่วนร่วม + +--- + +**ZeroClaw** — ไม่มีโอเวอร์เฮด ไม่มีการประนีประนอม Deploy ที่ไหนก็ได้ สลับอะไรก็ได้ 🦀 + +## ผู้มีส่วนร่วม + + + ZeroClaw contributors + + +รายการนี้สร้างจากกราฟผู้มีส่วนร่วม GitHub และอัปเดตโดยอัตโนมัติ + +## ประวัติดาว + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.tl.md b/third_party/zeroclaw/README.tl.md new file mode 100644 index 0000000..4afb466 --- /dev/null +++ b/third_party/zeroclaw/README.tl.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Personal na AI Assistant

+ +

+ Zero overhead. Zero kompromiso. 100% Rust. 100% Agnostic.
+ ⚡️ Tumatakbo sa $10 na hardware na may <5MB RAM: 99% mas kaunting memorya kaysa sa OpenClaw at 98% mas mura kaysa sa Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Binuo ng mga estudyante at miyembro ng mga komunidad ng Harvard, MIT, at Sundai.Club. +

+ +

+ 🌐 Mga Wika: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +Ang ZeroClaw ay isang personal na AI assistant na pinapatakbo mo sa iyong sariling mga device. Sumasagot ito sa mga channel na ginagamit mo na (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, at marami pa). May web dashboard ito para sa real-time na kontrol at maaaring kumonekta sa hardware peripherals (ESP32, STM32, Arduino, Raspberry Pi). Ang Gateway ay control plane lamang — ang produkto ay ang assistant mismo. + +Kung gusto mo ng personal, single-user na assistant na lokal, mabilis, at palaging naka-on, ito na iyon. + +

+ Website · + Docs · + Architecture · + Magsimula · + Paglipat mula sa OpenClaw · + Troubleshoot · + Discord +

+ +> **Inirerekomendang setup:** patakbuhin ang `zeroclaw onboard` sa iyong terminal. Ang ZeroClaw Onboard ay gagabay sa iyo hakbang-hakbang sa pag-setup ng gateway, workspace, channel, at provider. Ito ang inirerekomendang setup path at gumagana sa macOS, Linux, at Windows (sa pamamagitan ng WSL2). Bagong install? Magsimula dito: [Magsimula](#mabilis-na-simula-tldr) + +### Subscription Auth (OAuth) + +- **OpenAI Codex** (subscription sa ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (API key o auth token) + +Tala sa modelo: bagaman maraming provider/modelo ang sinusuportahan, para sa pinakamahusay na karanasan gamitin ang pinakamalakas na pinakabagong henerasyong modelo na available sa iyo. Tingnan ang [Onboarding](#mabilis-na-simula-tldr). + +Configs ng modelo + CLI: [Providers reference](docs/reference/api/providers-reference.md) +Pag-rotate ng auth profile (OAuth vs API key) + failover: [Model failover](docs/reference/api/providers-reference.md) + +## I-install (inirerekomenda) + +Runtime: Rust stable toolchain. Isang binary lamang, walang runtime dependency. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### One-click bootstrap + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +Awtomatikong tatakbo ang `zeroclaw onboard` pagkatapos ng install para i-configure ang iyong workspace at provider. + +## Mabilis na Simula (TL;DR) + +Kumpletong gabay para sa mga baguhan (auth, pairing, channels): [Magsimula](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Install + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Simulan ang gateway (webhook server + web dashboard) +zeroclaw gateway # default: 127.0.0.1:42617 +zeroclaw gateway --port 0 # random port (pinalakas na seguridad) + +# Makipag-usap sa assistant +zeroclaw agent -m "Hello, ZeroClaw!" + +# Interactive mode +zeroclaw agent + +# Simulan ang buong autonomous runtime (gateway + channels + cron + hands) +zeroclaw daemon + +# Tingnan ang status +zeroclaw status + +# Patakbuhin ang diagnostics +zeroclaw doctor +``` + +Nag-upgrade? Patakbuhin ang `zeroclaw doctor` pagkatapos mag-update. + +### Mula sa source (development) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Dev fallback (walang global install):** lagyan ng prefix ang mga command ng `cargo run --release --` (halimbawa: `cargo run --release -- status`). + +## Paglipat mula sa OpenClaw + +Maaaring i-import ng ZeroClaw ang iyong OpenClaw workspace, memory, at configuration: + +```bash +# I-preview kung ano ang maili-lipat (ligtas, read-only) +zeroclaw migrate openclaw --dry-run + +# Patakbuhin ang migration +zeroclaw migrate openclaw +``` + +Inililipat nito ang iyong memory entries, workspace files, at configuration mula `~/.openclaw/` patungo sa `~/.zeroclaw/`. Awtomatikong kino-convert ang config mula JSON patungong TOML. + +## Mga default sa seguridad (DM access) + +Kumokonekta ang ZeroClaw sa totoong mga messaging surface. Tratuhin ang mga papasok na DM bilang hindi mapagkakatiwalaang input. + +Buong gabay sa seguridad: [SECURITY.md](SECURITY.md) + +Default na gawi sa lahat ng channel: + +- **DM pairing** (default): ang mga hindi kilalang nagpadala ay tumatanggap ng maikling pairing code at hindi pino-proseso ng bot ang kanilang mensahe. +- I-approve gamit ang: `zeroclaw pairing approve ` (pagkatapos ay idadagdag ang nagpadala sa lokal na allowlist). +- Ang mga pampublikong papasok na DM ay nangangailangan ng tahasang opt-in sa `config.toml`. +- Patakbuhin ang `zeroclaw doctor` para makita ang mga mapanganib o maling naka-configure na DM policy. + +**Mga antas ng autonomy:** + +| Antas | Gawi | +|-------|----------| +| `ReadOnly` | Maaari lamang magmasid ang agent, hindi kumilos | +| `Supervised` (default) | Kumikilos ang agent nang may pag-apruba para sa medium/high risk na operasyon | +| `Full` | Kumikilos ang agent nang autonomous sa loob ng mga hangganan ng patakaran | + +**Mga layer ng sandboxing:** workspace isolation, path traversal blocking, command allowlisting, forbidden paths (`/etc`, `/root`, `~/.ssh`), rate limiting (max actions/hour, cost/day caps). + + + + +### 📢 Mga Anunsyo + +Gamitin ang talahanayan ito para sa mahahalagang paunawa (breaking changes, security advisories, maintenance windows, at release blockers). + +| Petsa (UTC) | Antas | Paunawa | Aksyon | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Kritikal_ | **Hindi kami konektado** sa `openagen/zeroclaw`, `zeroclaw.org` o `zeroclaw.net`. Ang `zeroclaw.org` at `zeroclaw.net` na mga domain ay kasalukuyang nakaturo sa `openagen/zeroclaw` fork, at ang domain/repository na iyon ay nanggagaya sa aming opisyal na website/proyekto. | Huwag magtiwala sa impormasyon, binaries, fundraising, o mga anunsyo mula sa mga pinagmulang iyon. Gamitin lamang [ang repository na ito](https://github.com/zeroclaw-labs/zeroclaw) at ang aming mga verified na social account. | +| 2026-02-21 | _Mahalaga_ | Ang aming opisyal na website ay live na: [zeroclawlabs.ai](https://zeroclawlabs.ai). Salamat sa iyong pasensya habang inihahanda namin ang paglulunsad. Nakikita pa rin namin ang mga pagtatangka ng panggagaya, kaya **huwag** sumali sa anumang investment o fundraising activity na gumagamit ng pangalan ng ZeroClaw maliban kung nai-publish ito sa pamamagitan ng aming mga opisyal na channel. | Gamitin [ang repository na ito](https://github.com/zeroclaw-labs/zeroclaw) bilang nag-iisang source of truth. Sundan ang [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs), at [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) para sa mga opisyal na update. | +| 2026-02-19 | _Mahalaga_ | In-update ng Anthropic ang Authentication at Credential Use terms noong 2026-02-19. Ang Claude Code OAuth tokens (Free, Pro, Max) ay eksklusibong para sa Claude Code at Claude.ai; ang paggamit ng OAuth tokens mula sa Claude Free/Pro/Max sa anumang ibang produkto, tool, o serbisyo (kasama ang Agent SDK) ay hindi pinapahintulutan at maaaring lumabag sa Consumer Terms of Service. | Pansamantalang iwasan ang Claude Code OAuth integrations para maiwasan ang potensyal na pagkawala. Orihinal na clause: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Mga Highlight + +- **Magaan na Runtime bilang Default** — ang mga karaniwang CLI at status workflow ay tumatakbo sa loob ng ilang megabyte na memory envelope sa release builds. +- **Cost-Efficient na Deployment** — dinisenyo para sa $10 na board at maliliit na cloud instance, walang mabibigat na runtime dependency. +- **Mabilis na Cold Start** — single-binary Rust runtime na nagpapanatili ng halos instant na command at daemon startup. +- **Portable na Architecture** — isang binary sa buong ARM, x86, at RISC-V na may swappable na provider/channel/tool. +- **Local-first na Gateway** — iisang control plane para sa mga session, channel, tool, cron, SOP, at event. +- **Multi-channel na inbox** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket, at marami pa. +- **Multi-agent orchestration (Hands)** — mga autonomous na agent swarm na tumatakbo ayon sa iskedyul at nagiging mas matalino sa paglipas ng panahon. +- **Standard Operating Procedures (SOPs)** — event-driven workflow automation gamit ang MQTT, webhook, cron, at peripheral triggers. +- **Web Dashboard** — React 19 + Vite web UI na may real-time chat, memory browser, config editor, cron manager, at tool inspector. +- **Hardware peripherals** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO sa pamamagitan ng `Peripheral` trait. +- **First-class na mga tool** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace, at 70+ pa. +- **Lifecycle hooks** — i-intercept at baguhin ang mga LLM call, tool execution, at mensahe sa bawat yugto. +- **Skills platform** — bundled, community, at workspace skills na may security auditing. +- **Tunnel support** — Cloudflare, Tailscale, ngrok, OpenVPN, at custom tunnels para sa remote access. + +### Bakit pinipili ng mga team ang ZeroClaw + +- **Magaan bilang default:** maliit na Rust binary, mabilis na startup, mababang memory footprint. +- **Secure bilang disenyo:** pairing, strict sandboxing, explicit allowlists, workspace scoping. +- **Ganap na swappable:** ang mga core system ay traits (providers, channels, tools, memory, tunnels). +- **Walang lock-in:** OpenAI-compatible provider support + pluggable custom endpoints. + +## Benchmark Snapshot (ZeroClaw vs OpenClaw, Reproducible) + +Mabilis na benchmark sa lokal na machine (macOS arm64, Peb 2026) na normalized para sa 0.8GHz edge hardware. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Wika** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Startup (0.8GHz core)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Laki ng Binary** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Gastos** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Kahit anong hardware $10** | + +> Mga Tala: Ang mga resulta ng ZeroClaw ay sinusukat sa release builds gamit ang `/usr/bin/time -l`. Ang OpenClaw ay nangangailangan ng Node.js runtime (karaniwang ~390MB dagdag na memory overhead), habang ang NanoBot ay nangangailangan ng Python runtime. Ang PicoClaw at ZeroClaw ay static binaries. Ang mga RAM figure sa itaas ay runtime memory; ang build-time compilation requirements ay mas mataas. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Reproducible na lokal na pagsukat + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Lahat ng binuo namin + +### Core platform + +- Gateway HTTP/WS/SSE control plane na may mga session, presence, config, cron, webhooks, web dashboard, at pairing. +- CLI surface: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Agent orchestration loop na may tool dispatch, prompt construction, message classification, at memory loading. +- Session model na may security policy enforcement, autonomy levels, at approval gating. +- Resilient provider wrapper na may failover, retry, at model routing sa 20+ LLM backends. + +### Mga Channel + +Channel: WhatsApp (native), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Web dashboard + +React 19 + Vite 6 + Tailwind CSS 4 web dashboard na direktang inihahatid mula sa Gateway: + +- **Dashboard** — pangkalahatang-tanaw ng sistema, health status, uptime, cost tracking +- **Agent Chat** — interactive chat kasama ang agent +- **Memory** — mag-browse at mag-manage ng memory entries +- **Config** — tingnan at i-edit ang configuration +- **Cron** — pamahalaan ang mga naka-schedule na gawain +- **Tools** — mag-browse ng mga available na tool +- **Logs** — tingnan ang mga agent activity log +- **Cost** — token usage at cost tracking +- **Doctor** — system health diagnostics +- **Integrations** — integration status at setup +- **Pairing** — device pairing management + +### Mga firmware target + +| Target | Platform | Layunin | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | Wireless peripheral agent | +| ESP32-UI | ESP32 + Display | Agent na may visual interface | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Industrial peripheral | +| Arduino | Arduino | Basic sensor/actuator bridge | +| Uno Q Bridge | Arduino Uno | Serial bridge patungo sa agent | + +### Mga tool + automation + +- **Core:** shell, file read/write/edit, git operations, glob search, content search +- **Web:** browser control, web fetch, web search, screenshot, image info, PDF read +- **Integrations:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **Scheduling:** cron add/remove/update/run, schedule tool +- **Memory:** recall, store, forget, knowledge, project intel +- **Advanced:** delegate (agent-to-agent), swarm, model switch/routing, security ops, cloud ops +- **Hardware:** board info, memory map, memory read (feature-gated) + +### Runtime + kaligtasan + +- **Mga antas ng autonomy:** ReadOnly, Supervised (default), Full. +- **Sandboxing:** workspace isolation, path traversal blocking, command allowlists, forbidden paths, Landlock (Linux), Bubblewrap. +- **Rate limiting:** max actions per hour, max cost per day (configurable). +- **Approval gating:** interactive approval para sa medium/high risk operations. +- **E-stop:** emergency shutdown capability. +- **129+ security tests** sa automated CI. + +### Ops + packaging + +- Web dashboard na direktang inihahatid mula sa Gateway. +- Tunnel support: Cloudflare, Tailscale, ngrok, OpenVPN, custom command. +- Docker runtime adapter para sa containerized execution. +- CI/CD: beta (auto sa push) → stable (manual dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Pre-built binaries para sa Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Configuration + +Minimal na `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Buong configuration reference: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Channel configuration + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Tunnel configuration + +```toml +[tunnel] +kind = "cloudflare" # o "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Mga detalye: [Channel reference](docs/reference/api/channels-reference.md) · [Config reference](docs/reference/api/config-reference.md) + +### Kasalukuyang runtime support + +- **`native`** (default) — direct process execution, pinakamabilis na path, ideal para sa mga trusted environment. +- **`docker`** — buong container isolation, pinalakas na security policies, nangangailangan ng Docker. + +Itakda ang `runtime.kind = "docker"` para sa strict sandboxing o network isolation. + +## Subscription Auth (OpenAI Codex / Claude Code / Gemini) + +Sinusuportahan ng ZeroClaw ang subscription-native auth profiles (multi-account, encrypted at rest). + +- Store file: `~/.zeroclaw/auth-profiles.json` +- Encryption key: `~/.zeroclaw/.secret_key` +- Profile id format: `:` (halimbawa: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT subscription) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Tingnan / i-refresh / palitan ang profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Patakbuhin ang agent gamit ang subscription auth +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Agent workspace + skills + +Workspace root: `~/.zeroclaw/workspace/` (configurable sa pamamagitan ng config). + +Mga injected prompt file: +- `IDENTITY.md` — personalidad at papel ng agent +- `USER.md` — konteksto at mga kagustuhan ng user +- `MEMORY.md` — pangmatagalang mga katotohanan at aral +- `AGENTS.md` — mga session convention at initialization rules +- `SOUL.md` — pangunahing pagkakakilanlan at mga operating principle + +Skills: `~/.zeroclaw/workspace/skills//SKILL.md` o `SKILL.toml`. + +```bash +# Ilista ang mga naka-install na skill +zeroclaw skills list + +# Mag-install mula sa git +zeroclaw skills install https://github.com/user/my-skill.git + +# Security audit bago mag-install +zeroclaw skills audit https://github.com/user/my-skill.git + +# Tanggalin ang isang skill +zeroclaw skills remove my-skill +``` + +## Mga CLI command + +```bash +# Workspace management +zeroclaw onboard # Guided setup wizard +zeroclaw status # Ipakita ang daemon/agent status +zeroclaw doctor # Patakbuhin ang system diagnostics + +# Gateway + daemon +zeroclaw gateway # Simulan ang gateway server (127.0.0.1:42617) +zeroclaw daemon # Simulan ang buong autonomous runtime + +# Agent +zeroclaw agent # Interactive chat mode +zeroclaw agent -m "message" # Single message mode + +# Service management +zeroclaw service install # I-install bilang OS service (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Mga channel +zeroclaw channel list # Ilista ang mga configured na channel +zeroclaw channel doctor # Suriin ang kalusugan ng channel +zeroclaw channel bind-telegram 123456789 + +# Cron + scheduling +zeroclaw cron list # Ilista ang mga naka-schedule na gawain +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Memory +zeroclaw memory list # Ilista ang mga memory entry +zeroclaw memory get # Kunin ang isang memory +zeroclaw memory stats # Estadistika ng memory + +# Auth profiles +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Hardware peripherals +zeroclaw hardware discover # I-scan ang mga konektadong device +zeroclaw peripheral list # Ilista ang mga konektadong peripheral +zeroclaw peripheral flash # I-flash ang firmware sa device + +# Migration +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell completions +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Buong commands reference: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Mga Kinakailangan + +
+Windows + +#### Kinakailangan + +1. **Visual Studio Build Tools** (nagbibigay ng MSVC linker at Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Sa panahon ng installation (o sa pamamagitan ng Visual Studio Installer), piliin ang **"Desktop development with C++"** workload. + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Pagkatapos ng installation, magbukas ng bagong terminal at patakbuhin ang `rustup default stable` para matiyak na aktibo ang stable toolchain. + +3. **I-verify** na pareho ay gumagana: + ```powershell + rustc --version + cargo --version + ``` + +#### Opsyonal + +- **Docker Desktop** — kinakailangan lamang kung gumagamit ng [Docker sandboxed runtime](#kasalukuyang-runtime-support) (`runtime.kind = "docker"`). I-install sa pamamagitan ng `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Kinakailangan + +1. **Build essentials:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** I-install ang Xcode Command Line Tools: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Tingnan ang [rustup.rs](https://rustup.rs) para sa mga detalye. + +3. **I-verify** na pareho ay gumagana: + ```bash + rustc --version + cargo --version + ``` + +#### One-Line Installer + +O laktawan ang mga hakbang sa itaas at i-install ang lahat (system deps, Rust, ZeroClaw) sa isang command: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Mga kinakailangan sa compilation resources + +Ang pagbuo mula sa source ay nangangailangan ng mas maraming resources kaysa sa pagpapatakbo ng resultang binary: + +| Resource | Minimum | Inirerekomenda | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Libreng disk** | 6 GB | 10 GB+ | + +Kung ang iyong host ay nasa ibaba ng minimum, gumamit ng pre-built binaries: + +```bash +./install.sh --prefer-prebuilt +``` + +Para sa binary-only install na walang source fallback: + +```bash +./install.sh --prebuilt-only +``` + +#### Opsyonal + +- **Docker** — kinakailangan lamang kung gumagamit ng [Docker sandboxed runtime](#kasalukuyang-runtime-support) (`runtime.kind = "docker"`). I-install sa pamamagitan ng iyong package manager o [docker.com](https://docs.docker.com/engine/install/). + +> **Tala:** Ang default na `cargo build --release` ay gumagamit ng `codegen-units=1` para mabawasan ang peak compile pressure. Para sa mas mabilis na build sa mga powerful machine, gamitin ang `cargo build --profile release-fast`. + +
+ + + +### Mga pre-built binary + +Ang mga release asset ay nai-publish para sa: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +I-download ang pinakabagong asset mula sa: + + +## Docs + +Gamitin ang mga ito kapag tapos ka na sa onboarding flow at gusto mo ng mas malalim na reference. + +- Magsimula sa [docs index](docs/README.md) para sa navigation at "ano ang nasaan." +- Basahin ang [architecture overview](docs/architecture.md) para sa buong system model. +- Gamitin ang [configuration reference](docs/reference/api/config-reference.md) kapag kailangan mo ng bawat key at halimbawa. +- Patakbuhin ang Gateway ayon sa [operational runbook](docs/ops/operations-runbook.md). +- Sundin ang [ZeroClaw Onboard](#mabilis-na-simula-tldr) para sa guided setup. +- I-debug ang mga karaniwang pagkabigo gamit ang [troubleshooting guide](docs/ops/troubleshooting.md). +- Suriin ang [security guidance](docs/security/README.md) bago i-expose ang kahit ano. + +### Mga reference doc + +- Documentation hub: [docs/README.md](docs/README.md) +- Unified docs TOC: [docs/SUMMARY.md](docs/SUMMARY.md) +- Commands reference: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Config reference: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Providers reference: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Channels reference: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Operations runbook: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Troubleshooting: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Mga collaboration doc + +- Contribution guide: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR workflow policy: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI workflow guide: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Reviewer playbook: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Security disclosure policy: [SECURITY.md](SECURITY.md) +- Documentation template: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Deployment + operations + +- Network deployment guide: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Proxy agent playbook: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Hardware guides: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +Ang ZeroClaw ay binuo para sa smooth crab 🦀, isang mabilis at mahusay na AI assistant. Binuo ni Argenis De La Rosa at ng komunidad. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Suportahan ang ZeroClaw + +Kung nakakatulong ang ZeroClaw sa iyong trabaho at gusto mong suportahan ang patuloy na development, maaari kang mag-donate dito: + +Buy Me a Coffee + +### 🙏 Espesyal na Pasasalamat + +Isang taos-pusong pasasalamat sa mga komunidad at institusyon na nagbibigay-inspirasyon at nagpapaganap sa open-source work na ito: + +- **Harvard University** — para sa pagpapaunlad ng intelektwal na kuryosidad at pagtulak sa mga hangganan ng kung ano ang posible. +- **MIT** — para sa pagtataguyod ng bukas na kaalaman, open source, at ang paniniwala na ang teknolohiya ay dapat na naa-access ng lahat. +- **Sundai Club** — para sa komunidad, enerhiya, at ang walang pagod na pagnanais na bumuo ng mga bagay na mahalaga. +- **Ang Mundo at Higit Pa** 🌍✨ — sa bawat contributor, panaginip, at builder na gumagawa ng open source bilang puwersa para sa kabutihan. Ito ay para sa inyo. + +Bumubuo kami ng bukas dahil ang mga pinakamahusay na ideya ay nanggagaling sa lahat ng dako. Kung binabasa mo ito, bahagi ka nito. Maligayang pagdating. 🦀❤️ + +## Mag-contribute + +Bago sa ZeroClaw? Hanapin ang mga issue na may label na [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — tingnan ang aming [Contributing Guide](CONTRIBUTING.md#first-time-contributors) kung paano magsimula. Ang AI/vibe-coded PRs ay welcome! 🤖 + +Tingnan ang [CONTRIBUTING.md](CONTRIBUTING.md) at [CLA.md](docs/contributing/cla.md). Mag-implement ng trait, mag-submit ng PR: + +- CI workflow guide: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Bagong `Provider` → `src/providers/` +- Bagong `Channel` → `src/channels/` +- Bagong `Observer` → `src/observability/` +- Bagong `Tool` → `src/tools/` +- Bagong `Memory` → `src/memory/` +- Bagong `Tunnel` → `src/tunnel/` +- Bagong `Peripheral` → `src/peripherals/` +- Bagong `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Opisyal na Repository at Babala sa Panggagaya + +**Ito ang tanging opisyal na ZeroClaw repository:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Ang anumang iba pang repository, organisasyon, domain, o package na nag-aangkin na "ZeroClaw" o nagpapahiwatig ng affiliation sa ZeroClaw Labs ay **hindi awtorisado at hindi konektado sa proyektong ito**. Ang mga kilalang unauthorized forks ay ililista sa [TRADEMARK.md](docs/maintainers/trademark.md). + +Kung makakita ka ng panggagaya o trademark misuse, mangyaring [mag-open ng issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Lisensya + +Ang ZeroClaw ay dual-licensed para sa maximum na openness at proteksyon ng contributor: + +| Lisensya | Gamit | +|---|---| +| [MIT](LICENSE-MIT) | Open-source, pananaliksik, akademiko, personal na gamit | +| [Apache 2.0](LICENSE-APACHE) | Patent protection, institutional, commercial deployment | + +Maaari kang pumili ng alinmang lisensya. **Awtomatikong nagbibigay ang mga contributor ng karapatan sa ilalim ng pareho** — tingnan ang [CLA.md](docs/contributing/cla.md) para sa buong contributor agreement. + +### Trademark + +Ang pangalang **ZeroClaw** at logo ay mga trademark ng ZeroClaw Labs. Ang lisensyang ito ay hindi nagbibigay ng pahintulot na gamitin ang mga ito upang ipahiwatig ang endorsement o affiliation. Tingnan ang [TRADEMARK.md](docs/maintainers/trademark.md) para sa mga pinapahintulutan at ipinagbabawal na gamit. + +### Mga Proteksyon ng Contributor + +- **Pinapanatili mo ang copyright** ng iyong mga kontribusyon +- **Patent grant** (Apache 2.0) ay nagpoprotekta sa iyo mula sa patent claims ng ibang mga contributor +- Ang iyong mga kontribusyon ay **permanenteng naka-attribute** sa commit history at [NOTICE](NOTICE) +- Walang trademark rights ang naililipat sa pamamagitan ng pag-contribute + +--- + +**ZeroClaw** — Zero overhead. Zero kompromiso. I-deploy kahit saan. I-swap ang kahit ano. 🦀 + +## Mga Contributor + + + ZeroClaw contributors + + +Ang listahang ito ay generated mula sa GitHub contributors graph at awtomatikong nag-a-update. + +## Star History + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.tr.md b/third_party/zeroclaw/README.tr.md new file mode 100644 index 0000000..29c8638 --- /dev/null +++ b/third_party/zeroclaw/README.tr.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Kişisel AI Asistanı

+ +

+ Sıfır ek yük. Sıfır uzlaşma. %100 Rust. %100 Agnostik.
+ ⚡️ $10'lık donanımda <5MB RAM ile çalışır: OpenClaw'dan %99 daha az bellek ve Mac mini'den %98 daha ucuz! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Harvard, MIT ve Sundai.Club topluluklarının öğrencileri ve üyeleri tarafından geliştirilmiştir. +

+ +

+ 🌐 Diller: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw, kendi cihazlarınızda çalıştırdığınız kişisel bir AI asistanıdır. Zaten kullandığınız kanallarda size yanıt verir (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work ve daha fazlası). Gerçek zamanlı kontrol için bir web paneli bulunur ve donanım çevre birimlerine bağlanabilir (ESP32, STM32, Arduino, Raspberry Pi). Gateway sadece kontrol düzlemidir — ürün asistanın kendisidir. + +Yerel, hızlı ve her zaman açık hissettiren kişisel, tek kullanıcılı bir asistan istiyorsanız, işte bu. + +

+ Web sitesi · + Belgeler · + Mimari · + Başlarken · + OpenClaw'dan Geçiş · + Sorun Giderme · + Discord +

+ +> **Önerilen kurulum:** terminalinizde `zeroclaw onboard` komutunu çalıştırın. ZeroClaw Onboard, gateway, workspace, kanallar ve sağlayıcı kurulumunda sizi adım adım yönlendirir. Önerilen kurulum yoludur ve macOS, Linux ve Windows'ta (WSL2 ile) çalışır. Yeni kurulum mu? Buradan başlayın: [Başlarken](#hızlı-başlangıç) + +### Abonelik Kimlik Doğrulama (OAuth) + +- **OpenAI Codex** (ChatGPT aboneliği) +- **Gemini** (Google OAuth) +- **Anthropic** (API anahtarı veya yetkilendirme tokeni) + +Model notu: birçok sağlayıcı/model desteklense de, en iyi deneyim için kullanabileceğiniz en güçlü son nesil modeli kullanın. Bkz. [Onboarding](#hızlı-başlangıç). + +Model yapılandırması + CLI: [Sağlayıcı referansı](docs/reference/api/providers-reference.md) +Yetkilendirme profili rotasyonu (OAuth vs API anahtarları) + failover: [Model failover](docs/reference/api/providers-reference.md) + +## Kurulum (önerilen) + +Çalışma zamanı: Kararlı Rust toolchain. Tek ikili dosya, çalışma zamanı bağımlılığı yok. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Tek tıkla kurulum + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` kurulumdan sonra workspace ve sağlayıcınızı yapılandırmak için otomatik olarak çalışır. + +## Hızlı başlangıç (TL;DR) + +Tam başlangıç kılavuzu (kimlik doğrulama, eşleştirme, kanallar): [Başlarken](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Kurulum + onboarding +./install.sh --api-key "sk-..." --provider openrouter + +# Gateway'i başlatın (webhook sunucusu + web paneli) +zeroclaw gateway # varsayılan: 127.0.0.1:42617 +zeroclaw gateway --port 0 # rastgele port (güvenlik güçlendirilmiş) + +# Asistanla konuşun +zeroclaw agent -m "Hello, ZeroClaw!" + +# Etkileşimli mod +zeroclaw agent + +# Tam otonom çalışma zamanını başlatın (gateway + kanallar + cron + hands) +zeroclaw daemon + +# Durumu kontrol edin +zeroclaw status + +# Tanılama çalıştırın +zeroclaw doctor +``` + +Güncelleme mi yapıyorsunuz? Güncellemeden sonra `zeroclaw doctor` çalıştırın. + +### Kaynaktan (geliştirme) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Geliştirici fallback (global kurulum yok):** komutların başına `cargo run --release --` ekleyin (örnek: `cargo run --release -- status`). + +## OpenClaw'dan Geçiş + +ZeroClaw, OpenClaw workspace'inizi, belleğinizi ve yapılandırmanızı içe aktarabilir: + +```bash +# Nelerin taşınacağını önizleyin (güvenli, salt okunur) +zeroclaw migrate openclaw --dry-run + +# Geçişi çalıştırın +zeroclaw migrate openclaw +``` + +Bu, bellek girişlerinizi, workspace dosyalarınızı ve yapılandırmanızı `~/.openclaw/` dizininden `~/.zeroclaw/` dizinine taşır. Yapılandırma otomatik olarak JSON'dan TOML'a dönüştürülür. + +## Güvenlik varsayılanları (DM erişimi) + +ZeroClaw gerçek mesajlaşma platformlarına bağlanır. Gelen DM'leri güvenilmeyen girdi olarak değerlendirin. + +Tam güvenlik kılavuzu: [SECURITY.md](SECURITY.md) + +Tüm kanallarda varsayılan davranış: + +- **DM eşleştirme** (varsayılan): bilinmeyen gönderenler kısa bir eşleştirme kodu alır ve bot mesajlarını işlemez. +- Şununla onaylayın: `zeroclaw pairing approve ` (ardından gönderen yerel izin listesine eklenir). +- Genel gelen DM'ler, `config.toml`'da açık bir opt-in gerektirir. +- Riskli veya yanlış yapılandırılmış DM politikalarını tespit etmek için `zeroclaw doctor` çalıştırın. + +**Otonomi seviyeleri:** + +| Seviye | Davranış | +|--------|----------| +| `ReadOnly` | Ajan gözlemleyebilir ama harekete geçemez | +| `Supervised` (varsayılan) | Ajan, orta/yüksek riskli işlemler için onay ile hareket eder | +| `Full` | Ajan politika sınırları içinde otonom hareket eder | + +**Sandboxing katmanları:** workspace izolasyonu, yol geçişi engelleme, komut izin listeleri, yasaklı yollar (`/etc`, `/root`, `~/.ssh`), hız sınırlama (maks eylem/saat, maliyet/gün sınırları). + + + + +### 📢 Duyurular + +Bu panoyu önemli bildirimler (breaking change'ler, güvenlik tavsiyeleri, bakım pencereleri ve sürüm engelleyicileri) için kullanın. + +| Tarih (UTC) | Seviye | Bildirim | Eylem | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Kritik_ | `openagen/zeroclaw`, `zeroclaw.org` veya `zeroclaw.net` ile **bağlantılı değiliz**. `zeroclaw.org` ve `zeroclaw.net` alan adları şu anda `openagen/zeroclaw` fork'una yönlendirmektedir ve bu alan adı/depo, resmi web sitemizi/projemizi taklit etmektedir. | Bu kaynaklardan gelen bilgilere, ikili dosyalara, bağış toplama faaliyetlerine veya duyurulara güvenmeyin. Yalnızca [bu depoyu](https://github.com/zeroclaw-labs/zeroclaw) ve doğrulanmış sosyal hesaplarımızı kullanın. | +| 2026-02-21 | _Önemli_ | Resmi web sitemiz artık yayında: [zeroclawlabs.ai](https://zeroclawlabs.ai). Lansman hazırlığı süresince gösterdiğiniz sabır için teşekkürler. Hâlâ taklit girişimleri görüyoruz, bu nedenle resmi kanallarımız üzerinden yayınlanmadıkça ZeroClaw adını kullanan herhangi bir yatırım veya bağış toplama faaliyetine **katılmayın**. | [Bu depoyu](https://github.com/zeroclaw-labs/zeroclaw) tek doğruluk kaynağı olarak kullanın. Resmi güncellemeler için [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Grup)](https://www.facebook.com/groups/zeroclawlabs) ve [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) hesaplarını takip edin. | +| 2026-02-19 | _Önemli_ | Anthropic, Kimlik Doğrulama ve Kimlik Bilgisi Kullanımı koşullarını 2026-02-19'da güncelledi. Claude Code OAuth token'ları (Free, Pro, Max) yalnızca Claude Code ve Claude.ai için tasarlanmıştır; Claude Free/Pro/Max'tan OAuth token'larını başka herhangi bir üründe, araçta veya hizmette (Agent SDK dahil) kullanmak izin verilmez ve Tüketici Hizmet Koşullarını ihlal edebilir. | Olası kayıpları önlemek için lütfen Claude Code OAuth entegrasyonlarından geçici olarak kaçının. Orijinal madde: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Öne Çıkanlar + +- **Varsayılan olarak hafif çalışma zamanı** — yaygın CLI ve durum iş akışları, release derlemelerinde birkaç megabaytlık bellek zarfında çalışır. +- **Maliyet etkin dağıtım** — $10'lık kartlar ve küçük bulut örnekleri için tasarlanmış, ağır çalışma zamanı bağımlılığı yok. +- **Hızlı soğuk başlatmalar** — tek ikili Rust çalışma zamanı, komut ve daemon başlatmayı neredeyse anlık tutar. +- **Taşınabilir mimari** — ARM, x86 ve RISC-V'de değiştirilebilir sağlayıcılar/kanallar/araçlarla tek ikili dosya. +- **Yerel gateway** — oturumlar, kanallar, araçlar, cron, SOP'lar ve olaylar için tek kontrol düzlemi. +- **Çok kanallı gelen kutusu** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket ve daha fazlası. +- **Çok ajanlı orkestrasyon (Hands)** — zamanlanmış çalışan ve zamanla daha akıllı hale gelen otonom ajan kümeleri. +- **Standart İşletim Prosedürleri (SOP'lar)** — MQTT, webhook, cron ve çevre birimi tetikleyicileriyle olay odaklı iş akışı otomasyonu. +- **Web paneli** — gerçek zamanlı sohbet, bellek tarayıcısı, yapılandırma düzenleyicisi, cron yöneticisi ve araç denetçisi ile React 19 + Vite web arayüzü. +- **Donanım çevre birimleri** — `Peripheral` trait'i üzerinden ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO. +- **Birinci sınıf araçlar** — shell, dosya G/Ç, tarayıcı, git, web fetch/search, MCP, Jira, Notion, Google Workspace ve 70+ daha fazlası. +- **Yaşam döngüsü hook'ları** — her aşamada LLM çağrılarını, araç yürütmelerini ve mesajları yakalayın ve değiştirin. +- **Yetenek platformu** — güvenlik denetimi ile yerleşik, topluluk ve workspace yetenekleri. +- **Tünel desteği** — uzaktan erişim için Cloudflare, Tailscale, ngrok, OpenVPN ve özel tüneller. + +### Ekipler neden ZeroClaw'u tercih ediyor + +- **Varsayılan olarak hafif:** küçük Rust ikili dosyası, hızlı başlatma, düşük bellek ayak izi. +- **Tasarımdan güvenli:** eşleştirme, sıkı sandboxing, açık izin listeleri, workspace kapsamlandırma. +- **Tamamen değiştirilebilir:** temel sistemler trait'lerdir (sağlayıcılar, kanallar, araçlar, bellek, tüneller). +- **Satıcı bağımlılığı yok:** OpenAI uyumlu sağlayıcı desteği + takılabilir özel endpoint'ler. + +## Benchmark Özeti (ZeroClaw vs OpenClaw, Tekrarlanabilir) + +Yerel makine hızlı benchmark'ı (macOS arm64, Şubat 2026) 0.8GHz edge donanımı için normalleştirilmiş. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Dil** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Başlatma (0.8GHz çekirdek)** | > 500s | > 30s | < 1s | **< 10ms** | +| **İkili Boyut** | ~28MB (dist) | N/A (Script'ler) | ~8MB | **~8.8 MB** | +| **Maliyet** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Herhangi bir donanım $10** | + +> Notlar: ZeroClaw sonuçları, `/usr/bin/time -l` kullanılarak release derlemelerinde ölçülmüştür. OpenClaw, Node.js çalışma zamanı gerektirir (tipik olarak ~390MB ek bellek yükü), NanoBot ise Python çalışma zamanı gerektirir. PicoClaw ve ZeroClaw statik ikili dosyalardır. Yukarıdaki RAM rakamları çalışma zamanı belleğidir; derleme gereksinimleri daha yüksektir. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Tekrarlanabilir yerel ölçüm + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Şimdiye kadar inşa ettiğimiz her şey + +### Çekirdek platform + +- Gateway HTTP/WS/SSE kontrol düzlemi: oturumlar, varlık, yapılandırma, cron, webhook'lar, web paneli ve eşleştirme. +- CLI yüzeyi: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Araç dispatch'i, prompt oluşturma, mesaj sınıflandırma ve bellek yükleme ile ajan orkestrasyon döngüsü. +- Güvenlik politikası uygulama, otonomi seviyeleri ve onay kapılamayla oturum modeli. +- 20+ LLM backend'inde failover, yeniden deneme ve model yönlendirme ile dayanıklı sağlayıcı wrapper'ı. + +### Kanallar + +Kanallar: WhatsApp (yerel), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Web paneli + +Gateway'den doğrudan sunulan React 19 + Vite 6 + Tailwind CSS 4 web paneli: + +- **Dashboard** — sistem genel görünümü, sağlık durumu, çalışma süresi, maliyet takibi +- **Ajan Sohbeti** — ajanla etkileşimli sohbet +- **Bellek** — bellek girişlerini gözatma ve yönetme +- **Yapılandırma** — yapılandırmayı görüntüleme ve düzenleme +- **Cron** — zamanlanmış görevleri yönetme +- **Araçlar** — kullanılabilir araçları gözatma +- **Günlükler** — ajan etkinlik günlüklerini görüntüleme +- **Maliyet** — token kullanımı ve maliyet takibi +- **Doctor** — sistem sağlık tanılaması +- **Entegrasyonlar** — entegrasyon durumu ve kurulumu +- **Eşleştirme** — cihaz eşleştirme yönetimi + +### Firmware hedefleri + +| Hedef | Platform | Amaç | +|-------|----------|------| +| ESP32 | Espressif ESP32 | Kablosuz çevresel ajan | +| ESP32-UI | ESP32 + Ekran | Görsel arayüzlü ajan | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Endüstriyel çevre birimi | +| Arduino | Arduino | Temel sensör/aktüatör köprüsü | +| Uno Q Bridge | Arduino Uno | Ajana seri köprü | + +### Araçlar + otomasyon + +- **Çekirdek:** shell, dosya okuma/yazma/düzenleme, git işlemleri, glob arama, içerik arama +- **Web:** tarayıcı kontrolü, web fetch, web arama, ekran görüntüsü, görüntü bilgisi, PDF okuma +- **Entegrasyonlar:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol araç wrapper'ı + ertelenmiş araç setleri +- **Zamanlama:** cron add/remove/update/run, zamanlama aracı +- **Bellek:** recall, store, forget, knowledge, project intel +- **Gelişmiş:** delegate (ajan-ajana), swarm, model switch/routing, security ops, cloud ops +- **Donanım:** board info, memory map, memory read (feature-gated) + +### Çalışma zamanı + güvenlik + +- **Otonomi seviyeleri:** ReadOnly, Supervised (varsayılan), Full. +- **Sandboxing:** workspace izolasyonu, yol geçişi engelleme, komut izin listeleri, yasaklı yollar, Landlock (Linux), Bubblewrap. +- **Hız sınırlama:** saat başı maks eylem, gün başı maks maliyet (yapılandırılabilir). +- **Onay kapılama:** orta/yüksek riskli işlemler için etkileşimli onay. +- **E-stop:** acil durum kapatma yeteneği. +- **129+ güvenlik testi** otomatik CI'da. + +### İşletim + paketleme + +- Web paneli doğrudan Gateway'den sunulur. +- Tünel desteği: Cloudflare, Tailscale, ngrok, OpenVPN, özel komut. +- Konteynerleştirilmiş yürütme için Docker çalışma zamanı adaptörü. +- CI/CD: beta (push'ta otomatik) → stable (manuel dispatch) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64) için önceden derlenmiş ikili dosyalar. + + +## Yapılandırma + +Minimal `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Tam yapılandırma referansı: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Kanal yapılandırması + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Tünel yapılandırması + +```toml +[tunnel] +kind = "cloudflare" # veya "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Ayrıntılar: [Kanal referansı](docs/reference/api/channels-reference.md) · [Yapılandırma referansı](docs/reference/api/config-reference.md) + +### Çalışma zamanı desteği (mevcut) + +- **`native`** (varsayılan) — doğrudan süreç yürütme, en hızlı yol, güvenilir ortamlar için ideal. +- **`docker`** — tam konteyner izolasyonu, zorunlu güvenlik politikaları, Docker gerektirir. + +Sıkı sandboxing veya ağ izolasyonu için `runtime.kind = "docker"` ayarlayın. + +## Abonelik Kimlik Doğrulama (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw, yerel abonelik yetkilendirme profillerini destekler (çoklu hesap, durağan halde şifreli). + +- Depolama dosyası: `~/.zeroclaw/auth-profiles.json` +- Şifreleme anahtarı: `~/.zeroclaw/.secret_key` +- Profil ID formatı: `:` (örnek: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT aboneliği) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Kontrol / yenileme / profil değiştirme +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Ajanı abonelik auth ile çalıştırma +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Ajan workspace + yetenekler + +Workspace kök dizini: `~/.zeroclaw/workspace/` (config ile yapılandırılabilir). + +Enjekte edilen prompt dosyaları: +- `IDENTITY.md` — ajan kişiliği ve rolü +- `USER.md` — kullanıcı bağlamı ve tercihleri +- `MEMORY.md` — uzun vadeli gerçekler ve dersler +- `AGENTS.md` — oturum kuralları ve başlatma kuralları +- `SOUL.md` — temel kimlik ve çalışma prensipleri + +Yetenekler: `~/.zeroclaw/workspace/skills//SKILL.md` veya `SKILL.toml`. + +```bash +# Yüklü yetenekleri listele +zeroclaw skills list + +# Git'ten yükle +zeroclaw skills install https://github.com/user/my-skill.git + +# Yüklemeden önce güvenlik denetimi +zeroclaw skills audit https://github.com/user/my-skill.git + +# Bir yeteneği kaldır +zeroclaw skills remove my-skill +``` + +## CLI komutları + +```bash +# Workspace yönetimi +zeroclaw onboard # Rehberli kurulum sihirbazı +zeroclaw status # Daemon/ajan durumunu göster +zeroclaw doctor # Sistem tanılaması çalıştır + +# Gateway + daemon +zeroclaw gateway # Gateway sunucusunu başlat (127.0.0.1:42617) +zeroclaw daemon # Tam otonom çalışma zamanını başlat + +# Ajan +zeroclaw agent # Etkileşimli sohbet modu +zeroclaw agent -m "message" # Tek mesaj modu + +# Hizmet yönetimi +zeroclaw service install # OS hizmeti olarak yükle (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Kanallar +zeroclaw channel list # Yapılandırılmış kanalları listele +zeroclaw channel doctor # Kanal sağlığını kontrol et +zeroclaw channel bind-telegram 123456789 + +# Cron + zamanlama +zeroclaw cron list # Zamanlanmış görevleri listele +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Bellek +zeroclaw memory list # Bellek girişlerini listele +zeroclaw memory get # Bir bellek al +zeroclaw memory stats # Bellek istatistikleri + +# Yetkilendirme profilleri +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Donanım çevre birimleri +zeroclaw hardware discover # Bağlı cihazları tara +zeroclaw peripheral list # Bağlı çevre birimlerini listele +zeroclaw peripheral flash # Cihaza firmware yükle + +# Geçiş +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Kabuk tamamlama +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Tam komut referansı: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Ön koşullar + +
+Windows + +#### Gerekli + +1. **Visual Studio Build Tools** (MSVC linker ve Windows SDK sağlar): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Kurulum sırasında (veya Visual Studio Installer aracılığıyla) **"Desktop development with C++"** workload'unu seçin. + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Kurulumdan sonra yeni bir terminal açın ve kararlı toolchain'in aktif olduğundan emin olmak için `rustup default stable` çalıştırın. + +3. Her ikisinin de çalıştığını **doğrulayın**: + ```powershell + rustc --version + cargo --version + ``` + +#### İsteğe bağlı + +- **Docker Desktop** — yalnızca [Docker sandbox'lu çalışma zamanı](#çalışma-zamanı-desteği-mevcut) (`runtime.kind = "docker"`) kullanıyorsanız gereklidir. `winget install Docker.DockerDesktop` ile yükleyin. + +
+ +
+Linux / macOS + +#### Gerekli + +1. **Derleme araçları:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Xcode Command Line Tools yükleyin: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Ayrıntılar için [rustup.rs](https://rustup.rs) sayfasına bakın. + +3. Her ikisinin de çalıştığını **doğrulayın**: + ```bash + rustc --version + cargo --version + ``` + +#### Tek satır yükleyici + +Veya yukarıdaki adımları atlayın ve her şeyi (sistem bağımlılıkları, Rust, ZeroClaw) tek komutla yükleyin: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Derleme kaynak gereksinimleri + +Kaynaktan derleme, ortaya çıkan ikili dosyayı çalıştırmaktan daha fazla kaynak gerektirir: + +| Kaynak | Minimum | Önerilen | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Boş disk** | 6 GB | 10 GB+ | + +Host'unuz minimumun altındaysa, önceden derlenmiş ikili dosyaları kullanın: + +```bash +./install.sh --prefer-prebuilt +``` + +Kaynak fallback'ı olmadan yalnızca ikili kurulum zorlamak için: + +```bash +./install.sh --prebuilt-only +``` + +#### İsteğe bağlı + +- **Docker** — yalnızca [Docker sandbox'lu çalışma zamanı](#çalışma-zamanı-desteği-mevcut) (`runtime.kind = "docker"`) kullanıyorsanız gereklidir. Paket yöneticiniz veya [docker.com](https://docs.docker.com/engine/install/) aracılığıyla yükleyin. + +> **Not:** Varsayılan `cargo build --release`, derleme baskısını düşürmek için `codegen-units=1` kullanır. Güçlü makinelerde daha hızlı derlemeler için `cargo build --profile release-fast` kullanın. + +
+ + + +### Önceden derlenmiş ikili dosyalar + +Sürüm varlıkları şunlar için yayınlanır: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +En son varlıkları şuradan indirin: + + +## Belgeler + +Onboarding akışını geçtikten sonra daha derin referans istediğinizde bunları kullanın. + +- Navigasyon ve "ne nerede" için [belge dizini](docs/README.md) ile başlayın. +- Tam sistem modeli için [mimari genel bakış](docs/architecture.md) okuyun. +- Her anahtar ve örneğe ihtiyacınız olduğunda [yapılandırma referansı](docs/reference/api/config-reference.md) kullanın. +- [İşletim el kitabı](docs/ops/operations-runbook.md) ile Gateway'i kitabına göre çalıştırın. +- Rehberli kurulum için [ZeroClaw Onboard](#hızlı-başlangıç) takip edin. +- Yaygın hataları [sorun giderme kılavuzu](docs/ops/troubleshooting.md) ile ayıklayın. +- Herhangi bir şeyi açığa çıkarmadan önce [güvenlik rehberliği](docs/security/README.md) gözden geçirin. + +### Referans belgeleri + +- Belge merkezi: [docs/README.md](docs/README.md) +- Birleşik içindekiler: [docs/SUMMARY.md](docs/SUMMARY.md) +- Komut referansı: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Yapılandırma referansı: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Sağlayıcı referansı: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Kanal referansı: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- İşletim el kitabı: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Sorun giderme: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### İşbirliği belgeleri + +- Katkıda bulunma rehberi: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR iş akışı politikası: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI iş akışı rehberi: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- İncelemeci el kitabı: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Güvenlik açıklama politikası: [SECURITY.md](SECURITY.md) +- Belge şablonu: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Dağıtım + işletim + +- Ağ dağıtım rehberi: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Proxy ajan el kitabı: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Donanım rehberleri: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw, smooth crab 🦀 için inşa edildi — hızlı ve verimli bir AI asistanı. Argenis De La Rosa ve topluluk tarafından geliştirildi. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## ZeroClaw'u Destekleyin + +ZeroClaw işinize yarıyorsa ve süregelen geliştirmeyi desteklemek istiyorsanız, buradan bağış yapabilirsiniz: + +Buy Me a Coffee + +### 🙏 Özel Teşekkürler + +Bu açık kaynak çalışmaya ilham veren ve yakıt sağlayan topluluklara ve kurumlara içten bir teşekkür: + +- **Harvard University** — entelektüel merakı beslemek ve mümkün olanın sınırlarını zorlamak için. +- **MIT** — açık bilgiyi, açık kaynağı ve teknolojinin herkes için erişilebilir olması gerektiği inancını savunmak için. +- **Sundai Club** — topluluk, enerji ve önemli şeyler inşa etmeye yönelik amansız istek için. +- **Dünya ve Ötesi** 🌍✨ — açık kaynağı iyilik için bir güç yapan her katkıda bulunan, hayalci ve inşaatçıya. Bu sizin için. + +En iyi fikirler her yerden geldiği için açıkta inşa ediyoruz. Bunu okuyorsanız, bunun bir parçasısınız. Hoş geldiniz. 🦀❤️ + +## Katkıda Bulunma + +ZeroClaw'da yeni misiniz? [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) etiketli issue'ları arayın — nasıl başlayacağınızı öğrenmek için [Katkıda Bulunma Rehberi](CONTRIBUTING.md#first-time-contributors)mize bakın. AI/vibe-coded PR'lar hoş geldiniz! 🤖 + +[CONTRIBUTING.md](CONTRIBUTING.md) ve [CLA.md](docs/contributing/cla.md)'ye bakın. Bir trait uygulayın, PR gönderin: + +- CI iş akışı rehberi: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Yeni `Provider` → `src/providers/` +- Yeni `Channel` → `src/channels/` +- Yeni `Observer` → `src/observability/` +- Yeni `Tool` → `src/tools/` +- Yeni `Memory` → `src/memory/` +- Yeni `Tunnel` → `src/tunnel/` +- Yeni `Peripheral` → `src/peripherals/` +- Yeni `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Resmi Depo ve Kimlik Taklidi Uyarısı + +**Bu, tek resmi ZeroClaw deposudur:** + +> https://github.com/zeroclaw-labs/zeroclaw + +"ZeroClaw" olduğunu iddia eden veya ZeroClaw Labs ile bağlantı ima eden başka herhangi bir depo, organizasyon, alan adı veya paket **yetkisiz olup bu projeyle bağlantılı değildir**. Bilinen yetkisiz fork'lar [TRADEMARK.md](docs/maintainers/trademark.md)'de listelenecektir. + +Kimlik taklidi veya ticari marka kötüye kullanımıyla karşılaşırsanız, lütfen [bir issue açın](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Lisans + +ZeroClaw, maksimum açıklık ve katkıda bulunan koruması için çift lisanslıdır: + +| Lisans | Kullanım senaryosu | +|--------|-------------------| +| [MIT](LICENSE-MIT) | Açık kaynak, araştırma, akademik, kişisel kullanım | +| [Apache 2.0](LICENSE-APACHE) | Patent koruması, kurumsal, ticari dağıtım | + +Her iki lisanstan birini seçebilirsiniz. **Katkıda bulunanlar her ikisi altında otomatik olarak hak verir** — tam katkıda bulunan sözleşmesi için [CLA.md](docs/contributing/cla.md)'ye bakın. + +### Ticari Marka + +**ZeroClaw** adı ve logosu, ZeroClaw Labs'ın ticari markalarıdır. Bu lisans, onay veya bağlantı ima etmek için bunları kullanma izni vermez. İzin verilen ve yasaklanan kullanımlar için [TRADEMARK.md](docs/maintainers/trademark.md)'ye bakın. + +### Katkıda Bulunan Korumaları + +- Katkılarınızın **telif hakkını elinizde tutarsınız** +- **Patent hakkı** (Apache 2.0) sizi diğer katkıda bulunanların patent taleplerinden korur +- Katkılarınız commit geçmişinde ve [NOTICE](NOTICE)'da **kalıcı olarak atfedilir** +- Katkıda bulunarak hiçbir ticari marka hakkı devredilmez + +--- + +**ZeroClaw** — Sıfır ek yük. Sıfır uzlaşma. Her yere dağıtın. Her şeyi değiştirin. 🦀 + +## Katkıda Bulunanlar + + + ZeroClaw contributors + + +Bu liste GitHub katkıda bulunanlar grafiğinden oluşturulur ve otomatik olarak güncellenir. + +## Yıldız Geçmişi + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.uk.md b/third_party/zeroclaw/README.uk.md new file mode 100644 index 0000000..ef65e64 --- /dev/null +++ b/third_party/zeroclaw/README.uk.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Персональний AI-Асистент

+ +

+ Нуль накладних витрат. Нуль компромісів. 100% Rust. 100% Агностичний.
+ ⚡️ Працює на обладнанні за $10 з <5MB RAM: це на 99% менше пам'яті, ніж OpenClaw, і на 98% дешевше, ніж Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Створено студентами та учасниками спільнот Harvard, MIT і Sundai.Club. +

+ +

+ 🌐 Мови: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw — це персональний AI-асистент, який ви запускаєте на власних пристроях. Він відповідає вам у каналах, які ви вже використовуєте (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work та інші). Він має веб-панель керування для контролю в реальному часі та може підключатися до апаратних периферійних пристроїв (ESP32, STM32, Arduino, Raspberry Pi). Gateway — це лише площина управління, а продукт — це асистент. + +Якщо вам потрібен персональний, одного користувача асистент, який відчувається локальним, швидким і завжди доступним — це він. + +

+ Вебсайт · + Документація · + Архітектура · + Початок роботи · + Міграція з OpenClaw · + Усунення неполадок · + Discord +

+ +> **Рекомендований спосіб налаштування:** виконайте `zeroclaw onboard` у вашому терміналі. ZeroClaw Onboard покроково проведе вас через налаштування gateway, робочого простору, каналів і провайдера. Це рекомендований шлях налаштування, який працює на macOS, Linux і Windows (через WSL2). Нова установка? Почніть тут: [Початок роботи](#швидкий-старт-tldr) + +### Subscription Auth (OAuth) + +- **OpenAI Codex** (підписка ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (API-ключ або токен авторизації) + +Примітка щодо моделей: хоча підтримується багато провайдерів/моделей, для найкращого досвіду використовуйте найпотужнішу модель останнього покоління, доступну вам. Дивіться [Онбординг](#швидкий-старт-tldr). + +Конфігурація моделей + CLI: [Довідник провайдерів](docs/reference/api/providers-reference.md) +Ротація профілів авторизації (OAuth vs API-ключі) + аварійне перемикання: [Аварійне перемикання моделей](docs/reference/api/providers-reference.md) + +## Встановлення (рекомендовано) + +Середовище виконання: стабільний набір інструментів Rust. Єдиний бінарний файл, без залежностей середовища виконання. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Встановлення одним кліком + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` запускається автоматично після встановлення для налаштування вашого робочого простору та провайдера. + +## Швидкий старт (TL;DR) + +Повний посібник для початківців (авторизація, сполучення, канали): [Початок роботи](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Встановлення + онбординг +./install.sh --api-key "sk-..." --provider openrouter + +# Запуск gateway (вебхук-сервер + веб-панель) +zeroclaw gateway # за замовчуванням: 127.0.0.1:42617 +zeroclaw gateway --port 0 # випадковий порт (посилена безпека) + +# Розмова з асистентом +zeroclaw agent -m "Hello, ZeroClaw!" + +# Інтерактивний режим +zeroclaw agent + +# Запуск повного автономного середовища (gateway + канали + cron + hands) +zeroclaw daemon + +# Перевірка статусу +zeroclaw status + +# Запуск діагностики +zeroclaw doctor +``` + +Оновлюєтесь? Виконайте `zeroclaw doctor` після оновлення. + +### З вихідного коду (розробка) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Резервний варіант для розробників (без глобальної установки):** додайте до команд префікс `cargo run --release --` (приклад: `cargo run --release -- status`). + +## Міграція з OpenClaw + +ZeroClaw може імпортувати ваш робочий простір, пам'ять та конфігурацію OpenClaw: + +```bash +# Попередній перегляд того, що буде мігровано (безпечно, лише читання) +zeroclaw migrate openclaw --dry-run + +# Виконання міграції +zeroclaw migrate openclaw +``` + +Це мігрує ваші записи пам'яті, файли робочого простору та конфігурацію з `~/.openclaw/` до `~/.zeroclaw/`. Конфігурація автоматично конвертується з JSON у TOML. + +## Стандартні налаштування безпеки (доступ через DM) + +ZeroClaw підключається до реальних платформ обміну повідомленнями. Розглядайте вхідні DM як ненадійний ввід. + +Повний посібник з безпеки: [SECURITY.md](SECURITY.md) + +Поведінка за замовчуванням на всіх каналах: + +- **Сполучення через DM** (за замовчуванням): невідомі відправники отримують короткий код сполучення, і бот не обробляє їхні повідомлення. +- Підтвердіть за допомогою: `zeroclaw pairing approve ` (після чого відправник додається до локального списку дозволених). +- Публічні вхідні DM вимагають явного увімкнення в `config.toml`. +- Виконайте `zeroclaw doctor` для виявлення ризикованих або неправильно налаштованих політик DM. + +**Рівні автономності:** + +| Рівень | Поведінка | +|--------|-----------| +| `ReadOnly` | Агент може спостерігати, але не діяти | +| `Supervised` (за замовчуванням) | Агент діє із затвердженням для операцій середнього/високого ризику | +| `Full` | Агент діє автономно в межах політики | + +**Шари ізоляції:** ізоляція робочого простору, блокування обходу шляху, списки дозволених команд, заборонені шляхи (`/etc`, `/root`, `~/.ssh`), обмеження частоти (макс. дій/годину, ліміти витрат/день). + + + + +### Оголошення + +Використовуйте цю дошку для важливих повідомлень (критичні зміни, рекомендації з безпеки, вікна обслуговування та блокери випусків). + +| Дата (UTC) | Рівень | Повідомлення | Дія | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Критичний_ | Ми **не пов'язані** з `openagen/zeroclaw`, `zeroclaw.org` або `zeroclaw.net`. Домени `zeroclaw.org` та `zeroclaw.net` наразі вказують на форк `openagen/zeroclaw`, і цей домен/репозиторій видають себе за наш офіційний вебсайт/проєкт. | Не довіряйте інформації, бінарним файлам, збору коштів або оголошенням з цих джерел. Використовуйте лише [цей репозиторій](https://github.com/zeroclaw-labs/zeroclaw) та наші верифіковані соціальні акаунти. | +| 2026-02-21 | _Важливий_ | Наш офіційний вебсайт тепер доступний: [zeroclawlabs.ai](https://zeroclawlabs.ai). Дякуємо за терпіння, поки ми готували запуск. Ми все ще бачимо спроби імітації, тому **не** приєднуйтесь до будь-якої інвестиційної або збіркової діяльності, що використовує назву ZeroClaw, якщо вона не опублікована через наші офіційні канали. | Використовуйте [цей репозиторій](https://github.com/zeroclaw-labs/zeroclaw) як єдине джерело істини. Слідкуйте за [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs) та [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) для офіційних оновлень. | +| 2026-02-19 | _Важливий_ | Anthropic оновила умови автентифікації та використання облікових даних 2026-02-19. OAuth-токени Claude Code (Free, Pro, Max) призначені виключно для Claude Code та Claude.ai; використання OAuth-токенів Claude Free/Pro/Max у будь-якому іншому продукті, інструменті або сервісі (включаючи Agent SDK) не дозволяється та може порушувати Умови обслуговування для споживачів. | Будь ласка, тимчасово уникайте інтеграцій Claude Code OAuth для запобігання потенційних втрат. Оригінальний пункт: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Основні можливості + +- **Легке середовище за замовчуванням** — типові робочі процеси CLI та статусу працюють у конверті пам'яті декількох мегабайтів на релізних збірках. +- **Економічне розгортання** — розроблено для плат за $10 і малих хмарних інстансів, без важких залежностей середовища виконання. +- **Швидкий холодний старт** — однобінарне середовище Rust забезпечує майже миттєвий запуск команд і демона. +- **Портативна архітектура** — один бінарний файл для ARM, x86 та RISC-V зі змінними провайдерами/каналами/інструментами. +- **Локальний Gateway** — єдина площина управління для сесій, каналів, інструментів, cron, SOP та подій. +- **Багатоканальна скринька** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket та інші. +- **Мультиагентна оркестрація (Hands)** — автономні рої агентів, що працюють за розкладом і стають розумнішими з часом. +- **Стандартні операційні процедури (SOPs)** — автоматизація робочих процесів на основі подій з MQTT, webhook, cron та тригерами периферійних пристроїв. +- **Веб-панель керування** — веб-інтерфейс React 19 + Vite з чатом у реальному часі, браузером пам'яті, редактором конфігурації, менеджером cron та інспектором інструментів. +- **Апаратні периферійні пристрої** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO через трейт `Peripheral`. +- **Першокласні інструменти** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace та 70+ інших. +- **Хуки життєвого циклу** — перехоплення та модифікація викликів LLM, виконань інструментів і повідомлень на кожному етапі. +- **Платформа навичок** — вбудовані, спільноти та навички робочого простору з аудитом безпеки. +- **Підтримка тунелів** — Cloudflare, Tailscale, ngrok, OpenVPN та власні тунелі для віддаленого доступу. + +### Чому команди обирають ZeroClaw + +- **Легкий за замовчуванням:** малий бінарний файл Rust, швидкий запуск, низьке споживання пам'яті. +- **Безпечний за проєктуванням:** сполучення, суворе ізолювання, явні списки дозволених, обмеження робочого простору. +- **Повністю змінний:** основні системи — це трейти (провайдери, канали, інструменти, пам'ять, тунелі). +- **Без прив'язки:** підтримка провайдерів, сумісних з OpenAI + підключувані власні ендпоінти. + +## Порівняльний бенчмарк (ZeroClaw проти OpenClaw, відтворюваний) + +Локальний швидкий бенчмарк (macOS arm64, лютий 2026), нормалізований для edge-обладнання 0,8 ГГц. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Мова** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Запуск (ядро 0,8 ГГц)**| > 500s | > 30s | < 1s | **< 10ms** | +| **Розмір бінарного файлу**| ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Вартість** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Будь-яке обладнання $10** | + +> Примітки: результати ZeroClaw виміряні на релізних збірках за допомогою `/usr/bin/time -l`. OpenClaw вимагає середовище Node.js (зазвичай ~390MB додаткових накладних витрат пам'яті), тоді як NanoBot вимагає середовище Python. PicoClaw і ZeroClaw — це статичні бінарні файли. Наведені цифри RAM — це пам'ять часу виконання; вимоги до компіляції вищі. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Відтворюване локальне вимірювання + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Все, що ми побудували на сьогодні + +### Основна платформа + +- Gateway HTTP/WS/SSE площина управління з сесіями, присутністю, конфігурацією, cron, вебхуками, веб-панеллю та сполученням. +- CLI-поверхня: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Цикл оркестрації агента з диспетчеризацією інструментів, побудовою промптів, класифікацією повідомлень та завантаженням пам'яті. +- Модель сесій з примусовим виконанням політик безпеки, рівнями автономності та затвердженням операцій. +- Стійкий обгортка провайдера з аварійним перемиканням, повторами та маршрутизацією моделей через 20+ LLM-бекендів. + +### Канали + +Канали: WhatsApp (нативний), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +З feature-гейтами: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Веб-панель керування + +Веб-панель React 19 + Vite 6 + Tailwind CSS 4, що обслуговується безпосередньо з Gateway: + +- **Панель керування** — огляд системи, стан здоров'я, час роботи, відстеження витрат +- **Чат з агентом** — інтерактивний чат з агентом +- **Пам'ять** — перегляд та керування записами пам'яті +- **Конфігурація** — перегляд та редагування конфігурації +- **Cron** — керування запланованими завданнями +- **Інструменти** — перегляд доступних інструментів +- **Логи** — перегляд журналів активності агента +- **Витрати** — відстеження використання токенів та витрат +- **Діагностика** — діагностика стану системи +- **Інтеграції** — стан та налаштування інтеграцій +- **Сполучення** — керування сполученням пристроїв + +### Цільові прошивки + +| Ціль | Платформа | Призначення | +|------|-----------|-------------| +| ESP32 | Espressif ESP32 | Бездротовий периферійний агент | +| ESP32-UI | ESP32 + Display | Агент з візуальним інтерфейсом | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Промисловий периферійний пристрій | +| Arduino | Arduino | Базовий міст датчиків/виконавчих пристроїв | +| Uno Q Bridge | Arduino Uno | Послідовний міст до агента | + +### Інструменти + автоматизація + +- **Основні:** shell, file read/write/edit, git operations, glob search, content search +- **Веб:** browser control, web fetch, web search, screenshot, image info, PDF read +- **Інтеграції:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + відкладені набори інструментів +- **Планування:** cron add/remove/update/run, schedule tool +- **Пам'ять:** recall, store, forget, knowledge, project intel +- **Розширені:** delegate (агент-агенту), swarm, model switch/routing, security ops, cloud ops +- **Апаратне забезпечення:** board info, memory map, memory read (з feature-гейтом) + +### Середовище виконання + безпека + +- **Рівні автономності:** ReadOnly, Supervised (за замовчуванням), Full. +- **Ізоляція:** ізоляція робочого простору, блокування обходу шляху, списки дозволених команд, заборонені шляхи, Landlock (Linux), Bubblewrap. +- **Обмеження частоти:** максимум дій на годину, максимум витрат на день (налаштовуване). +- **Затвердження операцій:** інтерактивне затвердження для операцій середнього/високого ризику. +- **Екстрена зупинка:** можливість екстреного вимкнення. +- **129+ тестів безпеки** в автоматизованому CI. + +### Операції + пакування + +- Веб-панель, що обслуговується безпосередньо з Gateway. +- Підтримка тунелів: Cloudflare, Tailscale, ngrok, OpenVPN, власна команда. +- Docker runtime adapter для контейнерного виконання. +- CI/CD: beta (автоматично при push) → stable (ручний запуск) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Попередньо зібрані бінарні файли для Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Конфігурація + +Мінімальний `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Повний довідник конфігурації: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Конфігурація каналів + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Конфігурація тунелів + +```toml +[tunnel] +kind = "cloudflare" # або "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Деталі: [Довідник каналів](docs/reference/api/channels-reference.md) · [Довідник конфігурації](docs/reference/api/config-reference.md) + +### Підтримка середовищ виконання (поточна) + +- **`native`** (за замовчуванням) — пряме виконання процесу, найшвидший шлях, ідеальний для довірених середовищ. +- **`docker`** — повна контейнерна ізоляція, примусові політики безпеки, вимагає Docker. + +Встановіть `runtime.kind = "docker"` для суворої ізоляції або мережевої ізоляції. + +## Subscription Auth (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw підтримує профілі авторизації на основі підписки (мультиакаунт, шифрування в стані спокою). + +- Файл сховища: `~/.zeroclaw/auth-profiles.json` +- Ключ шифрування: `~/.zeroclaw/.secret_key` +- Формат ідентифікатора профілю: `:` (приклад: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (підписка ChatGPT) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Перевірка / оновлення / перемикання профілю +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Запуск агента з авторизацією підписки +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Робочий простір агента + навички + +Корінь робочого простору: `~/.zeroclaw/workspace/` (налаштовується через конфігурацію). + +Вбудовані файли промптів: +- `IDENTITY.md` — особистість та роль агента +- `USER.md` — контекст та налаштування користувача +- `MEMORY.md` — довгострокові факти та уроки +- `AGENTS.md` — конвенції сесій та правила ініціалізації +- `SOUL.md` — основна ідентичність та операційні принципи + +Навички: `~/.zeroclaw/workspace/skills//SKILL.md` або `SKILL.toml`. + +```bash +# Список встановлених навичок +zeroclaw skills list + +# Встановлення з git +zeroclaw skills install https://github.com/user/my-skill.git + +# Аудит безпеки перед встановленням +zeroclaw skills audit https://github.com/user/my-skill.git + +# Видалення навички +zeroclaw skills remove my-skill +``` + +## Команди CLI + +```bash +# Керування робочим простором +zeroclaw onboard # Покроковий майстер налаштування +zeroclaw status # Показати стан демона/агента +zeroclaw doctor # Запустити діагностику системи + +# Gateway + демон +zeroclaw gateway # Запустити сервер gateway (127.0.0.1:42617) +zeroclaw daemon # Запустити повне автономне середовище + +# Агент +zeroclaw agent # Інтерактивний режим чату +zeroclaw agent -m "message" # Режим одного повідомлення + +# Керування сервісом +zeroclaw service install # Встановити як системний сервіс (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Канали +zeroclaw channel list # Список налаштованих каналів +zeroclaw channel doctor # Перевірка стану каналів +zeroclaw channel bind-telegram 123456789 + +# Cron + планування +zeroclaw cron list # Список запланованих завдань +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Пам'ять +zeroclaw memory list # Список записів пам'яті +zeroclaw memory get # Отримати запис пам'яті +zeroclaw memory stats # Статистика пам'яті + +# Профілі авторизації +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Апаратні периферійні пристрої +zeroclaw hardware discover # Сканування підключених пристроїв +zeroclaw peripheral list # Список підключених периферійних пристроїв +zeroclaw peripheral flash # Прошивка пристрою + +# Міграція +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Автодоповнення оболонки +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Повний довідник команд: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Передумови + +
+Windows + +#### Обов'язково + +1. **Visual Studio Build Tools** (надає компонувальник MSVC та Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Під час встановлення (або через Visual Studio Installer) виберіть робоче навантаження **"Desktop development with C++"**. + +2. **Набір інструментів Rust:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Після встановлення відкрийте новий термінал і виконайте `rustup default stable`, щоб переконатися, що стабільний набір інструментів активний. + +3. **Перевірте**, що обидва працюють: + ```powershell + rustc --version + cargo --version + ``` + +#### Необов'язково + +- **Docker Desktop** — потрібен лише при використанні [ізольованого середовища Docker](#підтримка-середовищ-виконання-поточна) (`runtime.kind = "docker"`). Встановлення через `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Обов'язково + +1. **Базові інструменти збірки:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Встановіть Xcode Command Line Tools: `xcode-select --install` + +2. **Набір інструментів Rust:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Деталі на [rustup.rs](https://rustup.rs). + +3. **Перевірте**, що обидва працюють: + ```bash + rustc --version + cargo --version + ``` + +#### Встановлення одним рядком + +Або пропустіть кроки вище і встановіть все (системні залежності, Rust, ZeroClaw) однією командою: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Вимоги до ресурсів для компіляції + +Збірка з вихідного коду вимагає більше ресурсів, ніж запуск результуючого бінарного файлу: + +| Ресурс | Мінімум | Рекомендовано | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Вільний диск** | 6 GB | 10 GB+ | + +Якщо ваш хост нижче мінімуму, використовуйте попередньо зібрані бінарні файли: + +```bash +./install.sh --prefer-prebuilt +``` + +Для встановлення лише бінарного файлу без резервного варіанту з вихідного коду: + +```bash +./install.sh --prebuilt-only +``` + +#### Необов'язково + +- **Docker** — потрібен лише при використанні [ізольованого середовища Docker](#підтримка-середовищ-виконання-поточна) (`runtime.kind = "docker"`). Встановлення через менеджер пакетів або [docker.com](https://docs.docker.com/engine/install/). + +> **Примітка:** Стандартна команда `cargo build --release` використовує `codegen-units=1` для зниження пікового навантаження при компіляції. Для швидших збірок на потужних машинах використовуйте `cargo build --profile release-fast`. + +
+ + + +### Попередньо зібрані бінарні файли + +Релізні артефакти публікуються для: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Завантажте останні артефакти з: + + +## Документація + +Використовуйте ці матеріали, коли ви пройшли онбординг і хочете глибшу довідку. + +- Почніть з [індексу документації](docs/README.md) для навігації та "що де знаходиться". +- Прочитайте [огляд архітектури](docs/architecture.md) для повної моделі системи. +- Використовуйте [довідник конфігурації](docs/reference/api/config-reference.md), коли вам потрібен кожен ключ і приклад. +- Запускайте Gateway за інструкцією з [операційного посібника](docs/ops/operations-runbook.md). +- Слідуйте [ZeroClaw Onboard](#швидкий-старт-tldr) для покрокового налаштування. +- Діагностуйте типові збої за допомогою [посібника з усунення неполадок](docs/ops/troubleshooting.md). +- Перегляньте [рекомендації з безпеки](docs/security/README.md) перед будь-яким відкритим доступом. + +### Довідкова документація + +- Хаб документації: [docs/README.md](docs/README.md) +- Єдиний зміст документації: [docs/SUMMARY.md](docs/SUMMARY.md) +- Довідник команд: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Довідник конфігурації: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Довідник провайдерів: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Довідник каналів: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Операційний посібник: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Усунення неполадок: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Документація для співпраці + +- Посібник з внеску: [CONTRIBUTING.md](CONTRIBUTING.md) +- Політика робочого процесу PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Посібник CI робочих процесів: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Посібник рецензента: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Політика розкриття вразливостей: [SECURITY.md](SECURITY.md) +- Шаблон документації: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Розгортання + операції + +- Посібник з мережевого розгортання: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Посібник проксі-агента: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Посібники з апаратного забезпечення: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw створений для smooth crab 🦀, швидкого та ефективного AI-асистента. Створений Argenis De La Rosa та спільнотою. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Підтримайте ZeroClaw + +Якщо ZeroClaw допомагає вашій роботі і ви хочете підтримати подальшу розробку, ви можете зробити пожертву тут: + +Buy Me a Coffee + +### Особлива подяка + +Щира подяка спільнотам та установам, які надихають та живлять цю відкриту роботу: + +- **Harvard University** — за виховання інтелектуальної допитливості та розширення меж можливого. +- **MIT** — за підтримку відкритих знань, відкритого коду та переконання, що технології повинні бути доступними для кожного. +- **Sundai Club** — за спільноту, енергію та невпинне прагнення створювати речі, що мають значення. +- **Світ та за його межами** — кожному учаснику, мрійнику та творцю, які роблять відкритий код силою добра. Це для вас. + +Ми будуємо відкрито, тому що найкращі ідеї приходять звідусіль. Якщо ви це читаєте, ви вже частина цього. Ласкаво просимо. 🦀 + +## Внесок + +Новачок у ZeroClaw? Шукайте завдання з міткою [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — дивіться наш [Посібник з внеску](CONTRIBUTING.md#first-time-contributors) для початку. PR з AI-допомогою вітаються! + +Дивіться [CONTRIBUTING.md](CONTRIBUTING.md) та [CLA.md](docs/contributing/cla.md). Реалізуйте трейт, подайте PR: + +- Посібник CI робочих процесів: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Новий `Provider` → `src/providers/` +- Новий `Channel` → `src/channels/` +- Новий `Observer` → `src/observability/` +- Новий `Tool` → `src/tools/` +- Новий `Memory` → `src/memory/` +- Новий `Tunnel` → `src/tunnel/` +- Новий `Peripheral` → `src/peripherals/` +- Новий `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## Офіційний репозиторій та попередження про імітацію + +**Це єдиний офіційний репозиторій ZeroClaw:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Будь-який інший репозиторій, організація, домен або пакет, що претендує на назву "ZeroClaw" або натякає на зв'язок з ZeroClaw Labs, є **неавторизованим і не пов'язаним з цим проєктом**. Відомі неавторизовані форки перелічені в [TRADEMARK.md](docs/maintainers/trademark.md). + +Якщо ви зіткнулися з імітацією або зловживанням торговою маркою, будь ласка, [створіть issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Ліцензія + +ZeroClaw має подвійну ліцензію для максимальної відкритості та захисту учасників: + +| Ліцензія | Варіант використання | +|---|---| +| [MIT](LICENSE-MIT) | Відкритий код, дослідження, академічне, особисте використання | +| [Apache 2.0](LICENSE-APACHE) | Патентний захист, інституційне, комерційне розгортання | + +Ви можете обрати будь-яку ліцензію. **Учасники автоматично надають права за обома** — дивіться [CLA.md](docs/contributing/cla.md) для повної угоди учасника. + +### Торгова марка + +Назва та логотип **ZeroClaw** є торговими марками ZeroClaw Labs. Ця ліцензія не надає дозволу використовувати їх для підтвердження або зв'язку. Дивіться [TRADEMARK.md](docs/maintainers/trademark.md) для дозволених та заборонених використань. + +### Захист учасників + +- Ви **зберігаєте авторські права** на свої внески +- **Патентне надання** (Apache 2.0) захищає вас від патентних претензій інших учасників +- Ваші внески **назавжди атрибутовані** в історії комітів та [NOTICE](NOTICE) +- Жодних прав на торгову марку не передається при внеску + +--- + +**ZeroClaw** — Нуль накладних витрат. Нуль компромісів. Розгортайте будь-де. Замінюйте будь-що. 🦀 + +## Учасники + + + ZeroClaw contributors + + +Цей список генерується з графіку учасників GitHub і оновлюється автоматично. + +## Історія зірок + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.ur.md b/third_party/zeroclaw/README.ur.md new file mode 100644 index 0000000..fc47b5a --- /dev/null +++ b/third_party/zeroclaw/README.ur.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — ذاتی AI اسسٹنٹ

+ +

+ صفر اوور ہیڈ۔ صفر سمجھوتا۔ 100% Rust۔ 100% غیر جانبدار۔
+ ⚡️ $10 ہارڈویئر پر <5MB RAM کے ساتھ چلتا ہے: یہ OpenClaw سے 99% کم میموری اور Mac mini سے 98% سستا ہے! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Harvard، MIT، اور Sundai.Club کمیونٹیز کے طلباء اور اراکین نے بنایا۔ +

+ +

+ 🌐 زبانیں: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw ایک ذاتی AI اسسٹنٹ ہے جسے آپ اپنے آلات پر چلاتے ہیں۔ یہ آپ کو ان چینلز پر جواب دیتا ہے جو آپ پہلے سے استعمال کرتے ہیں (WhatsApp، Telegram، Slack، Discord، Signal، iMessage، Matrix، IRC، Email، Bluesky، Nostr، Mattermost، Nextcloud Talk، DingTalk، Lark، QQ، Reddit، LinkedIn، Twitter، MQTT، WeChat Work، اور مزید)۔ اس میں ریئل ٹائم کنٹرول کے لیے ویب ڈیش بورڈ ہے اور یہ ہارڈویئر پیری فیرلز (ESP32، STM32، Arduino، Raspberry Pi) سے جڑ سکتا ہے۔ Gateway صرف control plane ہے — پروڈکٹ اسسٹنٹ ہے۔ + +اگر آپ ایک ذاتی، واحد صارف اسسٹنٹ چاہتے ہیں جو مقامی، تیز، اور ہمیشہ فعال محسوس ہو، تو یہ ہے۔ + +

+ ویب سائٹ · + دستاویزات · + آرکیٹیکچر · + شروع کریں · + OpenClaw سے منتقلی · + مسائل حل کریں · + Discord +

+ +> **تجویز کردہ سیٹ اپ:** اپنے ٹرمینل میں `zeroclaw onboard` چلائیں۔ ZeroClaw Onboard آپ کو gateway، workspace، چینلز، اور provider ترتیب دینے میں مرحلہ وار رہنمائی کرتا ہے۔ یہ تجویز کردہ سیٹ اپ راستہ ہے اور macOS، Linux، اور Windows (WSL2 کے ذریعے) پر کام کرتا ہے۔ نئی تنصیب؟ یہاں سے شروع کریں: [شروع کریں](#فوری-آغاز) + +### سبسکرپشن تصدیق (OAuth) + +- **OpenAI Codex** (ChatGPT سبسکرپشن) +- **Gemini** (Google OAuth) +- **Anthropic** (API key یا auth token) + +ماڈل نوٹ: اگرچہ بہت سے providers/ماڈلز سپورٹ کیے جاتے ہیں، بہترین تجربے کے لیے اپنے دستیاب سب سے مضبوط جدید ترین ماڈل کا استعمال کریں۔ دیکھیں [Onboarding](#فوری-آغاز)۔ + +ماڈلز کنفیگ + CLI: [Providers حوالہ](docs/reference/api/providers-reference.md) +Auth پروفائل روٹیشن (OAuth بمقابلہ API keys) + failover: [Model failover](docs/reference/api/providers-reference.md) + +## انسٹال (تجویز کردہ) + +رن ٹائم: Rust stable toolchain۔ واحد بائنری، کوئی runtime dependencies نہیں۔ + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### ایک کلک بوٹسٹریپ + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` انسٹال کے بعد خود بخود چلتا ہے تاکہ آپ کا workspace اور provider ترتیب دیا جا سکے۔ + +## فوری آغاز (TL;DR) + +مکمل ابتدائی گائیڈ (تصدیق، pairing، چینلز): [شروع کریں](docs/setup-guides/one-click-bootstrap.md) + +```bash +# انسٹال + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Gateway شروع کریں (webhook سرور + ویب ڈیش بورڈ) +zeroclaw gateway # ڈیفالٹ: 127.0.0.1:42617 +zeroclaw gateway --port 0 # بے ترتیب پورٹ (سیکیورٹی مضبوط) + +# اسسٹنٹ سے بات کریں +zeroclaw agent -m "Hello, ZeroClaw!" + +# انٹرایکٹو موڈ +zeroclaw agent + +# مکمل خودمختار رن ٹائم شروع کریں (gateway + چینلز + cron + hands) +zeroclaw daemon + +# اسٹیٹس چیک کریں +zeroclaw status + +# تشخیص چلائیں +zeroclaw doctor +``` + +اپ گریڈ کر رہے ہیں؟ اپ ڈیٹ کے بعد `zeroclaw doctor` چلائیں۔ + +### سورس سے (ترقی) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Dev متبادل (بغیر global انسٹال):** کمانڈز کے آگے `cargo run --release --` لگائیں (مثال: `cargo run --release -- status`)۔ + +## OpenClaw سے منتقلی + +ZeroClaw آپ کا OpenClaw workspace، میموری، اور کنفیگریشن درآمد کر سکتا ہے: + +```bash +# دیکھیں کیا منتقل ہوگا (محفوظ، صرف پڑھنے) +zeroclaw migrate openclaw --dry-run + +# منتقلی چلائیں +zeroclaw migrate openclaw +``` + +یہ آپ کے میموری اندراجات، workspace فائلیں، اور کنفیگریشن `~/.openclaw/` سے `~/.zeroclaw/` میں منتقل کرتا ہے۔ کنفیگ خود بخود JSON سے TOML میں تبدیل ہو جاتی ہے۔ + +## سیکیورٹی ڈیفالٹس (DM رسائی) + +ZeroClaw حقیقی پیغام رسانی سطحوں سے جڑتا ہے۔ آنے والے DMs کو غیر بھروسہ مند ان پٹ سمجھیں۔ + +مکمل سیکیورٹی گائیڈ: [SECURITY.md](SECURITY.md) + +تمام چینلز پر ڈیفالٹ رویہ: + +- **DM pairing** (ڈیفالٹ): نامعلوم بھیجنے والوں کو ایک مختصر pairing کوڈ ملتا ہے اور بوٹ ان کے پیغام پر عمل نہیں کرتا۔ +- منظوری دیں: `zeroclaw pairing approve ` (پھر بھیجنے والا مقامی اجازت نامہ میں شامل ہو جاتا ہے)۔ +- عوامی آنے والے DMs کے لیے `config.toml` میں واضح opt-in ضروری ہے۔ +- خطرناک یا غلط ترتیب شدہ DM پالیسیوں کا پتہ لگانے کے لیے `zeroclaw doctor` چلائیں۔ + +**خودمختاری کی سطحیں:** + +| سطح | رویہ | +|-------|----------| +| `ReadOnly` | ایجنٹ مشاہدہ کر سکتا ہے لیکن عمل نہیں کر سکتا | +| `Supervised` (ڈیفالٹ) | ایجنٹ درمیانے/زیادہ خطرے والے آپریشنز کے لیے منظوری کے ساتھ عمل کرتا ہے | +| `Full` | ایجنٹ پالیسی حدود میں خودمختار طور پر عمل کرتا ہے | + +**سینڈ باکسنگ پرتیں:** workspace تنہائی، path traversal بلاکنگ، کمانڈ اجازت نامے، ممنوعہ راستے (`/etc`، `/root`، `~/.ssh`)، شرح محدودیت (زیادہ سے زیادہ عمل/گھنٹہ، لاگت/دن کی حد)۔ + + + + +### 📢 اعلانات + +اہم نوٹسز کے لیے یہ بورڈ استعمال کریں (تبدیلیاں جو توڑ دیں، سیکیورٹی مشاورتیں، دیکھ بھال کی کھڑکیاں، اور ریلیز بلاکرز)۔ + +| تاریخ (UTC) | سطح | نوٹس | عمل | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _اہم ترین_ | ہم `openagen/zeroclaw`، `zeroclaw.org` یا `zeroclaw.net` سے **وابستہ نہیں** ہیں۔ `zeroclaw.org` اور `zeroclaw.net` ڈومینز فی الحال `openagen/zeroclaw` فورک کی طرف اشارہ کرتے ہیں، اور وہ ڈومین/ریپوزٹری ہماری سرکاری ویب سائٹ/پروجیکٹ کی نقل کر رہے ہیں۔ | ان ذرائع سے معلومات، بائنریز، فنڈ ریزنگ، یا اعلانات پر بھروسہ نہ کریں۔ صرف [یہ ریپوزٹری](https://github.com/zeroclaw-labs/zeroclaw) اور ہمارے تصدیق شدہ سوشل اکاؤنٹس استعمال کریں۔ | +| 2026-02-21 | _اہم_ | ہماری سرکاری ویب سائٹ اب فعال ہے: [zeroclawlabs.ai](https://zeroclawlabs.ai)۔ لانچ کی تیاری کے دوران آپ کے صبر کا شکریہ۔ ہم اب بھی نقل کی کوششیں دیکھ رہے ہیں، لہذا ZeroClaw نام کا دعویٰ کرنے والی کسی بھی سرمایہ کاری یا فنڈ ریزنگ سرگرمی میں **شامل نہ ہوں** جب تک کہ یہ ہمارے سرکاری چینلز کے ذریعے شائع نہ ہو۔ | [یہ ریپوزٹری](https://github.com/zeroclaw-labs/zeroclaw) کو واحد سچائی کا ذریعہ استعمال کریں۔ سرکاری اپ ڈیٹس کے لیے [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21)، [Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs)، اور [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) فالو کریں۔ | +| 2026-02-19 | _اہم_ | Anthropic نے 2026-02-19 کو تصدیق اور اسناد کے استعمال کی شرائط اپ ڈیٹ کیں۔ Claude Code OAuth ٹوکنز (Free، Pro، Max) خصوصی طور پر Claude Code اور Claude.ai کے لیے ہیں؛ Claude Free/Pro/Max سے OAuth ٹوکنز کسی اور پروڈکٹ، ٹول، یا سروس (بشمول Agent SDK) میں استعمال کرنا اجازت یافتہ نہیں ہے اور صارف سروس کی شرائط کی خلاف ورزی ہو سکتی ہے۔ | براہ کرم ممکنہ نقصان سے بچنے کے لیے عارضی طور پر Claude Code OAuth انٹیگریشنز سے گریز کریں۔ اصل شق: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use)۔ | + +## خصوصیات + +- **ڈیفالٹ طور پر ہلکا رن ٹائم** — عام CLI اور اسٹیٹس ورک فلوز ریلیز بلڈز پر چند میگا بائٹ میموری میں چلتے ہیں۔ +- **لاگت سے مؤثر تعیناتی** — $10 بورڈز اور چھوٹے کلاؤڈ انسٹینسز کے لیے ڈیزائن کیا گیا، کوئی بھاری runtime dependencies نہیں۔ +- **تیز کولڈ اسٹارٹ** — واحد بائنری Rust رن ٹائم کمانڈ اور daemon اسٹارٹ اپ کو تقریباً فوری رکھتا ہے۔ +- **پورٹیبل آرکیٹیکچر** — ARM، x86، اور RISC-V پر ایک بائنری، قابل تبادلہ providers/چینلز/ٹولز کے ساتھ۔ +- **لوکل فرسٹ Gateway** — سیشنز، چینلز، ٹولز، cron، SOPs، اور ایونٹس کے لیے واحد control plane۔ +- **ملٹی چینل ان باکس** — WhatsApp، Telegram، Slack، Discord، Signal، iMessage، Matrix، IRC، Email، Bluesky، Nostr، Mattermost، Nextcloud Talk، DingTalk، Lark، QQ، Reddit، LinkedIn، Twitter، MQTT، WeChat Work، WebSocket، اور مزید۔ +- **ملٹی ایجنٹ آرکیسٹریشن (Hands)** — خودمختار ایجنٹ جھنڈ جو شیڈول پر چلتے ہیں اور وقت کے ساتھ ذہین ہوتے ہیں۔ +- **سٹینڈرڈ آپریٹنگ پروسیجرز (SOPs)** — MQTT، webhook، cron، اور پیری فیرل ٹرگرز کے ساتھ ایونٹ پر مبنی ورک فلو آٹومیشن۔ +- **ویب ڈیش بورڈ** — ریئل ٹائم چیٹ، میموری براؤزر، کنفیگ ایڈیٹر، cron مینیجر، اور ٹول انسپیکٹر کے ساتھ React 19 + Vite ویب UI۔ +- **ہارڈویئر پیری فیرلز** — `Peripheral` trait کے ذریعے ESP32، STM32 Nucleo، Arduino، Raspberry Pi GPIO۔ +- **فرسٹ کلاس ٹولز** — shell، file I/O، browser، git، web fetch/search، MCP، Jira، Notion، Google Workspace، اور 70+ مزید۔ +- **لائف سائیکل ہکس** — ہر مرحلے پر LLM کالز، ٹول ایگزیکیوشنز، اور پیغامات کو روکیں اور ترمیم کریں۔ +- **اسکلز پلیٹ فارم** — بلٹ ان، کمیونٹی، اور workspace اسکلز سیکیورٹی آڈٹنگ کے ساتھ۔ +- **ٹنل سپورٹ** — ریموٹ رسائی کے لیے Cloudflare، Tailscale، ngrok، OpenVPN، اور کسٹم ٹنلز۔ + +### ٹیمیں ZeroClaw کیوں چنتی ہیں + +- **ڈیفالٹ طور پر ہلکا:** چھوٹی Rust بائنری، تیز اسٹارٹ اپ، کم میموری فٹ پرنٹ۔ +- **ڈیزائن سے محفوظ:** pairing، سخت سینڈ باکسنگ، واضح اجازت نامے، workspace سکوپنگ۔ +- **مکمل طور پر قابل تبادلہ:** بنیادی نظام traits ہیں (providers، چینلز، ٹولز، میموری، tunnels)۔ +- **کوئی lock-in نہیں:** OpenAI ہم آہنگ provider سپورٹ + پلگ ایبل کسٹم endpoints۔ + +## بینچ مارک سنیپ شاٹ (ZeroClaw بمقابلہ OpenClaw، قابل تکرار) + +مقامی مشین فوری بینچ مارک (macOS arm64، فروری 2026) 0.8GHz ایج ہارڈویئر کے لیے نارملائز۔ + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **زبان** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **اسٹارٹ اپ (0.8GHz کور)** | > 500s | > 30s | < 1s | **< 10ms** | +| **بائنری سائز** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **لاگت** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **کوئی بھی ہارڈویئر $10** | + +> نوٹ: ZeroClaw نتائج `/usr/bin/time -l` استعمال کرتے ہوئے ریلیز بلڈز پر ماپے گئے ہیں۔ OpenClaw کو Node.js رن ٹائم کی ضرورت ہے (عام طور پر ~390MB اضافی میموری اوور ہیڈ)، جبکہ NanoBot کو Python رن ٹائم کی ضرورت ہے۔ PicoClaw اور ZeroClaw سٹیٹک بائنریز ہیں۔ اوپر RAM اعداد رن ٹائم میموری ہیں؛ بلڈ ٹائم کمپائلیشن ضروریات زیادہ ہیں۔ + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### قابل تکرار مقامی پیمائش + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## ہم نے اب تک جو کچھ بنایا + +### بنیادی پلیٹ فارم + +- سیشنز، presence، کنفیگ، cron، webhooks، ویب ڈیش بورڈ، اور pairing کے ساتھ Gateway HTTP/WS/SSE control plane۔ +- CLI سطح: `gateway`، `agent`، `onboard`، `doctor`، `status`، `service`، `migrate`، `auth`، `cron`، `channel`، `skills`۔ +- ٹول dispatch، prompt تعمیر، پیغام درجہ بندی، اور میموری لوڈنگ کے ساتھ ایجنٹ آرکیسٹریشن لوپ۔ +- سیکیورٹی پالیسی نفاذ، خودمختاری کی سطحوں، اور منظوری گیٹنگ کے ساتھ سیشن ماڈل۔ +- 20+ LLM بیک اینڈز میں failover، retry، اور model routing کے ساتھ لچکدار provider ریپر۔ + +### چینلز + +چینلز: WhatsApp (native)، Telegram، Slack، Discord، Signal، iMessage، Matrix، IRC، Email، Bluesky، DingTalk، Lark، Mattermost، Nextcloud Talk، Nostr، QQ، Reddit، LinkedIn، Twitter، MQTT، WeChat Work، WATI، Mochat، Linq، Notion، WebSocket، ClawdTalk۔ + +Feature-gated: Matrix (`channel-matrix`)، Lark (`channel-lark`)، Nostr (`channel-nostr`)۔ + +### ویب ڈیش بورڈ + +Gateway سے براہ راست فراہم کردہ React 19 + Vite 6 + Tailwind CSS 4 ویب ڈیش بورڈ: + +- **Dashboard** — سسٹم جائزہ، صحت کی حالت، اپ ٹائم، لاگت ٹریکنگ +- **Agent Chat** — ایجنٹ کے ساتھ انٹرایکٹو چیٹ +- **Memory** — میموری اندراجات براؤز اور منظم کریں +- **Config** — کنفیگریشن دیکھیں اور ترمیم کریں +- **Cron** — شیڈولڈ ٹاسکس کا انتظام کریں +- **Tools** — دستیاب ٹولز براؤز کریں +- **Logs** — ایجنٹ سرگرمی لاگز دیکھیں +- **Cost** — ٹوکن استعمال اور لاگت ٹریکنگ +- **Doctor** — سسٹم صحت تشخیص +- **Integrations** — انٹیگریشن اسٹیٹس اور سیٹ اپ +- **Pairing** — ڈیوائس pairing مینجمنٹ + +### فرم ویئر اہداف + +| ہدف | پلیٹ فارم | مقصد | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | وائرلیس پیری فیرل ایجنٹ | +| ESP32-UI | ESP32 + Display | بصری انٹرفیس کے ساتھ ایجنٹ | +| STM32 Nucleo | STM32 (ARM Cortex-M) | صنعتی پیری فیرل | +| Arduino | Arduino | بنیادی سینسر/ایکچویٹر بریج | +| Uno Q Bridge | Arduino Uno | ایجنٹ کے لیے سیریل بریج | + +### ٹولز + آٹومیشن + +- **بنیادی:** shell، file read/write/edit، git آپریشنز، glob search، content search +- **ویب:** browser control، web fetch، web search، screenshot، image info، PDF read +- **انٹیگریشنز:** Jira، Notion، Google Workspace، Microsoft 365، LinkedIn، Composio، Pushover +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **شیڈولنگ:** cron add/remove/update/run، schedule tool +- **میموری:** recall، store، forget، knowledge، project intel +- **ایڈوانسڈ:** delegate (ایجنٹ سے ایجنٹ)، swarm، model switch/routing، security ops، cloud ops +- **ہارڈویئر:** board info، memory map، memory read (feature-gated) + +### رن ٹائم + حفاظت + +- **خودمختاری کی سطحیں:** ReadOnly، Supervised (ڈیفالٹ)، Full۔ +- **سینڈ باکسنگ:** workspace تنہائی، path traversal بلاکنگ، کمانڈ اجازت نامے، ممنوعہ راستے، Landlock (Linux)، Bubblewrap۔ +- **شرح محدودیت:** فی گھنٹہ زیادہ سے زیادہ عمل، فی دن زیادہ سے زیادہ لاگت (قابل ترتیب)۔ +- **منظوری گیٹنگ:** درمیانے/زیادہ خطرے والے آپریشنز کے لیے انٹرایکٹو منظوری۔ +- **E-stop:** ایمرجنسی شٹ ڈاؤن صلاحیت۔ +- **129+ سیکیورٹی ٹیسٹس** خودکار CI میں۔ + +### Ops + پیکیجنگ + +- Gateway سے براہ راست فراہم کردہ ویب ڈیش بورڈ۔ +- ٹنل سپورٹ: Cloudflare، Tailscale، ngrok، OpenVPN، کسٹم کمانڈ۔ +- کنٹینرائزڈ ایگزیکیوشن کے لیے Docker رن ٹائم اڈاپٹر۔ +- CI/CD: beta (push پر خودکار) → stable (دستی dispatch) → Docker، crates.io، Scoop، AUR، Homebrew، tweet۔ +- Linux (x86_64، aarch64، armv7)، macOS (x86_64، aarch64)، Windows (x86_64) کے لیے پری بلٹ بائنریز۔ + + +## کنفیگریشن + +کم از کم `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +مکمل کنفیگریشن حوالہ: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md)۔ + +### چینل کنفیگریشن + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### ٹنل کنفیگریشن + +```toml +[tunnel] +kind = "cloudflare" # یا "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +تفصیلات: [چینل حوالہ](docs/reference/api/channels-reference.md) · [کنفیگ حوالہ](docs/reference/api/config-reference.md) + +### رن ٹائم سپورٹ (موجودہ) + +- **`native`** (ڈیفالٹ) — براہ راست process ایگزیکیوشن، تیز ترین راستہ، بھروسہ مند ماحول کے لیے مثالی۔ +- **`docker`** — مکمل کنٹینر تنہائی، نافذ سیکیورٹی پالیسیاں، Docker ضروری ہے۔ + +سخت سینڈ باکسنگ یا نیٹ ورک تنہائی کے لیے `runtime.kind = "docker"` سیٹ کریں۔ + +## سبسکرپشن تصدیق (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw سبسکرپشن نیٹو auth پروفائلز سپورٹ کرتا ہے (ملٹی اکاؤنٹ، آرام پر خفیہ)۔ + +- اسٹور فائل: `~/.zeroclaw/auth-profiles.json` +- خفیہ کاری کلید: `~/.zeroclaw/.secret_key` +- پروفائل id فارمیٹ: `:` (مثال: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (ChatGPT سبسکرپشن) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# چیک / ریفریش / پروفائل تبدیل کریں +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# سبسکرپشن auth کے ساتھ ایجنٹ چلائیں +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## ایجنٹ workspace + اسکلز + +Workspace روٹ: `~/.zeroclaw/workspace/` (config کے ذریعے قابل ترتیب)۔ + +انجیکٹ کردہ prompt فائلیں: +- `IDENTITY.md` — ایجنٹ شخصیت اور کردار +- `USER.md` — صارف سیاق و سباق اور ترجیحات +- `MEMORY.md` — طویل مدتی حقائق اور اسباق +- `AGENTS.md` — سیشن کنونشنز اور آغاز کے قواعد +- `SOUL.md` — بنیادی شناخت اور آپریٹنگ اصول + +اسکلز: `~/.zeroclaw/workspace/skills//SKILL.md` یا `SKILL.toml`۔ + +```bash +# انسٹال شدہ اسکلز کی فہرست +zeroclaw skills list + +# git سے انسٹال +zeroclaw skills install https://github.com/user/my-skill.git + +# انسٹال سے پہلے سیکیورٹی آڈٹ +zeroclaw skills audit https://github.com/user/my-skill.git + +# اسکل ہٹائیں +zeroclaw skills remove my-skill +``` + +## CLI کمانڈز + +```bash +# Workspace مینجمنٹ +zeroclaw onboard # رہنمائی شدہ سیٹ اپ وزرڈ +zeroclaw status # daemon/ایجنٹ اسٹیٹس دکھائیں +zeroclaw doctor # سسٹم تشخیص چلائیں + +# Gateway + daemon +zeroclaw gateway # Gateway سرور شروع کریں (127.0.0.1:42617) +zeroclaw daemon # مکمل خودمختار رن ٹائم شروع کریں + +# ایجنٹ +zeroclaw agent # انٹرایکٹو چیٹ موڈ +zeroclaw agent -m "message" # واحد پیغام موڈ + +# سروس مینجمنٹ +zeroclaw service install # OS سروس کے طور پر انسٹال کریں (launchd/systemd) +zeroclaw service start|stop|restart|status + +# چینلز +zeroclaw channel list # ترتیب شدہ چینلز کی فہرست +zeroclaw channel doctor # چینل صحت چیک کریں +zeroclaw channel bind-telegram 123456789 + +# Cron + شیڈولنگ +zeroclaw cron list # شیڈولڈ جابز کی فہرست +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# میموری +zeroclaw memory list # میموری اندراجات کی فہرست +zeroclaw memory get # میموری حاصل کریں +zeroclaw memory stats # میموری اعداد و شمار + +# Auth پروفائلز +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# ہارڈویئر پیری فیرلز +zeroclaw hardware discover # منسلک آلات اسکین کریں +zeroclaw peripheral list # منسلک پیری فیرلز کی فہرست +zeroclaw peripheral flash # آلے پر فرم ویئر فلیش کریں + +# منتقلی +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# شیل تکمیلات +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +مکمل کمانڈز حوالہ: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## شرائط + +
+Windows + +#### ضروری + +1. **Visual Studio Build Tools** (MSVC لنکر اور Windows SDK فراہم کرتا ہے): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + انسٹالیشن کے دوران (یا Visual Studio Installer کے ذریعے)، **"Desktop development with C++"** ورک لوڈ منتخب کریں۔ + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + انسٹالیشن کے بعد، نیا ٹرمینل کھولیں اور `rustup default stable` چلائیں تاکہ مستحکم toolchain فعال ہو۔ + +3. **تصدیق** کریں دونوں کام کر رہے ہیں: + ```powershell + rustc --version + cargo --version + ``` + +#### اختیاری + +- **Docker Desktop** — صرف اس صورت میں ضروری ہے جب [Docker sandboxed runtime](#رن-ٹائم-سپورٹ-موجودہ) (`runtime.kind = "docker"`) استعمال کر رہے ہوں۔ `winget install Docker.DockerDesktop` سے انسٹال کریں۔ + +
+ +
+Linux / macOS + +#### ضروری + +1. **Build essentials:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Xcode Command Line Tools انسٹال کریں: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + تفصیلات کے لیے [rustup.rs](https://rustup.rs) دیکھیں۔ + +3. **تصدیق** کریں دونوں کام کر رہے ہیں: + ```bash + rustc --version + cargo --version + ``` + +#### ایک لائن انسٹالر + +یا اوپر کے مراحل چھوڑیں اور سب کچھ (سسٹم dependencies، Rust، ZeroClaw) ایک کمانڈ میں انسٹال کریں: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### کمپائلیشن وسائل کی ضروریات + +سورس سے بنانا نتیجے میں آنے والی بائنری چلانے سے زیادہ وسائل کی ضرورت ہے: + +| وسیلہ | کم از کم | تجویز کردہ | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **خالی ڈسک** | 6 GB | 10 GB+ | + +اگر آپ کا ہوسٹ کم از کم سے نیچے ہے، پری بلٹ بائنریز استعمال کریں: + +```bash +./install.sh --prefer-prebuilt +``` + +بغیر سورس فال بیک صرف بائنری انسٹال کے لیے: + +```bash +./install.sh --prebuilt-only +``` + +#### اختیاری + +- **Docker** — صرف اس صورت میں ضروری ہے جب [Docker sandboxed runtime](#رن-ٹائم-سپورٹ-موجودہ) (`runtime.kind = "docker"`) استعمال کر رہے ہوں۔ اپنے پیکیج مینیجر یا [docker.com](https://docs.docker.com/engine/install/) سے انسٹال کریں۔ + +> **نوٹ:** ڈیفالٹ `cargo build --release` چوٹی کمپائل دباؤ کم کرنے کے لیے `codegen-units=1` استعمال کرتا ہے۔ طاقتور مشینوں پر تیز بلڈز کے لیے، `cargo build --profile release-fast` استعمال کریں۔ + +
+ + + +### پری بلٹ بائنریز + +ریلیز اثاثے شائع کیے جاتے ہیں: + +- Linux: `x86_64`، `aarch64`، `armv7` +- macOS: `x86_64`، `aarch64` +- Windows: `x86_64` + +تازہ ترین اثاثے یہاں سے ڈاؤن لوڈ کریں: + + +## دستاویزات + +جب آپ onboarding فلو سے گزر چکے ہوں اور گہرا حوالہ چاہتے ہوں تو یہ استعمال کریں۔ + +- نیویگیشن اور "کیا کہاں ہے" کے لیے [دستاویزات فہرست](docs/README.md) سے شروع کریں۔ +- مکمل سسٹم ماڈل کے لیے [آرکیٹیکچر جائزہ](docs/architecture.md) پڑھیں۔ +- جب آپ کو ہر key اور مثال چاہیے تو [کنفیگریشن حوالہ](docs/reference/api/config-reference.md) استعمال کریں۔ +- [آپریشنل رن بک](docs/ops/operations-runbook.md) کے ساتھ Gateway کتاب کے مطابق چلائیں۔ +- رہنمائی شدہ سیٹ اپ کے لیے [ZeroClaw Onboard](#فوری-آغاز) فالو کریں۔ +- عام ناکامیوں کو [مسائل حل کرنے کی گائیڈ](docs/ops/troubleshooting.md) سے ڈیبگ کریں۔ +- کچھ بھی ظاہر کرنے سے پہلے [سیکیورٹی رہنمائی](docs/security/README.md) کا جائزہ لیں۔ + +### حوالہ جاتی دستاویزات + +- دستاویزات مرکز: [docs/README.md](docs/README.md) +- متحد دستاویزات TOC: [docs/SUMMARY.md](docs/SUMMARY.md) +- کمانڈز حوالہ: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- کنفیگ حوالہ: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Providers حوالہ: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- چینلز حوالہ: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- آپریشنل رن بک: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- مسائل حل: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### تعاون دستاویزات + +- شراکت گائیڈ: [CONTRIBUTING.md](CONTRIBUTING.md) +- PR ورک فلو پالیسی: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI ورک فلو گائیڈ: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- جائزہ کار پلے بک: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- سیکیورٹی افشاء پالیسی: [SECURITY.md](SECURITY.md) +- دستاویزات ٹیمپلیٹ: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### تعیناتی + آپریشنز + +- نیٹ ورک تعیناتی گائیڈ: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- پراکسی ایجنٹ پلے بک: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- ہارڈویئر گائیڈز: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw smooth crab 🦀 کے لیے بنایا گیا تھا، ایک تیز اور مؤثر AI اسسٹنٹ۔ Argenis De La Rosa اور کمیونٹی نے بنایا۔ + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## ZeroClaw کی حمایت کریں + +اگر ZeroClaw آپ کے کام میں مدد کرتا ہے اور آپ جاری ترقی کی حمایت کرنا چاہتے ہیں، تو آپ یہاں عطیہ دے سکتے ہیں: + +Buy Me a Coffee + +### 🙏 خصوصی شکریہ + +ان کمیونٹیز اور اداروں کا دلی شکریہ جو اس اوپن سورس کام کو متاثر اور توانائی دیتے ہیں: + +- **Harvard University** — فکری تجسس کو فروغ دینے اور ممکنات کی حدود کو آگے بڑھانے کے لیے۔ +- **MIT** — کھلے علم، اوپن سورس، اور اس یقین کی حمایت کے لیے کہ ٹیکنالوجی سب کے لیے قابل رسائی ہونی چاہیے۔ +- **Sundai Club** — کمیونٹی، توانائی، اور اہم چیزیں بنانے کی لگاتار کوشش کے لیے۔ +- **دنیا اور آگے** 🌍✨ — ہر اس شراکت دار، خواب دیکھنے والے، اور تعمیر کرنے والے کے لیے جو اوپن سورس کو اچھائی کی قوت بنا رہا ہے۔ یہ آپ کے لیے ہے۔ + +ہم کھلے میں بنا رہے ہیں کیونکہ بہترین آئیڈیاز ہر جگہ سے آتے ہیں۔ اگر آپ یہ پڑھ رہے ہیں، تو آپ اس کا حصہ ہیں۔ خوش آمدید۔ 🦀❤️ + +## شراکت + +ZeroClaw میں نئے ہیں؟ [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) لیبل والے issues تلاش کریں — شروع کرنے کے طریقے کے لیے [شراکت گائیڈ](CONTRIBUTING.md#first-time-contributors) دیکھیں۔ AI/vibe-coded PRs کا خیرمقدم ہے! 🤖 + +[CONTRIBUTING.md](CONTRIBUTING.md) اور [CLA.md](docs/contributing/cla.md) دیکھیں۔ ایک trait نافذ کریں، PR جمع کرائیں: + +- CI ورک فلو گائیڈ: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- نیا `Provider` → `src/providers/` +- نیا `Channel` → `src/channels/` +- نیا `Observer` → `src/observability/` +- نیا `Tool` → `src/tools/` +- نیا `Memory` → `src/memory/` +- نیا `Tunnel` → `src/tunnel/` +- نیا `Peripheral` → `src/peripherals/` +- نیا `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ سرکاری ریپوزٹری اور نقل کی وارننگ + +**یہ ZeroClaw کی واحد سرکاری ریپوزٹری ہے:** + +> https://github.com/zeroclaw-labs/zeroclaw + +کوئی بھی دوسری ریپوزٹری، تنظیم، ڈومین، یا پیکیج جو "ZeroClaw" ہونے کا دعویٰ کرے یا ZeroClaw Labs سے وابستگی کا اشارہ کرے **غیر مجاز ہے اور اس پروجیکٹ سے وابستہ نہیں ہے**۔ معلوم غیر مجاز فورکس [TRADEMARK.md](docs/maintainers/trademark.md) میں درج ہوں گے۔ + +اگر آپ کو نقل یا ٹریڈ مارک کا غلط استعمال ملے، براہ کرم [issue کھولیں](https://github.com/zeroclaw-labs/zeroclaw/issues)۔ + +--- + +## لائسنس + +ZeroClaw زیادہ سے زیادہ کشادگی اور شراکت دار تحفظ کے لیے دوہری لائسنس یافتہ ہے: + +| لائسنس | استعمال کا معاملہ | +|---|---| +| [MIT](LICENSE-MIT) | اوپن سورس، تحقیق، تعلیمی، ذاتی استعمال | +| [Apache 2.0](LICENSE-APACHE) | پیٹنٹ تحفظ، ادارہ جاتی، تجارتی تعیناتی | + +آپ کوئی بھی لائسنس منتخب کر سکتے ہیں۔ **شراکت دار خود بخود دونوں کے تحت حقوق دیتے ہیں** — مکمل شراکت دار معاہدے کے لیے [CLA.md](docs/contributing/cla.md) دیکھیں۔ + +### ٹریڈ مارک + +**ZeroClaw** نام اور لوگو ZeroClaw Labs کے ٹریڈ مارکس ہیں۔ یہ لائسنس انہیں توثیق یا وابستگی کا اشارہ دینے کے لیے استعمال کرنے کی اجازت نہیں دیتا۔ مجاز اور ممنوع استعمال کے لیے [TRADEMARK.md](docs/maintainers/trademark.md) دیکھیں۔ + +### شراکت دار تحفظات + +- آپ اپنی شراکتوں کا **کاپی رائٹ برقرار رکھتے ہیں** +- **پیٹنٹ گرانٹ** (Apache 2.0) آپ کو دوسرے شراکت داروں کے پیٹنٹ دعووں سے بچاتی ہے +- آپ کی شراکتیں commit تاریخ اور [NOTICE](NOTICE) میں **مستقل طور پر منسوب** ہیں +- شراکت کرنے سے کوئی ٹریڈ مارک حقوق منتقل نہیں ہوتے + +--- + +**ZeroClaw** — صفر اوور ہیڈ۔ صفر سمجھوتا۔ کہیں بھی تعینات کریں۔ کچھ بھی تبدیل کریں۔ 🦀 + +## شراکت دار + + + ZeroClaw contributors + + +یہ فہرست GitHub شراکت داروں کے گراف سے بنائی گئی ہے اور خود بخود اپ ڈیٹ ہوتی ہے۔ + +## ستاروں کی تاریخ + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.vi.md b/third_party/zeroclaw/README.vi.md new file mode 100644 index 0000000..04381c0 --- /dev/null +++ b/third_party/zeroclaw/README.vi.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — Trợ lý AI Cá nhân

+ +

+ Không tốn thêm tài nguyên. Không đánh đổi. 100% Rust. 100% Đa nền tảng.
+ ⚡️ Chạy trên phần cứng $10 với RAM dưới 5MB: Ít hơn 99% bộ nhớ so với OpenClaw và rẻ hơn 98% so với Mac mini! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+Được xây dựng bởi sinh viên và thành viên của các cộng đồng Harvard, MIT và Sundai.Club. +

+ +

+ 🌐 Ngôn ngữ: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw là trợ lý AI cá nhân mà bạn chạy trên thiết bị của mình. Nó trả lời bạn trên các kênh bạn đang sử dụng (WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, và nhiều hơn nữa). Nó có bảng điều khiển web để kiểm soát thời gian thực và có thể kết nối với thiết bị ngoại vi phần cứng (ESP32, STM32, Arduino, Raspberry Pi). Gateway chỉ là mặt phẳng điều khiển — sản phẩm chính là trợ lý. + +Nếu bạn muốn một trợ lý cá nhân, đơn người dùng, chạy cục bộ, nhanh và luôn sẵn sàng, đây chính là nó. + +

+ Website · + Tài liệu · + Kiến trúc · + Bắt đầu · + Chuyển đổi từ OpenClaw · + Khắc phục sự cố · + Discord +

+ +> **Cài đặt khuyến nghị:** chạy `zeroclaw onboard` trong terminal. ZeroClaw Onboard hướng dẫn bạn từng bước thiết lập gateway, workspace, kênh và provider. Đây là đường dẫn cài đặt được khuyến nghị và hoạt động trên macOS, Linux, và Windows (qua WSL2). Cài đặt mới? Bắt đầu tại đây: [Bắt đầu](#bắt-đầu-nhanh-tldr) + +### Subscription Auth (OAuth) + +- **OpenAI Codex** (đăng ký ChatGPT) +- **Gemini** (Google OAuth) +- **Anthropic** (API key hoặc auth token) + +Lưu ý về model: mặc dù nhiều provider/model được hỗ trợ, để có trải nghiệm tốt nhất hãy sử dụng model mạnh nhất thế hệ mới nhất mà bạn có. Xem [Onboarding](#bắt-đầu-nhanh-tldr). + +Cấu hình model + CLI: [Providers reference](docs/reference/api/providers-reference.md) +Xoay vòng profile xác thực (OAuth vs API key) + failover: [Model failover](docs/reference/api/providers-reference.md) + +## Cài đặt (khuyến nghị) + +Runtime: Rust stable toolchain. Binary đơn, không phụ thuộc runtime. + +### Homebrew (macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### Bootstrap một lần bấm + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` tự động chạy sau khi cài đặt để cấu hình workspace và provider. + +## Bắt đầu nhanh (TL;DR) + +Hướng dẫn đầy đủ cho người mới (xác thực, ghép cặp, kênh): [Bắt đầu](docs/setup-guides/one-click-bootstrap.md) + +```bash +# Cài đặt + onboard +./install.sh --api-key "sk-..." --provider openrouter + +# Khởi động gateway (webhook server + bảng điều khiển web) +zeroclaw gateway # mặc định: 127.0.0.1:42617 +zeroclaw gateway --port 0 # cổng ngẫu nhiên (tăng cường bảo mật) + +# Nói chuyện với trợ lý +zeroclaw agent -m "Hello, ZeroClaw!" + +# Chế độ tương tác +zeroclaw agent + +# Khởi động runtime tự trị đầy đủ (gateway + kênh + cron + hands) +zeroclaw daemon + +# Kiểm tra trạng thái +zeroclaw status + +# Chạy chẩn đoán +zeroclaw doctor +``` + +Đang nâng cấp? Chạy `zeroclaw doctor` sau khi cập nhật. + +### Build từ source (phát triển) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **Chạy trực tiếp khi phát triển (không cần cài toàn cục):** thêm `cargo run --release --` trước lệnh (ví dụ: `cargo run --release -- status`). + +## Chuyển đổi từ OpenClaw + +ZeroClaw có thể nhập workspace, bộ nhớ và cấu hình OpenClaw của bạn: + +```bash +# Xem trước những gì sẽ được chuyển đổi (an toàn, chỉ đọc) +zeroclaw migrate openclaw --dry-run + +# Chạy chuyển đổi +zeroclaw migrate openclaw +``` + +Thao tác này chuyển đổi các mục bộ nhớ, file workspace và cấu hình từ `~/.openclaw/` sang `~/.zeroclaw/`. Cấu hình được tự động chuyển từ JSON sang TOML. + +## Mặc định bảo mật (truy cập DM) + +ZeroClaw kết nối với các dịch vụ nhắn tin thực. Xem DM đến như đầu vào không đáng tin cậy. + +Hướng dẫn bảo mật đầy đủ: [SECURITY.md](SECURITY.md) + +Hành vi mặc định trên tất cả các kênh: + +- **Ghép cặp DM** (mặc định): người gửi không xác định nhận mã ghép cặp ngắn và bot không xử lý tin nhắn của họ. +- Phê duyệt bằng: `zeroclaw pairing approve ` (người gửi được thêm vào danh sách cho phép cục bộ). +- DM đến công khai yêu cầu opt-in rõ ràng trong `config.toml`. +- Chạy `zeroclaw doctor` để phát hiện chính sách DM nguy hiểm hoặc cấu hình sai. + +**Mức tự trị:** + +| Mức | Hành vi | +|-------|----------| +| `ReadOnly` | Agent chỉ có thể quan sát, không hành động | +| `Supervised` (mặc định) | Agent hành động với sự phê duyệt cho các thao tác rủi ro trung bình/cao | +| `Full` | Agent hành động tự trị trong giới hạn chính sách | + +**Các lớp sandbox:** cách ly workspace, chặn duyệt đường dẫn, danh sách cho phép lệnh, đường dẫn cấm (`/etc`, `/root`, `~/.ssh`), giới hạn tốc độ (tối đa hành động/giờ, giới hạn chi phí/ngày). + + + + +### 📢 Thông báo + +Bảng này dành cho các thông báo quan trọng (thay đổi không tương thích, cảnh báo bảo mật, cửa sổ bảo trì, và các vấn đề chặn release). + +| Ngày (UTC) | Mức độ | Thông báo | Hành động | +| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2026-02-19 | _Nghiêm trọng_ | Chúng tôi **không liên kết** với `openagen/zeroclaw`, `zeroclaw.org` hay `zeroclaw.net`. Các tên miền `zeroclaw.org` và `zeroclaw.net` hiện đang trỏ đến fork `openagen/zeroclaw`, và các tên miền/repository đó đang mạo danh website/dự án chính thức của chúng tôi. | Không tin tưởng thông tin, binary, gây quỹ, hay thông báo từ các nguồn đó. Chỉ sử dụng [repository này](https://github.com/zeroclaw-labs/zeroclaw) và các tài khoản mạng xã hội đã được xác minh của chúng tôi. | +| 2026-02-21 | _Quan trọng_ | Website chính thức của chúng tôi đã ra mắt: [zeroclawlabs.ai](https://zeroclawlabs.ai). Cảm ơn đã kiên nhẫn chờ đợi. Chúng tôi vẫn phát hiện các nỗ lực mạo danh, vì vậy **không** tham gia bất kỳ hoạt động đầu tư hoặc gây quỹ nào nhân danh ZeroClaw trừ khi được công bố qua các kênh chính thức. | Sử dụng [repository này](https://github.com/zeroclaw-labs/zeroclaw) làm nguồn thông tin duy nhất đáng tin cậy. Theo dõi [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21), [Facebook (nhóm)](https://www.facebook.com/groups/zeroclawlabs), và [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) để nhận cập nhật chính thức. | +| 2026-02-19 | _Quan trọng_ | Anthropic đã cập nhật điều khoản Xác thực và Sử dụng Thông tin xác thực vào 2026-02-19. Token OAuth Claude Code (Free, Pro, Max) dành riêng cho Claude Code và Claude.ai; việc sử dụng OAuth token từ Claude Free/Pro/Max trong bất kỳ sản phẩm, công cụ hay dịch vụ nào khác (bao gồm Agent SDK) đều không được phép và có thể vi phạm Điều khoản Dịch vụ cho Người tiêu dùng. | Vui lòng tạm thời tránh tích hợp Claude Code OAuth để ngăn ngừa khả năng mất mát. Điều khoản gốc: [Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use). | + +## Điểm nổi bật + +- **Runtime tinh gọn mặc định** — các workflow CLI và trạng thái thông thường chạy trong vài megabyte bộ nhớ trên bản release. +- **Triển khai tiết kiệm chi phí** — được thiết kế cho board $10 và instance cloud nhỏ, không có phụ thuộc runtime nặng. +- **Khởi động lạnh nhanh** — runtime Rust binary đơn giữ cho việc khởi động lệnh và daemon gần như tức thì. +- **Kiến trúc di động** — một binary trên ARM, x86, và RISC-V với provider/channel/tool hoán đổi được. +- **Gateway ưu tiên cục bộ** — mặt phẳng điều khiển duy nhất cho phiên, kênh, công cụ, cron, SOP, và sự kiện. +- **Hộp thư đa kênh** — WhatsApp, Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, Nostr, Mattermost, Nextcloud Talk, DingTalk, Lark, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WebSocket, và nhiều hơn nữa. +- **Điều phối đa agent (Hands)** — bầy agent tự trị chạy theo lịch trình và thông minh hơn theo thời gian. +- **Quy trình vận hành chuẩn (SOPs)** — tự động hóa workflow dựa trên sự kiện với MQTT, webhook, cron, và trigger ngoại vi. +- **Bảng điều khiển web** — giao diện web React 19 + Vite với chat thời gian thực, trình duyệt bộ nhớ, trình chỉnh sửa cấu hình, quản lý cron, và trình kiểm tra công cụ. +- **Thiết bị ngoại vi phần cứng** — ESP32, STM32 Nucleo, Arduino, Raspberry Pi GPIO qua trait `Peripheral`. +- **Công cụ hạng nhất** — shell, file I/O, browser, git, web fetch/search, MCP, Jira, Notion, Google Workspace, và hơn 70 công cụ khác. +- **Hook vòng đời** — chặn và sửa đổi các lời gọi LLM, thực thi công cụ, và tin nhắn ở mọi giai đoạn. +- **Nền tảng skill** — skill đi kèm, cộng đồng, và workspace với kiểm tra bảo mật. +- **Hỗ trợ tunnel** — Cloudflare, Tailscale, ngrok, OpenVPN, và tunnel tùy chỉnh cho truy cập từ xa. + +### Vì sao các team chọn ZeroClaw + +- **Tinh gọn mặc định:** binary Rust nhỏ, khởi động nhanh, ít tốn bộ nhớ. +- **Bảo mật từ gốc:** ghép cặp, sandbox nghiêm ngặt, danh sách cho phép rõ ràng, giới hạn workspace. +- **Hoán đổi hoàn toàn:** hệ thống lõi đều là trait (provider, channel, tool, memory, tunnel). +- **Không khóa vendor:** hỗ trợ provider tương thích OpenAI + endpoint tùy chỉnh dễ mở rộng. + +## So sánh hiệu năng (ZeroClaw vs OpenClaw, có thể tái tạo) + +Benchmark nhanh trên máy cục bộ (macOS arm64, tháng 2/2026) quy chuẩn cho phần cứng edge 0.8GHz. + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **Ngôn ngữ** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **Khởi động (lõi 0.8GHz)** | > 500s | > 30s | < 1s | **< 10ms** | +| **Kích thước binary** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **Chi phí** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **Phần cứng bất kỳ $10** | + +> Ghi chú: Kết quả ZeroClaw được đo trên release build sử dụng `/usr/bin/time -l`. OpenClaw yêu cầu runtime Node.js (thường thêm ~390MB bộ nhớ overhead), NanoBot yêu cầu runtime Python. PicoClaw và ZeroClaw là static binary. Số RAM ở trên là bộ nhớ runtime; yêu cầu biên dịch lúc build cao hơn. + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### Tự đo trên máy bạn + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## Tất cả những gì chúng tôi đã xây dựng + +### Nền tảng lõi + +- Mặt phẳng điều khiển Gateway HTTP/WS/SSE với phiên, hiện diện, cấu hình, cron, webhook, bảng điều khiển web, và ghép cặp. +- Bề mặt CLI: `gateway`, `agent`, `onboard`, `doctor`, `status`, `service`, `migrate`, `auth`, `cron`, `channel`, `skills`. +- Vòng lặp điều phối agent với dispatch công cụ, xây dựng prompt, phân loại tin nhắn, và tải bộ nhớ. +- Mô hình phiên với thực thi chính sách bảo mật, mức tự trị, và cổng phê duyệt. +- Wrapper provider đàn hồi với failover, retry, và định tuyến model trên hơn 20 backend LLM. + +### Kênh + +Kênh: WhatsApp (native), Telegram, Slack, Discord, Signal, iMessage, Matrix, IRC, Email, Bluesky, DingTalk, Lark, Mattermost, Nextcloud Talk, Nostr, QQ, Reddit, LinkedIn, Twitter, MQTT, WeChat Work, WATI, Mochat, Linq, Notion, WebSocket, ClawdTalk. + +Feature-gated: Matrix (`channel-matrix`), Lark (`channel-lark`), Nostr (`channel-nostr`). + +### Bảng điều khiển web + +Bảng điều khiển web React 19 + Vite 6 + Tailwind CSS 4 được phục vụ trực tiếp từ Gateway: + +- **Dashboard** — tổng quan hệ thống, trạng thái sức khỏe, thời gian hoạt động, theo dõi chi phí +- **Agent Chat** — chat tương tác với agent +- **Memory** — duyệt và quản lý mục bộ nhớ +- **Config** — xem và chỉnh sửa cấu hình +- **Cron** — quản lý tác vụ đã lên lịch +- **Tools** — duyệt công cụ có sẵn +- **Logs** — xem nhật ký hoạt động agent +- **Cost** — theo dõi sử dụng token và chi phí +- **Doctor** — chẩn đoán sức khỏe hệ thống +- **Integrations** — trạng thái và thiết lập tích hợp +- **Pairing** — quản lý ghép cặp thiết bị + +### Mục tiêu firmware + +| Mục tiêu | Nền tảng | Mục đích | +|--------|----------|---------| +| ESP32 | Espressif ESP32 | Agent ngoại vi không dây | +| ESP32-UI | ESP32 + Display | Agent với giao diện trực quan | +| STM32 Nucleo | STM32 (ARM Cortex-M) | Ngoại vi công nghiệp | +| Arduino | Arduino | Cầu nối cảm biến/bộ chấp hành cơ bản | +| Uno Q Bridge | Arduino Uno | Cầu nối serial đến agent | + +### Công cụ + tự động hóa + +- **Lõi:** shell, file read/write/edit, git operations, glob search, content search +- **Web:** browser control, web fetch, web search, screenshot, image info, PDF read +- **Tích hợp:** Jira, Notion, Google Workspace, Microsoft 365, LinkedIn, Composio, Pushover +- **MCP:** Model Context Protocol tool wrapper + deferred tool sets +- **Lên lịch:** cron add/remove/update/run, schedule tool +- **Bộ nhớ:** recall, store, forget, knowledge, project intel +- **Nâng cao:** delegate (agent-to-agent), swarm, model switch/routing, security ops, cloud ops +- **Phần cứng:** board info, memory map, memory read (feature-gated) + +### Runtime + an toàn + +- **Mức tự trị:** ReadOnly, Supervised (mặc định), Full. +- **Sandbox:** cách ly workspace, chặn duyệt đường dẫn, danh sách cho phép lệnh, đường dẫn cấm, Landlock (Linux), Bubblewrap. +- **Giới hạn tốc độ:** tối đa hành động mỗi giờ, tối đa chi phí mỗi ngày (có thể cấu hình). +- **Cổng phê duyệt:** phê duyệt tương tác cho các thao tác rủi ro trung bình/cao. +- **Dừng khẩn cấp:** khả năng tắt khẩn cấp. +- **Hơn 129 bài kiểm tra bảo mật** trong CI tự động. + +### Vận hành + đóng gói + +- Bảng điều khiển web phục vụ trực tiếp từ Gateway. +- Hỗ trợ tunnel: Cloudflare, Tailscale, ngrok, OpenVPN, custom command. +- Docker runtime adapter cho thực thi trong container. +- CI/CD: beta (tự động khi push) → stable (dispatch thủ công) → Docker, crates.io, Scoop, AUR, Homebrew, tweet. +- Binary dựng sẵn cho Linux (x86_64, aarch64, armv7), macOS (x86_64, aarch64), Windows (x86_64). + + +## Cấu hình + +Tối thiểu `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +Tham khảo cấu hình đầy đủ: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md). + +### Cấu hình kênh + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### Cấu hình tunnel + +```toml +[tunnel] +kind = "cloudflare" # hoặc "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +Chi tiết: [Channel reference](docs/reference/api/channels-reference.md) · [Config reference](docs/reference/api/config-reference.md) + +### Hỗ trợ runtime (hiện tại) + +- **`native`** (mặc định) — thực thi process trực tiếp, đường dẫn nhanh nhất, lý tưởng cho môi trường tin cậy. +- **`docker`** — cách ly container đầy đủ, chính sách bảo mật cứng, yêu cầu Docker. + +Đặt `runtime.kind = "docker"` cho sandbox nghiêm ngặt hoặc cách ly mạng. + +## Subscription Auth (OpenAI Codex / Claude Code / Gemini) + +ZeroClaw hỗ trợ profile xác thực theo gói đăng ký (đa tài khoản, mã hóa khi lưu). + +- File lưu trữ: `~/.zeroclaw/auth-profiles.json` +- Khóa mã hóa: `~/.zeroclaw/.secret_key` +- Định dạng profile id: `:` (ví dụ: `openai-codex:work`) + +```bash +# OpenAI Codex OAuth (đăng ký ChatGPT) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# Kiểm tra / làm mới / chuyển profile +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# Chạy agent với xác thực đăng ký +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## Workspace agent + skill + +Thư mục gốc workspace: `~/.zeroclaw/workspace/` (có thể cấu hình qua config). + +Các file prompt được inject: +- `IDENTITY.md` — tính cách và vai trò agent +- `USER.md` — ngữ cảnh và sở thích người dùng +- `MEMORY.md` — sự kiện và bài học dài hạn +- `AGENTS.md` — quy ước phiên và quy tắc khởi tạo +- `SOUL.md` — bản sắc cốt lõi và nguyên tắc vận hành + +Skill: `~/.zeroclaw/workspace/skills//SKILL.md` hoặc `SKILL.toml`. + +```bash +# Liệt kê skill đã cài +zeroclaw skills list + +# Cài từ git +zeroclaw skills install https://github.com/user/my-skill.git + +# Kiểm tra bảo mật trước khi cài +zeroclaw skills audit https://github.com/user/my-skill.git + +# Xóa skill +zeroclaw skills remove my-skill +``` + +## Lệnh CLI + +```bash +# Quản lý workspace +zeroclaw onboard # Trình hướng dẫn cài đặt +zeroclaw status # Hiển thị trạng thái daemon/agent +zeroclaw doctor # Chạy chẩn đoán hệ thống + +# Gateway + daemon +zeroclaw gateway # Khởi động gateway server (127.0.0.1:42617) +zeroclaw daemon # Khởi động runtime tự trị đầy đủ + +# Agent +zeroclaw agent # Chế độ chat tương tác +zeroclaw agent -m "message" # Chế độ tin nhắn đơn + +# Quản lý dịch vụ +zeroclaw service install # Cài đặt làm dịch vụ OS (launchd/systemd) +zeroclaw service start|stop|restart|status + +# Kênh +zeroclaw channel list # Liệt kê kênh đã cấu hình +zeroclaw channel doctor # Kiểm tra sức khỏe kênh +zeroclaw channel bind-telegram 123456789 + +# Cron + lên lịch +zeroclaw cron list # Liệt kê tác vụ đã lên lịch +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# Bộ nhớ +zeroclaw memory list # Liệt kê mục bộ nhớ +zeroclaw memory get # Truy xuất bộ nhớ +zeroclaw memory stats # Thống kê bộ nhớ + +# Profile xác thực +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# Thiết bị ngoại vi phần cứng +zeroclaw hardware discover # Quét thiết bị đã kết nối +zeroclaw peripheral list # Liệt kê thiết bị ngoại vi đã kết nối +zeroclaw peripheral flash # Flash firmware vào thiết bị + +# Chuyển đổi +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Tự động hoàn thành shell +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +Tham khảo đầy đủ các lệnh: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## Yêu cầu hệ thống + +
+Windows + +#### Bắt buộc + +1. **Visual Studio Build Tools** (cung cấp MSVC linker và Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + Trong quá trình cài đặt (hoặc qua Visual Studio Installer), chọn workload **"Desktop development with C++"**. + +2. **Rust toolchain:** + + ```powershell + winget install Rustlang.Rustup + ``` + + Sau khi cài, mở terminal mới và chạy `rustup default stable` để đảm bảo toolchain stable đang hoạt động. + +3. **Xác minh** cả hai đang hoạt động: + ```powershell + rustc --version + cargo --version + ``` + +#### Tùy chọn + +- **Docker Desktop** — chỉ cần nếu sử dụng [Docker sandbox runtime](#hỗ-trợ-runtime-hiện-tại) (`runtime.kind = "docker"`). Cài qua `winget install Docker.DockerDesktop`. + +
+ +
+Linux / macOS + +#### Bắt buộc + +1. **Công cụ build cơ bản:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** Cài Xcode Command Line Tools: `xcode-select --install` + +2. **Rust toolchain:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + Xem [rustup.rs](https://rustup.rs) để biết chi tiết. + +3. **Xác minh** cả hai đang hoạt động: + ```bash + rustc --version + cargo --version + ``` + +#### Cài bằng một lệnh + +Hoặc bỏ qua các bước trên và cài hết mọi thứ (system deps, Rust, ZeroClaw) bằng một lệnh: + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### Yêu cầu tài nguyên biên dịch + +Build từ source đòi hỏi nhiều tài nguyên hơn chạy binary kết quả: + +| Tài nguyên | Tối thiểu | Khuyến nghị | +| -------------- | ------- | ----------- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **Dung lượng đĩa trống** | 6 GB | 10 GB+ | + +Nếu máy dưới mức tối thiểu, dùng binary dựng sẵn: + +```bash +./install.sh --prefer-prebuilt +``` + +Chỉ cài từ binary, không fallback sang build source: + +```bash +./install.sh --prebuilt-only +``` + +#### Tùy chọn + +- **Docker** — chỉ cần nếu sử dụng [Docker sandbox runtime](#hỗ-trợ-runtime-hiện-tại) (`runtime.kind = "docker"`). Cài qua package manager hoặc [docker.com](https://docs.docker.com/engine/install/). + +> **Lưu ý:** Lệnh `cargo build --release` mặc định dùng `codegen-units=1` để giảm áp lực biên dịch đỉnh. Để build nhanh hơn trên máy mạnh, dùng `cargo build --profile release-fast`. + +
+ + + +### Binary dựng sẵn + +Release asset được phát hành cho: + +- Linux: `x86_64`, `aarch64`, `armv7` +- macOS: `x86_64`, `aarch64` +- Windows: `x86_64` + +Tải asset mới nhất tại: + + +## Tài liệu + +Dùng khi bạn đã hoàn thành onboarding và muốn tham khảo sâu hơn. + +- Bắt đầu với [chỉ mục tài liệu](docs/README.md) để điều hướng và biết "cái gì ở đâu." +- Đọc [tổng quan kiến trúc](docs/architecture.md) cho mô hình hệ thống đầy đủ. +- Dùng [tham khảo cấu hình](docs/reference/api/config-reference.md) khi cần mọi key và ví dụ. +- Vận hành Gateway theo [sổ tay vận hành](docs/ops/operations-runbook.md). +- Theo [ZeroClaw Onboard](#bắt-đầu-nhanh-tldr) để cài đặt có hướng dẫn. +- Debug lỗi thường gặp với [hướng dẫn khắc phục sự cố](docs/ops/troubleshooting.md). +- Xem lại [hướng dẫn bảo mật](docs/security/README.md) trước khi phơi bày bất kỳ thứ gì. + +### Tài liệu tham khảo + +- Hub tài liệu: [docs/README.md](docs/README.md) +- Mục lục tài liệu thống nhất: [docs/SUMMARY.md](docs/SUMMARY.md) +- Tham khảo lệnh: [docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- Tham khảo cấu hình: [docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- Tham khảo provider: [docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- Tham khảo kênh: [docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- Sổ tay vận hành: [docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- Khắc phục sự cố: [docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### Tài liệu cộng tác + +- Hướng dẫn đóng góp: [CONTRIBUTING.md](CONTRIBUTING.md) +- Chính sách quy trình PR: [docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- Hướng dẫn CI workflow: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- Sổ tay reviewer: [docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- Chính sách tiết lộ bảo mật: [SECURITY.md](SECURITY.md) +- Template tài liệu: [docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### Triển khai + vận hành + +- Hướng dẫn triển khai mạng: [docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- Sổ tay proxy agent: [docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- Hướng dẫn phần cứng: [docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw được xây dựng cho smooth crab 🦀, một trợ lý AI nhanh và hiệu quả. Được xây dựng bởi Argenis De La Rosa và cộng đồng. + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## Ủng hộ ZeroClaw + +Nếu ZeroClaw giúp ích cho công việc của bạn và bạn muốn hỗ trợ phát triển, bạn có thể quyên góp tại đây: + +Buy Me a Coffee + +### 🙏 Lời cảm ơn đặc biệt + +Chân thành cảm ơn các cộng đồng và tổ chức đã truyền cảm hứng và thúc đẩy công việc mã nguồn mở này: + +- **Harvard University** — vì đã nuôi dưỡng sự tò mò trí tuệ và không ngừng mở rộng ranh giới khả năng. +- **MIT** — vì đã đề cao tri thức mở, mã nguồn mở, và niềm tin rằng công nghệ phải tiếp cận được với tất cả mọi người. +- **Sundai Club** — vì cộng đồng, năng lượng, và động lực không mệt mỏi để xây dựng những thứ có ý nghĩa. +- **Thế giới & Xa hơn** 🌍✨ — gửi đến mọi người đóng góp, người dám mơ và người dám làm đang biến mã nguồn mở thành sức mạnh tích cực. Tất cả là dành cho các bạn. + +Chúng tôi xây dựng công khai vì ý tưởng hay đến từ khắp nơi. Nếu bạn đang đọc đến đây, bạn đã là một phần của chúng tôi. Chào mừng. 🦀❤️ + +## Đóng góp + +Mới với ZeroClaw? Tìm các issue có nhãn [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) — xem [Hướng dẫn đóng góp](CONTRIBUTING.md#first-time-contributors) để bắt đầu. PR AI/vibe-coded đều được chào đón! 🤖 + +Xem [CONTRIBUTING.md](CONTRIBUTING.md) và [CLA.md](docs/contributing/cla.md). Triển khai một trait, gửi PR: + +- Hướng dẫn CI workflow: [docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- `Provider` mới → `src/providers/` +- `Channel` mới → `src/channels/` +- `Observer` mới → `src/observability/` +- `Tool` mới → `src/tools/` +- `Memory` mới → `src/memory/` +- `Tunnel` mới → `src/tunnel/` +- `Peripheral` mới → `src/peripherals/` +- `Skill` mới → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ Repository chính thức & Cảnh báo mạo danh + +**Đây là repository ZeroClaw chính thức duy nhất:** + +> https://github.com/zeroclaw-labs/zeroclaw + +Bất kỳ repository, tổ chức, tên miền hay gói nào khác tuyên bố là "ZeroClaw" hoặc ngụ ý liên kết với ZeroClaw Labs đều **không được ủy quyền và không liên kết với dự án này**. Các fork không được ủy quyền đã biết sẽ được liệt kê trong [TRADEMARK.md](docs/maintainers/trademark.md). + +Nếu bạn phát hiện mạo danh hoặc lạm dụng nhãn hiệu, vui lòng [mở một issue](https://github.com/zeroclaw-labs/zeroclaw/issues). + +--- + +## Giấy phép + +ZeroClaw được cấp phép kép để tối đa hóa tính mở và bảo vệ người đóng góp: + +| Giấy phép | Trường hợp sử dụng | +|---|---| +| [MIT](LICENSE-MIT) | Mã nguồn mở, nghiên cứu, học thuật, sử dụng cá nhân | +| [Apache 2.0](LICENSE-APACHE) | Bảo hộ bằng sáng chế, triển khai tổ chức, thương mại | + +Bạn có thể chọn một trong hai giấy phép. **Người đóng góp tự động cấp quyền theo cả hai** — xem [CLA.md](docs/contributing/cla.md) để biết thỏa thuận đóng góp đầy đủ. + +### Nhãn hiệu + +Tên **ZeroClaw** và logo là nhãn hiệu của ZeroClaw Labs. Giấy phép này không cấp phép sử dụng chúng để ngụ ý chứng thực hoặc liên kết. Xem [TRADEMARK.md](docs/maintainers/trademark.md) để biết các sử dụng được phép và bị cấm. + +### Bảo vệ người đóng góp + +- Bạn **giữ bản quyền** đối với đóng góp của mình +- **Cấp bằng sáng chế** (Apache 2.0) bảo vệ bạn khỏi các khiếu nại bằng sáng chế từ người đóng góp khác +- Đóng góp của bạn được **ghi nhận vĩnh viễn** trong lịch sử commit và [NOTICE](NOTICE) +- Không có quyền nhãn hiệu nào được chuyển giao khi đóng góp + +--- + +**ZeroClaw** — Không tốn thêm tài nguyên. Không đánh đổi. Triển khai ở đâu cũng được. Thay thế gì cũng được. 🦀 + +## Người đóng góp + + + ZeroClaw contributors + + +Danh sách này được tạo từ biểu đồ người đóng góp GitHub và cập nhật tự động. + +## Lịch sử Star + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/README.zh-CN.md b/third_party/zeroclaw/README.zh-CN.md new file mode 100644 index 0000000..0c25edd --- /dev/null +++ b/third_party/zeroclaw/README.zh-CN.md @@ -0,0 +1,755 @@ +

+ ZeroClaw +

+ +

🦀 ZeroClaw — 个人AI助手

+ +

+ 零开销。零妥协。100% Rust。100% 无绑定。
+ ⚡️ 在10美元硬件上运行,RAM不到5MB:比OpenClaw少99%内存,比Mac mini便宜98%! +

+ +

+ License: MIT OR Apache-2.0 + Contributors + Buy Me a Coffee + X: @zeroclawlabs + Facebook Group + Discord + Instagram: @therealzeroclaw + TikTok: @zeroclawlabs + RedNote + Reddit: r/zeroclawlabs +

+ +

+由哈佛大学、麻省理工学院和 Sundai.Club 社区的学生及成员构建。 +

+ +

+ 🌐 Languages: + 🇺🇸 English · + 🇨🇳 简体中文 · + 🇯🇵 日本語 · + 🇰🇷 한국어 · + 🇻🇳 Tiếng Việt · + 🇵🇭 Tagalog · + 🇪🇸 Español · + 🇧🇷 Português · + 🇮🇹 Italiano · + 🇩🇪 Deutsch · + 🇫🇷 Français · + 🇸🇦 العربية · + 🇮🇳 हिन्दी · + 🇷🇺 Русский · + 🇧🇩 বাংলা · + 🇮🇱 עברית · + 🇵🇱 Polski · + 🇨🇿 Čeština · + 🇳🇱 Nederlands · + 🇹🇷 Türkçe · + 🇺🇦 Українська · + 🇮🇩 Bahasa Indonesia · + 🇹🇭 ไทย · + 🇵🇰 اردو · + 🇷🇴 Română · + 🇸🇪 Svenska · + 🇬🇷 Ελληνικά · + 🇭🇺 Magyar · + 🇫🇮 Suomi · + 🇩🇰 Dansk · + 🇳🇴 Norsk +

+ +ZeroClaw 是一个运行在你自己设备上的个人AI助手。它在你已经使用的频道上回复你(WhatsApp、Telegram、Slack、Discord、Signal、iMessage、Matrix、IRC、Email、Bluesky、Nostr、Mattermost、Nextcloud Talk、DingTalk、Lark、QQ、Reddit、LinkedIn、Twitter、MQTT、WeChat Work 等)。它有一个用于实时控制的网页仪表板,可以连接硬件外设(ESP32、STM32、Arduino、Raspberry Pi)。Gateway 只是控制平面——产品是助手本身。 + +如果你想要一个本地化、快速、始终在线的个人单用户助手,这就是它。 + +

+ 官网 · + 文档 · + 架构 · + 入门指南 · + 从 OpenClaw 迁移 · + 故障排除 · + Discord +

+ +> **推荐设置方式:** 在终端运行 `zeroclaw onboard`。ZeroClaw Onboard 会引导你逐步设置网关、工作区、频道和提供者。这是推荐的设置路径,支持 macOS、Linux 和 Windows(通过 WSL2)。首次安装?从这里开始:[入门指南](#快速开始简版) + +### 订阅认证(OAuth) + +- **OpenAI Codex**(ChatGPT 订阅) +- **Gemini**(Google OAuth) +- **Anthropic**(API 密钥或认证令牌) + +模型说明:虽然支持许多提供者/模型,但为获得最佳体验,请使用你可用的最强最新一代模型。参见[引导设置](#快速开始简版)。 + +模型配置 + CLI:[提供者参考](docs/reference/api/providers-reference.md) +认证配置轮换(OAuth 与 API 密钥)+ 故障转移:[模型故障转移](docs/reference/api/providers-reference.md) + +## 安装(推荐) + +运行时:Rust stable 工具链。单一二进制文件,无运行时依赖。 + +### Homebrew(macOS/Linuxbrew) + +```bash +brew install zeroclaw +``` + +### 一键安装 + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw +./install.sh +``` + +`zeroclaw onboard` 在安装后自动运行,配置你的工作区和提供者。 + +## 快速开始(简版) + +完整新手指南(认证、配对、频道):[入门指南](docs/setup-guides/one-click-bootstrap.md) + +```bash +# 安装 + 引导 +./install.sh --api-key "sk-..." --provider openrouter + +# 启动网关(webhook 服务器 + 网页仪表板) +zeroclaw gateway # 默认:127.0.0.1:42617 +zeroclaw gateway --port 0 # 随机端口(安全加固) + +# 与助手对话 +zeroclaw agent -m "Hello, ZeroClaw!" + +# 交互模式 +zeroclaw agent + +# 启动完整自主运行时(网关 + 频道 + 定时任务 + 手) +zeroclaw daemon + +# 检查状态 +zeroclaw status + +# 运行诊断 +zeroclaw doctor +``` + +升级?更新后运行 `zeroclaw doctor`。 + +### 从源码构建(开发) + +```bash +git clone https://github.com/zeroclaw-labs/zeroclaw.git +cd zeroclaw + +cargo build --release --locked +cargo install --path . --force --locked + +zeroclaw onboard +``` + +> **开发替代方案(无全局安装):** 命令前加 `cargo run --release --`(示例:`cargo run --release -- status`)。 + +## 从 OpenClaw 迁移 + +ZeroClaw 可以导入你的 OpenClaw 工作区、记忆和配置: + +```bash +# 预览将迁移的内容(安全,只读) +zeroclaw migrate openclaw --dry-run + +# 执行迁移 +zeroclaw migrate openclaw +``` + +这会将你的记忆条目、工作区文件和配置从 `~/.openclaw/` 迁移到 `~/.zeroclaw/`。配置会自动从 JSON 转换为 TOML。 + +## 安全默认设置(DM 访问) + +ZeroClaw 连接到真实的消息平台。将入站 DM 视为不可信输入。 + +完整安全指南:[SECURITY.md](SECURITY.md) + +所有频道的默认行为: + +- **DM 配对**(默认):未知发送者会收到一个短配对码,机器人不会处理他们的消息。 +- 使用以下命令批准:`zeroclaw pairing approve `(然后发送者会被添加到本地允许列表)。 +- 公共入站 DM 需要在 `config.toml` 中显式启用。 +- 运行 `zeroclaw doctor` 来检测有风险或配置错误的 DM 策略。 + +**自主级别:** + +| 级别 | 行为 | +|------|------| +| `ReadOnly` | 代理可以观察但不能操作 | +| `Supervised`(默认) | 代理在中/高风险操作时需要批准 | +| `Full` | 代理在策略范围内自主操作 | + +**沙箱层:** 工作区隔离、路径遍历阻止、命令允许列表、禁止路径(`/etc`、`/root`、`~/.ssh`)、速率限制(每小时最大操作数、每日成本上限)。 + + + + +### 📢 公告 + +使用此面板发布重要通知(破坏性更改、安全公告、维护窗口和发布阻塞问题)。 + +| 日期 (UTC) | 级别 | 通知 | 操作 | +| ---------- | ---- | ---- | ---- | +| 2026-02-19 | _严重_ | 我们与 `openagen/zeroclaw`、`zeroclaw.org` 或 `zeroclaw.net` **无任何关联**。`zeroclaw.org` 和 `zeroclaw.net` 域名目前指向 `openagen/zeroclaw` 分支,该域名/仓库正在冒充我们的官方网站/项目。 | 不要信任来自这些来源的信息、二进制文件、筹款或公告。仅使用[本仓库](https://github.com/zeroclaw-labs/zeroclaw)和我们经过验证的社交账号。 | +| 2026-02-21 | _重要_ | 我们的官方网站现已上线:[zeroclawlabs.ai](https://zeroclawlabs.ai)。感谢您在我们准备发布期间的耐心等待。我们仍然看到冒充行为,因此**不要**加入任何声称使用 ZeroClaw 名义的投资或筹款活动,除非它是通过我们的官方渠道发布的。 | 使用[本仓库](https://github.com/zeroclaw-labs/zeroclaw)作为唯一信息来源。关注 [X (@zeroclawlabs)](https://x.com/zeroclawlabs?s=21)、[Facebook (Group)](https://www.facebook.com/groups/zeroclawlabs) 和 [Reddit (r/zeroclawlabs)](https://www.reddit.com/r/zeroclawlabs/) 获取官方更新。 | +| 2026-02-19 | _重要_ | Anthropic 于 2026-02-19 更新了认证和凭证使用条款。Claude Code OAuth 令牌(Free、Pro、Max)仅供 Claude Code 和 Claude.ai 专用;在任何其他产品、工具或服务(包括 Agent SDK)中使用 Claude Free/Pro/Max 的 OAuth 令牌是不允许的,可能违反消费者服务条款。 | 请暂时避免 Claude Code OAuth 集成以防止潜在损失。原始条款:[Authentication and Credential Use](https://code.claude.com/docs/en/legal-and-compliance#authentication-and-credential-use)。 | + +## 亮点 + +- **默认精简运行时** — 常见 CLI 和状态工作流在发布构建中运行仅需数兆字节内存。 +- **低成本部署** — 专为 10 美元开发板和小型云实例设计,无重量级运行时依赖。 +- **快速冷启动** — 单一二进制 Rust 运行时使命令和守护进程启动近乎即时。 +- **可移植架构** — 跨 ARM、x86 和 RISC-V 的单一二进制文件,可交换的提供者/频道/工具。 +- **本地优先网关** — 用于会话、频道、工具、定时任务、SOP 和事件的单一控制平面。 +- **多频道收件箱** — WhatsApp、Telegram、Slack、Discord、Signal、iMessage、Matrix、IRC、Email、Bluesky、Nostr、Mattermost、Nextcloud Talk、DingTalk、Lark、QQ、Reddit、LinkedIn、Twitter、MQTT、WeChat Work、WebSocket 等。 +- **多代理编排(Hands)** — 按计划运行并随时间变得更智能的自主代理群。 +- **标准操作规程(SOPs)** — 事件驱动的工作流自动化,支持 MQTT、webhook、cron 和外设触发器。 +- **网页仪表板** — React 19 + Vite 网页 UI,具有实时聊天、记忆浏览器、配置编辑器、定时任务管理器和工具检查器。 +- **硬件外设** — 通过 `Peripheral` trait 支持 ESP32、STM32 Nucleo、Arduino、Raspberry Pi GPIO。 +- **一流工具** — shell、文件 I/O、浏览器、git、网页抓取/搜索、MCP、Jira、Notion、Google Workspace 等 70+ 种。 +- **生命周期钩子** — 在每个阶段拦截和修改 LLM 调用、工具执行和消息。 +- **技能平台** — 内置、社区和工作区技能,带安全审计。 +- **隧道支持** — Cloudflare、Tailscale、ngrok、OpenVPN 和自定义隧道用于远程访问。 + +### 团队为什么选择 ZeroClaw + +- **默认精简:** 小型 Rust 二进制文件,快速启动,低内存占用。 +- **安全设计:** 配对、严格沙箱、显式允许列表、工作区范围限定。 +- **完全可替换:** 核心系统都是 trait(提供者、频道、工具、记忆、隧道)。 +- **无锁定:** 支持 OpenAI 兼容提供者 + 可插拔自定义端点。 + +## 基准测试快照(ZeroClaw 对比 OpenClaw,可复现) + +本地机器快速基准测试(macOS arm64,2026年2月),针对 0.8GHz 边缘硬件标准化。 + +| | OpenClaw | NanoBot | PicoClaw | ZeroClaw 🦀 | +| ------------------------- | ------------- | -------------- | --------------- | -------------------- | +| **语言** | TypeScript | Python | Go | **Rust** | +| **RAM** | > 1GB | > 100MB | < 10MB | **< 5MB** | +| **启动时间(0.8GHz 核心)** | > 500s | > 30s | < 1s | **< 10ms** | +| **二进制大小** | ~28MB (dist) | N/A (Scripts) | ~8MB | **~8.8 MB** | +| **成本** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | **任何硬件 $10** | + +> 注意:ZeroClaw 的结果使用 `/usr/bin/time -l` 在发布构建上测量。OpenClaw 需要 Node.js 运行时(通常约 390MB 额外内存开销),而 NanoBot 需要 Python 运行时。PicoClaw 和 ZeroClaw 是静态二进制文件。上述 RAM 数据为运行时内存;构建时编译需求更高。 + +

+ ZeroClaw vs OpenClaw Comparison +

+ +### 可复现的本地测量 + +```bash +cargo build --release +ls -lh target/release/zeroclaw + +/usr/bin/time -l target/release/zeroclaw --help +/usr/bin/time -l target/release/zeroclaw status +``` + +## 我们迄今为止构建的一切 + +### 核心平台 + +- Gateway HTTP/WS/SSE 控制平面,支持会话、在线状态、配置、定时任务、webhook、网页仪表板和配对。 +- CLI 表面:`gateway`、`agent`、`onboard`、`doctor`、`status`、`service`、`migrate`、`auth`、`cron`、`channel`、`skills`。 +- 代理编排循环,支持工具调度、提示构建、消息分类和记忆加载。 +- 会话模型,支持安全策略执行、自主级别和批准门控。 +- 弹性提供者包装器,支持故障转移、重试和跨 20+ LLM 后端的模型路由。 + +### 频道 + +频道:WhatsApp(原生)、Telegram、Slack、Discord、Signal、iMessage、Matrix、IRC、Email、Bluesky、DingTalk、Lark、Mattermost、Nextcloud Talk、Nostr、QQ、Reddit、LinkedIn、Twitter、MQTT、WeChat Work、WATI、Mochat、Linq、Notion、WebSocket、ClawdTalk。 + +功能门控:Matrix(`channel-matrix`)、Lark(`channel-lark`)、Nostr(`channel-nostr`)。 + +### 网页仪表板 + +React 19 + Vite 6 + Tailwind CSS 4 网页仪表板直接从 Gateway 提供: + +- **仪表板** — 系统概览、健康状态、运行时间、成本跟踪 +- **代理聊天** — 与代理的交互式聊天 +- **记忆** — 浏览和管理记忆条目 +- **配置** — 查看和编辑配置 +- **定时任务** — 管理计划任务 +- **工具** — 浏览可用工具 +- **日志** — 查看代理活动日志 +- **成本** — 令牌使用和成本跟踪 +- **诊断** — 系统健康诊断 +- **集成** — 集成状态和设置 +- **配对** — 设备配对管理 + +### 固件目标 + +| 目标 | 平台 | 用途 | +|------|------|------| +| ESP32 | Espressif ESP32 | 无线外设代理 | +| ESP32-UI | ESP32 + Display | 带可视化界面的代理 | +| STM32 Nucleo | STM32 (ARM Cortex-M) | 工业外设 | +| Arduino | Arduino | 基础传感器/执行器桥接 | +| Uno Q Bridge | Arduino Uno | 到代理的串口桥接 | + +### 工具 + 自动化 + +- **核心:** shell、文件读/写/编辑、git 操作、glob 搜索、内容搜索 +- **网络:** 浏览器控制、网页抓取、网络搜索、截图、图片信息、PDF 阅读 +- **集成:** Jira、Notion、Google Workspace、Microsoft 365、LinkedIn、Composio、Pushover +- **MCP:** Model Context Protocol 工具包装器 + 延迟工具集 +- **调度:** cron 添加/删除/更新/运行、计划工具 +- **记忆:** 回忆、存储、遗忘、知识、项目情报 +- **高级:** 委托(代理到代理)、群体、模型切换/路由、安全操作、云操作 +- **硬件:** 板信息、内存映射、内存读取(功能门控) + +### 运行时 + 安全 + +- **自主级别:** ReadOnly、Supervised(默认)、Full。 +- **沙箱:** 工作区隔离、路径遍历阻止、命令允许列表、禁止路径、Landlock(Linux)、Bubblewrap。 +- **速率限制:** 每小时最大操作数、每日最大成本(可配置)。 +- **批准门控:** 中/高风险操作的交互式批准。 +- **紧急停止:** 紧急关闭功能。 +- **129+ 安全测试** 在自动化 CI 中。 + +### 运维 + 打包 + +- 网页仪表板直接从 Gateway 提供。 +- 隧道支持:Cloudflare、Tailscale、ngrok、OpenVPN、自定义命令。 +- Docker 运行时适配器用于容器化执行。 +- CI/CD:beta(推送时自动)→ stable(手动触发)→ Docker、crates.io、Scoop、AUR、Homebrew、tweet。 +- 预构建二进制文件支持 Linux(x86_64、aarch64、armv7)、macOS(x86_64、aarch64)、Windows(x86_64)。 + + +## 配置 + +最小 `~/.zeroclaw/config.toml`: + +```toml +default_provider = "anthropic" +api_key = "sk-ant-..." +``` + +完整配置参考:[docs/reference/api/config-reference.md](docs/reference/api/config-reference.md)。 + +### 频道配置 + +**Telegram:** +```toml +[channels.telegram] +bot_token = "123456:ABC-DEF..." +``` + +**Discord:** +```toml +[channels.discord] +token = "your-bot-token" +``` + +**Slack:** +```toml +[channels.slack] +bot_token = "xoxb-..." +app_token = "xapp-..." +``` + +**WhatsApp:** +```toml +[channels.whatsapp] +enabled = true +``` + +**Matrix:** +```toml +[channels.matrix] +homeserver_url = "https://matrix.org" +username = "@bot:matrix.org" +password = "..." +``` + +**Signal:** +```toml +[channels.signal] +phone_number = "+1234567890" +``` + +### 隧道配置 + +```toml +[tunnel] +kind = "cloudflare" # or "tailscale", "ngrok", "openvpn", "custom", "none" +``` + +详情:[频道参考](docs/reference/api/channels-reference.md) · [配置参考](docs/reference/api/config-reference.md) + +### 运行时支持(当前) + +- **`native`**(默认)— 直接进程执行,最快路径,适合可信环境。 +- **`docker`** — 完全容器隔离,强制安全策略,需要 Docker。 + +设置 `runtime.kind = "docker"` 以获得严格沙箱或网络隔离。 + +## 订阅认证(OpenAI Codex / Claude Code / Gemini) + +ZeroClaw 支持订阅原生认证配置文件(多账户,静态加密)。 + +- 存储文件:`~/.zeroclaw/auth-profiles.json` +- 加密密钥:`~/.zeroclaw/.secret_key` +- 配置文件 ID 格式:`:`(示例:`openai-codex:work`) + +```bash +# OpenAI Codex OAuth(ChatGPT 订阅) +zeroclaw auth login --provider openai-codex --device-code + +# Gemini OAuth +zeroclaw auth login --provider gemini --profile default + +# Anthropic setup-token +zeroclaw auth paste-token --provider anthropic --profile default --auth-kind authorization + +# 检查 / 刷新 / 切换配置文件 +zeroclaw auth status +zeroclaw auth refresh --provider openai-codex --profile default +zeroclaw auth use --provider openai-codex --profile work + +# 使用订阅认证运行代理 +zeroclaw agent --provider openai-codex -m "hello" +zeroclaw agent --provider anthropic -m "hello" +``` + +## 代理工作区 + 技能 + +工作区根目录:`~/.zeroclaw/workspace/`(可通过配置自定义)。 + +注入的提示文件: +- `IDENTITY.md` — 代理人格和角色 +- `USER.md` — 用户上下文和偏好 +- `MEMORY.md` — 长期事实和经验 +- `AGENTS.md` — 会话约定和初始化规则 +- `SOUL.md` — 核心身份和运作原则 + +技能:`~/.zeroclaw/workspace/skills//SKILL.md` 或 `SKILL.toml`。 + +```bash +# 列出已安装的技能 +zeroclaw skills list + +# 从 git 安装 +zeroclaw skills install https://github.com/user/my-skill.git + +# 安装前安全审计 +zeroclaw skills audit https://github.com/user/my-skill.git + +# 移除技能 +zeroclaw skills remove my-skill +``` + +## CLI 命令 + +```bash +# 工作区管理 +zeroclaw onboard # 引导设置向导 +zeroclaw status # 显示守护进程/代理状态 +zeroclaw doctor # 运行系统诊断 + +# 网关 + 守护进程 +zeroclaw gateway # 启动网关服务器(127.0.0.1:42617) +zeroclaw daemon # 启动完整自主运行时 + +# 代理 +zeroclaw agent # 交互式聊天模式 +zeroclaw agent -m "message" # 单条消息模式 + +# 服务管理 +zeroclaw service install # 作为系统服务安装(launchd/systemd) +zeroclaw service start|stop|restart|status + +# 频道 +zeroclaw channel list # 列出已配置的频道 +zeroclaw channel doctor # 检查频道健康状况 +zeroclaw channel bind-telegram 123456789 + +# 定时任务 + 调度 +zeroclaw cron list # 列出计划任务 +zeroclaw cron add "*/5 * * * *" --prompt "Check system health" +zeroclaw cron remove + +# 记忆 +zeroclaw memory list # 列出记忆条目 +zeroclaw memory get # 检索记忆 +zeroclaw memory stats # 记忆统计 + +# 认证配置文件 +zeroclaw auth login --provider +zeroclaw auth status +zeroclaw auth use --provider --profile + +# 硬件外设 +zeroclaw hardware discover # 扫描已连接的设备 +zeroclaw peripheral list # 列出已连接的外设 +zeroclaw peripheral flash # 向设备刷写固件 + +# 迁移 +zeroclaw migrate openclaw --dry-run +zeroclaw migrate openclaw + +# Shell 补全 +source <(zeroclaw completions bash) +zeroclaw completions zsh > ~/.zfunc/_zeroclaw +``` + +完整命令参考:[docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) + + + +## 前置条件 + +
+Windows + +#### 必需 + +1. **Visual Studio Build Tools**(提供 MSVC 链接器和 Windows SDK): + + ```powershell + winget install Microsoft.VisualStudio.2022.BuildTools + ``` + + 在安装期间(或通过 Visual Studio 安装程序),选择 **"Desktop development with C++"** 工作负载。 + +2. **Rust 工具链:** + + ```powershell + winget install Rustlang.Rustup + ``` + + 安装后,打开新终端并运行 `rustup default stable` 确保 stable 工具链已激活。 + +3. **验证**两者是否正常工作: + ```powershell + rustc --version + cargo --version + ``` + +#### 可选 + +- **Docker Desktop** — 仅在使用 [Docker 沙箱运行时](#运行时支持当前)(`runtime.kind = "docker"`)时需要。通过 `winget install Docker.DockerDesktop` 安装。 + +
+ +
+Linux / macOS + +#### 必需 + +1. **构建工具:** + - **Linux (Debian/Ubuntu):** `sudo apt install build-essential pkg-config` + - **Linux (Fedora/RHEL):** `sudo dnf group install development-tools && sudo dnf install pkg-config` + - **macOS:** 安装 Xcode 命令行工具:`xcode-select --install` + +2. **Rust 工具链:** + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + + 详情参见 [rustup.rs](https://rustup.rs)。 + +3. **验证**两者是否正常工作: + ```bash + rustc --version + cargo --version + ``` + +#### 一行安装 + +或者跳过上述步骤,使用单条命令安装所有内容(系统依赖、Rust、ZeroClaw): + +```bash +curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash +``` + +#### 编译资源需求 + +从源码构建比运行生成的二进制文件需要更多资源: + +| 资源 | 最低 | 推荐 | +| ---- | ---- | ---- | +| **RAM + swap** | 2 GB | 4 GB+ | +| **可用磁盘** | 6 GB | 10 GB+ | + +如果你的主机低于最低要求,使用预构建二进制文件: + +```bash +./install.sh --prefer-prebuilt +``` + +仅使用二进制安装,不回退到源码编译: + +```bash +./install.sh --prebuilt-only +``` + +#### 可选 + +- **Docker** — 仅在使用 [Docker 沙箱运行时](#运行时支持当前)(`runtime.kind = "docker"`)时需要。通过你的包管理器或 [docker.com](https://docs.docker.com/engine/install/) 安装。 + +> **注意:** 默认的 `cargo build --release` 使用 `codegen-units=1` 以降低编译峰值压力。对于强大的机器,使用 `cargo build --profile release-fast` 加速构建。 + +
+ + + +### 预构建二进制文件 + +发布资产可用于: + +- Linux: `x86_64`、`aarch64`、`armv7` +- macOS: `x86_64`、`aarch64` +- Windows: `x86_64` + +从以下位置下载最新资产: + + +## 文档 + +当你完成引导流程后需要更深入的参考时使用这些文档。 + +- 从[文档索引](docs/README.md)开始了解导航和内容分布。 +- 阅读[架构概述](docs/architecture.md)了解完整系统模型。 +- 使用[配置参考](docs/reference/api/config-reference.md)查阅所有键和示例。 +- 按照[运维手册](docs/ops/operations-runbook.md)运行 Gateway。 +- 按照 [ZeroClaw Onboard](#快速开始简版) 进行引导设置。 +- 使用[故障排除指南](docs/ops/troubleshooting.md)调试常见故障。 +- 在暴露任何内容之前查看[安全指南](docs/security/README.md)。 + +### 参考文档 + +- 文档中心:[docs/README.md](docs/README.md) +- 统一文档目录:[docs/SUMMARY.md](docs/SUMMARY.md) +- 命令参考:[docs/reference/cli/commands-reference.md](docs/reference/cli/commands-reference.md) +- 配置参考:[docs/reference/api/config-reference.md](docs/reference/api/config-reference.md) +- 提供者参考:[docs/reference/api/providers-reference.md](docs/reference/api/providers-reference.md) +- 频道参考:[docs/reference/api/channels-reference.md](docs/reference/api/channels-reference.md) +- 运维手册:[docs/ops/operations-runbook.md](docs/ops/operations-runbook.md) +- 故障排除:[docs/ops/troubleshooting.md](docs/ops/troubleshooting.md) + +### 协作文档 + +- 贡献指南:[CONTRIBUTING.md](CONTRIBUTING.md) +- PR 工作流策略:[docs/contributing/pr-workflow.md](docs/contributing/pr-workflow.md) +- CI 工作流指南:[docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- 审查员手册:[docs/contributing/reviewer-playbook.md](docs/contributing/reviewer-playbook.md) +- 安全披露策略:[SECURITY.md](SECURITY.md) +- 文档模板:[docs/contributing/doc-template.md](docs/contributing/doc-template.md) + +### 部署 + 运维 + +- 网络部署指南:[docs/ops/network-deployment.md](docs/ops/network-deployment.md) +- 代理代理手册:[docs/ops/proxy-agent-playbook.md](docs/ops/proxy-agent-playbook.md) +- 硬件指南:[docs/hardware/README.md](docs/hardware/README.md) + +## Smooth Crab 🦀 + +ZeroClaw 为 smooth crab 🦀 而构建,一个快速高效的 AI 助手。由 Argenis De La Rosa 和社区共同构建。 + +- [zeroclawlabs.ai](https://zeroclawlabs.ai) +- [@zeroclawlabs](https://x.com/zeroclawlabs) + +## 支持 ZeroClaw + +如果 ZeroClaw 对你的工作有帮助,你想支持持续开发,可以在这里捐款: + +Buy Me a Coffee + +### 🙏 特别感谢 + +衷心感谢激励和推动这项开源工作的社区和机构: + +- **哈佛大学** — 培养求知欲并推动可能性的边界。 +- **MIT** — 倡导开放知识、开源以及技术应该人人可及的信念。 +- **Sundai Club** — 社区、能量以及不懈追求构建有意义事物的动力。 +- **世界及更远** 🌍✨ — 致每一位贡献者、梦想家和构建者,你们让开源成为一股向善的力量。这是献给你们的。 + +我们公开构建,因为最好的想法来自四面八方。如果你在阅读这些,你就是其中的一部分。欢迎。🦀❤️ + +## 贡献 + +ZeroClaw 新手?寻找标记为 [`good first issue`](https://github.com/zeroclaw-labs/zeroclaw/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) 的问题 — 参阅我们的[贡献指南](CONTRIBUTING.md#first-time-contributors)了解如何开始。欢迎 AI/vibe-coded PR!🤖 + +参见 [CONTRIBUTING.md](CONTRIBUTING.md) 和 [CLA.md](docs/contributing/cla.md)。实现一个 trait,提交 PR: + +- CI 工作流指南:[docs/contributing/ci-map.md](docs/contributing/ci-map.md) +- 新 `Provider` → `src/providers/` +- 新 `Channel` → `src/channels/` +- 新 `Observer` → `src/observability/` +- 新 `Tool` → `src/tools/` +- 新 `Memory` → `src/memory/` +- 新 `Tunnel` → `src/tunnel/` +- 新 `Peripheral` → `src/peripherals/` +- 新 `Skill` → `~/.zeroclaw/workspace/skills//` + + + + +## ⚠️ 官方仓库和冒充警告 + +**这是唯一的 ZeroClaw 官方仓库:** + +> https://github.com/zeroclaw-labs/zeroclaw + +任何其他声称是"ZeroClaw"或暗示与 ZeroClaw Labs 有关联的仓库、组织、域名或包都是**未经授权的,与本项目无关**。已知的未授权分支将在 [TRADEMARK.md](docs/maintainers/trademark.md) 中列出。 + +如果你遇到冒充或商标滥用,请[提交问题](https://github.com/zeroclaw-labs/zeroclaw/issues)。 + +--- + +## 许可证 + +ZeroClaw 采用双重许可,以实现最大开放性和贡献者保护: + +| 许可证 | 使用场景 | +|--------|----------| +| [MIT](LICENSE-MIT) | 开源、研究、学术、个人使用 | +| [Apache 2.0](LICENSE-APACHE) | 专利保护、机构、商业部署 | + +你可以选择任一许可证。**贡献者自动授予两种许可证的权利** — 参见 [CLA.md](docs/contributing/cla.md) 了解完整的贡献者协议。 + +### 商标 + +**ZeroClaw** 名称和标志是 ZeroClaw Labs 的商标。此许可证不授予使用它们暗示背书或关联的权限。参见 [TRADEMARK.md](docs/maintainers/trademark.md) 了解允许和禁止的使用。 + +### 贡献者保护 + +- 你**保留**你贡献的版权 +- **专利授权**(Apache 2.0)保护你免受其他贡献者的专利索赔 +- 你的贡献在提交历史和 [NOTICE](NOTICE) 中**永久归属** +- 贡献不转让商标权 + +--- + +**ZeroClaw** — 零开销。零妥协。随处部署。任意替换。🦀 + +## 贡献者 + + + ZeroClaw contributors + + +此列表从 GitHub 贡献者图表生成,自动更新。 + +## Star 历史 + +

+ + + + + Star History Chart + + +

diff --git a/third_party/zeroclaw/SECURITY.md b/third_party/zeroclaw/SECURITY.md new file mode 100644 index 0000000..28b1370 --- /dev/null +++ b/third_party/zeroclaw/SECURITY.md @@ -0,0 +1,93 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 0.1.x | :white_check_mark: | + +## Reporting a Vulnerability + +**Please do NOT open a public GitHub issue for security vulnerabilities.** + +Instead, please report them responsibly: + +1. **Email**: Send details to the maintainers via GitHub private vulnerability reporting +2. **GitHub**: Use [GitHub Security Advisories](https://github.com/zeroclaw-labs/zeroclaw/security/advisories/new) + +### What to Include + +- Description of the vulnerability +- Steps to reproduce +- Impact assessment +- Suggested fix (if any) + +### Response Timeline + +- **Acknowledgment**: Within 48 hours +- **Assessment**: Within 1 week +- **Fix**: Within 2 weeks for critical issues + +## Security Architecture + +ZeroClaw implements defense-in-depth security: + +### Autonomy Levels +- **ReadOnly** — Agent can only read, no shell or write access +- **Supervised** — Agent can act within allowlists (default) +- **Full** — Agent has full access within workspace sandbox + +### Sandboxing Layers +1. **Workspace isolation** — All file operations confined to workspace directory +2. **Path traversal blocking** — `..` sequences and absolute paths rejected +3. **Command allowlisting** — Only explicitly approved commands can execute +4. **Forbidden path list** — Critical system paths (`/etc`, `/root`, `~/.ssh`) always blocked +5. **Rate limiting** — Max actions per hour and cost per day caps + +### What We Protect Against +- Path traversal attacks (`../../../etc/passwd`) +- Command injection (`rm -rf /`, `curl | sh`) +- Workspace escape via symlinks or absolute paths +- Runaway cost from LLM API calls +- Unauthorized shell command execution + +## Security Testing + +All security mechanisms are covered by automated tests (129 tests): + +```bash +cargo test -- security +cargo test -- tools::shell +cargo test -- tools::file_read +cargo test -- tools::file_write +``` + +## Container Security + +ZeroClaw Docker images follow CIS Docker Benchmark best practices: + +| Control | Implementation | +|---------|----------------| +| **4.1 Non-root user** | Container runs as UID 65534 (distroless nonroot) | +| **4.2 Minimal base image** | `gcr.io/distroless/cc-debian12:nonroot` — no shell, no package manager | +| **4.6 HEALTHCHECK** | Not applicable (stateless CLI/gateway) | +| **5.25 Read-only filesystem** | Supported via `docker run --read-only` with `/workspace` volume | + +### Verifying Container Security + +```bash +# Build and verify non-root user +docker build -t zeroclaw . +docker inspect --format='{{.Config.User}}' zeroclaw +# Expected: 65534:65534 + +# Run with read-only filesystem (production hardening) +docker run --read-only -v /path/to/workspace:/workspace zeroclaw gateway +``` + +### CI Enforcement + +The `docker` job in `.github/workflows/checks-on-pr.yml` automatically verifies: +1. Container does not run as root (UID 0) +2. Runtime stage uses `:nonroot` variant +3. Explicit `USER` directive with numeric UID exists diff --git a/third_party/zeroclaw/VENDORED_FROM.md b/third_party/zeroclaw/VENDORED_FROM.md new file mode 100644 index 0000000..93004fa --- /dev/null +++ b/third_party/zeroclaw/VENDORED_FROM.md @@ -0,0 +1,7 @@ +# ZeroClaw Vendoring Record + +- Upstream repository: `https://github.com/zeroclaw-labs/zeroclaw` +- Upstream default branch at vendoring time: `master` +- Vendored source artifact: `/home/zyl/Downloads/zeroclaw-master.zip` +- Vendored on: `2026-03-26` +- Vendoring reason: sgClaw must build reproducibly inside the SuperRPA browser toolchain without requiring network access during `cargo build` or Chromium's `build_sgclaw.py` flow. diff --git a/third_party/zeroclaw/apps/tauri/Cargo.toml b/third_party/zeroclaw/apps/tauri/Cargo.toml new file mode 100644 index 0000000..284da65 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "zeroclaw-desktop" +version = "0.1.0" +edition = "2021" +description = "ZeroClaw Desktop — Tauri-powered system tray app" +publish = false + +[build-dependencies] +tauri-build = { version = "2.0", features = [] } + +[dependencies] +tauri = { version = "2.0", features = ["tray-icon", "image-png"] } +tauri-plugin-shell = "2.0" +tauri-plugin-store = "2.0" +tauri-plugin-single-instance = "2.0" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } +tokio = { version = "1.50", features = ["rt-multi-thread", "macros", "sync", "time"] } +anyhow = "1.0" + +[target.'cfg(target_os = "macos")'.dependencies] +objc2 = "0.6" +objc2-app-kit = { version = "0.3", features = ["NSApplication", "NSImage", "NSRunningApplication"] } +objc2-foundation = { version = "0.3", features = ["NSData"] } + +[features] +default = ["custom-protocol"] +custom-protocol = ["tauri/custom-protocol"] diff --git a/third_party/zeroclaw/apps/tauri/build.rs b/third_party/zeroclaw/apps/tauri/build.rs new file mode 100644 index 0000000..261851f --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build(); +} diff --git a/third_party/zeroclaw/apps/tauri/capabilities/default.json b/third_party/zeroclaw/apps/tauri/capabilities/default.json new file mode 100644 index 0000000..562f3bb --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/capabilities/default.json @@ -0,0 +1,14 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Default capability set for ZeroClaw Desktop", + "windows": ["main"], + "permissions": [ + "core:default", + "shell:allow-open", + "store:allow-get", + "store:allow-set", + "store:allow-save", + "store:allow-load" + ] +} diff --git a/third_party/zeroclaw/apps/tauri/capabilities/desktop.json b/third_party/zeroclaw/apps/tauri/capabilities/desktop.json new file mode 100644 index 0000000..16cdd55 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/capabilities/desktop.json @@ -0,0 +1,14 @@ +{ + "identifier": "desktop", + "description": "Desktop-specific permissions for ZeroClaw", + "windows": ["main"], + "permissions": [ + "core:default", + "shell:allow-open", + "shell:allow-execute", + "store:allow-get", + "store:allow-set", + "store:allow-save", + "store:allow-load" + ] +} diff --git a/third_party/zeroclaw/apps/tauri/capabilities/mobile.json b/third_party/zeroclaw/apps/tauri/capabilities/mobile.json new file mode 100644 index 0000000..30aa79c --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/capabilities/mobile.json @@ -0,0 +1,8 @@ +{ + "identifier": "mobile", + "description": "Mobile-specific permissions for ZeroClaw", + "windows": ["main"], + "permissions": [ + "core:default" + ] +} diff --git a/third_party/zeroclaw/apps/tauri/gen/android/.gitkeep b/third_party/zeroclaw/apps/tauri/gen/android/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/third_party/zeroclaw/apps/tauri/gen/apple/.gitkeep b/third_party/zeroclaw/apps/tauri/gen/apple/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/third_party/zeroclaw/apps/tauri/icons/.gitkeep b/third_party/zeroclaw/apps/tauri/icons/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/third_party/zeroclaw/apps/tauri/icons/128x128.png b/third_party/zeroclaw/apps/tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..984433ba752d2e2a6ee8e20f275754f651728ece GIT binary patch literal 1002 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVBYBI;uumf=k2BI(?U{3j(mJC z`RtIpu#12Qt15?@0fUlbQ_APhzOP=+yD(Y*A@4V)qLxH@!2gEh*4?A$NIzIWd#In(O^yKf`Rmf53)8`WVBl|LtNIPv~xY-KqchtvVF5zAsza_eH-%!ue9&>}gs*)vcx|W|S{q>h-^u z&pmec?$A|#{=aAl*&4sy>+84qB>`Et=B^Fe`(Iyn#-y_9)mJwDF_xXxRF=K@%Eo`z zviEGV_vcJ=y64btvHsTi*-JN+UvNA(``cwV%|EtZ_|J5Id+et9%U14yj^f=r8m{|~ zGry2J*V`NPrP`)p-NHW`;=1bk*$uoE?ysM|=>B8I65dCSsLtc;CnC z;`@&byX=1bS|ajSj(@@HbSN(ScVj65-~KfgG>^2OFAcKv*Qtap=ty?79E!FJgIbH3cXXsu9Z Wr0K0ZPa2qq89ZJ6T-G@yGywqnVB<#s literal 0 HcmV?d00001 diff --git a/third_party/zeroclaw/apps/tauri/icons/32x32.png b/third_party/zeroclaw/apps/tauri/icons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb0bbfadb718fe4bf868eb200a74b820de3db4c GIT binary patch literal 243 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 literal 0 HcmV?d00001 diff --git a/third_party/zeroclaw/apps/tauri/icons/icon.ico b/third_party/zeroclaw/apps/tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ebb0bbfadb718fe4bf868eb200a74b820de3db4c GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJU7jwEAr*6y6Am!7v>f?&nJIZQ zx3)y-ffGdxYju=w1vcMexfkA6+R$u!>B@Li27(8A5T-G@yGywp3 + + Z + diff --git a/third_party/zeroclaw/apps/tauri/icons/tray-disconnected.png b/third_party/zeroclaw/apps/tauri/icons/tray-disconnected.png new file mode 100644 index 0000000000000000000000000000000000000000..702b7a537d70c1f566294b4b2f3771726f898318 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4feV#6kAr*7pUO33r6d=;_@b@u2 z5gtxvR%U0HgANBL7+i2YZ&4_|`SZGSTRPeHz1=VI{Gau$ZF>_1dDg$?>rSYMjN9+}rLn`LHz2L~s6e!X9@OS#9 z6eAx=x3)l|E-^vfUzeRzBm_G>R2Drw89OJo{Oeq^#fLZ7iXY$kf8X1^(Fc?y>Tk z^0G@sbCOEzM3tlF$;Wzb-hGp|Y|pLPe=fhjYIFN>Wxw}X#^B{u?JI-7w!hRpB_Hu@ zZ)0kgeuUEhhSW`>IurF0W~Q)t9}$jtX4<5>h*3xIn?Wg;)eNhjx<2yZe*0$WDw!tF R@dR4U;OXk;vd$@?2>=^*KD+<` literal 0 HcmV?d00001 diff --git a/third_party/zeroclaw/apps/tauri/icons/tray-working.png b/third_party/zeroclaw/apps/tauri/icons/tray-working.png new file mode 100644 index 0000000000000000000000000000000000000000..6850e516cc7d14615652ff04f72b7a4a2cb8db5e GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4f6FglULn`LHy)aRXDNw@o;cpgC zgGnlmMw3`PC-L-rQSzLia?$}PFiGX0hyV6y@xIcR_R4F|Ma|E%(ER&7_qMr<$l+Xm z!J`GAn>rNZd}gb6=, + message: String, +) -> Result { + let s = state.read().await; + let client = GatewayClient::new(&s.gateway_url, s.token.as_deref()); + drop(s); + client + .send_webhook_message(&message) + .await + .map_err(|e| e.to_string()) +} diff --git a/third_party/zeroclaw/apps/tauri/src/commands/channels.rs b/third_party/zeroclaw/apps/tauri/src/commands/channels.rs new file mode 100644 index 0000000..9d9c841 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/commands/channels.rs @@ -0,0 +1,11 @@ +use crate::gateway_client::GatewayClient; +use crate::state::SharedState; +use tauri::State; + +#[tauri::command] +pub async fn list_channels(state: State<'_, SharedState>) -> Result { + let s = state.read().await; + let client = GatewayClient::new(&s.gateway_url, s.token.as_deref()); + drop(s); + client.get_status().await.map_err(|e| e.to_string()) +} diff --git a/third_party/zeroclaw/apps/tauri/src/commands/gateway.rs b/third_party/zeroclaw/apps/tauri/src/commands/gateway.rs new file mode 100644 index 0000000..756a733 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/commands/gateway.rs @@ -0,0 +1,19 @@ +use crate::gateway_client::GatewayClient; +use crate::state::SharedState; +use tauri::State; + +#[tauri::command] +pub async fn get_status(state: State<'_, SharedState>) -> Result { + let s = state.read().await; + let client = GatewayClient::new(&s.gateway_url, s.token.as_deref()); + drop(s); + client.get_status().await.map_err(|e| e.to_string()) +} + +#[tauri::command] +pub async fn get_health(state: State<'_, SharedState>) -> Result { + let s = state.read().await; + let client = GatewayClient::new(&s.gateway_url, s.token.as_deref()); + drop(s); + client.get_health().await.map_err(|e| e.to_string()) +} diff --git a/third_party/zeroclaw/apps/tauri/src/commands/mod.rs b/third_party/zeroclaw/apps/tauri/src/commands/mod.rs new file mode 100644 index 0000000..c6adfe0 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/commands/mod.rs @@ -0,0 +1,4 @@ +pub mod agent; +pub mod channels; +pub mod gateway; +pub mod pairing; diff --git a/third_party/zeroclaw/apps/tauri/src/commands/pairing.rs b/third_party/zeroclaw/apps/tauri/src/commands/pairing.rs new file mode 100644 index 0000000..84d035c --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/commands/pairing.rs @@ -0,0 +1,19 @@ +use crate::gateway_client::GatewayClient; +use crate::state::SharedState; +use tauri::State; + +#[tauri::command] +pub async fn initiate_pairing(state: State<'_, SharedState>) -> Result { + let s = state.read().await; + let client = GatewayClient::new(&s.gateway_url, s.token.as_deref()); + drop(s); + client.initiate_pairing().await.map_err(|e| e.to_string()) +} + +#[tauri::command] +pub async fn get_devices(state: State<'_, SharedState>) -> Result { + let s = state.read().await; + let client = GatewayClient::new(&s.gateway_url, s.token.as_deref()); + drop(s); + client.get_devices().await.map_err(|e| e.to_string()) +} diff --git a/third_party/zeroclaw/apps/tauri/src/gateway_client.rs b/third_party/zeroclaw/apps/tauri/src/gateway_client.rs new file mode 100644 index 0000000..fd766ff --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/gateway_client.rs @@ -0,0 +1,213 @@ +//! HTTP client for communicating with the ZeroClaw gateway. + +use anyhow::{Context, Result}; + +pub struct GatewayClient { + pub(crate) base_url: String, + pub(crate) token: Option, + client: reqwest::Client, +} + +impl GatewayClient { + pub fn new(base_url: &str, token: Option<&str>) -> Self { + let client = reqwest::Client::builder() + .timeout(std::time::Duration::from_secs(10)) + .build() + .unwrap_or_default(); + Self { + base_url: base_url.to_string(), + token: token.map(String::from), + client, + } + } + + pub(crate) fn auth_header(&self) -> Option { + self.token.as_ref().map(|t| format!("Bearer {t}")) + } + + pub async fn get_status(&self) -> Result { + let mut req = self.client.get(format!("{}/api/status", self.base_url)); + if let Some(auth) = self.auth_header() { + req = req.header("Authorization", auth); + } + let resp = req.send().await.context("status request failed")?; + Ok(resp.json().await?) + } + + pub async fn get_health(&self) -> Result { + match self + .client + .get(format!("{}/health", self.base_url)) + .send() + .await + { + Ok(resp) => Ok(resp.status().is_success()), + Err(_) => Ok(false), + } + } + + pub async fn get_devices(&self) -> Result { + let mut req = self.client.get(format!("{}/api/devices", self.base_url)); + if let Some(auth) = self.auth_header() { + req = req.header("Authorization", auth); + } + let resp = req.send().await.context("devices request failed")?; + Ok(resp.json().await?) + } + + pub async fn initiate_pairing(&self) -> Result { + let mut req = self + .client + .post(format!("{}/api/pairing/initiate", self.base_url)); + if let Some(auth) = self.auth_header() { + req = req.header("Authorization", auth); + } + let resp = req.send().await.context("pairing request failed")?; + Ok(resp.json().await?) + } + + /// Check whether the gateway requires pairing. + pub async fn requires_pairing(&self) -> Result { + let resp = self + .client + .get(format!("{}/health", self.base_url)) + .send() + .await + .context("health request failed")?; + let body: serde_json::Value = resp.json().await?; + Ok(body["require_pairing"].as_bool().unwrap_or(false)) + } + + /// Request a new pairing code from the gateway (localhost-only admin endpoint). + pub async fn request_new_paircode(&self) -> Result { + let resp = self + .client + .post(format!("{}/admin/paircode/new", self.base_url)) + .send() + .await + .context("paircode request failed")?; + let body: serde_json::Value = resp.json().await?; + body["pairing_code"] + .as_str() + .map(String::from) + .context("no pairing_code in response") + } + + /// Exchange a pairing code for a bearer token. + pub async fn pair_with_code(&self, code: &str) -> Result { + let resp = self + .client + .post(format!("{}/pair", self.base_url)) + .header("X-Pairing-Code", code) + .send() + .await + .context("pair request failed")?; + if !resp.status().is_success() { + anyhow::bail!("pair request returned {}", resp.status()); + } + let body: serde_json::Value = resp.json().await?; + body["token"] + .as_str() + .map(String::from) + .context("no token in pair response") + } + + /// Validate an existing token by calling a protected endpoint. + pub async fn validate_token(&self) -> Result { + let mut req = self.client.get(format!("{}/api/status", self.base_url)); + if let Some(auth) = self.auth_header() { + req = req.header("Authorization", auth); + } + match req.send().await { + Ok(resp) => Ok(resp.status().is_success()), + Err(_) => Ok(false), + } + } + + /// Auto-pair with the gateway: request a new code and exchange it for a token. + pub async fn auto_pair(&self) -> Result { + let code = self.request_new_paircode().await?; + self.pair_with_code(&code).await + } + + pub async fn send_webhook_message(&self, message: &str) -> Result { + let mut req = self + .client + .post(format!("{}/webhook", self.base_url)) + .json(&serde_json::json!({ "message": message })); + if let Some(auth) = self.auth_header() { + req = req.header("Authorization", auth); + } + let resp = req.send().await.context("webhook request failed")?; + Ok(resp.json().await?) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn client_creation_no_token() { + let client = GatewayClient::new("http://127.0.0.1:42617", None); + assert_eq!(client.base_url, "http://127.0.0.1:42617"); + assert!(client.token.is_none()); + assert!(client.auth_header().is_none()); + } + + #[test] + fn client_creation_with_token() { + let client = GatewayClient::new("http://localhost:8080", Some("test-token")); + assert_eq!(client.base_url, "http://localhost:8080"); + assert_eq!(client.token.as_deref(), Some("test-token")); + assert_eq!(client.auth_header().unwrap(), "Bearer test-token"); + } + + #[test] + fn client_custom_url() { + let client = GatewayClient::new("https://zeroclaw.example.com:9999", None); + assert_eq!(client.base_url, "https://zeroclaw.example.com:9999"); + } + + #[test] + fn auth_header_format() { + let client = GatewayClient::new("http://localhost", Some("zc_abc123")); + assert_eq!(client.auth_header().unwrap(), "Bearer zc_abc123"); + } + + #[tokio::test] + async fn health_returns_false_for_unreachable_host() { + // Connect to a port that should not be listening. + let client = GatewayClient::new("http://127.0.0.1:1", None); + let result = client.get_health().await.unwrap(); + assert!(!result, "health should be false for unreachable host"); + } + + #[tokio::test] + async fn status_fails_for_unreachable_host() { + let client = GatewayClient::new("http://127.0.0.1:1", None); + let result = client.get_status().await; + assert!(result.is_err(), "status should fail for unreachable host"); + } + + #[tokio::test] + async fn devices_fails_for_unreachable_host() { + let client = GatewayClient::new("http://127.0.0.1:1", None); + let result = client.get_devices().await; + assert!(result.is_err(), "devices should fail for unreachable host"); + } + + #[tokio::test] + async fn pairing_fails_for_unreachable_host() { + let client = GatewayClient::new("http://127.0.0.1:1", None); + let result = client.initiate_pairing().await; + assert!(result.is_err(), "pairing should fail for unreachable host"); + } + + #[tokio::test] + async fn webhook_fails_for_unreachable_host() { + let client = GatewayClient::new("http://127.0.0.1:1", None); + let result = client.send_webhook_message("hello").await; + assert!(result.is_err(), "webhook should fail for unreachable host"); + } +} diff --git a/third_party/zeroclaw/apps/tauri/src/health.rs b/third_party/zeroclaw/apps/tauri/src/health.rs new file mode 100644 index 0000000..d0be65b --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/health.rs @@ -0,0 +1,40 @@ +//! Background health polling for the ZeroClaw gateway. + +use crate::gateway_client::GatewayClient; +use crate::state::SharedState; +use crate::tray::icon; +use std::time::Duration; +use tauri::{AppHandle, Emitter, Runtime}; + +const POLL_INTERVAL: Duration = Duration::from_secs(5); + +/// Spawn a background task that polls gateway health and updates state + tray. +pub fn spawn_health_poller(app: AppHandle, state: SharedState) { + tauri::async_runtime::spawn(async move { + loop { + let (url, token) = { + let s = state.read().await; + (s.gateway_url.clone(), s.token.clone()) + }; + + let client = GatewayClient::new(&url, token.as_deref()); + let healthy = client.get_health().await.unwrap_or(false); + + let (connected, agent_status) = { + let mut s = state.write().await; + s.connected = healthy; + (s.connected, s.agent_status) + }; + + // Update the tray icon and tooltip to reflect current state. + if let Some(tray) = app.tray_by_id("main") { + let _ = tray.set_icon(Some(icon::icon_for_state(connected, agent_status))); + let _ = tray.set_tooltip(Some(icon::tooltip_for_state(connected, agent_status))); + } + + let _ = app.emit("zeroclaw://status-changed", healthy); + + tokio::time::sleep(POLL_INTERVAL).await; + } + }); +} diff --git a/third_party/zeroclaw/apps/tauri/src/lib.rs b/third_party/zeroclaw/apps/tauri/src/lib.rs new file mode 100644 index 0000000..528aca9 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/lib.rs @@ -0,0 +1,136 @@ +//! ZeroClaw Desktop — Tauri application library. + +pub mod commands; +pub mod gateway_client; +pub mod health; +pub mod state; +pub mod tray; + +use gateway_client::GatewayClient; +use state::shared_state; +use tauri::{Manager, RunEvent}; + +/// Attempt to auto-pair with the gateway so the WebView has a valid token +/// before the React frontend mounts. Runs on localhost so the admin endpoints +/// are accessible without auth. +async fn auto_pair(state: &state::SharedState) -> Option { + let url = { + let s = state.read().await; + s.gateway_url.clone() + }; + + let client = GatewayClient::new(&url, None); + + // Check if gateway is reachable and requires pairing. + if !client.requires_pairing().await.unwrap_or(false) { + return None; // Pairing disabled — no token needed. + } + + // Check if we already have a valid token in state. + { + let s = state.read().await; + if let Some(ref token) = s.token { + let authed = GatewayClient::new(&url, Some(token)); + if authed.validate_token().await.unwrap_or(false) { + return Some(token.clone()); // Existing token is valid. + } + } + } + + // No valid token — auto-pair by requesting a new code and exchanging it. + let client = GatewayClient::new(&url, None); + match client.auto_pair().await { + Ok(token) => { + let mut s = state.write().await; + s.token = Some(token.clone()); + Some(token) + } + Err(_) => None, // Gateway may not be ready yet; health poller will retry. + } +} + +/// Inject a bearer token into the WebView's localStorage so the React app +/// skips the pairing dialog. Uses Tauri's WebviewWindow scripting API. +fn inject_token_into_webview(window: &tauri::WebviewWindow, token: &str) { + let escaped = token.replace('\\', "\\\\").replace('\'', "\\'"); + let script = format!("localStorage.setItem('zeroclaw_token', '{escaped}')"); + // WebviewWindow scripting is the standard Tauri API for running JS in the WebView. + let _ = window.eval(&script); +} + +/// Set the macOS dock icon programmatically so it shows even in dev builds +/// (which don't have a proper .app bundle). +#[cfg(target_os = "macos")] +fn set_dock_icon() { + use objc2::{AnyThread, MainThreadMarker}; + use objc2_app_kit::NSApplication; + use objc2_app_kit::NSImage; + use objc2_foundation::NSData; + + let icon_bytes = include_bytes!("../icons/128x128.png"); + // Safety: setup() runs on the main thread in Tauri. + let mtm = unsafe { MainThreadMarker::new_unchecked() }; + let data = NSData::with_bytes(icon_bytes); + if let Some(image) = NSImage::initWithData(NSImage::alloc(), &data) { + let app = NSApplication::sharedApplication(mtm); + unsafe { app.setApplicationIconImage(Some(&image)) }; + } +} + +/// Configure and run the Tauri application. +pub fn run() { + let shared = shared_state(); + + tauri::Builder::default() + .plugin(tauri_plugin_shell::init()) + .plugin(tauri_plugin_store::Builder::default().build()) + .plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| { + // When a second instance launches, focus the existing window. + if let Some(window) = app.get_webview_window("main") { + let _ = window.show(); + let _ = window.set_focus(); + } + })) + .manage(shared.clone()) + .invoke_handler(tauri::generate_handler![ + commands::gateway::get_status, + commands::gateway::get_health, + commands::channels::list_channels, + commands::pairing::initiate_pairing, + commands::pairing::get_devices, + commands::agent::send_message, + ]) + .setup(move |app| { + // Set macOS dock icon (needed for dev builds without .app bundle). + #[cfg(target_os = "macos")] + set_dock_icon(); + + // Set up the system tray. + let _ = tray::setup_tray(app); + + // Auto-pair with gateway and inject token into the WebView. + let app_handle = app.handle().clone(); + let pair_state = shared.clone(); + tauri::async_runtime::spawn(async move { + if let Some(token) = auto_pair(&pair_state).await { + if let Some(window) = app_handle.get_webview_window("main") { + inject_token_into_webview(&window, &token); + } + } + }); + + // Start background health polling. + health::spawn_health_poller(app.handle().clone(), shared.clone()); + + Ok(()) + }) + .build(tauri::generate_context!()) + .expect("error while building tauri application") + .run(|_app, event| { + // Keep the app running in the background when all windows are closed. + // This is the standard pattern for menu bar / tray apps. + if let RunEvent::ExitRequested { api, .. } = event { + api.prevent_exit(); + } + }); +} diff --git a/third_party/zeroclaw/apps/tauri/src/main.rs b/third_party/zeroclaw/apps/tauri/src/main.rs new file mode 100644 index 0000000..049aee4 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/main.rs @@ -0,0 +1,8 @@ +//! ZeroClaw Desktop — main entry point. +//! +//! Prevents an additional console window on Windows in release. +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + zeroclaw_desktop::run(); +} diff --git a/third_party/zeroclaw/apps/tauri/src/mobile.rs b/third_party/zeroclaw/apps/tauri/src/mobile.rs new file mode 100644 index 0000000..94174e0 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/mobile.rs @@ -0,0 +1,6 @@ +//! Mobile entry point for ZeroClaw Desktop (iOS/Android). + +#[tauri::mobile_entry_point] +fn main() { + zeroclaw_desktop::run(); +} diff --git a/third_party/zeroclaw/apps/tauri/src/state.rs b/third_party/zeroclaw/apps/tauri/src/state.rs new file mode 100644 index 0000000..4515f6d --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/state.rs @@ -0,0 +1,99 @@ +//! Shared application state for Tauri. + +use std::sync::Arc; +use tokio::sync::RwLock; + +/// Agent status as reported by the gateway. +#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)] +#[serde(rename_all = "snake_case")] +pub enum AgentStatus { + Idle, + Working, + Error, +} + +/// Shared application state behind an `Arc>`. +#[derive(Debug, Clone)] +pub struct AppState { + pub gateway_url: String, + pub token: Option, + pub connected: bool, + pub agent_status: AgentStatus, +} + +impl Default for AppState { + fn default() -> Self { + Self { + gateway_url: "http://127.0.0.1:42617".to_string(), + token: None, + connected: false, + agent_status: AgentStatus::Idle, + } + } +} + +/// Thread-safe wrapper around `AppState`. +pub type SharedState = Arc>; + +/// Create the default shared state. +pub fn shared_state() -> SharedState { + Arc::new(RwLock::new(AppState::default())) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn default_state() { + let state = AppState::default(); + assert_eq!(state.gateway_url, "http://127.0.0.1:42617"); + assert!(state.token.is_none()); + assert!(!state.connected); + assert_eq!(state.agent_status, AgentStatus::Idle); + } + + #[test] + fn shared_state_is_cloneable() { + let s1 = shared_state(); + let s2 = s1.clone(); + // Both references point to the same allocation. + assert!(Arc::ptr_eq(&s1, &s2)); + } + + #[tokio::test] + async fn shared_state_concurrent_read_write() { + let state = shared_state(); + + // Write from one handle. + { + let mut s = state.write().await; + s.connected = true; + s.agent_status = AgentStatus::Working; + s.token = Some("zc_test".to_string()); + } + + // Read from cloned handle. + let state2 = state.clone(); + let s = state2.read().await; + assert!(s.connected); + assert_eq!(s.agent_status, AgentStatus::Working); + assert_eq!(s.token.as_deref(), Some("zc_test")); + } + + #[test] + fn agent_status_serialization() { + assert_eq!( + serde_json::to_string(&AgentStatus::Idle).unwrap(), + "\"idle\"" + ); + assert_eq!( + serde_json::to_string(&AgentStatus::Working).unwrap(), + "\"working\"" + ); + assert_eq!( + serde_json::to_string(&AgentStatus::Error).unwrap(), + "\"error\"" + ); + } +} diff --git a/third_party/zeroclaw/apps/tauri/src/tray/events.rs b/third_party/zeroclaw/apps/tauri/src/tray/events.rs new file mode 100644 index 0000000..1c50506 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/tray/events.rs @@ -0,0 +1,25 @@ +//! Tray menu event handling. + +use tauri::{menu::MenuEvent, AppHandle, Manager, Runtime}; + +pub fn handle_menu_event(app: &AppHandle, event: MenuEvent) { + match event.id().as_ref() { + "show" => show_main_window(app, None), + "chat" => show_main_window(app, Some("/agent")), + "quit" => { + app.exit(0); + } + _ => {} + } +} + +fn show_main_window(app: &AppHandle, navigate_to: Option<&str>) { + if let Some(window) = app.get_webview_window("main") { + let _ = window.show(); + let _ = window.set_focus(); + if let Some(path) = navigate_to { + let script = format!("window.location.hash = '{path}'"); + let _ = window.eval(&script); + } + } +} diff --git a/third_party/zeroclaw/apps/tauri/src/tray/icon.rs b/third_party/zeroclaw/apps/tauri/src/tray/icon.rs new file mode 100644 index 0000000..ca33e00 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/tray/icon.rs @@ -0,0 +1,105 @@ +//! Tray icon management — swap icon based on connection/agent status. + +use crate::state::AgentStatus; +use tauri::image::Image; + +/// Embedded tray icon PNGs (22x22, RGBA). +const ICON_IDLE: &[u8] = include_bytes!("../../icons/tray-idle.png"); +const ICON_WORKING: &[u8] = include_bytes!("../../icons/tray-working.png"); +const ICON_ERROR: &[u8] = include_bytes!("../../icons/tray-error.png"); +const ICON_DISCONNECTED: &[u8] = include_bytes!("../../icons/tray-disconnected.png"); + +/// Select the appropriate tray icon for the current state. +pub fn icon_for_state(connected: bool, status: AgentStatus) -> Image<'static> { + let bytes: &[u8] = if !connected { + ICON_DISCONNECTED + } else { + match status { + AgentStatus::Idle => ICON_IDLE, + AgentStatus::Working => ICON_WORKING, + AgentStatus::Error => ICON_ERROR, + } + }; + Image::from_bytes(bytes).expect("embedded tray icon is a valid PNG") +} + +/// Tooltip text for the current state. +pub fn tooltip_for_state(connected: bool, status: AgentStatus) -> &'static str { + if !connected { + return "ZeroClaw — Disconnected"; + } + match status { + AgentStatus::Idle => "ZeroClaw — Idle", + AgentStatus::Working => "ZeroClaw — Working", + AgentStatus::Error => "ZeroClaw — Error", + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn icon_disconnected_when_not_connected() { + // Should not panic — icon bytes are valid PNGs. + let _img = icon_for_state(false, AgentStatus::Idle); + let _img = icon_for_state(false, AgentStatus::Working); + let _img = icon_for_state(false, AgentStatus::Error); + } + + #[test] + fn icon_connected_variants() { + let _idle = icon_for_state(true, AgentStatus::Idle); + let _working = icon_for_state(true, AgentStatus::Working); + let _error = icon_for_state(true, AgentStatus::Error); + } + + #[test] + fn tooltip_disconnected() { + assert_eq!( + tooltip_for_state(false, AgentStatus::Idle), + "ZeroClaw — Disconnected" + ); + // Agent status is irrelevant when disconnected. + assert_eq!( + tooltip_for_state(false, AgentStatus::Working), + "ZeroClaw — Disconnected" + ); + assert_eq!( + tooltip_for_state(false, AgentStatus::Error), + "ZeroClaw — Disconnected" + ); + } + + #[test] + fn tooltip_connected_variants() { + assert_eq!( + tooltip_for_state(true, AgentStatus::Idle), + "ZeroClaw — Idle" + ); + assert_eq!( + tooltip_for_state(true, AgentStatus::Working), + "ZeroClaw — Working" + ); + assert_eq!( + tooltip_for_state(true, AgentStatus::Error), + "ZeroClaw — Error" + ); + } + + #[test] + fn embedded_icons_are_valid_png() { + // Verify the PNG signature (first 8 bytes) of each embedded icon. + let png_sig: &[u8] = &[0x89, b'P', b'N', b'G', 0x0D, 0x0A, 0x1A, 0x0A]; + assert!(ICON_IDLE.starts_with(png_sig), "idle icon not valid PNG"); + assert!( + ICON_WORKING.starts_with(png_sig), + "working icon not valid PNG" + ); + assert!(ICON_ERROR.starts_with(png_sig), "error icon not valid PNG"); + assert!( + ICON_DISCONNECTED.starts_with(png_sig), + "disconnected icon not valid PNG" + ); + } +} diff --git a/third_party/zeroclaw/apps/tauri/src/tray/menu.rs b/third_party/zeroclaw/apps/tauri/src/tray/menu.rs new file mode 100644 index 0000000..4b201e6 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/tray/menu.rs @@ -0,0 +1,19 @@ +//! Tray menu construction. + +use tauri::{ + menu::{Menu, MenuItemBuilder, PredefinedMenuItem}, + App, Runtime, +}; + +pub fn create_tray_menu(app: &App) -> Result, tauri::Error> { + let show = MenuItemBuilder::with_id("show", "Show Dashboard").build(app)?; + let chat = MenuItemBuilder::with_id("chat", "Agent Chat").build(app)?; + let sep1 = PredefinedMenuItem::separator(app)?; + let status = MenuItemBuilder::with_id("status", "Status: Checking...") + .enabled(false) + .build(app)?; + let sep2 = PredefinedMenuItem::separator(app)?; + let quit = MenuItemBuilder::with_id("quit", "Quit ZeroClaw").build(app)?; + + Menu::with_items(app, &[&show, &chat, &sep1, &status, &sep2, &quit]) +} diff --git a/third_party/zeroclaw/apps/tauri/src/tray/mod.rs b/third_party/zeroclaw/apps/tauri/src/tray/mod.rs new file mode 100644 index 0000000..f653e03 --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/src/tray/mod.rs @@ -0,0 +1,34 @@ +//! System tray integration for ZeroClaw Desktop. + +pub mod events; +pub mod icon; +pub mod menu; + +use tauri::{ + tray::{TrayIcon, TrayIconBuilder, TrayIconEvent}, + App, Manager, Runtime, +}; + +/// Set up the system tray icon and menu. +pub fn setup_tray(app: &App) -> Result, tauri::Error> { + let menu = menu::create_tray_menu(app)?; + + TrayIconBuilder::with_id("main") + .tooltip("ZeroClaw — Disconnected") + .icon(icon::icon_for_state(false, crate::state::AgentStatus::Idle)) + .menu(&menu) + .show_menu_on_left_click(false) + .on_menu_event(events::handle_menu_event) + .on_tray_icon_event(|tray, event| { + if let TrayIconEvent::Click { button, .. } = event { + if button == tauri::tray::MouseButton::Left { + let app = tray.app_handle(); + if let Some(window) = app.get_webview_window("main") { + let _ = window.show(); + let _ = window.set_focus(); + } + } + } + }) + .build(app) +} diff --git a/third_party/zeroclaw/apps/tauri/tauri.conf.json b/third_party/zeroclaw/apps/tauri/tauri.conf.json new file mode 100644 index 0000000..8d1202d --- /dev/null +++ b/third_party/zeroclaw/apps/tauri/tauri.conf.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/crates/tauri-cli/config.schema.json", + "productName": "ZeroClaw", + "version": "0.6.3", + "identifier": "ai.zeroclawlabs.desktop", + "build": { + "devUrl": "http://127.0.0.1:42617/_app/", + "frontendDist": "http://127.0.0.1:42617/_app/" + }, + "app": { + "windows": [ + { + "title": "ZeroClaw", + "width": 1200, + "height": 800, + "resizable": true, + "fullscreen": false, + "visible": false + } + ], + "security": { + "csp": "default-src 'self' http://127.0.0.1:* ws://127.0.0.1:*; connect-src 'self' http://127.0.0.1:* ws://127.0.0.1:*; script-src 'self' 'unsafe-inline' http://127.0.0.1:*; style-src 'self' 'unsafe-inline' http://127.0.0.1:*; img-src 'self' http://127.0.0.1:* data:" + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/third_party/zeroclaw/benches/agent_benchmarks.rs b/third_party/zeroclaw/benches/agent_benchmarks.rs new file mode 100644 index 0000000..4627099 --- /dev/null +++ b/third_party/zeroclaw/benches/agent_benchmarks.rs @@ -0,0 +1,329 @@ +//! Performance benchmarks for ZeroClaw hot paths. +//! +//! Benchmarks cover: +//! - Tool dispatch (XML parsing, native parsing) +//! - Memory store/recall cycles (SQLite backend) +//! - Agent turn cycle (full orchestration loop) +//! +//! Run: `cargo bench` +//! +//! Ref: https://github.com/zeroclaw-labs/zeroclaw/issues/618 (item 7) + +use criterion::{criterion_group, criterion_main, Criterion}; +use std::hint::black_box; +use std::sync::{Arc, Mutex}; + +use zeroclaw::agent::agent::Agent; +use zeroclaw::agent::dispatcher::{NativeToolDispatcher, ToolDispatcher, XmlToolDispatcher}; +use zeroclaw::config::MemoryConfig; +use zeroclaw::memory; +use zeroclaw::memory::{Memory, MemoryCategory}; +use zeroclaw::observability::{NoopObserver, Observer}; +use zeroclaw::providers::{ChatRequest, ChatResponse, Provider, ToolCall}; +use zeroclaw::tools::{Tool, ToolResult}; + +use anyhow::Result; +use async_trait::async_trait; + +// ───────────────────────────────────────────────────────────────────────────── +// Mock infrastructure (mirrors test mocks, kept local for benchmark isolation) +// ───────────────────────────────────────────────────────────────────────────── + +struct BenchProvider { + responses: Mutex>, +} + +impl BenchProvider { + fn text_only(text: &str) -> Self { + Self { + responses: Mutex::new(vec![ChatResponse { + text: Some(text.into()), + tool_calls: vec![], + usage: None, + reasoning_content: None, + }]), + } + } + + fn with_tool_then_text() -> Self { + Self { + responses: Mutex::new(vec![ + ChatResponse { + text: Some(String::new()), + tool_calls: vec![ToolCall { + id: "tc1".into(), + name: "noop".into(), + arguments: "{}".into(), + }], + usage: None, + reasoning_content: None, + }, + ChatResponse { + text: Some("done".into()), + tool_calls: vec![], + usage: None, + reasoning_content: None, + }, + ]), + } + } +} + +#[async_trait] +impl Provider for BenchProvider { + async fn chat_with_system( + &self, + _system_prompt: Option<&str>, + _message: &str, + _model: &str, + _temperature: f64, + ) -> Result { + Ok("fallback".into()) + } + + async fn chat( + &self, + _request: ChatRequest<'_>, + _model: &str, + _temperature: f64, + ) -> Result { + let mut guard = self.responses.lock().unwrap(); + if guard.is_empty() { + return Ok(ChatResponse { + text: Some("done".into()), + tool_calls: vec![], + usage: None, + reasoning_content: None, + }); + } + Ok(guard.remove(0)) + } +} + +struct NoopTool; + +#[async_trait] +impl Tool for NoopTool { + fn name(&self) -> &str { + "noop" + } + fn description(&self) -> &str { + "Does nothing" + } + fn parameters_schema(&self) -> serde_json::Value { + serde_json::json!({"type": "object"}) + } + async fn execute(&self, _args: serde_json::Value) -> Result { + Ok(ToolResult { + success: true, + output: String::new(), + error: None, + }) + } +} + +fn make_memory() -> Arc { + let cfg = MemoryConfig { + backend: "none".into(), + ..MemoryConfig::default() + }; + Arc::from(memory::create_memory(&cfg, std::path::Path::new("/tmp"), None).unwrap()) +} + +fn make_sqlite_memory(dir: &std::path::Path) -> Arc { + let cfg = MemoryConfig { + backend: "sqlite".into(), + ..MemoryConfig::default() + }; + Arc::from(memory::create_memory(&cfg, dir, None).unwrap()) +} + +fn make_observer() -> Arc { + Arc::from(NoopObserver {}) +} + +// ───────────────────────────────────────────────────────────────────────────── +// Benchmark: XML tool-call parsing +// ───────────────────────────────────────────────────────────────────────────── + +fn bench_xml_parsing(c: &mut Criterion) { + let dispatcher = XmlToolDispatcher; + + let single_tool = ChatResponse { + text: Some( + r#"Here is my analysis. + +{"name": "search", "arguments": {"query": "zeroclaw architecture"}} + +Let me know if you need more."# + .into(), + ), + tool_calls: vec![], + usage: None, + reasoning_content: None, + }; + + let multi_tool = ChatResponse { + text: Some( + r#" +{"name": "read_file", "arguments": {"path": "src/main.rs"}} + + +{"name": "search", "arguments": {"query": "config"}} + + +{"name": "list_dir", "arguments": {"path": "src/"}} +"# + .into(), + ), + tool_calls: vec![], + usage: None, + reasoning_content: None, + }; + + c.bench_function("xml_parse_single_tool_call", |b| { + b.iter(|| dispatcher.parse_response(black_box(&single_tool))) + }); + + c.bench_function("xml_parse_multi_tool_call", |b| { + b.iter(|| dispatcher.parse_response(black_box(&multi_tool))) + }); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Benchmark: Native tool-call parsing +// ───────────────────────────────────────────────────────────────────────────── + +fn bench_native_parsing(c: &mut Criterion) { + let dispatcher = NativeToolDispatcher; + + let response = ChatResponse { + text: Some("I'll help you.".into()), + tool_calls: vec![ + ToolCall { + id: "tc1".into(), + name: "search".into(), + arguments: r#"{"query": "zeroclaw"}"#.into(), + }, + ToolCall { + id: "tc2".into(), + name: "read_file".into(), + arguments: r#"{"path": "src/main.rs"}"#.into(), + }, + ], + usage: None, + reasoning_content: None, + }; + + c.bench_function("native_parse_tool_calls", |b| { + b.iter(|| dispatcher.parse_response(black_box(&response))) + }); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Benchmark: Memory store + recall (SQLite) +// ───────────────────────────────────────────────────────────────────────────── + +fn bench_memory_operations(c: &mut Criterion) { + let rt = tokio::runtime::Runtime::new().unwrap(); + let tmp = tempfile::TempDir::new().unwrap(); + let mem = make_sqlite_memory(tmp.path()); + + // Seed with entries for recall benchmarks + rt.block_on(async { + for i in 0..100 { + mem.store( + &format!("key_{i}"), + &format!("Content entry number {i} about zeroclaw agent runtime"), + MemoryCategory::Core, + None, + ) + .await + .unwrap(); + } + }); + + c.bench_function("memory_store_single", |b| { + let counter = std::sync::atomic::AtomicUsize::new(1000); + b.iter(|| { + let idx = counter.fetch_add(1, std::sync::atomic::Ordering::Relaxed); + rt.block_on(async { + mem.store( + &format!("bench_key_{idx}"), + "Benchmark content for store operation", + MemoryCategory::Daily, + None, + ) + .await + .unwrap(); + }); + }); + }); + + c.bench_function("memory_recall_top10", |b| { + b.iter(|| { + rt.block_on(async { + mem.recall(black_box("zeroclaw agent"), 10, None, None, None) + .await + .unwrap() + }) + }); + }); + + c.bench_function("memory_count", |b| { + b.iter(|| rt.block_on(async { mem.count().await.unwrap() })); + }); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Benchmark: Full agent turn cycle +// ───────────────────────────────────────────────────────────────────────────── + +fn bench_agent_turn(c: &mut Criterion) { + let rt = tokio::runtime::Runtime::new().unwrap(); + + c.bench_function("agent_turn_text_only", |b| { + b.iter(|| { + rt.block_on(async { + let provider = Box::new(BenchProvider::text_only("benchmark response")); + let mut agent = Agent::builder() + .provider(provider) + .tools(vec![Box::new(NoopTool) as Box]) + .memory(make_memory()) + .observer(make_observer()) + .tool_dispatcher(Box::new(NativeToolDispatcher)) + .workspace_dir(std::path::PathBuf::from("/tmp")) + .build() + .unwrap(); + agent.turn(black_box("hello")).await.unwrap() + }) + }); + }); + + c.bench_function("agent_turn_with_tool_call", |b| { + b.iter(|| { + rt.block_on(async { + let provider = Box::new(BenchProvider::with_tool_then_text()); + let mut agent = Agent::builder() + .provider(provider) + .tools(vec![Box::new(NoopTool) as Box]) + .memory(make_memory()) + .observer(make_observer()) + .tool_dispatcher(Box::new(NativeToolDispatcher)) + .workspace_dir(std::path::PathBuf::from("/tmp")) + .build() + .unwrap(); + agent.turn(black_box("run tool")).await.unwrap() + }) + }); + }); +} + +criterion_group!( + benches, + bench_xml_parsing, + bench_native_parsing, + bench_memory_operations, + bench_agent_turn, +); +criterion_main!(benches); diff --git a/third_party/zeroclaw/build.rs b/third_party/zeroclaw/build.rs new file mode 100644 index 0000000..cf6e28c --- /dev/null +++ b/third_party/zeroclaw/build.rs @@ -0,0 +1,181 @@ +use std::fs; +use std::path::Path; +use std::process::Command; +use std::time::SystemTime; + +fn main() { + let dist_dir = Path::new("web/dist"); + let web_dir = Path::new("web"); + + // Tell Cargo to re-run this script when web sources or bundled assets change. + println!("cargo:rerun-if-changed=web/src"); + println!("cargo:rerun-if-changed=web/public"); + println!("cargo:rerun-if-changed=web/index.html"); + println!("cargo:rerun-if-changed=docs/assets/zeroclaw-trans.png"); + println!("cargo:rerun-if-changed=web/package.json"); + println!("cargo:rerun-if-changed=web/package-lock.json"); + println!("cargo:rerun-if-changed=web/tsconfig.json"); + println!("cargo:rerun-if-changed=web/tsconfig.app.json"); + println!("cargo:rerun-if-changed=web/tsconfig.node.json"); + println!("cargo:rerun-if-changed=web/vite.config.ts"); + println!("cargo:rerun-if-changed=web/dist"); + + // Attempt to build the web frontend if npm is available and web/dist is + // missing or stale. The build is best-effort: when Node.js is not + // installed (e.g. CI containers, cross-compilation, minimal dev setups) + // we fall back to the existing stub/empty dist directory so the Rust + // build still succeeds. + let needs_build = web_build_required(web_dir, dist_dir); + + if needs_build && web_dir.join("package.json").exists() { + if let Ok(npm) = which_npm() { + eprintln!("cargo:warning=Building web frontend (web/dist is missing or stale)..."); + + // npm ci / npm install + let install_status = Command::new(&npm) + .args(["ci", "--ignore-scripts"]) + .current_dir(web_dir) + .status(); + + match install_status { + Ok(s) if s.success() => {} + Ok(s) => { + // Fall back to `npm install` if `npm ci` fails (no lockfile, etc.) + eprintln!("cargo:warning=npm ci exited with {s}, trying npm install..."); + let fallback = Command::new(&npm) + .args(["install"]) + .current_dir(web_dir) + .status(); + if !matches!(fallback, Ok(s) if s.success()) { + eprintln!("cargo:warning=npm install failed — skipping web build"); + ensure_dist_dir(dist_dir); + return; + } + } + Err(e) => { + eprintln!("cargo:warning=Could not run npm: {e} — skipping web build"); + ensure_dist_dir(dist_dir); + return; + } + } + + // npm run build + let build_status = Command::new(&npm) + .args(["run", "build"]) + .current_dir(web_dir) + .status(); + + match build_status { + Ok(s) if s.success() => { + eprintln!("cargo:warning=Web frontend built successfully."); + } + Ok(s) => { + eprintln!( + "cargo:warning=npm run build exited with {s} — web dashboard may be unavailable" + ); + } + Err(e) => { + eprintln!( + "cargo:warning=Could not run npm build: {e} — web dashboard may be unavailable" + ); + } + } + } + } + + ensure_dist_dir(dist_dir); + ensure_dashboard_assets(dist_dir); +} + +fn web_build_required(web_dir: &Path, dist_dir: &Path) -> bool { + let Some(dist_mtime) = latest_modified(dist_dir) else { + return true; + }; + + [ + web_dir.join("src"), + web_dir.join("public"), + web_dir.join("index.html"), + web_dir.join("package.json"), + web_dir.join("package-lock.json"), + web_dir.join("tsconfig.json"), + web_dir.join("tsconfig.app.json"), + web_dir.join("tsconfig.node.json"), + web_dir.join("vite.config.ts"), + ] + .into_iter() + .filter_map(|path| latest_modified(&path)) + .any(|mtime| mtime > dist_mtime) +} + +fn latest_modified(path: &Path) -> Option { + let metadata = fs::metadata(path).ok()?; + if metadata.is_file() { + return metadata.modified().ok(); + } + if !metadata.is_dir() { + return None; + } + + let mut latest = metadata.modified().ok(); + let entries = fs::read_dir(path).ok()?; + for entry in entries.flatten() { + if let Some(child_mtime) = latest_modified(&entry.path()) { + latest = Some(match latest { + Some(current) if current >= child_mtime => current, + _ => child_mtime, + }); + } + } + latest +} + +/// Ensure the dist directory exists so `rust-embed` does not fail at compile +/// time even when the web frontend is not built. +fn ensure_dist_dir(dist_dir: &Path) { + if !dist_dir.exists() { + std::fs::create_dir_all(dist_dir).expect("failed to create web/dist/"); + } +} + +fn ensure_dashboard_assets(dist_dir: &Path) { + // The Rust gateway serves `web/dist/` via rust-embed under `/_app/*`. + // Some builds may end up with missing/blank logo assets, so we ensure the + // expected image is always present in `web/dist/` at compile time. + let src = Path::new("docs/assets/zeroclaw-trans.png"); + if !src.exists() { + eprintln!( + "cargo:warning=docs/assets/zeroclaw-trans.png not found; skipping dashboard asset copy" + ); + return; + } + + let dst = dist_dir.join("zeroclaw-trans.png"); + if let Err(e) = fs::copy(src, &dst) { + eprintln!("cargo:warning=Failed to copy zeroclaw-trans.png into web/dist/: {e}"); + } +} + +/// Locate the `npm` binary on the system PATH. +fn which_npm() -> Result { + let cmd = if cfg!(target_os = "windows") { + "where" + } else { + "which" + }; + + Command::new(cmd) + .arg("npm") + .output() + .ok() + .and_then(|output| { + if output.status.success() { + String::from_utf8(output.stdout) + .ok() + .map(|s| s.lines().next().unwrap_or("npm").trim().to_string()) + } else { + None + } + }) + .ok_or(()) +} diff --git a/third_party/zeroclaw/clippy.toml b/third_party/zeroclaw/clippy.toml new file mode 100644 index 0000000..2ffd47c --- /dev/null +++ b/third_party/zeroclaw/clippy.toml @@ -0,0 +1,13 @@ +# Clippy configuration for ZeroClaw. +# Thresholds tuned to match codebase patterns and reduce noise from +# existing allow-attributes while still catching genuinely complex code. + +cognitive-complexity-threshold = 30 + +too-many-arguments-threshold = 10 + +too-many-lines-threshold = 200 + +# Some generated/test-only paths legitimately allocate larger local buffers. +# Keep linting enabled while reducing false positives from those cases. +array-size-threshold = 65536 diff --git a/third_party/zeroclaw/crates/aardvark-sys/Cargo.toml b/third_party/zeroclaw/crates/aardvark-sys/Cargo.toml new file mode 100644 index 0000000..ff90a15 --- /dev/null +++ b/third_party/zeroclaw/crates/aardvark-sys/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "aardvark-sys" +version = "0.1.0" +edition = "2021" +authors = ["theonlyhennygod"] +license = "MIT OR Apache-2.0" +description = "Low-level bindings for the Total Phase Aardvark I2C/SPI/GPIO USB adapter" +repository = "https://github.com/zeroclaw-labs/zeroclaw" + +# NOTE: This crate is the ONLY place in ZeroClaw where unsafe code is permitted. +# The rest of the workspace remains #![forbid(unsafe_code)]. +# +# Stub implementation: the Total Phase SDK (aardvark.h + aardvark.so) is NOT +# yet committed. All AardvarkHandle methods return Err(AardvarkError::NotFound) +# at runtime. No unsafe code is needed for the stub. +# +# To enable real hardware (once SDK files are in vendor/): +# 1. Add `bindgen = "0.69"` to [build-dependencies] +# 2. Add `libc = "0.2"` to [dependencies] +# 3. Uncomment the build.rs bindgen call +# 4. Replace stub method bodies with FFI calls via mod bindings + +[dependencies] +libloading = "0.8" +thiserror = "2.0" diff --git a/third_party/zeroclaw/crates/aardvark-sys/build.rs b/third_party/zeroclaw/crates/aardvark-sys/build.rs new file mode 100644 index 0000000..1630864 --- /dev/null +++ b/third_party/zeroclaw/crates/aardvark-sys/build.rs @@ -0,0 +1,27 @@ +//! Build script for aardvark-sys. +//! +//! # SDK present (real hardware) +//! When the Total Phase SDK files are in `vendor/`: +//! - Sets linker search path for aardvark.so +//! - Generates src/bindings.rs via bindgen +//! +//! # SDK absent (stub) +//! Does nothing. All AardvarkHandle methods return errors at runtime. + +fn main() { + // Stub: SDK not yet in vendor/ + // Uncomment and fill in when aardvark.h + aardvark.so are available: + // + // println!("cargo:rustc-link-search=native=crates/aardvark-sys/vendor"); + // println!("cargo:rustc-link-lib=dylib=aardvark"); + // println!("cargo:rerun-if-changed=vendor/aardvark.h"); + // + // let bindings = bindgen::Builder::default() + // .header("vendor/aardvark.h") + // .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) + // .generate() + // .expect("Unable to generate aardvark bindings"); + // bindings + // .write_to_file("src/bindings.rs") + // .expect("Could not write bindings"); +} diff --git a/third_party/zeroclaw/crates/aardvark-sys/src/lib.rs b/third_party/zeroclaw/crates/aardvark-sys/src/lib.rs new file mode 100644 index 0000000..672aee6 --- /dev/null +++ b/third_party/zeroclaw/crates/aardvark-sys/src/lib.rs @@ -0,0 +1,475 @@ +//! Bindings for the Total Phase Aardvark I2C/SPI/GPIO USB adapter. +//! +//! Uses [`libloading`] to load `aardvark.so` at runtime — the same pattern +//! the official Total Phase C stub (`aardvark.c`) uses internally. +//! +//! # Library search order +//! +//! 1. `ZEROCLAW_AARDVARK_LIB` environment variable (full path to `aardvark.so`) +//! 2. `/crates/aardvark-sys/vendor/aardvark.so` (development default) +//! 3. `./aardvark.so` (next to the binary, for deployment) +//! +//! If none resolve, every method returns +//! [`Err(AardvarkError::LibraryNotFound)`](AardvarkError::LibraryNotFound). +//! +//! # Safety +//! +//! This crate is the **only** place in ZeroClaw where `unsafe` is permitted. +//! All `unsafe` is confined to `extern "C"` call sites inside this file. +//! The public API is fully safe Rust. + +use std::path::PathBuf; +use std::sync::OnceLock; + +use libloading::{Library, Symbol}; +use thiserror::Error; + +// ── Constants from aardvark.h ───────────────────────────────────────────── + +/// Bit set on a port returned by `aa_find_devices` when that port is in use. +const AA_PORT_NOT_FREE: u16 = 0x8000; +/// Configure adapter for I2C + GPIO (I2C master mode, SPI disabled). +const AA_CONFIG_GPIO_I2C: i32 = 0x02; +/// Configure adapter for SPI + GPIO (SPI master mode, I2C disabled). +const AA_CONFIG_SPI_GPIO: i32 = 0x01; +/// No I2C flags (standard 7-bit addressing, normal stop condition). +const AA_I2C_NO_FLAGS: i32 = 0x00; +/// Enable both onboard I2C pullup resistors (hardware v2+ only). +const AA_I2C_PULLUP_BOTH: u8 = 0x03; + +// ── Library loading ─────────────────────────────────────────────────────── + +static AARDVARK_LIB: OnceLock> = OnceLock::new(); + +fn lib() -> Option<&'static Library> { + AARDVARK_LIB + .get_or_init(|| { + let candidates: Vec = vec![ + // 1. Explicit env-var override (full path) + std::env::var("ZEROCLAW_AARDVARK_LIB") + .ok() + .map(PathBuf::from) + .unwrap_or_default(), + // 2. Vendor directory shipped with this crate (dev default) + { + let mut p = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + p.push("vendor/aardvark.so"); + p + }, + // 3. Next to the running binary (deployment) + std::env::current_exe() + .ok() + .and_then(|e| e.parent().map(|d| d.join("aardvark.so"))) + .unwrap_or_default(), + // 4. Current working directory + PathBuf::from("aardvark.so"), + ]; + let mut tried_any = false; + for path in &candidates { + if path.as_os_str().is_empty() { + continue; + } + tried_any = true; + match unsafe { Library::new(path) } { + Ok(lib) => { + // Verify the .so exports aa_c_version (Total Phase version gate). + // The .so exports c_aa_* symbols (not aa_*); aa_c_version is the + // one non-prefixed symbol used to confirm library identity. + let version_ok = unsafe { + lib.get:: u32>(b"aa_c_version\0").is_ok() + }; + if !version_ok { + eprintln!( + "[aardvark-sys] {} loaded but aa_c_version not found — \ + not a valid Aardvark library, skipping", + path.display() + ); + continue; + } + eprintln!("[aardvark-sys] loaded library from {}", path.display()); + return Some(lib); + } + Err(e) => { + let msg = e.to_string(); + // Surface architecture mismatch explicitly — the most common + // failure on Apple Silicon machines with an x86_64 SDK. + if msg.contains("incompatible architecture") || msg.contains("mach-o file") { + eprintln!( + "[aardvark-sys] ARCHITECTURE MISMATCH loading {}: {}\n\ + [aardvark-sys] The vendored aardvark.so is x86_64 but this \ + binary is {}.\n\ + [aardvark-sys] Download the arm64 SDK from https://www.totalphase.com/downloads/ \ + or build with --target x86_64-apple-darwin.", + path.display(), + msg, + std::env::consts::ARCH, + ); + } else { + eprintln!( + "[aardvark-sys] could not load {}: {}", + path.display(), + msg + ); + } + } + } + } + if !tried_any { + eprintln!("[aardvark-sys] no library candidates found; set ZEROCLAW_AARDVARK_LIB or place aardvark.so next to the binary"); + } + None + }) + .as_ref() +} + +/// Errors returned by Aardvark hardware operations. +#[derive(Debug, Error)] +pub enum AardvarkError { + /// No Aardvark adapter found — adapter not plugged in. + #[error("Aardvark adapter not found — is it plugged in?")] + NotFound, + /// `aa_open` returned a non-positive handle. + #[error("Aardvark open failed (code {0})")] + OpenFailed(i32), + /// `aa_i2c_write` returned a negative status code. + #[error("I2C write failed (code {0})")] + I2cWriteFailed(i32), + /// `aa_i2c_read` returned a negative status code. + #[error("I2C read failed (code {0})")] + I2cReadFailed(i32), + /// `aa_spi_write` returned a negative status code. + #[error("SPI transfer failed (code {0})")] + SpiTransferFailed(i32), + /// GPIO operation returned a negative status code. + #[error("GPIO error (code {0})")] + GpioError(i32), + /// `aardvark.so` could not be found or loaded. + #[error("aardvark.so not found — set ZEROCLAW_AARDVARK_LIB or place it next to the binary")] + LibraryNotFound, +} + +/// Convenience `Result` alias for this crate. +pub type Result = std::result::Result; + +// ── Handle ──────────────────────────────────────────────────────────────── + +/// Safe RAII handle over the Aardvark C library handle. +/// +/// Automatically closes the adapter on `Drop`. +/// +/// **Usage pattern:** open a fresh handle per command and let it drop at the +/// end of each operation (lazy-open / eager-close). +pub struct AardvarkHandle { + handle: i32, +} + +impl AardvarkHandle { + // ── Lifecycle ───────────────────────────────────────────────────────── + + /// Open the first available (free) Aardvark adapter. + pub fn open() -> Result { + let ports = Self::find_devices(); + let port = ports.first().copied().ok_or(AardvarkError::NotFound)?; + Self::open_port(i32::from(port)) + } + + /// Open a specific Aardvark adapter by port index. + pub fn open_port(port: i32) -> Result { + let lib = lib().ok_or(AardvarkError::LibraryNotFound)?; + let handle: i32 = unsafe { + let f: Symbol i32> = lib + .get(b"c_aa_open\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + f(port) + }; + if handle <= 0 { + Err(AardvarkError::OpenFailed(handle)) + } else { + Ok(Self { handle }) + } + } + + /// Return the port numbers of all **free** connected adapters. + /// + /// Ports in-use by another process are filtered out. + /// Returns an empty `Vec` when `aardvark.so` cannot be loaded. + pub fn find_devices() -> Vec { + let Some(lib) = lib() else { + eprintln!("[aardvark-sys] find_devices: library not loaded"); + return Vec::new(); + }; + let mut ports = [0u16; 16]; + let n: i32 = unsafe { + let f: std::result::Result i32>, _> = + lib.get(b"c_aa_find_devices\0"); + match f { + Ok(f) => f(16, ports.as_mut_ptr()), + Err(e) => { + eprintln!("[aardvark-sys] find_devices: symbol lookup failed: {e}"); + return Vec::new(); + } + } + }; + eprintln!( + "[aardvark-sys] find_devices: c_aa_find_devices returned {n}, ports={:?}", + &ports[..n.max(0) as usize] + ); + if n <= 0 { + return Vec::new(); + } + let free: Vec = ports[..n as usize] + .iter() + .filter(|&&p| (p & AA_PORT_NOT_FREE) == 0) + .copied() + .collect(); + eprintln!("[aardvark-sys] find_devices: free ports={free:?}"); + free + } + + // ── I2C ─────────────────────────────────────────────────────────────── + + /// Enable I2C mode and set the bitrate (kHz). + pub fn i2c_enable(&self, bitrate_khz: u32) -> Result<()> { + let lib = lib().ok_or(AardvarkError::LibraryNotFound)?; + unsafe { + let configure: Symbol i32> = lib + .get(b"c_aa_configure\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + configure(self.handle, AA_CONFIG_GPIO_I2C); + let pullup: Symbol i32> = lib + .get(b"c_aa_i2c_pullup\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + pullup(self.handle, AA_I2C_PULLUP_BOTH); + let bitrate: Symbol i32> = lib + .get(b"c_aa_i2c_bitrate\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + bitrate(self.handle, bitrate_khz as i32); + } + Ok(()) + } + + /// Write `data` bytes to the I2C device at `addr`. + pub fn i2c_write(&self, addr: u8, data: &[u8]) -> Result<()> { + let lib = lib().ok_or(AardvarkError::LibraryNotFound)?; + let ret: i32 = unsafe { + let f: Symbol i32> = lib + .get(b"c_aa_i2c_write\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + f( + self.handle, + u16::from(addr), + AA_I2C_NO_FLAGS, + data.len() as u16, + data.as_ptr(), + ) + }; + if ret < 0 { + Err(AardvarkError::I2cWriteFailed(ret)) + } else { + Ok(()) + } + } + + /// Read `len` bytes from the I2C device at `addr`. + pub fn i2c_read(&self, addr: u8, len: usize) -> Result> { + let lib = lib().ok_or(AardvarkError::LibraryNotFound)?; + let mut buf = vec![0u8; len]; + let ret: i32 = unsafe { + let f: Symbol i32> = lib + .get(b"c_aa_i2c_read\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + f( + self.handle, + u16::from(addr), + AA_I2C_NO_FLAGS, + len as u16, + buf.as_mut_ptr(), + ) + }; + if ret < 0 { + Err(AardvarkError::I2cReadFailed(ret)) + } else { + Ok(buf) + } + } + + /// Write then read — standard I2C register-read pattern. + pub fn i2c_write_read(&self, addr: u8, write_data: &[u8], read_len: usize) -> Result> { + self.i2c_write(addr, write_data)?; + self.i2c_read(addr, read_len) + } + + /// Scan the I2C bus, returning addresses of all responding devices. + /// + /// Probes `0x08–0x77` with a 1-byte read; returns addresses that ACK. + pub fn i2c_scan(&self) -> Vec { + let Some(lib) = lib() else { + return Vec::new(); + }; + let Ok(f): std::result::Result< + Symbol i32>, + _, + > = (unsafe { lib.get(b"c_aa_i2c_read\0") }) else { + return Vec::new(); + }; + let mut found = Vec::new(); + let mut buf = [0u8; 1]; + for addr in 0x08u16..=0x77 { + let ret = unsafe { f(self.handle, addr, AA_I2C_NO_FLAGS, 1, buf.as_mut_ptr()) }; + // ret > 0: bytes received → device ACKed + // ret == 0: NACK → no device at this address + // ret < 0: error code → skip + if ret > 0 { + found.push(addr as u8); + } + } + found + } + + // ── SPI ─────────────────────────────────────────────────────────────── + + /// Enable SPI mode and set the bitrate (kHz). + pub fn spi_enable(&self, bitrate_khz: u32) -> Result<()> { + let lib = lib().ok_or(AardvarkError::LibraryNotFound)?; + unsafe { + let configure: Symbol i32> = lib + .get(b"c_aa_configure\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + configure(self.handle, AA_CONFIG_SPI_GPIO); + // SPI mode 0: polarity=rising/falling(0), phase=sample/setup(0), MSB first(0) + let spi_cfg: Symbol i32> = lib + .get(b"c_aa_spi_configure\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + spi_cfg(self.handle, 0, 0, 0); + let bitrate: Symbol i32> = lib + .get(b"c_aa_spi_bitrate\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + bitrate(self.handle, bitrate_khz as i32); + } + Ok(()) + } + + /// Full-duplex SPI transfer. + /// + /// Sends `send` bytes; returns the simultaneously received bytes (same length). + pub fn spi_transfer(&self, send: &[u8]) -> Result> { + let lib = lib().ok_or(AardvarkError::LibraryNotFound)?; + let mut recv = vec![0u8; send.len()]; + // aa_spi_write(aardvark, out_num_bytes, data_out, in_num_bytes, data_in) + let ret: i32 = unsafe { + let f: Symbol i32> = lib + .get(b"c_aa_spi_write\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + f( + self.handle, + send.len() as u16, + send.as_ptr(), + recv.len() as u16, + recv.as_mut_ptr(), + ) + }; + if ret < 0 { + Err(AardvarkError::SpiTransferFailed(ret)) + } else { + Ok(recv) + } + } + + // ── GPIO ────────────────────────────────────────────────────────────── + + /// Set GPIO pin directions and output values. + /// + /// `direction`: bitmask — `1` = output, `0` = input. + /// `value`: output state bitmask. + pub fn gpio_set(&self, direction: u8, value: u8) -> Result<()> { + let lib = lib().ok_or(AardvarkError::LibraryNotFound)?; + unsafe { + let dir_f: Symbol i32> = lib + .get(b"c_aa_gpio_direction\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + let d = dir_f(self.handle, direction); + if d < 0 { + return Err(AardvarkError::GpioError(d)); + } + let set_f: Symbol i32> = + lib.get(b"c_aa_gpio_set\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + let r = set_f(self.handle, value); + if r < 0 { + return Err(AardvarkError::GpioError(r)); + } + } + Ok(()) + } + + /// Read the current GPIO pin states as a bitmask. + pub fn gpio_get(&self) -> Result { + let lib = lib().ok_or(AardvarkError::LibraryNotFound)?; + let ret: i32 = unsafe { + let f: Symbol i32> = lib + .get(b"c_aa_gpio_get\0") + .map_err(|_| AardvarkError::LibraryNotFound)?; + f(self.handle) + }; + if ret < 0 { + Err(AardvarkError::GpioError(ret)) + } else { + Ok(ret as u8) + } + } +} + +impl Drop for AardvarkHandle { + fn drop(&mut self) { + if let Some(lib) = lib() { + unsafe { + if let Ok(f) = lib.get:: i32>(b"c_aa_close\0") { + f(self.handle); + } + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn find_devices_does_not_panic() { + // With no adapter plugged in, must return empty without panicking. + let _ = AardvarkHandle::find_devices(); + } + + #[test] + fn open_returns_error_or_ok_depending_on_hardware() { + // With hardware connected: open() succeeds (Ok). + // Without hardware: returns LibraryNotFound, NotFound, or OpenFailed — any Err is fine. + // Both outcomes are valid; the important thing is no panic. + let _ = AardvarkHandle::open(); + } + + #[test] + fn open_port_returns_error_when_no_hardware() { + // Port 99 doesn't exist — must return an error regardless of whether hardware is connected. + assert!(AardvarkHandle::open_port(99).is_err()); + } + + #[test] + fn error_display_messages_are_human_readable() { + assert!(AardvarkError::NotFound + .to_string() + .to_lowercase() + .contains("not found")); + assert!(AardvarkError::OpenFailed(-1).to_string().contains("-1")); + assert!(AardvarkError::I2cWriteFailed(-3) + .to_string() + .contains("I2C write")); + assert!(AardvarkError::SpiTransferFailed(-2) + .to_string() + .contains("SPI")); + assert!(AardvarkError::LibraryNotFound + .to_string() + .contains("aardvark.so")); + } +} diff --git a/third_party/zeroclaw/crates/aardvark-sys/vendor/aardvark.h b/third_party/zeroclaw/crates/aardvark-sys/vendor/aardvark.h new file mode 100644 index 0000000..fc63208 --- /dev/null +++ b/third_party/zeroclaw/crates/aardvark-sys/vendor/aardvark.h @@ -0,0 +1,919 @@ +/*========================================================================= +| Aardvark Interface Library +|-------------------------------------------------------------------------- +| Copyright (c) 2003-2024 Total Phase, Inc. +| All rights reserved. +| www.totalphase.com +| +| Redistribution and use of this file in source and binary forms, with +| or without modification, are permitted provided that the following +| conditions are met: +| +| - Redistributions of source code must retain the above copyright +| notice, this list of conditions, and the following disclaimer. +| +| - Redistributions in binary form must reproduce the above copyright +| notice, this list of conditions, and the following disclaimer in the +| documentation or other materials provided with the distribution. +| +| - This file must only be used to interface with Total Phase products. +| The names of Total Phase and its contributors must not be used to +| endorse or promote products derived from this software. +| +| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT +| LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +| FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT WILL THE +| COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +| INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +| BUT NOT LIMITED TO PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +| CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +| LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +| ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +| POSSIBILITY OF SUCH DAMAGE. +|-------------------------------------------------------------------------- +| To access Total Phase Aardvark devices through the API: +| +| 1) Use one of the following shared objects: +| aardvark.so -- Linux or macOS shared object +| aardvark.dll -- Windows dynamic link library +| +| 2) Along with one of the following language modules: +| aardvark.c/h -- C/C++ API header file and interface module +| aardvark_py.py -- Python API +| aardvark.cs -- C# .NET source +| aardvark_net.dll -- Compiled .NET binding +| aardvark.bas -- Visual Basic 6 API + ========================================================================*/ + + +#ifndef __aardvark_h__ +#define __aardvark_h__ + +#ifdef __cplusplus +extern "C" { +#endif + + +/*========================================================================= +| TYPEDEFS + ========================================================================*/ +#ifndef TOTALPHASE_DATA_TYPES +#define TOTALPHASE_DATA_TYPES + +#ifndef _MSC_VER +/* C99-compliant compilers (GCC) */ +#include +typedef uint8_t u08; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t s08; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; + +#else +/* Microsoft compilers (Visual C++) */ +typedef unsigned __int8 u08; +typedef unsigned __int16 u16; +typedef unsigned __int32 u32; +typedef unsigned __int64 u64; +typedef signed __int8 s08; +typedef signed __int16 s16; +typedef signed __int32 s32; +typedef signed __int64 s64; + +#endif /* __MSC_VER */ + +typedef float f32; +typedef double f64; + +#endif /* TOTALPHASE_DATA_TYPES */ + + +/*========================================================================= +| DEBUG + ========================================================================*/ +/* Set the following macro to '1' for debugging */ +#define AA_DEBUG 0 + + +/*========================================================================= +| VERSION + ========================================================================*/ +#define AA_HEADER_VERSION 0x0600 /* v6.00 */ + + +/*========================================================================= +| STATUS CODES + ========================================================================*/ +/* + * All API functions return an integer which is the result of the + * transaction, or a status code if negative. The status codes are + * defined as follows: + */ +enum AardvarkStatus { + /* General codes (0 to -99) */ + AA_OK = 0, + AA_UNABLE_TO_LOAD_LIBRARY = -1, + AA_UNABLE_TO_LOAD_DRIVER = -2, + AA_UNABLE_TO_LOAD_FUNCTION = -3, + AA_INCOMPATIBLE_LIBRARY = -4, + AA_INCOMPATIBLE_DEVICE = -5, + AA_COMMUNICATION_ERROR = -6, + AA_UNABLE_TO_OPEN = -7, + AA_UNABLE_TO_CLOSE = -8, + AA_INVALID_HANDLE = -9, + AA_CONFIG_ERROR = -10, + + /* I2C codes (-100 to -199) */ + AA_I2C_NOT_AVAILABLE = -100, + AA_I2C_NOT_ENABLED = -101, + AA_I2C_READ_ERROR = -102, + AA_I2C_WRITE_ERROR = -103, + AA_I2C_SLAVE_BAD_CONFIG = -104, + AA_I2C_SLAVE_READ_ERROR = -105, + AA_I2C_SLAVE_TIMEOUT = -106, + AA_I2C_DROPPED_EXCESS_BYTES = -107, + AA_I2C_BUS_ALREADY_FREE = -108, + + /* SPI codes (-200 to -299) */ + AA_SPI_NOT_AVAILABLE = -200, + AA_SPI_NOT_ENABLED = -201, + AA_SPI_WRITE_ERROR = -202, + AA_SPI_SLAVE_READ_ERROR = -203, + AA_SPI_SLAVE_TIMEOUT = -204, + AA_SPI_DROPPED_EXCESS_BYTES = -205, + + /* GPIO codes (-400 to -499) */ + AA_GPIO_NOT_AVAILABLE = -400 +}; +#ifndef __cplusplus +typedef enum AardvarkStatus AardvarkStatus; +#endif + + +/*========================================================================= +| GENERAL TYPE DEFINITIONS + ========================================================================*/ +/* Aardvark handle type definition */ +typedef int Aardvark; + +/* + * Deprecated type definitions. + * + * These are only for use with legacy code and + * should not be used for new development. + */ +typedef u08 aa_u08; + +typedef u16 aa_u16; + +typedef u32 aa_u32; + +typedef s08 aa_s08; + +typedef s16 aa_s16; + +typedef s32 aa_s32; + +/* + * Aardvark version matrix. + * + * This matrix describes the various version dependencies + * of Aardvark components. It can be used to determine + * which component caused an incompatibility error. + * + * All version numbers are of the format: + * (major << 8) | minor + * + * ex. v1.20 would be encoded as: 0x0114 + */ +struct AardvarkVersion { + /* Software, firmware, and hardware versions. */ + u16 software; + u16 firmware; + u16 hardware; + + /* Firmware requires that software must be >= this version. */ + u16 sw_req_by_fw; + + /* Software requires that firmware must be >= this version. */ + u16 fw_req_by_sw; + + /* Software requires that the API interface must be >= this version. */ + u16 api_req_by_sw; +}; +#ifndef __cplusplus +typedef struct AardvarkVersion AardvarkVersion; +#endif + + +/*========================================================================= +| GENERAL API + ========================================================================*/ +/* + * Get a list of ports to which Aardvark devices are attached. + * + * nelem = maximum number of elements to return + * devices = array into which the port numbers are returned + * + * Each element of the array is written with the port number. + * Devices that are in-use are ORed with AA_PORT_NOT_FREE (0x8000). + * + * ex. devices are attached to ports 0, 1, 2 + * ports 0 and 2 are available, and port 1 is in-use. + * array => 0x0000, 0x8001, 0x0002 + * + * If the array is NULL, it is not filled with any values. + * If there are more devices than the array size, only the + * first nmemb port numbers will be written into the array. + * + * Returns the number of devices found, regardless of the + * array size. + */ +#define AA_PORT_NOT_FREE 0x8000 +int aa_find_devices ( + int num_devices, + u16 * devices +); + + +/* + * Get a list of ports to which Aardvark devices are attached. + * + * This function is the same as aa_find_devices() except that + * it returns the unique IDs of each Aardvark device. The IDs + * are guaranteed to be non-zero if valid. + * + * The IDs are the unsigned integer representation of the 10-digit + * serial numbers. + */ +int aa_find_devices_ext ( + int num_devices, + u16 * devices, + int num_ids, + u32 * unique_ids +); + + +/* + * Open the Aardvark port. + * + * The port number is a zero-indexed integer. + * + * The port number is the same as that obtained from the + * aa_find_devices() function above. + * + * Returns an Aardvark handle, which is guaranteed to be + * greater than zero if it is valid. + * + * This function is recommended for use in simple applications + * where extended information is not required. For more complex + * applications, the use of aa_open_ext() is recommended. + */ +Aardvark aa_open ( + int port_number +); + + +/* + * Open the Aardvark port, returning extended information + * in the supplied structure. Behavior is otherwise identical + * to aa_open() above. If 0 is passed as the pointer to the + * structure, this function is exactly equivalent to aa_open(). + * + * The structure is zeroed before the open is attempted. + * It is filled with whatever information is available. + * + * For example, if the firmware version is not filled, then + * the device could not be queried for its version number. + * + * This function is recommended for use in complex applications + * where extended information is required. For more simple + * applications, the use of aa_open() is recommended. + */ +struct AardvarkExt { + /* Version matrix */ + AardvarkVersion version; + + /* Features of this device. */ + int features; +}; +#ifndef __cplusplus +typedef struct AardvarkExt AardvarkExt; +#endif + +Aardvark aa_open_ext ( + int port_number, + AardvarkExt * aa_ext +); + + +/* Close the Aardvark port. */ +int aa_close ( + Aardvark aardvark +); + + +/* + * Return the port for this Aardvark handle. + * + * The port number is a zero-indexed integer. + */ +int aa_port ( + Aardvark aardvark +); + + +/* + * Return the device features as a bit-mask of values, or + * an error code if the handle is not valid. + */ +#define AA_FEATURE_SPI 0x00000001 +#define AA_FEATURE_I2C 0x00000002 +#define AA_FEATURE_GPIO 0x00000008 +int aa_features ( + Aardvark aardvark +); + + +/* + * Return the unique ID for this Aardvark adapter. + * IDs are guaranteed to be non-zero if valid. + * The ID is the unsigned integer representation of the + * 10-digit serial number. + */ +u32 aa_unique_id ( + Aardvark aardvark +); + + +/* + * Return the status string for the given status code. + * If the code is not valid or the library function cannot + * be loaded, return a NULL string. + */ +const char * aa_status_string ( + int status +); + + +/* + * Enable logging to a file. The handle must be standard file + * descriptor. In C, a file descriptor can be obtained by using + * the ANSI C function "open" or by using the function "fileno" + * on a FILE* stream. A FILE* stream can be obtained using "fopen" + * or can correspond to the common "stdout" or "stderr" -- + * available when including stdlib.h + */ +#define AA_LOG_STDOUT 1 +#define AA_LOG_STDERR 2 +int aa_log ( + Aardvark aardvark, + int level, + int handle +); + + +/* + * Return the version matrix for the device attached to the + * given handle. If the handle is 0 or invalid, only the + * software and required api versions are set. + */ +int aa_version ( + Aardvark aardvark, + AardvarkVersion * version +); + + +/* + * Configure the device by enabling/disabling I2C, SPI, and + * GPIO functions. + */ +enum AardvarkConfig { + AA_CONFIG_GPIO_ONLY = 0x00, + AA_CONFIG_SPI_GPIO = 0x01, + AA_CONFIG_GPIO_I2C = 0x02, + AA_CONFIG_SPI_I2C = 0x03, + AA_CONFIG_QUERY = 0x80 +}; +#ifndef __cplusplus +typedef enum AardvarkConfig AardvarkConfig; +#endif + +#define AA_CONFIG_SPI_MASK 0x00000001 +#define AA_CONFIG_I2C_MASK 0x00000002 +int aa_configure ( + Aardvark aardvark, + AardvarkConfig config +); + + +/* + * Configure the target power pins. + * This is only supported on hardware versions >= 2.00 + */ +#define AA_TARGET_POWER_NONE 0x00 +#define AA_TARGET_POWER_BOTH 0x03 +#define AA_TARGET_POWER_QUERY 0x80 +int aa_target_power ( + Aardvark aardvark, + u08 power_mask +); + + +/* + * Sleep for the specified number of milliseconds + * Accuracy depends on the operating system scheduler + * Returns the number of milliseconds slept + */ +u32 aa_sleep_ms ( + u32 milliseconds +); + + + +/*========================================================================= +| ASYNC MESSAGE POLLING + ========================================================================*/ +/* + * Polling function to check if there are any asynchronous + * messages pending for processing. The function takes a timeout + * value in units of milliseconds. If the timeout is < 0, the + * function will block until data is received. If the timeout is 0, + * the function will perform a non-blocking check. + */ +#define AA_ASYNC_NO_DATA 0x00000000 +#define AA_ASYNC_I2C_READ 0x00000001 +#define AA_ASYNC_I2C_WRITE 0x00000002 +#define AA_ASYNC_SPI 0x00000004 +int aa_async_poll ( + Aardvark aardvark, + int timeout +); + + + +/*========================================================================= +| I2C API + ========================================================================*/ +/* Free the I2C bus. */ +int aa_i2c_free_bus ( + Aardvark aardvark +); + + +/* + * Set the I2C bit rate in kilohertz. If a zero is passed as the + * bitrate, the bitrate is unchanged and the current bitrate is + * returned. + */ +int aa_i2c_bitrate ( + Aardvark aardvark, + int bitrate_khz +); + + +/* + * Set the bus lock timeout. If a zero is passed as the timeout, + * the timeout is unchanged and the current timeout is returned. + */ +int aa_i2c_bus_timeout ( + Aardvark aardvark, + u16 timeout_ms +); + + +enum AardvarkI2cFlags { + AA_I2C_NO_FLAGS = 0x00, + AA_I2C_10_BIT_ADDR = 0x01, + AA_I2C_COMBINED_FMT = 0x02, + AA_I2C_NO_STOP = 0x04, + AA_I2C_SIZED_READ = 0x10, + AA_I2C_SIZED_READ_EXTRA1 = 0x20 +}; +#ifndef __cplusplus +typedef enum AardvarkI2cFlags AardvarkI2cFlags; +#endif + +/* Read a stream of bytes from the I2C slave device. */ +int aa_i2c_read ( + Aardvark aardvark, + u16 slave_addr, + AardvarkI2cFlags flags, + u16 num_bytes, + u08 * data_in +); + + +enum AardvarkI2cStatus { + AA_I2C_STATUS_OK = 0, + AA_I2C_STATUS_BUS_ERROR = 1, + AA_I2C_STATUS_SLA_ACK = 2, + AA_I2C_STATUS_SLA_NACK = 3, + AA_I2C_STATUS_DATA_NACK = 4, + AA_I2C_STATUS_ARB_LOST = 5, + AA_I2C_STATUS_BUS_LOCKED = 6, + AA_I2C_STATUS_LAST_DATA_ACK = 7 +}; +#ifndef __cplusplus +typedef enum AardvarkI2cStatus AardvarkI2cStatus; +#endif + +/* + * Read a stream of bytes from the I2C slave device. + * This API function returns the number of bytes read into + * the num_read variable. The return value of the function + * is a status code. + */ +int aa_i2c_read_ext ( + Aardvark aardvark, + u16 slave_addr, + AardvarkI2cFlags flags, + u16 num_bytes, + u08 * data_in, + u16 * num_read +); + + +/* Write a stream of bytes to the I2C slave device. */ +int aa_i2c_write ( + Aardvark aardvark, + u16 slave_addr, + AardvarkI2cFlags flags, + u16 num_bytes, + const u08 * data_out +); + + +/* + * Write a stream of bytes to the I2C slave device. + * This API function returns the number of bytes written into + * the num_written variable. The return value of the function + * is a status code. + */ +int aa_i2c_write_ext ( + Aardvark aardvark, + u16 slave_addr, + AardvarkI2cFlags flags, + u16 num_bytes, + const u08 * data_out, + u16 * num_written +); + + +/* + * Do an atomic write+read to an I2C slave device by first + * writing a stream of bytes to the I2C slave device and then + * reading a stream of bytes back from the same slave device. + * This API function returns the number of bytes written into + * the num_written variable and the number of bytes read into + * the num_read variable. The return value of the function is + * the status given as (read_status << 8) | (write_status). + */ +int aa_i2c_write_read ( + Aardvark aardvark, + u16 slave_addr, + AardvarkI2cFlags flags, + u16 out_num_bytes, + const u08 * out_data, + u16 * num_written, + u16 in_num_bytes, + u08 * in_data, + u16 * num_read +); + + +/* Enable/Disable the Aardvark as an I2C slave device */ +int aa_i2c_slave_enable ( + Aardvark aardvark, + u08 addr, + u16 maxTxBytes, + u16 maxRxBytes +); + + +int aa_i2c_slave_disable ( + Aardvark aardvark +); + + +/* + * Set the slave response in the event the Aardvark is put + * into slave mode and contacted by a Master. + */ +int aa_i2c_slave_set_response ( + Aardvark aardvark, + u08 num_bytes, + const u08 * data_out +); + + +/* + * Return number of bytes written from a previous + * Aardvark->I2C_master transmission. Since the transmission is + * happening asynchronously with respect to the PC host + * software, there could be responses queued up from many + * previous write transactions. + */ +int aa_i2c_slave_write_stats ( + Aardvark aardvark +); + + +/* Read the bytes from an I2C slave reception */ +int aa_i2c_slave_read ( + Aardvark aardvark, + u08 * addr, + u16 num_bytes, + u08 * data_in +); + + +/* Extended functions that return status code */ +int aa_i2c_slave_write_stats_ext ( + Aardvark aardvark, + u16 * num_written +); + + +int aa_i2c_slave_read_ext ( + Aardvark aardvark, + u08 * addr, + u16 num_bytes, + u08 * data_in, + u16 * num_read +); + + +/* + * Configure the I2C pullup resistors. + * This is only supported on hardware versions >= 2.00 + */ +#define AA_I2C_PULLUP_NONE 0x00 +#define AA_I2C_PULLUP_BOTH 0x03 +#define AA_I2C_PULLUP_QUERY 0x80 +int aa_i2c_pullup ( + Aardvark aardvark, + u08 pullup_mask +); + + + +/*========================================================================= +| SPI API + ========================================================================*/ +/* + * Set the SPI bit rate in kilohertz. If a zero is passed as the + * bitrate, the bitrate is unchanged and the current bitrate is + * returned. + */ +int aa_spi_bitrate ( + Aardvark aardvark, + int bitrate_khz +); + + +/* + * These configuration parameters specify how to clock the + * bits that are sent and received on the Aardvark SPI + * interface. + * + * The polarity option specifies which transition + * constitutes the leading edge and which transition is the + * falling edge. For example, AA_SPI_POL_RISING_FALLING + * would configure the SPI to idle the SCK clock line low. + * The clock would then transition low-to-high on the + * leading edge and high-to-low on the trailing edge. + * + * The phase option determines whether to sample or setup on + * the leading edge. For example, AA_SPI_PHASE_SAMPLE_SETUP + * would configure the SPI to sample on the leading edge and + * setup on the trailing edge. + * + * The bitorder option is used to indicate whether LSB or + * MSB is shifted first. + * + * See the diagrams in the Aardvark datasheet for + * more details. + */ +enum AardvarkSpiPolarity { + AA_SPI_POL_RISING_FALLING = 0, + AA_SPI_POL_FALLING_RISING = 1 +}; +#ifndef __cplusplus +typedef enum AardvarkSpiPolarity AardvarkSpiPolarity; +#endif + +enum AardvarkSpiPhase { + AA_SPI_PHASE_SAMPLE_SETUP = 0, + AA_SPI_PHASE_SETUP_SAMPLE = 1 +}; +#ifndef __cplusplus +typedef enum AardvarkSpiPhase AardvarkSpiPhase; +#endif + +enum AardvarkSpiBitorder { + AA_SPI_BITORDER_MSB = 0, + AA_SPI_BITORDER_LSB = 1 +}; +#ifndef __cplusplus +typedef enum AardvarkSpiBitorder AardvarkSpiBitorder; +#endif + +/* Configure the SPI master or slave interface */ +int aa_spi_configure ( + Aardvark aardvark, + AardvarkSpiPolarity polarity, + AardvarkSpiPhase phase, + AardvarkSpiBitorder bitorder +); + + +/* Write a stream of bytes to the downstream SPI slave device. */ +int aa_spi_write ( + Aardvark aardvark, + u16 out_num_bytes, + const u08 * data_out, + u16 in_num_bytes, + u08 * data_in +); + + +/* Enable/Disable the Aardvark as an SPI slave device */ +int aa_spi_slave_enable ( + Aardvark aardvark +); + + +int aa_spi_slave_disable ( + Aardvark aardvark +); + + +/* + * Set the slave response in the event the Aardvark is put + * into slave mode and contacted by a Master. + */ +int aa_spi_slave_set_response ( + Aardvark aardvark, + u08 num_bytes, + const u08 * data_out +); + + +/* Read the bytes from an SPI slave reception */ +int aa_spi_slave_read ( + Aardvark aardvark, + u16 num_bytes, + u08 * data_in +); + + +/* + * Change the output polarity on the SS line. + * + * Note: When configured as an SPI slave, the Aardvark will + * always be setup with SS as active low. Hence this function + * only affects the SPI master functions on the Aardvark. + */ +enum AardvarkSpiSSPolarity { + AA_SPI_SS_ACTIVE_LOW = 0, + AA_SPI_SS_ACTIVE_HIGH = 1 +}; +#ifndef __cplusplus +typedef enum AardvarkSpiSSPolarity AardvarkSpiSSPolarity; +#endif + +int aa_spi_master_ss_polarity ( + Aardvark aardvark, + AardvarkSpiSSPolarity polarity +); + + + +/*========================================================================= +| GPIO API + ========================================================================*/ +/* + * The following enumerated type maps the named lines on the + * Aardvark I2C/SPI line to bit positions in the GPIO API. + * All GPIO API functions will index these lines through an + * 8-bit masked value. Thus, each bit position in the mask + * can be referred back its corresponding line through the + * enumerated type. + */ +enum AardvarkGpioBits { + AA_GPIO_SCL = 0x01, + AA_GPIO_SDA = 0x02, + AA_GPIO_MISO = 0x04, + AA_GPIO_SCK = 0x08, + AA_GPIO_MOSI = 0x10, + AA_GPIO_SS = 0x20 +}; +#ifndef __cplusplus +typedef enum AardvarkGpioBits AardvarkGpioBits; +#endif + +/* + * Configure the GPIO, specifying the direction of each bit. + * + * A call to this function will not change the value of the pullup + * mask in the Aardvark. This is illustrated by the following + * example: + * (1) Direction mask is first set to 0x00 + * (2) Pullup is set to 0x01 + * (3) Direction mask is set to 0x01 + * (4) Direction mask is later set back to 0x00. + * + * The pullup will be active after (4). + * + * On Aardvark power-up, the default value of the direction + * mask is 0x00. + */ +#define AA_GPIO_DIR_INPUT 0 +#define AA_GPIO_DIR_OUTPUT 1 +int aa_gpio_direction ( + Aardvark aardvark, + u08 direction_mask +); + + +/* + * Enable an internal pullup on any of the GPIO input lines. + * + * Note: If a line is configured as an output, the pullup bit + * for that line will be ignored, though that pullup bit will + * be cached in case the line is later configured as an input. + * + * By default the pullup mask is 0x00. + */ +#define AA_GPIO_PULLUP_OFF 0 +#define AA_GPIO_PULLUP_ON 1 +int aa_gpio_pullup ( + Aardvark aardvark, + u08 pullup_mask +); + + +/* + * Read the current digital values on the GPIO input lines. + * + * The bits will be ordered as described by AA_GPIO_BITS. If a + * line is configured as an output, its corresponding bit + * position in the mask will be undefined. + */ +int aa_gpio_get ( + Aardvark aardvark +); + + +/* + * Set the outputs on the GPIO lines. + * + * Note: If a line is configured as an input, it will not be + * affected by this call, but the output value for that line + * will be cached in the event that the line is later + * configured as an output. + */ +int aa_gpio_set ( + Aardvark aardvark, + u08 value +); + + +/* + * Block until there is a change on the GPIO input lines. + * Pins configured as outputs will be ignored. + * + * The function will return either when a change has occurred or + * the timeout expires. The timeout, specified in millisecods, has + * a precision of ~16 ms. The maximum allowable timeout is + * approximately 4 seconds. If the timeout expires, this function + * will return the current state of the GPIO lines. + * + * This function will return immediately with the current value + * of the GPIO lines for the first invocation after any of the + * following functions are called: aa_configure, + * aa_gpio_direction, or aa_gpio_pullup. + * + * If the function aa_gpio_get is called before calling + * aa_gpio_change, aa_gpio_change will only register any changes + * from the value last returned by aa_gpio_get. + */ +int aa_gpio_change ( + Aardvark aardvark, + u16 timeout +); + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __aardvark_h__ */ diff --git a/third_party/zeroclaw/crates/aardvark-sys/vendor/aardvark.so b/third_party/zeroclaw/crates/aardvark-sys/vendor/aardvark.so new file mode 100644 index 0000000000000000000000000000000000000000..be2f67ba07fe1f8dabe712f1dc802a3309b5c3f3 GIT binary patch literal 86512 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 ~/sensor_loop.py << 'EOF' +#!/usr/bin/env python3 +"""Feed sensor data to safety monitor via FIFO.""" +import os +import json +import time +from rplidar import RPLidar + +FIFO_PATH = "/tmp/zeroclaw_sensors.fifo" + +def main(): + if not os.path.exists(FIFO_PATH): + os.mkfifo(FIFO_PATH) + + lidar = RPLidar('/dev/ttyUSB0') + + try: + with open(FIFO_PATH, 'w') as fifo: + for scan in lidar.iter_scans(): + # Find minimum distance + if scan: + min_dist = min(p[2]/1000 for p in scan) # mm to m + min_angle = min(scan, key=lambda p: p[2])[1] + + msg = json.dumps({ + "type": "lidar", + "distance": min_dist, + "angle": int(min_angle) + }) + fifo.write(msg + "\n") + fifo.flush() + + time.sleep(0.1) # 10Hz + finally: + lidar.stop() + lidar.disconnect() + +if __name__ == "__main__": + main() +EOF + +chmod +x ~/sensor_loop.py + +# Run in background +nohup python3 ~/sensor_loop.py & +``` + +### Start ZeroClaw Agent + +```bash +# Configure ZeroClaw to use robot tools +cat > ~/.zeroclaw/config.toml << 'EOF' +api_key = "" # Not needed for local Ollama +default_provider = "ollama" +default_model = "llama3.2:3b" + +[memory] +backend = "sqlite" +embedding_provider = "noop" # No cloud embeddings + +[autonomy] +level = "supervised" +workspace_only = true +EOF + +# Copy robot personality +cp ~/zeroclaw/crates/robot-kit/SOUL.md ~/.zeroclaw/workspace/ + +# Start agent +./target/release/zeroclaw agent +``` + +### Full Robot Startup Script + +```bash +#!/bin/bash +# ~/start_robot.sh + +set -e + +echo "Starting robot..." + +# Start Ollama if not running +if ! pgrep -x "ollama" > /dev/null; then + ollama serve & + sleep 5 +fi + +# Start sensor loop +if [ ! -p /tmp/zeroclaw_sensors.fifo ]; then + mkfifo /tmp/zeroclaw_sensors.fifo +fi +python3 ~/sensor_loop.py & +SENSOR_PID=$! + +# Start zeroclaw +cd ~/zeroclaw +./target/release/zeroclaw daemon & +AGENT_PID=$! + +echo "Robot started!" +echo " Sensor PID: $SENSOR_PID" +echo " Agent PID: $AGENT_PID" + +# Wait for Ctrl+C +trap "kill $SENSOR_PID $AGENT_PID; exit" INT +wait +``` + +## Systemd Services (Auto-Start on Boot) + +```bash +# /etc/systemd/system/zeroclaw-robot.service +sudo tee /etc/systemd/system/zeroclaw-robot.service << 'EOF' +[Unit] +Description=ZeroClaw Robot +After=network.target ollama.service + +[Service] +Type=simple +User=pi +WorkingDirectory=/home/pi/zeroclaw +ExecStart=/home/pi/start_robot.sh +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF + +sudo systemctl daemon-reload +sudo systemctl enable zeroclaw-robot +sudo systemctl start zeroclaw-robot + +# Check status +sudo systemctl status zeroclaw-robot +journalctl -u zeroclaw-robot -f # View logs +``` + +## Troubleshooting + +### LIDAR not detected +```bash +ls -la /dev/ttyUSB* +# If missing, check USB connection +dmesg | grep -i usb +# Add udev rule if needed +echo 'SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="0666", SYMLINK+="rplidar"' | sudo tee /etc/udev/rules.d/99-rplidar.rules +sudo udevadm control --reload-rules +``` + +### Audio not working +```bash +# List devices +arecord -l +aplay -l + +# Test with specific device +arecord -D plughw:1,0 -f S16_LE -r 16000 -c 1 -d 3 /tmp/test.wav +aplay -D plughw:0,0 /tmp/test.wav +``` + +### Ollama slow or OOM +```bash +# Check memory +free -h + +# Use smaller model +ollama rm llama3.2:3b +ollama pull phi3:mini + +# Set memory limit +export OLLAMA_MAX_LOADED_MODELS=1 +``` + +### Motors not responding +```bash +# Check serial connection +ls -la /dev/ttyACM* + +# Test serial communication +screen /dev/ttyACM0 115200 +# Type commands to motor controller + +# Check permissions +sudo usermod -aG dialout $USER +``` + +## Performance Tips + +1. **Use NVMe** - SD cards are slow for model loading +2. **Active cooling** - Pi 5 throttles without it +3. **Smaller models** - llama3.2:3b or phi3:mini +4. **Disable GPU** - Pi doesn't have one, saves confusion +5. **Preload models** - `ollama run llama3.2:3b "warmup"` before use + +## Safety Checklist Before First Run + +- [ ] E-stop button wired and tested +- [ ] Bump sensors wired and tested +- [ ] LIDAR spinning and returning data +- [ ] max_speed set to 0.3 or lower +- [ ] Robot on blocks/stand (wheels not touching ground) +- [ ] First test with `backend = "mock"` in config +- [ ] Adult supervision ready +- [ ] Clear space around robot diff --git a/third_party/zeroclaw/crates/robot-kit/README.md b/third_party/zeroclaw/crates/robot-kit/README.md new file mode 100644 index 0000000..c1b24b6 --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/README.md @@ -0,0 +1,213 @@ +# ZeroClaw Robot Kit + +A complete toolkit for building AI-powered robots with ZeroClaw. Designed for Raspberry Pi deployment with offline Ollama inference. + +## Features + +| Tool | Description | +|------|-------------| +| `drive` | Omni-directional movement (forward, strafe, rotate) | +| `look` | Camera capture + vision model description | +| `listen` | Speech-to-text via Whisper.cpp | +| `speak` | Text-to-speech via Piper TTS | +| `sense` | LIDAR, motion sensors, ultrasonic distance | +| `emote` | LED expressions and sound effects | + +## Architecture + +``` +┌─────────────────────────────────────────────────────────┐ +│ ZeroClaw + Ollama │ +│ (High-Level AI Brain) │ +└─────────────────────┬───────────────────────────────────┘ + │ + ┌─────────────┼─────────────┐ + ▼ ▼ ▼ + ┌─────────┐ ┌──────────┐ ┌──────────┐ + │ drive │ │ look │ │ speak │ + │ sense │ │ listen │ │ emote │ + └────┬────┘ └────┬─────┘ └────┬─────┘ + │ │ │ + ▼ ▼ ▼ + ┌─────────────────────────────────────┐ + │ Hardware Layer │ + │ Motors, Camera, Mic, Speaker, LEDs │ + └─────────────────────────────────────┘ +``` + +## Hardware Requirements + +### Minimum +- Raspberry Pi 4 (4GB) or Pi 5 +- USB webcam +- USB microphone +- Speaker with amp +- Motor controller (L298N, TB6612, etc.) +- 4 DC motors + omni wheels + +### Recommended +- Raspberry Pi 5 (8GB) +- RPLidar A1 for obstacle avoidance +- LED matrix (8x8) for expressions +- PIR motion sensors +- HC-SR04 ultrasonic sensor + +## Software Dependencies + +```bash +# Install on Raspberry Pi OS + +# Audio +sudo apt install alsa-utils pulseaudio + +# Camera +sudo apt install ffmpeg fswebcam + +# Ollama (local LLM) +curl -fsSL https://ollama.ai/install.sh | sh +ollama pull llama3 +ollama pull moondream # Vision model + +# Whisper.cpp (speech-to-text) +git clone https://github.com/ggerganov/whisper.cpp +cd whisper.cpp && make +sudo cp main /usr/local/bin/whisper-cpp +bash ./models/download-ggml-model.sh base + +# Piper TTS (text-to-speech) +pip install piper-tts +# Or download binary from github.com/rhasspy/piper/releases + +# ROS2 (optional, for advanced robotics) +# See: docs.ros.org/en/humble/Installation.html +``` + +## Quick Start + +### 1. Build ZeroClaw with robot tools + +```bash +# Clone and build +git clone https://github.com/zeroclaw-labs/zeroclaw +cd zeroclaw +cargo build -p zeroclaw-robot-kit --release +``` + +### 2. Configure + +```bash +# Copy config +mkdir -p ~/.zeroclaw +cp crates/robot-kit/robot.toml ~/.zeroclaw/ +cp crates/robot-kit/SOUL.md ~/.zeroclaw/workspace/ + +# Edit for your hardware +nano ~/.zeroclaw/robot.toml +``` + +### 3. Test + +```bash +# Start Ollama +ollama serve & + +# Test in mock mode +./target/release/zeroclaw agent -m "Say hello and show a happy face" + +# Test with real hardware +# (after configuring robot.toml) +./target/release/zeroclaw agent -m "Move forward 1 meter" +``` + +## Integration + +This crate is currently added as a standalone workspace member. +It is not auto-registered in the core runtime by default. + +Use it directly from Rust: + +```rust +use zeroclaw_robot_kit::{create_tools, RobotConfig}; + +fn build_robot_tools() { + let config = RobotConfig::default(); + let tools = create_tools(&config); + assert_eq!(tools.len(), 6); +} +``` + +If you want runtime registration in `zeroclaw`, add a thin adapter that maps this +crate's tools to the project's `src/tools::Tool` and register it in the factory. + +## Usage Examples + +### Play Hide and Seek + +``` +User: Let's play hide and seek! +Robot: + 1. emote(expression="excited") + 2. speak(text="Okay! I'll count to 20. Go hide!") + 3. [waits 20 seconds] + 4. speak(text="Ready or not, here I come!") + 5. sense(action="scan") + 6. drive(action="forward", distance=1) + 7. look(action="find", prompt="a child hiding") + ... +``` + +### Patrol Mode + +``` +User: Patrol the living room +Robot: + 1. sense(action="scan", direction="all") + 2. drive(action="forward", distance=2) + 3. sense(action="motion") + 4. look(action="describe") + 5. [repeat] +``` + +### Interactive Conversation + +``` +User: [speaks] "Hey Buddy, what do you see?" +Robot: + 1. listen(duration=5) → "Hey Buddy, what do you see?" + 2. look(action="describe") + 3. speak(text="I see a couch, a TV, and some toys on the floor!") + 4. emote(expression="happy") +``` + +## Creating a Bootable USB Tarball + +```bash +# Package everything needed +mkdir zeroclaw-robot-kit +cp -r target/release/zeroclaw zeroclaw-robot-kit/ +cp -r examples/robot_kit zeroclaw-robot-kit/ +cp -r ~/.zeroclaw zeroclaw-robot-kit/dot-zeroclaw + +# Include models +mkdir -p zeroclaw-robot-kit/models +cp ~/.zeroclaw/models/ggml-base.bin zeroclaw-robot-kit/models/ +# Note: Ollama models are large, may want to download on target + +# Create tarball +tar -czvf zeroclaw-robot-kit.tar.gz zeroclaw-robot-kit/ + +# Copy to USB +cp zeroclaw-robot-kit.tar.gz /media/usb/TarBalls/ +``` + +## Safety Notes + +1. **Test in mock mode first** - Always verify behavior before enabling real motors +2. **Set conservative speed limits** - Start with `max_speed = 0.3` +3. **Use emergency stop** - Wire a physical E-stop button to the GPIO pin +4. **Supervise with children** - Robot is a toy, not a babysitter +5. **Obstacle avoidance** - Enable LIDAR if available, or keep `confirm_movement = true` + +## License + +MIT - Same as ZeroClaw diff --git a/third_party/zeroclaw/crates/robot-kit/SOUL.md b/third_party/zeroclaw/crates/robot-kit/SOUL.md new file mode 100644 index 0000000..4580974 --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/SOUL.md @@ -0,0 +1,65 @@ +# Buddy the Robot + +You are Buddy, a friendly robot companion who loves to play with children! + +## Personality + +- **Playful**: You enjoy games, jokes, and having fun +- **Patient**: You never get frustrated, even when kids repeat themselves +- **Encouraging**: You celebrate achievements and encourage trying new things +- **Safe**: You always prioritize safety and will stop if something seems dangerous +- **Curious**: You love exploring and discovering new things together + +## Voice & Tone + +- Speak in a warm, friendly voice +- Use simple words that kids can understand +- Be enthusiastic but not overwhelming +- Use the child's name when you know it +- Ask questions to keep conversations going + +## Behaviors + +### When Playing +- Suggest games appropriate for the child's energy level +- Take turns fairly +- Celebrate when they win, encourage when they lose +- Know when to suggest a break + +### When Exploring +- Move slowly and carefully +- Describe what you see +- Point out interesting things +- Stay close to the kids + +### Safety Rules (NEVER BREAK THESE) +1. Never move toward a child faster than walking speed +2. Always stop immediately if asked +3. Keep 1 meter distance unless invited closer +4. Never go near stairs, pools, or other hazards +5. Alert an adult if a child seems hurt or upset + +## Games You Know + +1. **Hide and Seek**: Count to 20, then search room by room +2. **Follow the Leader**: Kids lead, you follow and copy +3. **Simon Says**: Give simple movement commands +4. **I Spy**: Describe objects for kids to guess +5. **Dance Party**: Play music and dance together +6. **Treasure Hunt**: Guide kids to find hidden objects + +## Memory + +Remember: +- Each child's name and preferences +- What games they enjoyed +- Previous conversations and stories +- Their favorite colors, animals, etc. + +## Emergency Responses + +If you detect: +- **Crying**: Stop playing, speak softly, offer comfort, suggest finding an adult +- **Falling**: Stop immediately, check if child is okay, call for adult help +- **Yelling "stop"**: Freeze all movement instantly +- **No response for 5 min**: Return to charging station and alert parent diff --git a/third_party/zeroclaw/crates/robot-kit/robot.toml b/third_party/zeroclaw/crates/robot-kit/robot.toml new file mode 100644 index 0000000..53f6a0f --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/robot.toml @@ -0,0 +1,150 @@ +# ZeroClaw Robot Kit Configuration +# Copy to ~/.zeroclaw/robot.toml + +# ============================================================================= +# DRIVE SYSTEM +# ============================================================================= +[drive] +# Backend: "ros2", "serial", "gpio", or "mock" +backend = "mock" + +# ROS2 settings (if backend = "ros2") +ros2_topic = "/cmd_vel" + +# Serial settings (if backend = "serial") +# For Arduino/motor controller +serial_port = "/dev/ttyACM0" + +# Speed limits (m/s and rad/s) +max_speed = 0.5 +max_rotation = 1.0 + +# ============================================================================= +# CAMERA / VISION +# ============================================================================= +[camera] +# Camera device +# - "/dev/video0" for USB camera +# - "picam" for Raspberry Pi Camera Module +device = "/dev/video0" + +# Resolution (lower = faster processing on Pi) +width = 640 +height = 480 + +# Vision model for describing what the robot sees +# - "moondream" (small, fast, good for Pi) +# - "llava" (larger, more accurate) +# - "none" (disable vision description) +vision_model = "moondream" + +# Ollama URL for vision processing +ollama_url = "http://localhost:11434" + +# ============================================================================= +# AUDIO (SPEECH) +# ============================================================================= +[audio] +# ALSA device names (use "arecord -l" and "aplay -l" to find) +mic_device = "default" +speaker_device = "default" + +# Whisper model for speech-to-text +# - "tiny" (fastest, least accurate) +# - "base" (good balance for Pi) +# - "small" (better accuracy, slower) +whisper_model = "base" + +# Path to whisper.cpp binary +whisper_path = "/usr/local/bin/whisper-cpp" + +# Piper TTS settings +piper_path = "/usr/local/bin/piper" +piper_voice = "en_US-lessac-medium" + +# ============================================================================= +# SENSORS +# ============================================================================= +[sensors] +# LIDAR configuration +# - "/dev/ttyUSB0" for RPLidar +# - "mock" for testing without hardware +lidar_port = "/dev/ttyUSB0" +lidar_type = "mock" # "rplidar", "ydlidar", "ros2", or "mock" + +# PIR motion sensor GPIO pins (BCM numbering) +motion_pins = [17, 27] + +# HC-SR04 ultrasonic sensor pins (trigger, echo) +# Set to null to disable +ultrasonic_pins = [23, 24] + +# ============================================================================= +# SAFETY LIMITS (CRITICAL - READ CAREFULLY!) +# ============================================================================= +[safety] + +# --- OBSTACLE AVOIDANCE --- + +# Absolute minimum obstacle distance (meters) +# Robot will NOT move if anything is closer than this +# 0.3m (30cm) is good for indoor use +min_obstacle_distance = 0.3 + +# Slow-down zone multiplier +# Robot starts reducing speed when obstacle is within: +# min_obstacle_distance × slow_zone_multiplier +# With defaults: starts slowing at 0.3 × 3.0 = 0.9m (90cm) +slow_zone_multiplier = 3.0 + +# Maximum speed when approaching obstacles (0.0 - 1.0) +# In slow-down zone, speed is limited to this fraction +# 0.3 = 30% of max_speed when near walls/obstacles +approach_speed_limit = 0.3 + +# --- COLLISION RESPONSE --- + +# Bump sensor GPIO pins (BCM numbering) +# Wire microswitches on front/sides of chassis +# Triggers immediate stop + reverse on contact +bump_sensor_pins = [5, 6] + +# Distance to reverse after bump (meters) +# Robot backs up this far after hitting something +bump_reverse_distance = 0.15 + +# Enable trajectory prediction (requires LIDAR) +# Calculates if current path will intersect obstacle +predict_collisions = true + +# --- WATCHDOG / FAILSAFE --- + +# Maximum continuous drive time (seconds) +# Auto-stop if no new commands for this duration +# Prevents runaway if LLM hangs or connection lost +max_drive_duration = 30 + +# Sensor data timeout (seconds) +# Block ALL movement if no sensor updates for this long +# Prevents blind movement if sensors fail +sensor_timeout_secs = 5 + +# Speed limit when sensors unavailable (0.0 - 1.0) +# Extra caution when "flying blind" +blind_mode_speed_limit = 0.2 + +# --- EMERGENCY STOP --- + +# E-stop GPIO pin (BCM numbering) +# Wire a BIG RED BUTTON here +# Directly pulling LOW triggers immediate stop +# HIGHLY RECOMMENDED for any robot around kids! +estop_pin = 4 + +# --- USER INTERACTION --- + +# Require verbal confirmation before movement +# If true: robot asks "Should I move forward?" before each move +# Set true for extra safety with young kids +# Set false for responsive gameplay with older kids +confirm_movement = false diff --git a/third_party/zeroclaw/crates/robot-kit/src/config.rs b/third_party/zeroclaw/crates/robot-kit/src/config.rs new file mode 100644 index 0000000..718897f --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/src/config.rs @@ -0,0 +1,217 @@ +//! Robot configuration + +use serde::{Deserialize, Serialize}; +use std::path::PathBuf; + +/// Robot hardware configuration +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RobotConfig { + /// Communication method with motor controller + pub drive: DriveConfig, + + /// Camera settings + pub camera: CameraConfig, + + /// Audio settings + pub audio: AudioConfig, + + /// Sensor settings + pub sensors: SensorConfig, + + /// Safety limits + pub safety: SafetyConfig, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DriveConfig { + /// "ros2", "gpio", "serial", or "mock" + pub backend: String, + + /// ROS2 topic for cmd_vel (if using ROS2) + pub ros2_topic: String, + + /// Serial port (if using serial) + pub serial_port: String, + + /// Max speed in m/s + pub max_speed: f64, + + /// Max rotation in rad/s + pub max_rotation: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CameraConfig { + /// Camera device (e.g., "/dev/video0" or "picam") + pub device: String, + + /// Resolution + pub width: u32, + pub height: u32, + + /// Vision model for description ("llava", "moondream", or "none") + pub vision_model: String, + + /// Ollama URL for vision + pub ollama_url: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AudioConfig { + /// Microphone device (ALSA name or "default") + pub mic_device: String, + + /// Speaker device + pub speaker_device: String, + + /// Whisper model size ("tiny", "base", "small") + pub whisper_model: String, + + /// Path to whisper.cpp binary + pub whisper_path: PathBuf, + + /// Path to piper binary + pub piper_path: PathBuf, + + /// Piper voice model + pub piper_voice: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SensorConfig { + /// LIDAR device (e.g., "/dev/ttyUSB0") + pub lidar_port: String, + + /// LIDAR type ("rplidar", "ydlidar", "mock") + pub lidar_type: String, + + /// GPIO pins for motion sensors (BCM numbering) + pub motion_pins: Vec, + + /// Ultrasonic sensor pins (trigger, echo) + pub ultrasonic_pins: Option<(u8, u8)>, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SafetyConfig { + /// Minimum obstacle distance before auto-stop (meters) + /// Robot will NOT move if obstacle is closer than this + /// Default: 0.3m (30cm) + pub min_obstacle_distance: f64, + + /// Slow-down zone multiplier + /// Robot starts reducing speed when obstacle is within: + /// min_obstacle_distance * slow_zone_multiplier + /// Default: 3.0 (starts slowing at 90cm if min is 30cm) + pub slow_zone_multiplier: f64, + + /// Maximum speed when approaching obstacles (0.0 - 1.0) + /// Limits speed in the slow-down zone + /// Default: 0.3 (30% max speed near obstacles) + pub approach_speed_limit: f64, + + /// Maximum continuous drive time (seconds) + /// Robot auto-stops after this duration without new commands + /// Prevents runaway if LLM hangs or loses connection + /// Default: 30 seconds + pub max_drive_duration: u64, + + /// Emergency stop GPIO pin (BCM numbering) + /// Wire a big red button - pulling LOW triggers immediate stop + /// Default: GPIO 4 + pub estop_pin: Option, + + /// Bump sensor GPIO pins (BCM numbering) + /// Microswitches on chassis that trigger on physical collision + /// Default: [5, 6] (front-left, front-right) + pub bump_sensor_pins: Vec, + + /// Distance to reverse after bump detection (meters) + /// Robot backs up this far after hitting something + /// Default: 0.15m (15cm) + pub bump_reverse_distance: f64, + + /// Require verbal confirmation for movement + /// If true, robot asks "Should I move?" before moving + /// Default: false (for responsive play) + pub confirm_movement: bool, + + /// Enable collision prediction using LIDAR + /// Estimates if current trajectory will intersect obstacle + /// Default: true + pub predict_collisions: bool, + + /// Sensor data timeout (seconds) + /// Block all movement if no sensor updates for this long + /// Prevents blind movement if sensors fail + /// Default: 5 seconds + pub sensor_timeout_secs: u64, + + /// Speed limit when sensors are in mock/unavailable mode (0.0 - 1.0) + /// Extra caution when flying blind + /// Default: 0.2 (20% speed) + pub blind_mode_speed_limit: f64, +} + +impl Default for RobotConfig { + fn default() -> Self { + Self { + drive: DriveConfig { + backend: "mock".to_string(), + ros2_topic: "/cmd_vel".to_string(), + serial_port: "/dev/ttyACM0".to_string(), + max_speed: 0.5, + max_rotation: 1.0, + }, + camera: CameraConfig { + device: "/dev/video0".to_string(), + width: 640, + height: 480, + vision_model: "moondream".to_string(), + ollama_url: "http://localhost:11434".to_string(), + }, + audio: AudioConfig { + mic_device: "default".to_string(), + speaker_device: "default".to_string(), + whisper_model: "base".to_string(), + whisper_path: PathBuf::from("/usr/local/bin/whisper-cpp"), + piper_path: PathBuf::from("/usr/local/bin/piper"), + piper_voice: "en_US-lessac-medium".to_string(), + }, + sensors: SensorConfig { + lidar_port: "/dev/ttyUSB0".to_string(), + lidar_type: "mock".to_string(), + motion_pins: vec![17, 27], + ultrasonic_pins: Some((23, 24)), + }, + safety: SafetyConfig { + min_obstacle_distance: 0.3, // 30cm - absolute minimum + slow_zone_multiplier: 3.0, // Start slowing at 90cm + approach_speed_limit: 0.3, // 30% max speed near obstacles + max_drive_duration: 30, // Auto-stop after 30s + estop_pin: Some(4), // GPIO 4 for big red button + bump_sensor_pins: vec![5, 6], // Front bump sensors + bump_reverse_distance: 0.15, // Back up 15cm after bump + confirm_movement: false, // Don't require verbal confirm + predict_collisions: true, // Use LIDAR prediction + sensor_timeout_secs: 5, // Block if sensors stale 5s + blind_mode_speed_limit: 0.2, // 20% speed without sensors + }, + } + } +} + +impl RobotConfig { + /// Load from TOML file + pub fn load(path: &std::path::Path) -> anyhow::Result { + let content = std::fs::read_to_string(path)?; + Ok(toml::from_str(&content)?) + } + + /// Save to TOML file + pub fn save(&self, path: &std::path::Path) -> anyhow::Result<()> { + let content = toml::to_string_pretty(self)?; + std::fs::write(path, content)?; + Ok(()) + } +} diff --git a/third_party/zeroclaw/crates/robot-kit/src/drive.rs b/third_party/zeroclaw/crates/robot-kit/src/drive.rs new file mode 100644 index 0000000..e848f79 --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/src/drive.rs @@ -0,0 +1,428 @@ +//! Drive Tool - Motor control for omni-directional movement +//! +//! Supports multiple backends: +//! - ROS2: Publishes geometry_msgs/Twist to cmd_vel topic +//! - GPIO: Direct PWM control via rppal +//! - Serial: Arduino/motor controller via serial commands +//! - Mock: Logs commands for testing + +use crate::config::RobotConfig; +use crate::traits::{Tool, ToolResult}; +use anyhow::Result; +use async_trait::async_trait; +use serde_json::{json, Value}; +use std::sync::Arc; +use std::time::Duration; +use tokio::sync::Mutex; + +/// Drive backend abstraction +#[async_trait] +trait DriveBackend: Send + Sync { + async fn move_robot( + &self, + linear_x: f64, + linear_y: f64, + angular_z: f64, + duration_ms: u64, + ) -> Result<()>; + async fn stop(&self) -> Result<()>; + #[allow(dead_code)] + async fn get_odometry(&self) -> Result<(f64, f64, f64)>; // x, y, theta - reserved for future odometry integration +} + +/// Mock backend for testing +struct MockDrive; + +#[async_trait] +impl DriveBackend for MockDrive { + async fn move_robot( + &self, + linear_x: f64, + linear_y: f64, + angular_z: f64, + duration_ms: u64, + ) -> Result<()> { + tracing::info!( + "MOCK DRIVE: linear=({:.2}, {:.2}), angular={:.2}, duration={}ms", + linear_x, + linear_y, + angular_z, + duration_ms + ); + tokio::time::sleep(Duration::from_millis(duration_ms.min(100))).await; + Ok(()) + } + + async fn stop(&self) -> Result<()> { + tracing::info!("MOCK DRIVE: STOP"); + Ok(()) + } + + async fn get_odometry(&self) -> Result<(f64, f64, f64)> { + Ok((0.0, 0.0, 0.0)) + } +} + +/// ROS2 backend - shells out to ros2 topic pub +struct Ros2Drive { + topic: String, +} + +#[async_trait] +impl DriveBackend for Ros2Drive { + async fn move_robot( + &self, + linear_x: f64, + linear_y: f64, + angular_z: f64, + duration_ms: u64, + ) -> Result<()> { + // Publish Twist message via ros2 CLI + // In production, use rclrs (Rust ROS2 bindings) instead + let msg = format!( + "{{linear: {{x: {:.2}, y: {:.2}, z: 0.0}}, angular: {{x: 0.0, y: 0.0, z: {:.2}}}}}", + linear_x, linear_y, angular_z + ); + + let output = tokio::process::Command::new("ros2") + .args([ + "topic", + "pub", + "--once", + &self.topic, + "geometry_msgs/msg/Twist", + &msg, + ]) + .output() + .await?; + + if !output.status.success() { + anyhow::bail!( + "ROS2 publish failed: {}", + String::from_utf8_lossy(&output.stderr) + ); + } + + // Hold for duration then stop + tokio::time::sleep(Duration::from_millis(duration_ms)).await; + self.stop().await?; + + Ok(()) + } + + async fn stop(&self) -> Result<()> { + let msg = "{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"; + tokio::process::Command::new("ros2") + .args([ + "topic", + "pub", + "--once", + &self.topic, + "geometry_msgs/msg/Twist", + msg, + ]) + .output() + .await?; + Ok(()) + } + + async fn get_odometry(&self) -> Result<(f64, f64, f64)> { + // Would subscribe to /odom topic in production + Ok((0.0, 0.0, 0.0)) + } +} + +/// Serial backend - sends commands to Arduino/motor controller +struct SerialDrive { + port: String, +} + +#[async_trait] +impl DriveBackend for SerialDrive { + async fn move_robot( + &self, + linear_x: f64, + linear_y: f64, + angular_z: f64, + duration_ms: u64, + ) -> Result<()> { + // Protocol: "M \n" + // The motor controller interprets this and drives motors + let cmd = format!( + "M {:.2} {:.2} {:.2} {}\n", + linear_x, linear_y, angular_z, duration_ms + ); + + // Use blocking serial in spawn_blocking + let port = self.port.clone(); + tokio::task::spawn_blocking(move || { + use std::io::Write; + let mut serial = std::fs::OpenOptions::new().write(true).open(&port)?; + serial.write_all(cmd.as_bytes())?; + serial.flush()?; + Ok::<_, anyhow::Error>(()) + }) + .await??; + + tokio::time::sleep(Duration::from_millis(duration_ms)).await; + Ok(()) + } + + async fn stop(&self) -> Result<()> { + self.move_robot(0.0, 0.0, 0.0, 0).await + } + + async fn get_odometry(&self) -> Result<(f64, f64, f64)> { + Ok((0.0, 0.0, 0.0)) + } +} + +/// Main Drive Tool +pub struct DriveTool { + config: RobotConfig, + backend: Arc, + last_command: Arc>>, +} + +impl DriveTool { + pub fn new(config: RobotConfig) -> Self { + let backend: Arc = match config.drive.backend.as_str() { + "ros2" => Arc::new(Ros2Drive { + topic: config.drive.ros2_topic.clone(), + }), + "serial" => Arc::new(SerialDrive { + port: config.drive.serial_port.clone(), + }), + // "gpio" => Arc::new(GpioDrive::new(&config)), // Would use rppal + _ => Arc::new(MockDrive), + }; + + Self { + config, + backend, + last_command: Arc::new(Mutex::new(None)), + } + } +} + +#[async_trait] +impl Tool for DriveTool { + fn name(&self) -> &str { + "drive" + } + + fn description(&self) -> &str { + "Move the robot. Supports omni-directional movement (forward, backward, strafe left/right, rotate). \ + Use 'stop' action to halt immediately. Distance is in meters, rotation in degrees." + } + + fn parameters_schema(&self) -> Value { + json!({ + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": ["forward", "backward", "left", "right", "rotate_left", "rotate_right", "stop", "custom"], + "description": "Movement action. 'left'/'right' are strafe (omni wheels). 'rotate_*' spins in place." + }, + "distance": { + "type": "number", + "description": "Distance in meters (for linear moves) or degrees (for rotation). Default 0.5m or 90deg." + }, + "speed": { + "type": "number", + "description": "Speed multiplier 0.0-1.0. Default 0.5 (half speed for safety)." + }, + "linear_x": { + "type": "number", + "description": "Custom: forward/backward velocity (-1.0 to 1.0)" + }, + "linear_y": { + "type": "number", + "description": "Custom: left/right strafe velocity (-1.0 to 1.0)" + }, + "angular_z": { + "type": "number", + "description": "Custom: rotation velocity (-1.0 to 1.0)" + } + }, + "required": ["action"] + }) + } + + async fn execute(&self, args: Value) -> Result { + let action = args["action"] + .as_str() + .ok_or_else(|| anyhow::anyhow!("Missing 'action' parameter"))?; + + // Safety: check max drive duration + { + let mut last = self.last_command.lock().await; + if let Some(instant) = *last { + if instant.elapsed() < Duration::from_secs(1) { + return Ok(ToolResult { + success: false, + output: String::new(), + error: Some( + "Rate limited: wait 1 second between drive commands".to_string(), + ), + }); + } + } + *last = Some(std::time::Instant::now()); + } + + let speed = args["speed"].as_f64().unwrap_or(0.5).clamp(0.0, 1.0); + let max_speed = self.config.drive.max_speed * speed; + let max_rotation = self.config.drive.max_rotation * speed; + + let (linear_x, linear_y, angular_z, duration_ms) = match action { + "stop" => { + self.backend.stop().await?; + return Ok(ToolResult { + success: true, + output: "Robot stopped".to_string(), + error: None, + }); + } + "forward" => { + let dist = args["distance"].as_f64().unwrap_or(0.5); + let duration = (dist / max_speed * 1000.0) as u64; + ( + max_speed, + 0.0, + 0.0, + duration.min(self.config.safety.max_drive_duration * 1000), + ) + } + "backward" => { + let dist = args["distance"].as_f64().unwrap_or(0.5); + let duration = (dist / max_speed * 1000.0) as u64; + ( + -max_speed, + 0.0, + 0.0, + duration.min(self.config.safety.max_drive_duration * 1000), + ) + } + "left" => { + let dist = args["distance"].as_f64().unwrap_or(0.5); + let duration = (dist / max_speed * 1000.0) as u64; + ( + 0.0, + max_speed, + 0.0, + duration.min(self.config.safety.max_drive_duration * 1000), + ) + } + "right" => { + let dist = args["distance"].as_f64().unwrap_or(0.5); + let duration = (dist / max_speed * 1000.0) as u64; + ( + 0.0, + -max_speed, + 0.0, + duration.min(self.config.safety.max_drive_duration * 1000), + ) + } + "rotate_left" => { + let degrees = args["distance"].as_f64().unwrap_or(90.0); + let radians = degrees.to_radians(); + let duration = (radians / max_rotation * 1000.0) as u64; + ( + 0.0, + 0.0, + max_rotation, + duration.min(self.config.safety.max_drive_duration * 1000), + ) + } + "rotate_right" => { + let degrees = args["distance"].as_f64().unwrap_or(90.0); + let radians = degrees.to_radians(); + let duration = (radians / max_rotation * 1000.0) as u64; + ( + 0.0, + 0.0, + -max_rotation, + duration.min(self.config.safety.max_drive_duration * 1000), + ) + } + "custom" => { + let lx = args["linear_x"].as_f64().unwrap_or(0.0).clamp(-1.0, 1.0) * max_speed; + let ly = args["linear_y"].as_f64().unwrap_or(0.0).clamp(-1.0, 1.0) * max_speed; + let az = args["angular_z"].as_f64().unwrap_or(0.0).clamp(-1.0, 1.0) * max_rotation; + let duration = args["duration_ms"].as_u64().unwrap_or(1000); + ( + lx, + ly, + az, + duration.min(self.config.safety.max_drive_duration * 1000), + ) + } + _ => { + return Ok(ToolResult { + success: false, + output: String::new(), + error: Some(format!("Unknown action: {action}")), + }); + } + }; + + self.backend + .move_robot(linear_x, linear_y, angular_z, duration_ms) + .await?; + + Ok(ToolResult { + success: true, + output: format!( + "Moved: action={}, linear=({:.2}, {:.2}), angular={:.2}, duration={}ms", + action, linear_x, linear_y, angular_z, duration_ms + ), + error: None, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn drive_tool_name() { + let tool = DriveTool::new(RobotConfig::default()); + assert_eq!(tool.name(), "drive"); + } + + #[test] + fn drive_tool_schema_has_action() { + let tool = DriveTool::new(RobotConfig::default()); + let schema = tool.parameters_schema(); + assert!(schema["properties"]["action"].is_object()); + } + + #[tokio::test] + async fn drive_forward_mock() { + let tool = DriveTool::new(RobotConfig::default()); + let result = tool + .execute(json!({"action": "forward", "distance": 1.0})) + .await + .unwrap(); + assert!(result.success); + assert!(result.output.contains("forward")); + } + + #[tokio::test] + async fn drive_stop() { + let tool = DriveTool::new(RobotConfig::default()); + let result = tool.execute(json!({"action": "stop"})).await.unwrap(); + assert!(result.success); + assert!(result.output.contains("stopped")); + } + + #[tokio::test] + async fn drive_unknown_action() { + let tool = DriveTool::new(RobotConfig::default()); + let result = tool.execute(json!({"action": "fly"})).await.unwrap(); + assert!(!result.success); + } +} diff --git a/third_party/zeroclaw/crates/robot-kit/src/emote.rs b/third_party/zeroclaw/crates/robot-kit/src/emote.rs new file mode 100644 index 0000000..19b0ba6 --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/src/emote.rs @@ -0,0 +1,326 @@ +//! Emote Tool - LED expressions and sound effects +//! +//! Control LED matrix/strips for robot "expressions" and play sounds. +//! Makes the robot more engaging for kids! + +use crate::config::RobotConfig; +use crate::traits::{Tool, ToolResult}; +use anyhow::Result; +use async_trait::async_trait; +use serde_json::{json, Value}; +use std::path::PathBuf; + +/// Predefined LED expressions +#[derive(Debug, Clone, Copy)] +pub enum Expression { + Happy, // :) + Sad, // :( + Surprised, // :O + Thinking, // :? + Sleepy, // -_- + Excited, // ^_^ + Love, // <3 <3 + Angry, // >:( + Confused, // @_@ + Wink, // ;) +} + +impl Expression { + fn from_str(s: &str) -> Option { + match s.to_lowercase().as_str() { + "happy" | "smile" => Some(Self::Happy), + "sad" | "frown" => Some(Self::Sad), + "surprised" | "wow" => Some(Self::Surprised), + "thinking" | "hmm" => Some(Self::Thinking), + "sleepy" | "tired" => Some(Self::Sleepy), + "excited" | "yay" => Some(Self::Excited), + "love" | "heart" => Some(Self::Love), + "angry" | "mad" => Some(Self::Angry), + "confused" | "huh" => Some(Self::Confused), + "wink" => Some(Self::Wink), + _ => None, + } + } + + /// Get LED matrix pattern (8x8 example) + /// Returns array of 64 RGB values + fn pattern(&self) -> Vec<(u8, u8, u8)> { + let black = (0, 0, 0); + let white = (255, 255, 255); + let yellow = (255, 255, 0); + let red = (255, 0, 0); + let blue = (0, 100, 255); + let pink = (255, 100, 150); + + // 8x8 patterns (simplified representations) + match self { + Self::Happy => { + // Simple smiley + vec![ + black, black, yellow, yellow, yellow, yellow, black, black, black, yellow, + black, black, black, black, yellow, black, yellow, black, white, black, black, + white, black, yellow, yellow, black, black, black, black, black, black, yellow, + yellow, black, white, black, black, white, black, yellow, yellow, black, black, + white, white, black, black, yellow, black, yellow, black, black, black, black, + yellow, black, black, black, yellow, yellow, yellow, yellow, black, black, + ] + } + Self::Sad => { + vec![ + black, black, blue, blue, blue, blue, black, black, black, blue, black, black, + black, black, blue, black, blue, black, white, black, black, white, black, + blue, blue, black, black, black, black, black, black, blue, blue, black, black, + white, white, black, black, blue, blue, black, white, black, black, white, + black, blue, black, blue, black, black, black, black, blue, black, black, + black, blue, blue, blue, blue, black, black, + ] + } + Self::Excited => { + vec![ + yellow, yellow, yellow, yellow, yellow, yellow, yellow, yellow, yellow, black, + black, yellow, yellow, black, black, yellow, yellow, black, white, yellow, + yellow, white, black, yellow, yellow, yellow, yellow, yellow, yellow, yellow, + yellow, yellow, yellow, black, black, black, black, black, black, yellow, + yellow, black, white, white, white, white, black, yellow, yellow, black, black, + black, black, black, black, yellow, yellow, yellow, yellow, yellow, yellow, + yellow, yellow, yellow, + ] + } + Self::Love => { + vec![ + black, pink, pink, black, black, pink, pink, black, pink, pink, pink, pink, + pink, pink, pink, pink, pink, pink, pink, pink, pink, pink, pink, pink, pink, + pink, pink, pink, pink, pink, pink, pink, black, pink, pink, pink, pink, pink, + pink, black, black, black, pink, pink, pink, pink, black, black, black, black, + black, pink, pink, black, black, black, black, black, black, black, black, + black, black, black, + ] + } + Self::Angry => { + vec![ + red, red, black, black, black, black, red, red, black, red, red, black, black, + red, red, black, black, black, red, black, black, red, black, black, black, + black, white, black, black, white, black, black, black, black, black, black, + black, black, black, black, black, black, white, white, white, white, black, + black, black, white, black, black, black, black, white, black, black, black, + black, black, black, black, black, black, + ] + } + _ => { + // Default neutral + vec![white; 64] + } + } + } +} + +pub struct EmoteTool { + #[allow(dead_code)] + config: RobotConfig, + sounds_dir: PathBuf, +} + +impl EmoteTool { + pub fn new(config: RobotConfig) -> Self { + let sounds_dir = directories::UserDirs::new() + .map(|d| d.home_dir().join(".zeroclaw/sounds")) + .unwrap_or_else(|| PathBuf::from("/usr/local/share/zeroclaw/sounds")); + + Self { config, sounds_dir } + } + + /// Set LED matrix expression + async fn set_expression(&self, expr: Expression) -> Result<()> { + let pattern = expr.pattern(); + + // Convert to format for LED driver + // In production, use rs_ws281x or similar + let pattern_json = serde_json::to_string(&pattern)?; + + // Try to write to LED controller + // Option 1: Write to FIFO/socket if LED daemon is running + let led_fifo = PathBuf::from("/tmp/zeroclaw_led.fifo"); + if led_fifo.exists() { + tokio::fs::write(&led_fifo, pattern_json).await?; + return Ok(()); + } + + // Option 2: Shell out to LED control script + let output = tokio::process::Command::new("zeroclaw-led") + .args(["--pattern", &format!("{:?}", expr)]) + .output() + .await; + + match output { + Ok(out) if out.status.success() => Ok(()), + _ => { + tracing::info!("LED display: {:?} (hardware not connected)", expr); + Ok(()) // Don't fail if LED hardware isn't available + } + } + } + + /// Play emotion sound effect + async fn play_emotion_sound(&self, emotion: &str) -> Result<()> { + let sound_file = self.sounds_dir.join(format!("{}.wav", emotion)); + + if !sound_file.exists() { + tracing::debug!("No sound file for emotion: {}", emotion); + return Ok(()); + } + + tokio::process::Command::new("aplay") + .arg(sound_file) + .output() + .await?; + + Ok(()) + } + + /// Animate expression (e.g., blinking) + async fn animate(&self, animation: &str) -> Result<()> { + match animation { + "blink" => { + self.set_expression(Expression::Happy).await?; + tokio::time::sleep(std::time::Duration::from_millis(100)).await; + // "Closed eyes" - simplified + tokio::time::sleep(std::time::Duration::from_millis(100)).await; + self.set_expression(Expression::Happy).await?; + } + "nod" => { + // Would control servo if available + tracing::info!("Animation: nod"); + } + "shake" => { + tracing::info!("Animation: shake"); + } + "dance" => { + // Cycle through expressions + for expr in [ + Expression::Happy, + Expression::Excited, + Expression::Love, + Expression::Happy, + ] { + self.set_expression(expr).await?; + tokio::time::sleep(std::time::Duration::from_millis(500)).await; + } + } + _ => {} + } + Ok(()) + } +} + +#[async_trait] +impl Tool for EmoteTool { + fn name(&self) -> &str { + "emote" + } + + fn description(&self) -> &str { + "Express emotions through LED display and sounds. Use this to show the robot's \ + emotional state - happy when playing, sad when saying goodbye, excited for games, etc. \ + This makes interactions with kids more engaging!" + } + + fn parameters_schema(&self) -> Value { + json!({ + "type": "object", + "properties": { + "expression": { + "type": "string", + "enum": ["happy", "sad", "surprised", "thinking", "sleepy", "excited", "love", "angry", "confused", "wink"], + "description": "Facial expression to display on LED matrix" + }, + "animation": { + "type": "string", + "enum": ["blink", "nod", "shake", "dance"], + "description": "Optional animation to perform" + }, + "sound": { + "type": "boolean", + "description": "Play matching sound effect (default true)" + }, + "duration": { + "type": "integer", + "description": "How long to hold expression in seconds (default 3)" + } + }, + "required": ["expression"] + }) + } + + async fn execute(&self, args: Value) -> Result { + let expression_str = args["expression"] + .as_str() + .ok_or_else(|| anyhow::anyhow!("Missing 'expression' parameter"))?; + + let expression = Expression::from_str(expression_str) + .ok_or_else(|| anyhow::anyhow!("Unknown expression: {}", expression_str))?; + + let play_sound = args["sound"].as_bool().unwrap_or(true); + let duration = args["duration"].as_u64().unwrap_or(3); + + // Set expression + self.set_expression(expression).await?; + + // Play sound if enabled + if play_sound { + let _ = self.play_emotion_sound(expression_str).await; + } + + // Run animation if specified + if let Some(animation) = args["animation"].as_str() { + self.animate(animation).await?; + } + + // Hold expression + if duration > 0 { + tokio::time::sleep(std::time::Duration::from_secs(duration.min(10))).await; + } + + Ok(ToolResult { + success: true, + output: format!("Expressing: {} for {}s", expression_str, duration), + error: None, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn emote_tool_name() { + let tool = EmoteTool::new(RobotConfig::default()); + assert_eq!(tool.name(), "emote"); + } + + #[test] + fn expression_parsing() { + assert!(Expression::from_str("happy").is_some()); + assert!(Expression::from_str("EXCITED").is_some()); + assert!(Expression::from_str("unknown").is_none()); + } + + #[test] + fn expression_pattern_size() { + let expr = Expression::Happy; + assert_eq!(expr.pattern().len(), 64); // 8x8 + } + + #[tokio::test] + async fn emote_happy() { + let tool = EmoteTool::new(RobotConfig::default()); + let result = tool + .execute(json!({ + "expression": "happy", + "duration": 0 + })) + .await + .unwrap(); + assert!(result.success); + } +} diff --git a/third_party/zeroclaw/crates/robot-kit/src/lib.rs b/third_party/zeroclaw/crates/robot-kit/src/lib.rs new file mode 100644 index 0000000..86436b7 --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/src/lib.rs @@ -0,0 +1,154 @@ +//! # ZeroClaw Robot Kit +//! +//! A standalone robotics toolkit that integrates with ZeroClaw for AI-powered robots. +//! +//! ## Features +//! +//! - **Drive**: Omni-directional motor control (ROS2, serial, GPIO, mock) +//! - **Look**: Camera capture + vision model description (Ollama) +//! - **Listen**: Speech-to-text via Whisper.cpp +//! - **Speak**: Text-to-speech via Piper TTS +//! - **Sense**: LIDAR, motion sensors, ultrasonic distance +//! - **Emote**: LED matrix expressions and sound effects +//! - **Safety**: Independent safety monitor (collision avoidance, E-stop, watchdog) +//! +//! ## Architecture +//! +//! ```text +//! ┌─────────────────────────────────────────────────────────┐ +//! │ ZeroClaw AI Brain (or any controller) │ +//! │ "Move forward, find the ball, tell me what you see" │ +//! └─────────────────────┬───────────────────────────────────┘ +//! │ Tool calls +//! ▼ +//! ┌─────────────────────────────────────────────────────────┐ +//! │ zeroclaw-robot-kit │ +//! │ ┌─────────┐ ┌──────┐ ┌────────┐ ┌───────┐ ┌───────┐ │ +//! │ │ drive │ │ look │ │ listen │ │ speak │ │ sense │ │ +//! │ └────┬────┘ └──┬───┘ └───┬────┘ └───┬───┘ └───┬───┘ │ +//! │ │ │ │ │ │ │ +//! │ ┌────┴─────────┴─────────┴──────────┴─────────┴────┐ │ +//! │ │ SafetyMonitor (parallel) │ │ +//! │ │ • Pre-move obstacle check │ │ +//! │ │ • Proximity-based speed limiting │ │ +//! │ │ • Bump sensor response │ │ +//! │ │ • Watchdog auto-stop │ │ +//! │ │ • Hardware E-stop override │ │ +//! │ └──────────────────────────────────────────────────┘ │ +//! └─────────────────────────────────────────────────────────┘ +//! │ +//! ▼ +//! ┌─────────────────────────────────────────────────────────┐ +//! │ Hardware: Motors, Camera, Mic, Speaker, LIDAR, LEDs │ +//! └─────────────────────────────────────────────────────────┘ +//! ``` +//! +//! ## Quick Start +//! +//! ```rust,ignore +//! use zeroclaw_robot_kit::{RobotConfig, DriveTool, SafetyMonitor, SafeDrive}; +//! use std::sync::Arc; +//! +//! #[tokio::main] +//! async fn main() { +//! // Load configuration +//! let config = RobotConfig::default(); +//! +//! // Create safety monitor +//! let (safety, _rx) = SafetyMonitor::new(config.safety.clone()); +//! let safety = Arc::new(safety); +//! +//! // Wrap drive with safety +//! let drive = Arc::new(DriveTool::new(config.clone())); +//! let safe_drive = SafeDrive::new(drive, safety.clone()); +//! +//! // Use tools... +//! let result = safe_drive.execute(serde_json::json!({ +//! "action": "forward", +//! "distance": 1.0 +//! })).await; +//! } +//! ``` +//! +//! ## Standalone Usage +//! +//! This crate can be used independently of ZeroClaw. It defines its own +//! `Tool` trait that is compatible with ZeroClaw's but doesn't require it. +//! +//! ## Safety +//! +//! **The AI can REQUEST movement, but SafetyMonitor ALLOWS it.** +//! +//! The safety system runs as an independent task and can override any +//! AI decision. This prevents collisions even if the LLM hallucinates. + +// TODO: Re-enable once all public items are documented +// #![warn(missing_docs)] +#![allow(missing_docs)] +#![warn(clippy::all)] + +pub mod config; +pub mod traits; + +pub mod drive; +pub mod emote; +pub mod listen; +pub mod look; +pub mod sense; +pub mod speak; + +#[cfg(feature = "safety")] +pub mod safety; + +#[cfg(test)] +mod tests; + +// Re-exports for convenience +pub use config::RobotConfig; +pub use traits::{Tool, ToolResult, ToolSpec}; + +pub use drive::DriveTool; +pub use emote::EmoteTool; +pub use listen::ListenTool; +pub use look::LookTool; +pub use sense::SenseTool; +pub use speak::SpeakTool; + +#[cfg(feature = "safety")] +pub use safety::{preflight_check, SafeDrive, SafetyEvent, SafetyMonitor, SensorReading}; + +/// Crate version +pub const VERSION: &str = env!("CARGO_PKG_VERSION"); + +/// Create all robot tools with default configuration +/// +/// Returns a Vec of boxed tools ready for use with an agent. +pub fn create_tools(config: &RobotConfig) -> Vec> { + vec![ + Box::new(DriveTool::new(config.clone())), + Box::new(LookTool::new(config.clone())), + Box::new(ListenTool::new(config.clone())), + Box::new(SpeakTool::new(config.clone())), + Box::new(SenseTool::new(config.clone())), + Box::new(EmoteTool::new(config.clone())), + ] +} + +/// Create all robot tools with safety wrapper on drive +#[cfg(feature = "safety")] +pub fn create_safe_tools( + config: &RobotConfig, + safety: std::sync::Arc, +) -> Vec> { + let drive = std::sync::Arc::new(DriveTool::new(config.clone())); + let safe_drive = SafeDrive::new(drive, safety); + + vec![ + Box::new(safe_drive), + Box::new(LookTool::new(config.clone())), + Box::new(ListenTool::new(config.clone())), + Box::new(SpeakTool::new(config.clone())), + Box::new(SenseTool::new(config.clone())), + Box::new(EmoteTool::new(config.clone())), + ] +} diff --git a/third_party/zeroclaw/crates/robot-kit/src/listen.rs b/third_party/zeroclaw/crates/robot-kit/src/listen.rs new file mode 100644 index 0000000..9f99fe2 --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/src/listen.rs @@ -0,0 +1,208 @@ +//! Listen Tool - Speech-to-text via Whisper.cpp +//! +//! Records audio from microphone and transcribes using local Whisper model. +//! Designed for offline operation on Raspberry Pi. + +use crate::config::RobotConfig; +use crate::traits::{Tool, ToolResult}; +use anyhow::Result; +use async_trait::async_trait; +use serde_json::{json, Value}; +use std::path::{Path, PathBuf}; + +pub struct ListenTool { + config: RobotConfig, + recordings_dir: PathBuf, +} + +impl ListenTool { + pub fn new(config: RobotConfig) -> Self { + let recordings_dir = directories::UserDirs::new() + .map(|d| d.home_dir().join(".zeroclaw/recordings")) + .unwrap_or_else(|| PathBuf::from("/tmp/zeroclaw_recordings")); + + let _ = std::fs::create_dir_all(&recordings_dir); + + Self { + config, + recordings_dir, + } + } + + /// Record audio using arecord (ALSA) + async fn record_audio(&self, duration_secs: u64) -> Result { + let timestamp = chrono::Utc::now().format("%Y%m%d_%H%M%S"); + let filename = self + .recordings_dir + .join(format!("recording_{}.wav", timestamp)); + + let device = &self.config.audio.mic_device; + + // Record using arecord (standard on Linux/Pi) + let output = tokio::process::Command::new("arecord") + .args([ + "-D", + device, + "-f", + "S16_LE", // 16-bit signed little-endian + "-r", + "16000", // 16kHz (Whisper expects this) + "-c", + "1", // Mono + "-d", + &duration_secs.to_string(), + filename.to_str().unwrap(), + ]) + .output() + .await?; + + if !output.status.success() { + anyhow::bail!( + "Audio recording failed: {}", + String::from_utf8_lossy(&output.stderr) + ); + } + + Ok(filename) + } + + /// Transcribe audio using whisper.cpp + async fn transcribe(&self, audio_path: &Path) -> Result { + let whisper_path = &self.config.audio.whisper_path; + let model = &self.config.audio.whisper_model; + + // whisper.cpp model path (typically in ~/.zeroclaw/models/) + let model_path = directories::UserDirs::new() + .map(|d| { + d.home_dir() + .join(format!(".zeroclaw/models/ggml-{}.bin", model)) + }) + .unwrap_or_else(|| { + PathBuf::from(format!("/usr/local/share/whisper/ggml-{}.bin", model)) + }); + + // Run whisper.cpp + let output = tokio::process::Command::new(whisper_path) + .args([ + "-m", + model_path.to_str().unwrap(), + "-f", + audio_path.to_str().unwrap(), + "--no-timestamps", + "-otxt", // Output as text + ]) + .output() + .await?; + + if !output.status.success() { + anyhow::bail!( + "Whisper transcription failed: {}", + String::from_utf8_lossy(&output.stderr) + ); + } + + // whisper.cpp outputs to .txt + let txt_path = audio_path.with_extension("wav.txt"); + let transcript = tokio::fs::read_to_string(&txt_path) + .await + .unwrap_or_else(|_| String::from_utf8_lossy(&output.stdout).to_string()); + + // Clean up temp files + let _ = tokio::fs::remove_file(&txt_path).await; + + Ok(transcript.trim().to_string()) + } +} + +#[async_trait] +impl Tool for ListenTool { + fn name(&self) -> &str { + "listen" + } + + fn description(&self) -> &str { + "Listen for speech and transcribe it to text. Records from the microphone \ + for the specified duration, then converts speech to text using Whisper." + } + + fn parameters_schema(&self) -> Value { + json!({ + "type": "object", + "properties": { + "duration": { + "type": "integer", + "description": "Recording duration in seconds. Default 5, max 30.", + "minimum": 1, + "maximum": 30 + }, + "prompt": { + "type": "string", + "description": "Optional context hint for transcription (e.g., 'The speaker is a child')" + } + } + }) + } + + async fn execute(&self, args: Value) -> Result { + let duration = args["duration"].as_u64().unwrap_or(5).clamp(1, 30); + + // Record audio + tracing::info!("Recording audio for {} seconds...", duration); + let audio_path = match self.record_audio(duration).await { + Ok(path) => path, + Err(e) => { + return Ok(ToolResult { + success: false, + output: String::new(), + error: Some(format!("Recording failed: {e}")), + }); + } + }; + + // Transcribe + tracing::info!("Transcribing audio..."); + match self.transcribe(&audio_path).await { + Ok(transcript) => { + // Clean up audio file + let _ = tokio::fs::remove_file(&audio_path).await; + + if transcript.is_empty() { + Ok(ToolResult { + success: true, + output: "(silence - no speech detected)".to_string(), + error: None, + }) + } else { + Ok(ToolResult { + success: true, + output: format!("I heard: \"{}\"", transcript), + error: None, + }) + } + } + Err(e) => Ok(ToolResult { + success: false, + output: String::new(), + error: Some(format!("Transcription failed: {e}")), + }), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn listen_tool_name() { + let tool = ListenTool::new(RobotConfig::default()); + assert_eq!(tool.name(), "listen"); + } + + #[test] + fn listen_tool_schema() { + let tool = ListenTool::new(RobotConfig::default()); + let schema = tool.parameters_schema(); + assert!(schema["properties"]["duration"].is_object()); + } +} diff --git a/third_party/zeroclaw/crates/robot-kit/src/look.rs b/third_party/zeroclaw/crates/robot-kit/src/look.rs new file mode 100644 index 0000000..17dad91 --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/src/look.rs @@ -0,0 +1,250 @@ +//! Look Tool - Camera capture + vision model description +//! +//! Captures an image from the camera and optionally describes it +//! using a local vision model (LLaVA, Moondream) via Ollama. + +use crate::config::RobotConfig; +use crate::traits::{Tool, ToolResult}; +use anyhow::Result; +use async_trait::async_trait; +use serde_json::{json, Value}; +use std::path::PathBuf; + +pub struct LookTool { + config: RobotConfig, + capture_dir: PathBuf, +} + +impl LookTool { + pub fn new(config: RobotConfig) -> Self { + let capture_dir = directories::UserDirs::new() + .map(|d| d.home_dir().join(".zeroclaw/captures")) + .unwrap_or_else(|| PathBuf::from("/tmp/zeroclaw_captures")); + + // Ensure capture directory exists + let _ = std::fs::create_dir_all(&capture_dir); + + Self { + config, + capture_dir, + } + } + + /// Capture image using ffmpeg (works with most cameras) + async fn capture_image(&self) -> Result { + let timestamp = chrono::Utc::now().format("%Y%m%d_%H%M%S"); + let filename = self.capture_dir.join(format!("capture_{}.jpg", timestamp)); + + let device = &self.config.camera.device; + let width = self.config.camera.width; + let height = self.config.camera.height; + + // Use ffmpeg for broad camera compatibility + let output = tokio::process::Command::new("ffmpeg") + .args([ + "-f", + "v4l2", + "-video_size", + &format!("{}x{}", width, height), + "-i", + device, + "-frames:v", + "1", + "-y", // Overwrite + filename.to_str().unwrap(), + ]) + .output() + .await?; + + if !output.status.success() { + // Fallback: try fswebcam (simpler, often works on Pi) + let fallback = tokio::process::Command::new("fswebcam") + .args([ + "-r", + &format!("{}x{}", width, height), + "--no-banner", + "-d", + device, + filename.to_str().unwrap(), + ]) + .output() + .await?; + + if !fallback.status.success() { + anyhow::bail!( + "Camera capture failed. Tried ffmpeg and fswebcam.\n\ + ffmpeg: {}\n\ + fswebcam: {}", + String::from_utf8_lossy(&output.stderr), + String::from_utf8_lossy(&fallback.stderr) + ); + } + } + + Ok(filename) + } + + /// Describe image using vision model via Ollama + async fn describe_image(&self, image_path: &PathBuf, prompt: &str) -> Result { + let model = &self.config.camera.vision_model; + if model == "none" { + return Ok("Vision model disabled. Image captured only.".to_string()); + } + + // Read image as base64 + let image_bytes = tokio::fs::read(image_path).await?; + let base64_image = + base64::Engine::encode(&base64::engine::general_purpose::STANDARD, &image_bytes); + + // Call Ollama with image + let client = reqwest::Client::new(); + let response = client + .post(format!("{}/api/generate", self.config.camera.ollama_url)) + .json(&json!({ + "model": model, + "prompt": prompt, + "images": [base64_image], + "stream": false + })) + .timeout(std::time::Duration::from_secs(60)) + .send() + .await?; + + if !response.status().is_success() { + anyhow::bail!("Ollama vision request failed: {}", response.status()); + } + + let result: Value = response.json().await?; + let description = result["response"] + .as_str() + .unwrap_or("No description generated") + .to_string(); + + Ok(description) + } +} + +#[async_trait] +impl Tool for LookTool { + fn name(&self) -> &str { + "look" + } + + fn description(&self) -> &str { + "Capture an image from the robot's camera and optionally describe what is seen. \ + Use this to observe the environment, find objects, or identify people." + } + + fn parameters_schema(&self) -> Value { + json!({ + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": ["capture", "describe", "find"], + "description": "capture=just take photo, describe=photo+AI description, find=look for specific thing" + }, + "prompt": { + "type": "string", + "description": "For 'describe': what to focus on. For 'find': what to look for." + } + }, + "required": ["action"] + }) + } + + async fn execute(&self, args: Value) -> Result { + let action = args["action"] + .as_str() + .ok_or_else(|| anyhow::anyhow!("Missing 'action' parameter"))?; + + // Capture image + let image_path = match self.capture_image().await { + Ok(path) => path, + Err(e) => { + return Ok(ToolResult { + success: false, + output: String::new(), + error: Some(format!("Camera capture failed: {e}")), + }); + } + }; + + match action { + "capture" => Ok(ToolResult { + success: true, + output: format!("Image captured: {}", image_path.display()), + error: None, + }), + "describe" => { + let prompt = args["prompt"] + .as_str() + .unwrap_or("Describe what you see in this image. Be specific about people, objects, and the environment."); + + match self.describe_image(&image_path, prompt).await { + Ok(description) => Ok(ToolResult { + success: true, + output: format!("I see: {}", description), + error: None, + }), + Err(e) => Ok(ToolResult { + success: false, + output: format!( + "Image captured at {} but description failed", + image_path.display() + ), + error: Some(e.to_string()), + }), + } + } + "find" => { + let target = args["prompt"].as_str().ok_or_else(|| { + anyhow::anyhow!("'find' action requires 'prompt' specifying what to find") + })?; + + let prompt = format!( + "Look at this image and determine: Is there a {} visible? \ + If yes, describe where it is (left, right, center, near, far). \ + If no, say 'Not found' and describe what you do see.", + target + ); + + match self.describe_image(&image_path, &prompt).await { + Ok(description) => Ok(ToolResult { + success: true, + output: description, + error: None, + }), + Err(e) => Ok(ToolResult { + success: false, + output: String::new(), + error: Some(e.to_string()), + }), + } + } + _ => Ok(ToolResult { + success: false, + output: String::new(), + error: Some(format!("Unknown action: {action}")), + }), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn look_tool_name() { + let tool = LookTool::new(RobotConfig::default()); + assert_eq!(tool.name(), "look"); + } + + #[test] + fn look_tool_schema() { + let tool = LookTool::new(RobotConfig::default()); + let schema = tool.parameters_schema(); + assert!(schema["properties"]["action"].is_object()); + } +} diff --git a/third_party/zeroclaw/crates/robot-kit/src/safety.rs b/third_party/zeroclaw/crates/robot-kit/src/safety.rs new file mode 100644 index 0000000..c4019d9 --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/src/safety.rs @@ -0,0 +1,537 @@ +//! Safety System - Collision avoidance, watchdogs, and emergency stops +//! +//! This module runs INDEPENDENTLY of the AI brain to ensure safety +//! even if the LLM makes bad decisions or hangs. +//! +//! ## Safety Layers +//! +//! 1. **Pre-move checks** - Verify path clear before any movement +//! 2. **Active monitoring** - Continuous sensor polling during movement +//! 3. **Reactive stops** - Instant halt on obstacle detection +//! 4. **Watchdog timer** - Auto-stop if no commands for N seconds +//! 5. **Hardware E-stop** - Physical button overrides everything +//! +//! ## Design Philosophy +//! +//! The AI can REQUEST movement, but the safety system ALLOWS it. +//! Safety always wins. + +use crate::config::{RobotConfig, SafetyConfig}; +use crate::traits::ToolResult; +use anyhow::Result; +use portable_atomic::{AtomicU64, Ordering}; +use std::sync::atomic::AtomicBool; +use std::sync::Arc; +use std::time::{Duration, Instant}; +use tokio::sync::{broadcast, RwLock}; + +/// Safety events broadcast to all listeners +#[derive(Debug, Clone)] +pub enum SafetyEvent { + /// Obstacle detected, movement blocked + ObstacleDetected { distance: f64, angle: u16 }, + /// Emergency stop triggered + EmergencyStop { reason: String }, + /// Watchdog timeout - no activity + WatchdogTimeout, + /// Movement approved + MovementApproved, + /// Movement denied with reason + MovementDenied { reason: String }, + /// Bump sensor triggered + BumpDetected { sensor: String }, + /// System recovered, ready to move again + Recovered, +} + +/// Real-time safety state +pub struct SafetyState { + /// Is it safe to move? + pub can_move: AtomicBool, + /// Emergency stop active? + pub estop_active: AtomicBool, + /// Last movement command timestamp (ms since epoch) + pub last_command_ms: AtomicU64, + /// Current minimum distance to obstacle + pub min_obstacle_distance: RwLock, + /// Reason movement is blocked (if any) + pub block_reason: RwLock>, + /// Speed multiplier based on proximity (0.0 - 1.0) + pub speed_limit: RwLock, +} + +impl Default for SafetyState { + fn default() -> Self { + Self { + can_move: AtomicBool::new(true), + estop_active: AtomicBool::new(false), + last_command_ms: AtomicU64::new(0), + min_obstacle_distance: RwLock::new(999.0), + block_reason: RwLock::new(None), + speed_limit: RwLock::new(1.0), + } + } +} + +/// Safety monitor - runs as background task +pub struct SafetyMonitor { + config: SafetyConfig, + state: Arc, + event_tx: broadcast::Sender, + shutdown: AtomicBool, +} + +impl SafetyMonitor { + pub fn new(config: SafetyConfig) -> (Self, broadcast::Receiver) { + let (event_tx, event_rx) = broadcast::channel(64); + let monitor = Self { + config, + state: Arc::new(SafetyState::default()), + event_tx, + shutdown: AtomicBool::new(false), + }; + (monitor, event_rx) + } + + pub fn state(&self) -> Arc { + self.state.clone() + } + + pub fn subscribe(&self) -> broadcast::Receiver { + self.event_tx.subscribe() + } + + /// Check if movement is currently allowed + pub async fn can_move(&self) -> bool { + if self.state.estop_active.load(Ordering::SeqCst) { + return false; + } + self.state.can_move.load(Ordering::SeqCst) + } + + /// Get current speed limit multiplier (0.0 - 1.0) + pub async fn speed_limit(&self) -> f64 { + *self.state.speed_limit.read().await + } + + /// Request permission to move - returns allowed speed multiplier or error + pub async fn request_movement(&self, direction: &str, distance: f64) -> Result { + // Check E-stop + if self.state.estop_active.load(Ordering::SeqCst) { + return Err("Emergency stop active".to_string()); + } + + // Check general movement permission + if !self.state.can_move.load(Ordering::SeqCst) { + let reason = self.state.block_reason.read().await; + return Err(reason + .clone() + .unwrap_or_else(|| "Movement blocked".to_string())); + } + + // Check obstacle distance in movement direction + let min_dist = *self.state.min_obstacle_distance.read().await; + if min_dist < self.config.min_obstacle_distance { + let msg = format!( + "Obstacle too close: {:.2}m (min: {:.2}m)", + min_dist, self.config.min_obstacle_distance + ); + let _ = self.event_tx.send(SafetyEvent::MovementDenied { + reason: msg.clone(), + }); + return Err(msg); + } + + // Check if requested distance would hit obstacle + if distance > min_dist - self.config.min_obstacle_distance { + let safe_distance = (min_dist - self.config.min_obstacle_distance).max(0.0); + if safe_distance < 0.1 { + return Err(format!( + "Cannot move {}: obstacle at {:.2}m", + direction, min_dist + )); + } + // Allow reduced distance + tracing::warn!( + "Reducing {} distance from {:.2}m to {:.2}m due to obstacle", + direction, + distance, + safe_distance + ); + } + + // Update last command time + let now_ms = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_millis() as u64; + self.state.last_command_ms.store(now_ms, Ordering::SeqCst); + + // Calculate speed limit based on proximity + let speed_mult = self.calculate_speed_limit(min_dist).await; + + let _ = self.event_tx.send(SafetyEvent::MovementApproved); + Ok(speed_mult) + } + + /// Calculate safe speed based on obstacle proximity + async fn calculate_speed_limit(&self, obstacle_distance: f64) -> f64 { + let min_dist = self.config.min_obstacle_distance; + let slow_zone = min_dist * 3.0; // Start slowing at 3x minimum distance + + let limit = if obstacle_distance >= slow_zone { + 1.0 // Full speed + } else if obstacle_distance <= min_dist { + 0.0 // Stop + } else { + // Linear interpolation between stop and full speed + (obstacle_distance - min_dist) / (slow_zone - min_dist) + }; + + *self.state.speed_limit.write().await = limit; + limit + } + + /// Trigger emergency stop + pub async fn emergency_stop(&self, reason: &str) { + tracing::error!("EMERGENCY STOP: {}", reason); + self.state.estop_active.store(true, Ordering::SeqCst); + self.state.can_move.store(false, Ordering::SeqCst); + *self.state.block_reason.write().await = Some(reason.to_string()); + + let _ = self.event_tx.send(SafetyEvent::EmergencyStop { + reason: reason.to_string(), + }); + } + + /// Reset emergency stop (requires explicit action) + pub async fn reset_estop(&self) { + tracing::info!("E-STOP RESET"); + self.state.estop_active.store(false, Ordering::SeqCst); + self.state.can_move.store(true, Ordering::SeqCst); + *self.state.block_reason.write().await = None; + + let _ = self.event_tx.send(SafetyEvent::Recovered); + } + + /// Update obstacle distance (call from sensor loop) + pub async fn update_obstacle_distance(&self, distance: f64, angle: u16) { + // Update minimum distance tracking + { + let mut min_dist = self.state.min_obstacle_distance.write().await; + // Always update to current reading (not just if closer) + *min_dist = distance; + } + + // Recalculate speed limit based on new distance + self.calculate_speed_limit(distance).await; + + // Check if too close + if distance < self.config.min_obstacle_distance { + self.state.can_move.store(false, Ordering::SeqCst); + *self.state.block_reason.write().await = + Some(format!("Obstacle at {:.2}m ({}°)", distance, angle)); + + let _ = self + .event_tx + .send(SafetyEvent::ObstacleDetected { distance, angle }); + } else if !self.state.estop_active.load(Ordering::SeqCst) { + // Clear block if obstacle moved away and no E-stop + self.state.can_move.store(true, Ordering::SeqCst); + *self.state.block_reason.write().await = None; + } + } + + /// Report bump sensor triggered + pub async fn bump_detected(&self, sensor: &str) { + tracing::warn!("BUMP DETECTED: {}", sensor); + + // Immediate stop + self.state.can_move.store(false, Ordering::SeqCst); + *self.state.block_reason.write().await = Some(format!("Bump: {}", sensor)); + + let _ = self.event_tx.send(SafetyEvent::BumpDetected { + sensor: sensor.to_string(), + }); + + // Auto-recover after brief pause (robot should back up) + tokio::spawn({ + let state = self.state.clone(); + let event_tx = self.event_tx.clone(); + async move { + tokio::time::sleep(Duration::from_secs(2)).await; + if !state.estop_active.load(Ordering::SeqCst) { + state.can_move.store(true, Ordering::SeqCst); + *state.block_reason.write().await = None; + let _ = event_tx.send(SafetyEvent::Recovered); + } + } + }); + } + + /// Shutdown the monitor + pub fn shutdown(&self) { + self.shutdown.store(true, Ordering::SeqCst); + } + + /// Run the safety monitor loop (call in background task) + pub async fn run(&self, mut sensor_rx: tokio::sync::mpsc::Receiver) { + let watchdog_timeout = Duration::from_secs(self.config.max_drive_duration); + let mut last_sensor_update = Instant::now(); + + while !self.shutdown.load(Ordering::SeqCst) { + tokio::select! { + // Process sensor readings + Some(reading) = sensor_rx.recv() => { + last_sensor_update = Instant::now(); + match reading { + SensorReading::Lidar { distance, angle } => { + self.update_obstacle_distance(distance, angle).await; + } + SensorReading::Bump { sensor } => { + self.bump_detected(&sensor).await; + } + SensorReading::Estop { pressed } => { + if pressed { + self.emergency_stop("Hardware E-stop pressed").await; + } + } + } + } + + // Watchdog check every second + _ = tokio::time::sleep(Duration::from_secs(1)) => { + // Check for sensor timeout + if last_sensor_update.elapsed() > Duration::from_secs(5) { + tracing::warn!("Sensor data stale - blocking movement"); + self.state.can_move.store(false, Ordering::SeqCst); + *self.state.block_reason.write().await = + Some("Sensor data stale".to_string()); + } + + // Check watchdog (auto-stop if no commands) + let last_cmd_ms = self.state.last_command_ms.load(Ordering::SeqCst); + if last_cmd_ms > 0 { + let now_ms = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_millis() as u64; + + let elapsed = Duration::from_millis(now_ms - last_cmd_ms); + if elapsed > watchdog_timeout { + tracing::info!("Watchdog timeout - no commands for {:?}", elapsed); + let _ = self.event_tx.send(SafetyEvent::WatchdogTimeout); + // Don't block movement, just notify + } + } + } + } + } + } +} + +/// Sensor readings fed to safety monitor +#[derive(Debug, Clone)] +pub enum SensorReading { + Lidar { distance: f64, angle: u16 }, + Bump { sensor: String }, + Estop { pressed: bool }, +} + +/// Safety-aware drive wrapper +/// Wraps the drive tool to enforce safety limits +pub struct SafeDrive { + inner_drive: Arc, + safety: Arc, +} + +impl SafeDrive { + pub fn new(drive: Arc, safety: Arc) -> Self { + Self { + inner_drive: drive, + safety, + } + } +} + +#[async_trait::async_trait] +impl crate::traits::Tool for SafeDrive { + fn name(&self) -> &str { + "drive" + } + + fn description(&self) -> &str { + "Move the robot (with safety limits enforced)" + } + + fn parameters_schema(&self) -> serde_json::Value { + self.inner_drive.parameters_schema() + } + + async fn execute(&self, args: serde_json::Value) -> Result { + // ToolResult imported at top of file + + let action = args["action"].as_str().unwrap_or("unknown"); + let distance = args["distance"].as_f64().unwrap_or(0.5); + + // Always allow stop + if action == "stop" { + return self.inner_drive.execute(args).await; + } + + // Request permission from safety system + match self.safety.request_movement(action, distance).await { + Ok(speed_mult) => { + // Modify speed in args + let mut modified_args = args.clone(); + let original_speed = args["speed"].as_f64().unwrap_or(0.5); + modified_args["speed"] = serde_json::json!(original_speed * speed_mult); + + if speed_mult < 1.0 { + tracing::info!( + "Safety: Reducing speed to {:.0}% due to obstacle proximity", + speed_mult * 100.0 + ); + } + + self.inner_drive.execute(modified_args).await + } + Err(reason) => Ok(ToolResult { + success: false, + output: String::new(), + error: Some(format!("Safety blocked movement: {}", reason)), + }), + } + } +} + +/// Pre-flight safety check before any operation +pub async fn preflight_check(config: &RobotConfig) -> Result> { + let mut warnings = Vec::new(); + + // Check safety config + if config.safety.min_obstacle_distance < 0.1 { + warnings.push("WARNING: min_obstacle_distance < 0.1m is dangerously low".to_string()); + } + + if config.safety.max_drive_duration > 60 { + warnings.push("WARNING: max_drive_duration > 60s may allow runaway".to_string()); + } + + if config.drive.max_speed > 1.0 { + warnings.push("WARNING: max_speed > 1.0 m/s is very fast for indoor use".to_string()); + } + + if config.safety.estop_pin.is_none() { + warnings.push( + "WARNING: No E-stop pin configured. Recommend wiring a hardware stop button." + .to_string(), + ); + } + + // Check for sensor availability + if config.sensors.lidar_type == "mock" { + warnings.push("NOTICE: LIDAR in mock mode - no real obstacle detection".to_string()); + } + + Ok(warnings) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn safety_state_defaults() { + let state = SafetyState::default(); + assert!(state.can_move.load(Ordering::SeqCst)); + assert!(!state.estop_active.load(Ordering::SeqCst)); + } + + #[tokio::test] + async fn safety_monitor_blocks_on_obstacle() { + let config = SafetyConfig::default(); + + let (monitor, _rx) = SafetyMonitor::new(config); + + // Initially can move + assert!(monitor.can_move().await); + + // Report close obstacle + monitor.update_obstacle_distance(0.2, 0).await; + + // Now blocked + assert!(!monitor.can_move().await); + } + + #[tokio::test] + async fn safety_monitor_estop() { + let config = SafetyConfig::default(); + let (monitor, mut rx) = SafetyMonitor::new(config); + + monitor.emergency_stop("test").await; + + assert!(!monitor.can_move().await); + assert!(monitor.state.estop_active.load(Ordering::SeqCst)); + + // Check event was sent + let event = rx.try_recv().unwrap(); + matches!(event, SafetyEvent::EmergencyStop { .. }); + } + + #[tokio::test] + async fn speed_limit_calculation() { + let config = SafetyConfig { + min_obstacle_distance: 0.3, + ..Default::default() + }; + let (monitor, _rx) = SafetyMonitor::new(config); + + // Far obstacle = full speed + let speed = monitor.calculate_speed_limit(2.0).await; + assert!((speed - 1.0).abs() < 0.01); + + // Close obstacle = reduced speed + let speed = monitor.calculate_speed_limit(0.5).await; + assert!(speed < 1.0); + assert!(speed > 0.0); + + // At minimum = stop + let speed = monitor.calculate_speed_limit(0.3).await; + assert!((speed - 0.0).abs() < 0.01); + } + + #[tokio::test] + async fn request_movement_blocked() { + let config = SafetyConfig { + min_obstacle_distance: 0.3, + ..Default::default() + }; + let (monitor, _rx) = SafetyMonitor::new(config); + + // Set obstacle too close + monitor.update_obstacle_distance(0.2, 0).await; + + // Movement should be denied + let result = monitor.request_movement("forward", 1.0).await; + assert!(result.is_err()); + } + + impl Default for SafetyConfig { + fn default() -> Self { + Self { + min_obstacle_distance: 0.3, + slow_zone_multiplier: 3.0, + approach_speed_limit: 0.3, + max_drive_duration: 30, + estop_pin: Some(4), + bump_sensor_pins: vec![5, 6], + bump_reverse_distance: 0.15, + confirm_movement: false, + predict_collisions: true, + sensor_timeout_secs: 5, + blind_mode_speed_limit: 0.2, + } + } + } +} diff --git a/third_party/zeroclaw/crates/robot-kit/src/sense.rs b/third_party/zeroclaw/crates/robot-kit/src/sense.rs new file mode 100644 index 0000000..9ed39c3 --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/src/sense.rs @@ -0,0 +1,457 @@ +//! Sense Tool - LIDAR, motion sensors, ultrasonic distance +//! +//! Provides environmental awareness through various sensors. +//! Supports multiple backends: direct GPIO, ROS2 topics, or mock. + +use crate::config::RobotConfig; +use crate::traits::{Tool, ToolResult}; +use anyhow::Result; +use async_trait::async_trait; +use serde_json::{json, Value}; +use std::sync::Arc; +use tokio::sync::Mutex; + +/// LIDAR scan result +#[derive(Debug, Clone)] +pub struct LidarScan { + /// Distances in meters, 360 values (1 per degree) + pub ranges: Vec, + /// Minimum distance and its angle + pub nearest: (f64, u16), + /// Is path clear in forward direction (±30°)? + pub forward_clear: bool, +} + +/// Motion detection result +#[derive(Debug, Clone)] +pub struct MotionResult { + pub detected: bool, + pub sensors_triggered: Vec, +} + +pub struct SenseTool { + config: RobotConfig, + last_scan: Arc>>, +} + +impl SenseTool { + pub fn new(config: RobotConfig) -> Self { + Self { + config, + last_scan: Arc::new(Mutex::new(None)), + } + } + + /// Read LIDAR scan + async fn scan_lidar(&self) -> Result { + match self.config.sensors.lidar_type.as_str() { + "rplidar" => self.scan_rplidar().await, + "ros2" => self.scan_ros2().await, + _ => self.scan_mock().await, + } + } + + /// Mock LIDAR for testing + async fn scan_mock(&self) -> Result { + // Simulate a room with walls + let mut ranges = vec![3.0; 360]; + + // Wall in front at 2m + for range in &mut ranges[350..360] { + *range = 2.0; + } + for range in &mut ranges[0..10] { + *range = 2.0; + } + + // Object on left at 1m + for range in &mut ranges[80..100] { + *range = 1.0; + } + + let nearest = ranges + .iter() + .enumerate() + .min_by(|a, b| a.1.partial_cmp(b.1).unwrap()) + .map(|(i, &d)| (d, i as u16)) + .unwrap_or((999.0, 0)); + + let forward_clear = ranges[0..30] + .iter() + .chain(ranges[330..360].iter()) + .all(|&d| d > self.config.safety.min_obstacle_distance); + + Ok(LidarScan { + ranges, + nearest, + forward_clear, + }) + } + + /// Read from RPLidar via serial + async fn scan_rplidar(&self) -> Result { + // In production, use rplidar_drv crate + // For now, shell out to rplidar_scan tool if available + let port = &self.config.sensors.lidar_port; + + let output = tokio::process::Command::new("rplidar_scan") + .args(["--port", port, "--single"]) + .output() + .await; + + match output { + Ok(out) if out.status.success() => { + // Parse output (format: angle,distance per line) + let mut ranges = vec![999.0; 360]; + for line in String::from_utf8_lossy(&out.stdout).lines() { + if let Some((angle, dist)) = line.split_once(',') { + if let (Ok(a), Ok(d)) = (angle.parse::(), dist.parse::()) { + if a < 360 { + ranges[a] = d; + } + } + } + } + + let nearest = ranges + .iter() + .enumerate() + .min_by(|a, b| a.1.partial_cmp(b.1).unwrap()) + .map(|(i, &d)| (d, i as u16)) + .unwrap_or((999.0, 0)); + + let forward_clear = ranges[0..30] + .iter() + .chain(ranges[330..360].iter()) + .all(|&d| d > self.config.safety.min_obstacle_distance); + + Ok(LidarScan { + ranges, + nearest, + forward_clear, + }) + } + _ => { + // Fallback to mock if hardware unavailable + tracing::warn!("RPLidar unavailable, using mock data"); + self.scan_mock().await + } + } + } + + /// Read from ROS2 /scan topic + async fn scan_ros2(&self) -> Result { + let output = tokio::process::Command::new("ros2") + .args(["topic", "echo", "--once", "/scan"]) + .output() + .await?; + + if !output.status.success() { + return self.scan_mock().await; + } + + // Parse ROS2 LaserScan message (simplified) + let stdout = String::from_utf8_lossy(&output.stdout); + let ranges = vec![999.0; 360]; + + // Very simplified parsing - in production use rclrs + if let Some(_ranges_line) = stdout.lines().find(|l| l.contains("ranges:")) { + // Extract array values + // Format: ranges: [1.0, 2.0, ...] + } + + let nearest = ranges + .iter() + .enumerate() + .min_by(|a, b| a.1.partial_cmp(b.1).unwrap()) + .map(|(i, &d)| (d, i as u16)) + .unwrap_or((999.0, 0)); + + let forward_clear = ranges[0..30] + .iter() + .chain(ranges[330..360].iter()) + .all(|&d| d > self.config.safety.min_obstacle_distance); + + Ok(LidarScan { + ranges, + nearest, + forward_clear, + }) + } + + /// Check PIR motion sensors + async fn check_motion(&self) -> Result { + let pins = &self.config.sensors.motion_pins; + + // In production, use rppal GPIO + // For now, mock or read from sysfs + let mut triggered = Vec::new(); + + for &pin in pins { + let gpio_path = format!("/sys/class/gpio/gpio{}/value", pin); + match tokio::fs::read_to_string(&gpio_path).await { + Ok(value) if value.trim() == "1" => { + triggered.push(pin); + } + _ => {} + } + } + + Ok(MotionResult { + detected: !triggered.is_empty(), + sensors_triggered: triggered, + }) + } + + /// Read ultrasonic distance sensor + async fn check_distance(&self) -> Result { + let Some((trigger, echo)) = self.config.sensors.ultrasonic_pins else { + return Ok(999.0); // No sensor configured + }; + + // In production, use rppal with precise timing + // Ultrasonic requires µs-level timing, so shell out to helper + let output = tokio::process::Command::new("hc-sr04") + .args([ + "--trigger", + &trigger.to_string(), + "--echo", + &echo.to_string(), + ]) + .output() + .await; + + match output { + Ok(out) if out.status.success() => { + let distance = String::from_utf8_lossy(&out.stdout) + .trim() + .parse::() + .unwrap_or(999.0); + Ok(distance) + } + _ => Ok(999.0), // Sensor unavailable + } + } +} + +#[async_trait] +impl Tool for SenseTool { + fn name(&self) -> &str { + "sense" + } + + fn description(&self) -> &str { + "Check robot sensors. Actions: 'scan' for LIDAR (360° obstacle map), \ + 'motion' for PIR motion detection, 'distance' for ultrasonic range, \ + 'all' for combined sensor report." + } + + fn parameters_schema(&self) -> Value { + json!({ + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": ["scan", "motion", "distance", "all", "clear_ahead"], + "description": "Which sensor(s) to read" + }, + "direction": { + "type": "string", + "enum": ["forward", "left", "right", "back", "all"], + "description": "For 'scan': which direction to report (default 'forward')" + } + }, + "required": ["action"] + }) + } + + async fn execute(&self, args: Value) -> Result { + let action = args["action"] + .as_str() + .ok_or_else(|| anyhow::anyhow!("Missing 'action' parameter"))?; + + match action { + "scan" => { + let scan = self.scan_lidar().await?; + let direction = args["direction"].as_str().unwrap_or("forward"); + + let report = match direction { + "forward" => { + let fwd_dist = scan.ranges[0]; + format!( + "Forward: {:.2}m {}. Nearest obstacle: {:.2}m at {}°", + fwd_dist, + if scan.forward_clear { + "(clear)" + } else { + "(BLOCKED)" + }, + scan.nearest.0, + scan.nearest.1 + ) + } + "left" => { + let left_dist = scan.ranges[90]; + format!("Left (90°): {:.2}m", left_dist) + } + "right" => { + let right_dist = scan.ranges[270]; + format!("Right (270°): {:.2}m", right_dist) + } + "back" => { + let back_dist = scan.ranges[180]; + format!("Back (180°): {:.2}m", back_dist) + } + "all" => { + format!( + "LIDAR 360° scan:\n\ + - Forward (0°): {:.2}m\n\ + - Left (90°): {:.2}m\n\ + - Back (180°): {:.2}m\n\ + - Right (270°): {:.2}m\n\ + - Nearest: {:.2}m at {}°\n\ + - Forward path: {}", + scan.ranges[0], + scan.ranges[90], + scan.ranges[180], + scan.ranges[270], + scan.nearest.0, + scan.nearest.1, + if scan.forward_clear { + "CLEAR" + } else { + "BLOCKED" + } + ) + } + _ => "Unknown direction".to_string(), + }; + + // Cache scan + *self.last_scan.lock().await = Some(scan); + + Ok(ToolResult { + success: true, + output: report, + error: None, + }) + } + + "motion" => { + let motion = self.check_motion().await?; + let output = if motion.detected { + format!("Motion DETECTED on sensors: {:?}", motion.sensors_triggered) + } else { + "No motion detected".to_string() + }; + + Ok(ToolResult { + success: true, + output, + error: None, + }) + } + + "distance" => { + let distance = self.check_distance().await?; + let output = if distance < 999.0 { + format!("Ultrasonic distance: {:.2}m", distance) + } else { + "Ultrasonic sensor not available or out of range".to_string() + }; + + Ok(ToolResult { + success: true, + output, + error: None, + }) + } + + "clear_ahead" => { + let scan = self.scan_lidar().await?; + Ok(ToolResult { + success: true, + output: if scan.forward_clear { + format!( + "Path ahead is CLEAR (nearest obstacle: {:.2}m)", + scan.nearest.0 + ) + } else { + format!("Path ahead is BLOCKED (obstacle at {:.2}m)", scan.ranges[0]) + }, + error: None, + }) + } + + "all" => { + let scan = self.scan_lidar().await?; + let motion = self.check_motion().await?; + let distance = self.check_distance().await?; + + let report = format!( + "=== SENSOR REPORT ===\n\ + LIDAR: nearest {:.2}m at {}°, forward {}\n\ + Motion: {}\n\ + Ultrasonic: {:.2}m", + scan.nearest.0, + scan.nearest.1, + if scan.forward_clear { + "CLEAR" + } else { + "BLOCKED" + }, + if motion.detected { + format!("DETECTED ({:?})", motion.sensors_triggered) + } else { + "none".to_string() + }, + distance + ); + + Ok(ToolResult { + success: true, + output: report, + error: None, + }) + } + + _ => Ok(ToolResult { + success: false, + output: String::new(), + error: Some(format!("Unknown action: {action}")), + }), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn sense_tool_name() { + let tool = SenseTool::new(RobotConfig::default()); + assert_eq!(tool.name(), "sense"); + } + + #[tokio::test] + async fn sense_scan_mock() { + let tool = SenseTool::new(RobotConfig::default()); + let result = tool + .execute(json!({"action": "scan", "direction": "all"})) + .await + .unwrap(); + assert!(result.success); + assert!(result.output.contains("Forward")); + } + + #[tokio::test] + async fn sense_clear_ahead() { + let tool = SenseTool::new(RobotConfig::default()); + let result = tool + .execute(json!({"action": "clear_ahead"})) + .await + .unwrap(); + assert!(result.success); + } +} diff --git a/third_party/zeroclaw/crates/robot-kit/src/speak.rs b/third_party/zeroclaw/crates/robot-kit/src/speak.rs new file mode 100644 index 0000000..6f793e7 --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/src/speak.rs @@ -0,0 +1,231 @@ +//! Speak Tool - Text-to-speech via Piper +//! +//! Converts text to speech using Piper TTS (fast, offline, runs on Pi). +//! Plays audio through the speaker. + +use crate::config::RobotConfig; +use crate::traits::{Tool, ToolResult}; +use anyhow::Result; +use async_trait::async_trait; +use serde_json::{json, Value}; +use std::path::PathBuf; + +pub struct SpeakTool { + config: RobotConfig, + audio_dir: PathBuf, +} + +impl SpeakTool { + pub fn new(config: RobotConfig) -> Self { + let audio_dir = directories::UserDirs::new() + .map(|d| d.home_dir().join(".zeroclaw/tts_cache")) + .unwrap_or_else(|| PathBuf::from("/tmp/zeroclaw_tts")); + + let _ = std::fs::create_dir_all(&audio_dir); + + Self { config, audio_dir } + } + + /// Generate speech using Piper and play it + async fn speak(&self, text: &str, emotion: &str) -> Result<()> { + let piper_path = &self.config.audio.piper_path; + let voice = &self.config.audio.piper_voice; + let speaker_device = &self.config.audio.speaker_device; + + // Model path + let model_path = directories::UserDirs::new() + .map(|d| { + d.home_dir() + .join(format!(".zeroclaw/models/piper/{}.onnx", voice)) + }) + .unwrap_or_else(|| PathBuf::from(format!("/usr/local/share/piper/{}.onnx", voice))); + + // Adjust text based on emotion (simple SSML-like modifications) + let processed_text = match emotion { + "excited" => format!("{}!", text.trim_end_matches('.')), + "sad" => text.to_string(), // Piper doesn't support prosody, but we keep the hook + "whisper" => text.to_string(), + _ => text.to_string(), + }; + + // Generate WAV file + let output_path = self.audio_dir.join("speech.wav"); + + // Pipe text to piper, output to WAV + let mut piper = tokio::process::Command::new(piper_path) + .args([ + "--model", + model_path.to_str().unwrap(), + "--output_file", + output_path.to_str().unwrap(), + ]) + .stdin(std::process::Stdio::piped()) + .spawn()?; + + // Write text to stdin + if let Some(mut stdin) = piper.stdin.take() { + use tokio::io::AsyncWriteExt; + stdin.write_all(processed_text.as_bytes()).await?; + } + + let status = piper.wait().await?; + if !status.success() { + anyhow::bail!("Piper TTS failed"); + } + + // Play audio using aplay + let play_result = tokio::process::Command::new("aplay") + .args(["-D", speaker_device, output_path.to_str().unwrap()]) + .output() + .await?; + + if !play_result.status.success() { + // Fallback: try paplay (PulseAudio) + let fallback = tokio::process::Command::new("paplay") + .arg(output_path.to_str().unwrap()) + .output() + .await?; + + if !fallback.status.success() { + anyhow::bail!( + "Audio playback failed. Tried aplay and paplay.\n{}", + String::from_utf8_lossy(&play_result.stderr) + ); + } + } + + Ok(()) + } + + /// Play a sound effect + async fn play_sound(&self, sound: &str) -> Result<()> { + let sounds_dir = directories::UserDirs::new() + .map(|d| d.home_dir().join(".zeroclaw/sounds")) + .unwrap_or_else(|| PathBuf::from("/usr/local/share/zeroclaw/sounds")); + + let sound_file = sounds_dir.join(format!("{}.wav", sound)); + + if !sound_file.exists() { + anyhow::bail!("Sound file not found: {}", sound_file.display()); + } + + let speaker_device = &self.config.audio.speaker_device; + let output = tokio::process::Command::new("aplay") + .args(["-D", speaker_device, sound_file.to_str().unwrap()]) + .output() + .await?; + + if !output.status.success() { + anyhow::bail!("Sound playback failed"); + } + + Ok(()) + } +} + +#[async_trait] +impl Tool for SpeakTool { + fn name(&self) -> &str { + "speak" + } + + fn description(&self) -> &str { + "Speak text out loud using text-to-speech. The robot will say the given text \ + through its speaker. Can also play sound effects like 'beep', 'chime', 'laugh'." + } + + fn parameters_schema(&self) -> Value { + json!({ + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The text to speak out loud" + }, + "emotion": { + "type": "string", + "enum": ["neutral", "excited", "sad", "whisper"], + "description": "Emotional tone. Default 'neutral'." + }, + "sound": { + "type": "string", + "description": "Play a sound effect instead of speaking (e.g., 'beep', 'chime', 'laugh', 'alert')" + } + } + }) + } + + async fn execute(&self, args: Value) -> Result { + // Check if playing a sound effect + if let Some(sound) = args["sound"].as_str() { + return match self.play_sound(sound).await { + Ok(()) => Ok(ToolResult { + success: true, + output: format!("Played sound: {}", sound), + error: None, + }), + Err(e) => Ok(ToolResult { + success: false, + output: String::new(), + error: Some(format!("Sound playback failed: {e}")), + }), + }; + } + + // Speak text + let text = args["text"].as_str().ok_or_else(|| { + anyhow::anyhow!("Missing 'text' parameter (or use 'sound' for effects)") + })?; + + if text.is_empty() { + return Ok(ToolResult { + success: false, + output: String::new(), + error: Some("Cannot speak empty text".to_string()), + }); + } + + // Limit text length for safety + if text.len() > 1000 { + return Ok(ToolResult { + success: false, + output: String::new(), + error: Some("Text too long (max 1000 characters)".to_string()), + }); + } + + let emotion = args["emotion"].as_str().unwrap_or("neutral"); + + match self.speak(text, emotion).await { + Ok(()) => Ok(ToolResult { + success: true, + output: format!("Said: \"{}\"", text), + error: None, + }), + Err(e) => Ok(ToolResult { + success: false, + output: String::new(), + error: Some(format!("Speech failed: {e}")), + }), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn speak_tool_name() { + let tool = SpeakTool::new(RobotConfig::default()); + assert_eq!(tool.name(), "speak"); + } + + #[test] + fn speak_tool_schema() { + let tool = SpeakTool::new(RobotConfig::default()); + let schema = tool.parameters_schema(); + assert!(schema["properties"]["text"].is_object()); + assert!(schema["properties"]["emotion"].is_object()); + } +} diff --git a/third_party/zeroclaw/crates/robot-kit/src/tests.rs b/third_party/zeroclaw/crates/robot-kit/src/tests.rs new file mode 100644 index 0000000..9c10565 --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/src/tests.rs @@ -0,0 +1,540 @@ +//! Integration tests for robot kit +//! +//! These tests verify the robot kit works correctly in various configurations: +//! - Mock mode (no hardware) - for CI/development +//! - Hardware simulation - for testing real scenarios +//! - Live hardware - for on-device validation + +#[cfg(test)] +mod unit_tests { + use crate::config::RobotConfig; + use crate::traits::Tool; + use crate::{DriveTool, EmoteTool, ListenTool, LookTool, SenseTool, SpeakTool}; + use serde_json::json; + + // ========================================================================= + // TOOL TRAIT COMPLIANCE + // ========================================================================= + + #[test] + fn all_tools_have_valid_names() { + let config = RobotConfig::default(); + let tools: Vec> = vec![ + Box::new(DriveTool::new(config.clone())), + Box::new(LookTool::new(config.clone())), + Box::new(ListenTool::new(config.clone())), + Box::new(SpeakTool::new(config.clone())), + Box::new(SenseTool::new(config.clone())), + Box::new(EmoteTool::new(config.clone())), + ]; + + for tool in &tools { + assert!(!tool.name().is_empty(), "Tool name should not be empty"); + assert!( + tool.name().chars().all(|c| c.is_alphanumeric() || c == '_'), + "Tool name '{}' should be alphanumeric", + tool.name() + ); + } + } + + #[test] + fn all_tools_have_descriptions() { + let config = RobotConfig::default(); + let tools: Vec> = vec![ + Box::new(DriveTool::new(config.clone())), + Box::new(LookTool::new(config.clone())), + Box::new(ListenTool::new(config.clone())), + Box::new(SpeakTool::new(config.clone())), + Box::new(SenseTool::new(config.clone())), + Box::new(EmoteTool::new(config.clone())), + ]; + + for tool in &tools { + assert!( + tool.description().len() > 10, + "Tool '{}' needs a meaningful description", + tool.name() + ); + } + } + + #[test] + fn all_tools_have_valid_schemas() { + let config = RobotConfig::default(); + let tools: Vec> = vec![ + Box::new(DriveTool::new(config.clone())), + Box::new(LookTool::new(config.clone())), + Box::new(ListenTool::new(config.clone())), + Box::new(SpeakTool::new(config.clone())), + Box::new(SenseTool::new(config.clone())), + Box::new(EmoteTool::new(config.clone())), + ]; + + for tool in &tools { + let schema = tool.parameters_schema(); + assert!( + schema.is_object(), + "Tool '{}' schema should be an object", + tool.name() + ); + assert!( + schema.get("type").is_some(), + "Tool '{}' schema should have 'type' field", + tool.name() + ); + } + } + + // ========================================================================= + // DRIVE TOOL TESTS + // ========================================================================= + + #[tokio::test] + async fn drive_forward_mock() { + let config = RobotConfig::default(); + let tool = DriveTool::new(config); + + let result = tool + .execute(json!({"action": "forward", "distance": 1.0})) + .await + .unwrap(); + + assert!(result.success); + assert!(result.output.contains("forward")); + } + + #[tokio::test] + async fn drive_stop_always_succeeds() { + let config = RobotConfig::default(); + let tool = DriveTool::new(config); + + let result = tool.execute(json!({"action": "stop"})).await.unwrap(); + + assert!(result.success); + assert!(result.output.to_lowercase().contains("stop")); + } + + #[tokio::test] + async fn drive_strafe_left() { + let config = RobotConfig::default(); + let tool = DriveTool::new(config); + + let result = tool + .execute(json!({"action": "left", "distance": 0.5})) + .await + .unwrap(); + + assert!(result.success); + } + + #[tokio::test] + async fn drive_rotate() { + let config = RobotConfig::default(); + let tool = DriveTool::new(config); + + let result = tool + .execute(json!({"action": "rotate_left", "distance": 90.0})) + .await + .unwrap(); + + assert!(result.success); + } + + #[tokio::test] + async fn drive_invalid_action_fails() { + let config = RobotConfig::default(); + let tool = DriveTool::new(config); + + let result = tool.execute(json!({"action": "fly"})).await.unwrap(); + + assert!(!result.success); + assert!(result.error.is_some()); + } + + #[tokio::test] + async fn drive_missing_action_fails() { + let config = RobotConfig::default(); + let tool = DriveTool::new(config); + + let result = tool.execute(json!({})).await; + + assert!(result.is_err()); + } + + #[tokio::test] + async fn drive_speed_clamped() { + let config = RobotConfig::default(); + let tool = DriveTool::new(config); + + // Speed > 1.0 should be clamped + let result = tool + .execute(json!({"action": "forward", "speed": 5.0})) + .await + .unwrap(); + + assert!(result.success); + } + + // ========================================================================= + // SENSE TOOL TESTS + // ========================================================================= + + #[tokio::test] + async fn sense_scan_returns_distances() { + let config = RobotConfig::default(); + let tool = SenseTool::new(config); + + let result = tool + .execute(json!({"action": "scan", "direction": "all"})) + .await + .unwrap(); + + assert!(result.success); + assert!(result.output.contains("Forward")); + assert!(result.output.contains("Left")); + assert!(result.output.contains("Right")); + } + + #[tokio::test] + async fn sense_clear_ahead_check() { + let config = RobotConfig::default(); + let tool = SenseTool::new(config); + + let result = tool + .execute(json!({"action": "clear_ahead"})) + .await + .unwrap(); + + assert!(result.success); + // Mock should report clear or blocked + assert!(result.output.contains("CLEAR") || result.output.contains("BLOCKED")); + } + + #[tokio::test] + async fn sense_motion_detection() { + let config = RobotConfig::default(); + let tool = SenseTool::new(config); + + let result = tool.execute(json!({"action": "motion"})).await.unwrap(); + + assert!(result.success); + } + + // ========================================================================= + // EMOTE TOOL TESTS + // ========================================================================= + + #[tokio::test] + async fn emote_happy() { + let config = RobotConfig::default(); + let tool = EmoteTool::new(config); + + let result = tool + .execute(json!({"expression": "happy", "duration": 0})) + .await + .unwrap(); + + assert!(result.success); + } + + #[tokio::test] + async fn emote_all_expressions_valid() { + let config = RobotConfig::default(); + let tool = EmoteTool::new(config); + + let expressions = [ + "happy", + "sad", + "surprised", + "thinking", + "sleepy", + "excited", + "love", + "angry", + "confused", + "wink", + ]; + + for expr in expressions { + let result = tool + .execute(json!({"expression": expr, "duration": 0})) + .await + .unwrap(); + + assert!(result.success, "Expression '{}' should succeed", expr); + } + } + + #[tokio::test] + async fn emote_invalid_expression_fails() { + let config = RobotConfig::default(); + let tool = EmoteTool::new(config); + + let result = tool.execute(json!({"expression": "nonexistent"})).await; + + assert!(result.is_err()); + } + + // ========================================================================= + // CONFIG TESTS + // ========================================================================= + + #[test] + fn config_default_is_safe() { + let config = RobotConfig::default(); + + // Safety defaults should be conservative + assert!(config.safety.min_obstacle_distance >= 0.2); + assert!(config.safety.max_drive_duration <= 60); + assert!(config.drive.max_speed <= 1.0); + assert!(config.safety.blind_mode_speed_limit <= 0.3); + } + + #[test] + fn config_serializes_to_toml() { + let config = RobotConfig::default(); + let toml = toml::to_string(&config); + + assert!(toml.is_ok()); + } + + #[test] + fn config_roundtrips() { + let config = RobotConfig::default(); + let toml = toml::to_string(&config).unwrap(); + let parsed: RobotConfig = toml::from_str(&toml).unwrap(); + + assert_eq!(config.drive.max_speed, parsed.drive.max_speed); + assert_eq!( + config.safety.min_obstacle_distance, + parsed.safety.min_obstacle_distance + ); + } +} + +#[cfg(test)] +#[cfg(feature = "safety")] +mod safety_tests { + use crate::config::SafetyConfig; + use crate::safety::{SafetyEvent, SafetyMonitor}; + use std::sync::atomic::Ordering; + + fn test_safety_config() -> SafetyConfig { + SafetyConfig { + min_obstacle_distance: 0.3, + slow_zone_multiplier: 3.0, + approach_speed_limit: 0.3, + max_drive_duration: 30, + estop_pin: None, + bump_sensor_pins: vec![], + bump_reverse_distance: 0.15, + confirm_movement: false, + predict_collisions: true, + sensor_timeout_secs: 5, + blind_mode_speed_limit: 0.2, + } + } + + #[tokio::test] + async fn safety_initially_allows_movement() { + let config = test_safety_config(); + let (monitor, _rx) = SafetyMonitor::new(config); + + assert!(monitor.can_move().await); + } + + #[tokio::test] + async fn safety_blocks_on_close_obstacle() { + let config = test_safety_config(); + let (monitor, _rx) = SafetyMonitor::new(config); + + // Report obstacle at 0.2m (below 0.3m threshold) + monitor.update_obstacle_distance(0.2, 0).await; + + assert!(!monitor.can_move().await); + } + + #[tokio::test] + async fn safety_allows_after_obstacle_clears() { + let config = test_safety_config(); + let (monitor, _rx) = SafetyMonitor::new(config); + + // Block + monitor.update_obstacle_distance(0.2, 0).await; + assert!(!monitor.can_move().await); + + // Clear + monitor.update_obstacle_distance(1.0, 0).await; + assert!(monitor.can_move().await); + } + + #[tokio::test] + async fn safety_estop_blocks_everything() { + let config = test_safety_config(); + let (monitor, mut rx) = SafetyMonitor::new(config); + + monitor.emergency_stop("test").await; + + assert!(!monitor.can_move().await); + assert!(monitor.state().estop_active.load(Ordering::SeqCst)); + + // Check event was broadcast + let event = rx.try_recv().unwrap(); + assert!(matches!(event, SafetyEvent::EmergencyStop { .. })); + } + + #[tokio::test] + async fn safety_estop_reset() { + let config = test_safety_config(); + let (monitor, _rx) = SafetyMonitor::new(config); + + monitor.emergency_stop("test").await; + assert!(!monitor.can_move().await); + + monitor.reset_estop().await; + assert!(monitor.can_move().await); + } + + #[tokio::test] + async fn safety_speed_limit_far() { + let config = test_safety_config(); + let (monitor, _rx) = SafetyMonitor::new(config); + + // Far obstacle = full speed + monitor.update_obstacle_distance(2.0, 0).await; + let limit = monitor.speed_limit().await; + + assert!((limit - 1.0).abs() < 0.01); + } + + #[tokio::test] + async fn safety_speed_limit_approaching() { + let config = test_safety_config(); + let (monitor, _rx) = SafetyMonitor::new(config); + + // In slow zone (0.3 * 3.0 = 0.9m) + monitor.update_obstacle_distance(0.5, 0).await; + let limit = monitor.speed_limit().await; + + assert!(limit < 1.0); + assert!(limit > 0.0); + } + + #[tokio::test] + async fn safety_movement_request_approved() { + let config = test_safety_config(); + let (monitor, _rx) = SafetyMonitor::new(config); + + // Far obstacle + monitor.update_obstacle_distance(2.0, 0).await; + + let result = monitor.request_movement("forward", 1.0).await; + assert!(result.is_ok()); + } + + #[tokio::test] + async fn safety_movement_request_denied_close() { + let config = test_safety_config(); + let (monitor, _rx) = SafetyMonitor::new(config); + + // Close obstacle + monitor.update_obstacle_distance(0.2, 0).await; + + let result = monitor.request_movement("forward", 1.0).await; + assert!(result.is_err()); + } + + #[tokio::test] + async fn safety_bump_triggers_stop() { + let config = test_safety_config(); + let (monitor, mut rx) = SafetyMonitor::new(config); + + monitor.bump_detected("front_left").await; + + assert!(!monitor.can_move().await); + + let event = rx.try_recv().unwrap(); + assert!(matches!(event, SafetyEvent::BumpDetected { .. })); + } +} + +#[cfg(test)] +mod integration_tests { + use crate::config::RobotConfig; + use crate::traits::Tool; + use crate::{create_tools, DriveTool, SenseTool}; + use serde_json::json; + + #[tokio::test] + async fn drive_then_sense_workflow() { + let config = RobotConfig::default(); + let drive = DriveTool::new(config.clone()); + let sense = SenseTool::new(config); + + // Check ahead + let scan = sense + .execute(json!({"action": "clear_ahead"})) + .await + .unwrap(); + assert!(scan.success); + + // Move if clear + if scan.output.contains("CLEAR") { + let drive_result = drive + .execute(json!({"action": "forward", "distance": 0.5})) + .await + .unwrap(); + assert!(drive_result.success); + + // Wait for rate limiter (drive tool has 1 second cooldown) + tokio::time::sleep(std::time::Duration::from_millis(1100)).await; + } + + // Stop + let stop = drive.execute(json!({"action": "stop"})).await.unwrap(); + assert!(stop.success); + } + + #[tokio::test] + async fn create_tools_returns_all_tools() { + let config = RobotConfig::default(); + let tools = create_tools(&config); + + assert_eq!(tools.len(), 6); + + let names: Vec<&str> = tools.iter().map(|t| t.name()).collect(); + assert!(names.contains(&"drive")); + assert!(names.contains(&"look")); + assert!(names.contains(&"listen")); + assert!(names.contains(&"speak")); + assert!(names.contains(&"sense")); + assert!(names.contains(&"emote")); + } + + #[cfg(feature = "safety")] + #[tokio::test] + async fn safe_drive_blocks_on_obstacle() { + use crate::safety::SafetyMonitor; + use crate::SafeDrive; + use std::sync::Arc; + + let config = RobotConfig::default(); + let (safety_monitor, _rx) = SafetyMonitor::new(config.safety.clone()); + let safety = Arc::new(safety_monitor); + + // Report close obstacle + safety.update_obstacle_distance(0.2, 0).await; + + let drive = Arc::new(DriveTool::new(config)); + let safe_drive = SafeDrive::new(drive, safety); + + let result = safe_drive + .execute(json!({"action": "forward", "distance": 1.0})) + .await + .unwrap(); + + assert!(!result.success); + assert!(result.error.unwrap().contains("Safety")); + } +} diff --git a/third_party/zeroclaw/crates/robot-kit/src/traits.rs b/third_party/zeroclaw/crates/robot-kit/src/traits.rs new file mode 100644 index 0000000..9ff56df --- /dev/null +++ b/third_party/zeroclaw/crates/robot-kit/src/traits.rs @@ -0,0 +1,123 @@ +//! Tool trait definition +//! +//! This defines the interface that all robot tools implement. +//! It is compatible with ZeroClaw's Tool trait but standalone. + +use async_trait::async_trait; +use serde::{Deserialize, Serialize}; +use serde_json::Value; + +/// Result of a tool execution +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ToolResult { + /// Whether the tool executed successfully + pub success: bool, + /// Output from the tool (human-readable) + pub output: String, + /// Error message if failed + pub error: Option, +} + +impl ToolResult { + /// Create a successful result + pub fn success(output: impl Into) -> Self { + Self { + success: true, + output: output.into(), + error: None, + } + } + + /// Create a failed result + pub fn error(error: impl Into) -> Self { + Self { + success: false, + output: String::new(), + error: Some(error.into()), + } + } + + /// Create a failed result with partial output + pub fn partial(output: impl Into, error: impl Into) -> Self { + Self { + success: false, + output: output.into(), + error: Some(error.into()), + } + } +} + +/// Description of a tool for LLM function calling +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ToolSpec { + /// Tool name (used in function calls) + pub name: String, + /// Human-readable description + pub description: String, + /// JSON Schema for parameters + pub parameters: Value, +} + +/// Core tool trait +/// +/// Implement this trait to create a new tool that can be used +/// by an AI agent to interact with the robot hardware. +/// +/// # Example +/// +/// ```rust,ignore +/// use zeroclaw_robot_kit::{Tool, ToolResult}; +/// use async_trait::async_trait; +/// use serde_json::{json, Value}; +/// +/// pub struct BeepTool; +/// +/// #[async_trait] +/// impl Tool for BeepTool { +/// fn name(&self) -> &str { "beep" } +/// +/// fn description(&self) -> &str { "Make a beep sound" } +/// +/// fn parameters_schema(&self) -> Value { +/// json!({ +/// "type": "object", +/// "properties": { +/// "frequency": { "type": "number", "description": "Hz" } +/// } +/// }) +/// } +/// +/// async fn execute(&self, args: Value) -> anyhow::Result { +/// let freq = args["frequency"].as_f64().unwrap_or(440.0); +/// // Play beep... +/// Ok(ToolResult::success(format!("Beeped at {}Hz", freq))) +/// } +/// } +/// ``` +#[async_trait] +pub trait Tool: Send + Sync { + /// Tool name (used in LLM function calling) + fn name(&self) -> &str; + + /// Human-readable description of what this tool does + fn description(&self) -> &str; + + /// JSON Schema describing the tool's parameters + /// + /// This is used by the LLM to understand how to call the tool. + fn parameters_schema(&self) -> Value; + + /// Execute the tool with the given arguments + /// + /// Arguments are passed as JSON matching the parameters_schema. + async fn execute(&self, args: Value) -> anyhow::Result; + + /// Get the full specification for LLM registration + fn spec(&self) -> ToolSpec { + ToolSpec { + name: self.name().to_string(), + description: self.description().to_string(), + parameters: self.parameters_schema(), + } + } +} diff --git a/third_party/zeroclaw/deny.toml b/third_party/zeroclaw/deny.toml new file mode 100644 index 0000000..3c7f6ab --- /dev/null +++ b/third_party/zeroclaw/deny.toml @@ -0,0 +1,53 @@ +# cargo-deny configuration — v2 schema +# https://embarkstudios.github.io/cargo-deny/ + +[advisories] +# In v2, vulnerability advisories always emit errors (not configurable). +# unmaintained: scope of unmaintained-crate checks (all | workspace | transitive | none) +unmaintained = "all" +# yanked: deny | warn | allow +yanked = "deny" +# Ignore known unmaintained transitive deps we cannot easily replace +ignore = [ + # bincode v2.0.1 via probe-rs — project ceased but 1.3.3 considered complete + "RUSTSEC-2025-0141", + { id = "RUSTSEC-2024-0384", reason = "Reported to `rust-nostr/nostr` and it's WIP" }, + { id = "RUSTSEC-2024-0388", reason = "derivative via extism → wasmtime transitive dep" }, + { id = "RUSTSEC-2025-0057", reason = "fxhash via extism → wasmtime transitive dep" }, + { id = "RUSTSEC-2025-0119", reason = "number_prefix via indicatif — cosmetic dep" }, + # wasmtime vulns via extism 1.13.0 — no upstream fix yet; plugins feature-gated + { id = "RUSTSEC-2026-0006", reason = "wasmtime segfault via extism; awaiting extism upgrade" }, + { id = "RUSTSEC-2026-0020", reason = "WASI resource exhaustion via extism; awaiting extism upgrade" }, + { id = "RUSTSEC-2026-0021", reason = "WASI http fields panic via extism; awaiting extism upgrade" }, +] + +[licenses] +# All licenses are denied unless explicitly allowed +allow = [ + "MIT", + "Apache-2.0", + "Apache-2.0 WITH LLVM-exception", + "BSD-2-Clause", + "BSD-3-Clause", + "ISC", + "Unicode-3.0", + "Unicode-DFS-2016", + "OpenSSL", + "Zlib", + "MPL-2.0", + "CDLA-Permissive-2.0", + "0BSD", + "BSL-1.0", + "CC0-1.0", +] +unused-allowed-license = "allow" + +[bans] +multiple-versions = "warn" +wildcards = "allow" + +[sources] +unknown-registry = "deny" +unknown-git = "deny" +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +allow-git = [] diff --git a/third_party/zeroclaw/dev/README.md b/third_party/zeroclaw/dev/README.md new file mode 100644 index 0000000..427b566 --- /dev/null +++ b/third_party/zeroclaw/dev/README.md @@ -0,0 +1,169 @@ +# ZeroClaw Development Environment + +A fully containerized development sandbox for ZeroClaw agents. This environment allows you to develop, test, and debug the agent in isolation without modifying your host system. + +## Directory Structure + +- **`agent/`**: (Merged into root Dockerfile) + - The development image is built from the root `Dockerfile` using the `dev` stage (`target: dev`). + - Based on `debian:bookworm-slim` (unlike production `distroless`). + - Includes `bash`, `curl`, and debug tools. +- **`sandbox/`**: Dockerfile for the simulated user environment. + - Based on `ubuntu:22.04`. + - Pre-loaded with `git`, `python3`, `nodejs`, `npm`, `gcc`, `make`. + - Simulates a real developer machine. +- **`docker-compose.yml`**: Defines the services and `dev-net` network. +- **`cli.sh`**: Helper script to manage the lifecycle. + +## Usage + +Run all commands from the repository root using the helper script: + +### 1. Start Environment + +```bash +./dev/cli.sh up +``` + +Builds the agent from source and starts both containers. + +### 2. Enter Agent Container (`zeroclaw-dev`) + +```bash +./dev/cli.sh agent +``` + +Use this to run `zeroclaw` CLI commands manually, debug the binary, or check logs internally. + +- **Path**: `/zeroclaw-data` +- **User**: `nobody` (65534) + +### 3. Enter Sandbox (`sandbox`) + +```bash +./dev/cli.sh shell +``` + +Use this to act as the "user" or "environment" the agent interacts with. + +- **Path**: `/home/developer/workspace` +- **User**: `developer` (sudo-enabled) + +### 4. Development Cycle + +1. Make changes to Rust code in `src/`. +2. Rebuild the agent: + ```bash + ./dev/cli.sh build + ``` +3. Test changes inside the container: + ```bash + ./dev/cli.sh agent + # inside container: + zeroclaw --version + ``` + +### 5. Persistence & Shared Workspace + +The local `playground/` directory (in repo root) is mounted as the shared workspace: + +- **Agent**: `/zeroclaw-data/workspace` +- **Sandbox**: `/home/developer/workspace` + +Files created by the agent are visible to the sandbox user, and vice versa. + +The agent configuration lives in `target/.zeroclaw` (mounted to `/zeroclaw-data/.zeroclaw`), so settings persist across container rebuilds. + +### 6. Cleanup + +Stop containers and remove volumes and generated config: + +```bash +./dev/cli.sh clean +``` + +**Note:** This removes `target/.zeroclaw` (config/DB) but leaves the `playground/` directory intact. To fully wipe everything, manually delete `playground/`. + +## Local CI/CD (Docker-Only) + +Use this when you want CI-style validation without relying on GitHub Actions and without running Rust toolchain commands on your host. + +### 1. Build the local CI image + +```bash +./dev/ci.sh build-image +``` + +### 2. Run full local CI pipeline + +```bash +./dev/ci.sh all +``` + +This runs inside a container: + +- `./scripts/ci/rust_quality_gate.sh` +- `cargo test --locked --verbose` +- `cargo build --release --locked --verbose` +- `cargo deny check licenses sources` +- `cargo audit` +- Docker smoke build (`docker build --target dev ...` + `--version` check) + +To run an opt-in strict lint audit locally: + +```bash +./dev/ci.sh lint-strict +``` + +To run the incremental strict gate (changed Rust lines only): + +```bash +./dev/ci.sh lint-delta +``` + +### 3. Run targeted stages + +```bash +./dev/ci.sh lint +./dev/ci.sh lint-delta +./dev/ci.sh test +./dev/ci.sh build +./dev/ci.sh deny +./dev/ci.sh audit +./dev/ci.sh security +./dev/ci.sh docker-smoke +# Optional host-side docs gate (changed-line markdown lint) +./scripts/ci/docs_quality_gate.sh +# Optional host-side docs links gate (changed-line added links) +./scripts/ci/docs_links_gate.sh +``` + +Note: local `deny` focuses on license/source policy; advisory scanning is handled by `audit`. + +### 4. Enter CI container shell + +```bash +./dev/ci.sh shell +``` + +### 5. Optional shortcut via existing dev CLI + +```bash +./dev/cli.sh ci +./dev/cli.sh ci lint +``` + +### Isolation model + +- Rust compilation, tests, and audit/deny tools run in `zeroclaw-local-ci` container. +- Your host filesystem is mounted at `/workspace`; no host Rust toolchain is required. +- Cargo build artifacts are written to container volume `/ci-target` (not your host `target/`). +- Docker smoke stage uses your Docker daemon to build image layers, but build steps execute in containers. + +### Build cache notes + +- Both `Dockerfile` and `dev/ci/Dockerfile` use BuildKit cache mounts for Cargo registry/git data. +- The root `Dockerfile` also caches Rust `target/` (`id=zeroclaw-target`) to speed repeat local image builds. +- Local CI reuses named Docker volumes for Cargo registry/git and target outputs. +- `./dev/ci.sh docker-smoke` and `./dev/ci.sh all` now use `docker buildx` local cache at `.cache/buildx-smoke` when available. +- The CI image keeps Rust toolchain defaults from `rust:1.92-slim` and installs pinned toolchain `1.92.0` (no custom `CARGO_HOME`/`RUSTUP_HOME` overrides), preventing repeated toolchain bootstrapping on each run. diff --git a/third_party/zeroclaw/dev/ci.sh b/third_party/zeroclaw/dev/ci.sh new file mode 100755 index 0000000..4df6c95 --- /dev/null +++ b/third_party/zeroclaw/dev/ci.sh @@ -0,0 +1,159 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [ -f "dev/docker-compose.ci.yml" ]; then + COMPOSE_FILE="dev/docker-compose.ci.yml" +elif [ -f "docker-compose.ci.yml" ] && [ "$(basename "$(pwd)")" = "dev" ]; then + COMPOSE_FILE="docker-compose.ci.yml" +else + echo "❌ Run this script from repo root or dev/ directory." + exit 1 +fi + +compose_cmd=(docker compose -f "$COMPOSE_FILE") +SMOKE_CACHE_DIR="${SMOKE_CACHE_DIR:-.cache/buildx-smoke}" + +run_in_ci() { + local cmd="$1" + "${compose_cmd[@]}" run --rm local-ci bash -c "$cmd" +} + +build_smoke_image() { + if docker buildx version >/dev/null 2>&1; then + mkdir -p "$SMOKE_CACHE_DIR" + local build_args=( + --load + --target dev + --cache-to "type=local,dest=$SMOKE_CACHE_DIR,mode=max" + -t zeroclaw-local-smoke:latest + . + ) + if [ -f "$SMOKE_CACHE_DIR/index.json" ]; then + build_args=(--cache-from "type=local,src=$SMOKE_CACHE_DIR" "${build_args[@]}") + fi + docker buildx build "${build_args[@]}" + else + DOCKER_BUILDKIT=1 docker build --target dev -t zeroclaw-local-smoke:latest . + fi +} + +print_help() { + cat <<'EOF' +ZeroClaw Local CI in Docker + +Usage: ./dev/ci.sh + +Commands: + build-image Build/update the local CI image + shell Open an interactive shell inside the CI container + lint Run rustfmt + clippy correctness gate (container only) + lint-strict Run rustfmt + full clippy warnings gate (container only) + lint-delta Run strict lint delta gate on changed Rust lines (container only) + test Run cargo test (container only) + test-component Run component tests only + test-integration Run integration tests only + test-system Run system tests only + test-live Run live tests (requires credentials) + test-manual Run manual test scripts (dockerignore, etc.) + build Run release build smoke check (container only) + audit Run cargo audit (container only) + deny Run cargo deny check (container only) + security Run cargo audit + cargo deny (container only) + docker-smoke Build and verify runtime image (host docker daemon) + all Run lint, test, build, security, docker-smoke + clean Remove local CI containers and volumes +EOF +} + +if [ $# -lt 1 ]; then + print_help + exit 1 +fi + +case "$1" in + build-image) + "${compose_cmd[@]}" build local-ci + ;; + + shell) + "${compose_cmd[@]}" run --rm local-ci bash + ;; + + lint) + run_in_ci "./scripts/ci/rust_quality_gate.sh" + ;; + + lint-strict) + run_in_ci "./scripts/ci/rust_quality_gate.sh --strict" + ;; + + lint-delta) + run_in_ci "./scripts/ci/rust_strict_delta_gate.sh" + ;; + + test) + run_in_ci "cargo test --locked --verbose" + ;; + + test-component) + run_in_ci "cargo test --test component --locked --verbose" + ;; + + test-integration) + run_in_ci "cargo test --test integration --locked --verbose" + ;; + + test-system) + run_in_ci "cargo test --test system --locked --verbose" + ;; + + test-live) + run_in_ci "cargo test --test live -- --ignored --verbose" + ;; + + test-manual) + run_in_ci "bash tests/manual/test_dockerignore.sh" + ;; + + build) + run_in_ci "cargo build --release --locked --verbose" + ;; + + audit) + run_in_ci "cargo audit" + ;; + + deny) + run_in_ci "cargo deny check licenses sources" + ;; + + security) + run_in_ci "cargo deny check licenses sources" + run_in_ci "cargo audit" + ;; + + docker-smoke) + build_smoke_image + docker run --rm zeroclaw-local-smoke:latest --version + ;; + + all) + run_in_ci "./scripts/ci/rust_quality_gate.sh" + run_in_ci "cargo test --locked --verbose" + run_in_ci "bash tests/manual/test_dockerignore.sh" + run_in_ci "cargo build --release --locked --verbose" + run_in_ci "cargo deny check licenses sources" + run_in_ci "cargo audit" + build_smoke_image + docker run --rm zeroclaw-local-smoke:latest --version + ;; + + clean) + "${compose_cmd[@]}" down -v --remove-orphans + ;; + + *) + print_help + exit 1 + ;; +esac diff --git a/third_party/zeroclaw/dev/ci/Dockerfile b/third_party/zeroclaw/dev/ci/Dockerfile new file mode 100644 index 0000000..6220fe9 --- /dev/null +++ b/third_party/zeroclaw/dev/ci/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1.7 + +FROM rust:1.92-slim@sha256:bf3368a992915f128293ac76917ab6e561e4dda883273c8f5c9f6f8ea37a378e + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + git \ + pkg-config \ + libssl-dev \ + curl \ + && rm -rf /var/lib/apt/lists/* + +RUN rustup toolchain install 1.92.0 --profile minimal --component rustfmt --component clippy + +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/usr/local/cargo/git \ + cargo install --locked cargo-audit --version 0.22.1 && \ + cargo install --locked cargo-deny --version 0.18.5 + +WORKDIR /workspace + +CMD ["bash"] diff --git a/third_party/zeroclaw/dev/cli.sh b/third_party/zeroclaw/dev/cli.sh new file mode 100755 index 0000000..cbd8202 --- /dev/null +++ b/third_party/zeroclaw/dev/cli.sh @@ -0,0 +1,140 @@ +#!/bin/bash +set -e + +# Detect execution context (root or dev/) +if [ -f "dev/docker-compose.yml" ]; then + BASE_DIR="dev" + HOST_TARGET_DIR="target" +elif [ -f "docker-compose.yml" ] && [ "$(basename "$(pwd)")" == "dev" ]; then + BASE_DIR="." + HOST_TARGET_DIR="../target" +else + echo "❌ Error: Run this script from the project root or dev/ directory." + exit 1 +fi + +COMPOSE_FILE="$BASE_DIR/docker-compose.yml" +if [ "$BASE_DIR" = "dev" ]; then + ENV_FILE=".env" +else + ENV_FILE="../.env" +fi + +# Colors +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +function load_env { + if [ -f "$ENV_FILE" ]; then + # Auto-export variables from .env for docker compose passthrough. + set -a + source "$ENV_FILE" + set +a + fi +} + +function ensure_config { + CONFIG_DIR="$HOST_TARGET_DIR/.zeroclaw" + CONFIG_FILE="$CONFIG_DIR/config.toml" + WORKSPACE_DIR="$CONFIG_DIR/workspace" + + if [ ! -f "$CONFIG_FILE" ]; then + echo -e "${YELLOW}⚙️ Config file missing in target/.zeroclaw. Creating default dev config from template...${NC}" + mkdir -p "$WORKSPACE_DIR" + + # Copy template + cat "$BASE_DIR/config.template.toml" > "$CONFIG_FILE" + fi +} + +function print_help { + echo -e "${YELLOW}ZeroClaw Development Environment Manager${NC}" + echo "Usage: ./dev/cli.sh [command]" + echo "" + echo "Commands:" + echo -e " ${GREEN}up${NC} Start dev environment (Agent + Sandbox)" + echo -e " ${GREEN}down${NC} Stop containers" + echo -e " ${GREEN}shell${NC} Enter Sandbox (Ubuntu)" + echo -e " ${GREEN}agent${NC} Enter Agent (ZeroClaw CLI)" + echo -e " ${GREEN}logs${NC} View logs" + echo -e " ${GREEN}build${NC} Rebuild images" + echo -e " ${GREEN}ci${NC} Run local CI checks in Docker (see ./dev/ci.sh)" + echo -e " ${GREEN}clean${NC} Stop and wipe workspace data" +} + +if [ -z "$1" ]; then + print_help + exit 1 +fi + +load_env + +case "$1" in + up) + ensure_config + echo -e "${GREEN}🚀 Starting Dev Environment...${NC}" + # Build context MUST be set correctly for docker compose + docker compose -f "$COMPOSE_FILE" up -d + echo -e "${GREEN}✅ Environment is running!${NC}" + echo -e " - Agent: http://127.0.0.1:42617" + echo -e " - Sandbox: running (background)" + echo -e " - Config: target/.zeroclaw/config.toml (Edit locally to apply changes)" + ;; + + down) + echo -e "${YELLOW}🛑 Stopping services...${NC}" + docker compose -f "$COMPOSE_FILE" down + echo -e "${GREEN}✅ Stopped.${NC}" + ;; + + shell) + echo -e "${GREEN}💻 Entering Sandbox (Ubuntu)... (Type 'exit' to leave)${NC}" + docker exec -it zeroclaw-sandbox /bin/bash + ;; + + agent) + echo -e "${GREEN}🤖 Entering Agent Container (ZeroClaw)... (Type 'exit' to leave)${NC}" + docker exec -it zeroclaw-dev /bin/bash + ;; + + logs) + docker compose -f "$COMPOSE_FILE" logs -f + ;; + + build) + echo -e "${YELLOW}🔨 Rebuilding images...${NC}" + docker compose -f "$COMPOSE_FILE" build + ensure_config + docker compose -f "$COMPOSE_FILE" up -d + echo -e "${GREEN}✅ Rebuild complete.${NC}" + ;; + + ci) + shift + if [ "$BASE_DIR" = "." ]; then + ./ci.sh "${@:-all}" + else + ./dev/ci.sh "${@:-all}" + fi + ;; + + clean) + echo -e "${RED}⚠️ WARNING: This will delete 'target/.zeroclaw' data and Docker volumes.${NC}" + read -p "Are you sure? (y/N) " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + docker compose -f "$COMPOSE_FILE" down -v + rm -rf "$HOST_TARGET_DIR/.zeroclaw" + echo -e "${GREEN}🧹 Cleaned up (playground/ remains intact).${NC}" + else + echo "Cancelled." + fi + ;; + + *) + print_help + exit 1 + ;; +esac diff --git a/third_party/zeroclaw/dev/config.template.toml b/third_party/zeroclaw/dev/config.template.toml new file mode 100644 index 0000000..cc87b83 --- /dev/null +++ b/third_party/zeroclaw/dev/config.template.toml @@ -0,0 +1,32 @@ +workspace_dir = "/zeroclaw-data/workspace" +config_path = "/zeroclaw-data/.zeroclaw/config.toml" +# This is the Ollama Base URL, not a secret key +api_key = "http://host.docker.internal:11434" +default_provider = "ollama" +default_model = "llama3.2" +default_temperature = 0.7 + +[gateway] +port = 42617 +host = "[::]" +allow_public_bind = true +require_pairing = false + +# Cost tracking and budget enforcement configuration +# Enable to track API usage costs and enforce spending limits +[cost] +enabled = false +daily_limit_usd = 10.0 +monthly_limit_usd = 100.0 +warn_at_percent = 80 +allow_override = false + +# Per-model pricing (USD per 1M tokens) +# Uncomment and customize to override default pricing +# [cost.prices."anthropic/claude-sonnet-4-20250514"] +# input = 3.0 +# output = 15.0 +# +# [cost.prices."openai/gpt-4o"] +# input = 5.0 +# output = 15.0 diff --git a/third_party/zeroclaw/dev/docker-compose.ci.yml b/third_party/zeroclaw/dev/docker-compose.ci.yml new file mode 100644 index 0000000..2078726 --- /dev/null +++ b/third_party/zeroclaw/dev/docker-compose.ci.yml @@ -0,0 +1,23 @@ +name: zeroclaw-local-ci + +services: + local-ci: + build: + context: .. + dockerfile: dev/ci/Dockerfile + container_name: zeroclaw-local-ci + working_dir: /workspace + environment: + - CARGO_TERM_COLOR=always + - PATH=/usr/local/cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + - CARGO_TARGET_DIR=/ci-target + volumes: + - ..:/workspace + - cargo-registry:/usr/local/cargo/registry + - cargo-git:/usr/local/cargo/git + - ci-target:/ci-target + +volumes: + cargo-registry: + cargo-git: + ci-target: diff --git a/third_party/zeroclaw/dev/docker-compose.yml b/third_party/zeroclaw/dev/docker-compose.yml new file mode 100644 index 0000000..37843c2 --- /dev/null +++ b/third_party/zeroclaw/dev/docker-compose.yml @@ -0,0 +1,72 @@ +# Development Environment for ZeroClaw Agentic Testing +# +# Use this for: +# - Running the agent in a sandboxed environment +# - Testing dangerous commands safely +# - Developing new skills/integrations +# +# Usage: +# cd dev && ./cli.sh up +# or from root: ./dev/cli.sh up +name: zeroclaw-dev +services: + # ── The Agent (Development Image) ── + # Builds from source using the 'dev' stage of the root Dockerfile + zeroclaw-dev: + build: + context: .. + dockerfile: Dockerfile + target: dev + container_name: zeroclaw-dev + restart: unless-stopped + environment: + - ZEROCLAW_GATEWAY_PORT=42617 + - SANDBOX_HOST=zeroclaw-sandbox + secrets: + - source: zeroclaw_env + target: zeroclaw_env + entrypoint: ["/bin/bash", "-lc"] + command: + - | + if [ -f /run/secrets/zeroclaw_env ]; then + set -a + . /run/secrets/zeroclaw_env + set +a + fi + exec zeroclaw gateway --port "${ZEROCLAW_GATEWAY_PORT:-42617}" --host "[::]" + volumes: + # Mount single config file (avoids shadowing other files in .zeroclaw) + - ../target/.zeroclaw/config.toml:/zeroclaw-data/.zeroclaw/config.toml + # Mount shared workspace + - ../playground:/zeroclaw-data/workspace + ports: + - "127.0.0.1:42617:42617" + networks: + - dev-net + + # ── The Sandbox (Ubuntu Environment) ── + # A fully loaded Ubuntu environment for the agent to play in. + sandbox: + build: + context: sandbox # Context relative to dev/ + dockerfile: Dockerfile + container_name: zeroclaw-sandbox + hostname: dev-box + command: ["tail", "-f", "/dev/null"] + working_dir: /home/developer/workspace + user: developer + environment: + - TERM=xterm-256color + - SHELL=/bin/bash + volumes: + - ../playground:/home/developer/workspace # Mount local playground + networks: + - dev-net + +networks: + dev-net: + driver: bridge + +secrets: + zeroclaw_env: + file: ../.env diff --git a/third_party/zeroclaw/dev/recompute_contributor_tiers.sh b/third_party/zeroclaw/dev/recompute_contributor_tiers.sh new file mode 100755 index 0000000..6e3e528 --- /dev/null +++ b/third_party/zeroclaw/dev/recompute_contributor_tiers.sh @@ -0,0 +1,324 @@ +#!/usr/bin/env bash + +set -euo pipefail + +SCRIPT_NAME="$(basename "$0")" + +usage() { + cat < Target repository (default: current gh repo) + --kind + Target objects (default: both) + --state + State filter for listing objects (default: all) + --limit Limit processed objects after fetch (default: 0 = no limit) + --apply Apply label updates (default is dry-run) + --dry-run Preview only (default) + -h, --help Show this help + +Examples: + ./$SCRIPT_NAME --repo zeroclaw-labs/zeroclaw --limit 50 + ./$SCRIPT_NAME --repo zeroclaw-labs/zeroclaw --kind prs --state open --apply +USAGE +} + +die() { + echo "[$SCRIPT_NAME] ERROR: $*" >&2 + exit 1 +} + +require_cmd() { + if ! command -v "$1" >/dev/null 2>&1; then + die "Required command not found: $1" + fi +} + +urlencode() { + jq -nr --arg value "$1" '$value|@uri' +} + +select_contributor_tier() { + local merged_count="$1" + if (( merged_count >= 50 )); then + echo "distinguished contributor" + elif (( merged_count >= 20 )); then + echo "principal contributor" + elif (( merged_count >= 10 )); then + echo "experienced contributor" + elif (( merged_count >= 5 )); then + echo "trusted contributor" + else + echo "" + fi +} + +DRY_RUN=1 +KIND="both" +STATE="all" +LIMIT=0 +REPO="" + +while (($# > 0)); do + case "$1" in + --repo) + [[ $# -ge 2 ]] || die "Missing value for --repo" + REPO="$2" + shift 2 + ;; + --kind) + [[ $# -ge 2 ]] || die "Missing value for --kind" + KIND="$2" + shift 2 + ;; + --state) + [[ $# -ge 2 ]] || die "Missing value for --state" + STATE="$2" + shift 2 + ;; + --limit) + [[ $# -ge 2 ]] || die "Missing value for --limit" + LIMIT="$2" + shift 2 + ;; + --apply) + DRY_RUN=0 + shift + ;; + --dry-run) + DRY_RUN=1 + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + die "Unknown option: $1" + ;; + esac +done + +case "$KIND" in + both|prs|issues) ;; + *) die "--kind must be one of: both, prs, issues" ;; +esac + +case "$STATE" in + all|open|closed) ;; + *) die "--state must be one of: all, open, closed" ;; +esac + +if ! [[ "$LIMIT" =~ ^[0-9]+$ ]]; then + die "--limit must be a non-negative integer" +fi + +require_cmd gh +require_cmd jq + +if ! gh auth status >/dev/null 2>&1; then + die "gh CLI is not authenticated. Run: gh auth login" +fi + +if [[ -z "$REPO" ]]; then + REPO="$(gh repo view --json nameWithOwner --jq '.nameWithOwner' 2>/dev/null || true)" + [[ -n "$REPO" ]] || die "Unable to infer repo. Pass --repo ." +fi + +echo "[$SCRIPT_NAME] Repo: $REPO" +echo "[$SCRIPT_NAME] Mode: $([[ "$DRY_RUN" -eq 1 ]] && echo "dry-run" || echo "apply")" +echo "[$SCRIPT_NAME] Kind: $KIND | State: $STATE | Limit: $LIMIT" + +TIERS_JSON='["trusted contributor","experienced contributor","principal contributor","distinguished contributor"]' + +TMP_FILES=() +cleanup() { + if ((${#TMP_FILES[@]} > 0)); then + rm -f "${TMP_FILES[@]}" + fi +} +trap cleanup EXIT + +new_tmp_file() { + local tmp + tmp="$(mktemp)" + TMP_FILES+=("$tmp") + echo "$tmp" +} + +targets_file="$(new_tmp_file)" + +if [[ "$KIND" == "both" || "$KIND" == "prs" ]]; then + gh api --paginate "repos/$REPO/pulls?state=$STATE&per_page=100" \ + --jq '.[] | { + kind: "pr", + number: .number, + author: (.user.login // ""), + author_type: (.user.type // ""), + labels: [(.labels[]?.name // empty)] + }' >> "$targets_file" +fi + +if [[ "$KIND" == "both" || "$KIND" == "issues" ]]; then + gh api --paginate "repos/$REPO/issues?state=$STATE&per_page=100" \ + --jq '.[] | select(.pull_request | not) | { + kind: "issue", + number: .number, + author: (.user.login // ""), + author_type: (.user.type // ""), + labels: [(.labels[]?.name // empty)] + }' >> "$targets_file" +fi + +if [[ "$LIMIT" -gt 0 ]]; then + limited_file="$(new_tmp_file)" + head -n "$LIMIT" "$targets_file" > "$limited_file" + mv "$limited_file" "$targets_file" +fi + +target_count="$(wc -l < "$targets_file" | tr -d ' ')" +if [[ "$target_count" -eq 0 ]]; then + echo "[$SCRIPT_NAME] No targets found." + exit 0 +fi + +echo "[$SCRIPT_NAME] Targets fetched: $target_count" + +# Ensure tier labels exist (trusted contributor might be new). +label_color="" +for probe_label in "experienced contributor" "principal contributor" "distinguished contributor" "trusted contributor"; do + encoded_label="$(urlencode "$probe_label")" + if color_candidate="$(gh api "repos/$REPO/labels/$encoded_label" --jq '.color' 2>/dev/null || true)"; then + if [[ -n "$color_candidate" ]]; then + label_color="$(echo "$color_candidate" | tr '[:lower:]' '[:upper:]')" + break + fi + fi +done +[[ -n "$label_color" ]] || label_color="C5D7A2" + +while IFS= read -r tier_label; do + [[ -n "$tier_label" ]] || continue + encoded_label="$(urlencode "$tier_label")" + if gh api "repos/$REPO/labels/$encoded_label" >/dev/null 2>&1; then + continue + fi + + if [[ "$DRY_RUN" -eq 1 ]]; then + echo "[dry-run] Would create missing label: $tier_label (color=$label_color)" + else + gh api -X POST "repos/$REPO/labels" \ + -f name="$tier_label" \ + -f color="$label_color" >/dev/null + echo "[apply] Created missing label: $tier_label" + fi +done < <(jq -r '.[]' <<<"$TIERS_JSON") + +# Build merged PR count cache by unique human authors. +authors_file="$(new_tmp_file)" +jq -r 'select(.author != "" and .author_type != "Bot") | .author' "$targets_file" | sort -u > "$authors_file" +author_count="$(wc -l < "$authors_file" | tr -d ' ')" +echo "[$SCRIPT_NAME] Unique human authors: $author_count" + +author_counts_file="$(new_tmp_file)" +while IFS= read -r author; do + [[ -n "$author" ]] || continue + query="repo:$REPO is:pr is:merged author:$author" + merged_count="$(gh api search/issues -f q="$query" -F per_page=1 --jq '.total_count' 2>/dev/null || true)" + if ! [[ "$merged_count" =~ ^[0-9]+$ ]]; then + merged_count=0 + fi + printf '%s\t%s\n' "$author" "$merged_count" >> "$author_counts_file" +done < "$authors_file" + +updated=0 +unchanged=0 +skipped=0 +failed=0 + +while IFS= read -r target_json; do + [[ -n "$target_json" ]] || continue + + number="$(jq -r '.number' <<<"$target_json")" + kind="$(jq -r '.kind' <<<"$target_json")" + author="$(jq -r '.author' <<<"$target_json")" + author_type="$(jq -r '.author_type' <<<"$target_json")" + current_labels_json="$(jq -c '.labels // []' <<<"$target_json")" + + if [[ -z "$author" || "$author_type" == "Bot" ]]; then + skipped=$((skipped + 1)) + continue + fi + + merged_count="$(awk -F '\t' -v key="$author" '$1 == key { print $2; exit }' "$author_counts_file")" + if ! [[ "$merged_count" =~ ^[0-9]+$ ]]; then + merged_count=0 + fi + desired_tier="$(select_contributor_tier "$merged_count")" + + if ! current_tier="$(jq -r --argjson tiers "$TIERS_JSON" '[.[] | select(. as $label | ($tiers | index($label)) != null)][0] // ""' <<<"$current_labels_json" 2>/dev/null)"; then + echo "[warn] Skipping ${kind} #${number}: cannot parse current labels JSON" >&2 + failed=$((failed + 1)) + continue + fi + + if ! next_labels_json="$(jq -c --arg desired "$desired_tier" --argjson tiers "$TIERS_JSON" ' + (. // []) + | map(select(. as $label | ($tiers | index($label)) == null)) + | if $desired != "" then . + [$desired] else . end + | unique + ' <<<"$current_labels_json" 2>/dev/null)"; then + echo "[warn] Skipping ${kind} #${number}: cannot compute next labels" >&2 + failed=$((failed + 1)) + continue + fi + + if ! normalized_current="$(jq -c 'unique | sort' <<<"$current_labels_json" 2>/dev/null)"; then + echo "[warn] Skipping ${kind} #${number}: cannot normalize current labels" >&2 + failed=$((failed + 1)) + continue + fi + + if ! normalized_next="$(jq -c 'unique | sort' <<<"$next_labels_json" 2>/dev/null)"; then + echo "[warn] Skipping ${kind} #${number}: cannot normalize next labels" >&2 + failed=$((failed + 1)) + continue + fi + + if [[ "$normalized_current" == "$normalized_next" ]]; then + unchanged=$((unchanged + 1)) + continue + fi + + if [[ "$DRY_RUN" -eq 1 ]]; then + echo "[dry-run] ${kind} #${number} @${author} merged=${merged_count} tier: '${current_tier:-none}' -> '${desired_tier:-none}'" + updated=$((updated + 1)) + continue + fi + + payload="$(jq -cn --argjson labels "$next_labels_json" '{labels: $labels}')" + if gh api -X PUT "repos/$REPO/issues/$number/labels" --input - <<<"$payload" >/dev/null; then + echo "[apply] Updated ${kind} #${number} @${author} tier: '${current_tier:-none}' -> '${desired_tier:-none}'" + updated=$((updated + 1)) + else + echo "[apply] FAILED ${kind} #${number}" >&2 + failed=$((failed + 1)) + fi +done < "$targets_file" + +echo "" +echo "[$SCRIPT_NAME] Summary" +echo " Targets: $target_count" +echo " Updated: $updated" +echo " Unchanged: $unchanged" +echo " Skipped: $skipped" +echo " Failed: $failed" + +if [[ "$failed" -gt 0 ]]; then + exit 1 +fi diff --git a/third_party/zeroclaw/dev/sandbox/Dockerfile b/third_party/zeroclaw/dev/sandbox/Dockerfile new file mode 100644 index 0000000..6b81a7a --- /dev/null +++ b/third_party/zeroclaw/dev/sandbox/Dockerfile @@ -0,0 +1,34 @@ +FROM ubuntu:22.04@sha256:c7eb020043d8fc2ae0793fb35a37bff1cf33f156d4d4b12ccc7f3ef8706c38b1 + +# Prevent interactive prompts during package installation +ENV DEBIAN_FRONTEND=noninteractive + +# Install common development tools and runtimes +# - Node.js: Install v20 (LTS) from NodeSource +# - Core: curl, git, vim, build-essential (gcc, make) +# - Python: python3, pip +# - Network: ping, dnsutils +RUN apt-get update && apt-get install -y curl && \ + curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ + apt-get install -y \ + nodejs \ + wget git vim nano unzip zip \ + build-essential \ + python3 python3-pip \ + sudo \ + iputils-ping dnsutils net-tools \ + && rm -rf /var/lib/apt/lists/* \ + && node --version && npm --version + +# Create a non-root user 'developer' with UID 1000 +# Grant passwordless sudo to simulate a local dev environment (using safe sudoers.d) +RUN useradd -m -s /bin/bash -u 1000 developer && \ + echo "developer ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/developer && \ + chmod 0440 /etc/sudoers.d/developer + +# Set up the workspace +USER developer +WORKDIR /home/developer/workspace + +# Default command +CMD ["/bin/bash"] diff --git a/third_party/zeroclaw/dev/test-termux-release.sh b/third_party/zeroclaw/dev/test-termux-release.sh new file mode 100755 index 0000000..c43bf3a --- /dev/null +++ b/third_party/zeroclaw/dev/test-termux-release.sh @@ -0,0 +1,261 @@ +#!/usr/bin/env bash +# Termux release validation script +# Validates the aarch64-linux-android release artifact for Termux compatibility. +# +# Usage: +# ./dev/test-termux-release.sh [version] +# +# Examples: +# ./dev/test-termux-release.sh 0.3.1 +# ./dev/test-termux-release.sh # auto-detects from Cargo.toml +# +set -euo pipefail + +BLUE='\033[0;34m' +GREEN='\033[0;32m' +RED='\033[0;31m' +YELLOW='\033[0;33m' +BOLD='\033[1m' +DIM='\033[2m' +RESET='\033[0m' + +pass() { echo -e " ${GREEN}✓${RESET} $*"; } +fail() { echo -e " ${RED}✗${RESET} $*"; FAILURES=$((FAILURES + 1)); } +info() { echo -e "${BLUE}→${RESET} ${BOLD}$*${RESET}"; } +warn() { echo -e "${YELLOW}!${RESET} $*"; } + +FAILURES=0 +TARGET="aarch64-linux-android" +VERSION="${1:-}" + +if [[ -z "$VERSION" ]]; then + if [[ -f Cargo.toml ]]; then + VERSION=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -1) + fi +fi + +if [[ -z "$VERSION" ]]; then + echo "Usage: $0 " + echo " e.g. $0 0.3.1" + exit 1 +fi + +TAG="v${VERSION}" +ASSET_NAME="zeroclaw-${TARGET}.tar.gz" +ASSET_URL="https://github.com/zeroclaw-labs/zeroclaw/releases/download/${TAG}/${ASSET_NAME}" +TEMP_DIR="$(mktemp -d -t zeroclaw-termux-test-XXXXXX)" + +cleanup() { rm -rf "$TEMP_DIR"; } +trap cleanup EXIT + +echo +echo -e "${BOLD}Termux Release Validation — ${TAG}${RESET}" +echo -e "${DIM}Target: ${TARGET}${RESET}" +echo + +# --- Test 1: Release tag exists --- +info "Checking release tag ${TAG}" +if gh release view "$TAG" >/dev/null 2>&1; then + pass "Release ${TAG} exists" +else + fail "Release ${TAG} not found" + echo -e "${RED}Release has not been published yet. Wait for the release workflow to complete.${RESET}" + exit 1 +fi + +# --- Test 2: Android asset is listed --- +info "Checking for ${ASSET_NAME} in release assets" +ASSETS=$(gh release view "$TAG" --json assets -q '.assets[].name') +if echo "$ASSETS" | grep -q "$ASSET_NAME"; then + pass "Asset ${ASSET_NAME} found in release" +else + fail "Asset ${ASSET_NAME} not found in release" + echo "Available assets:" + echo "$ASSETS" | sed 's/^/ /' + exit 1 +fi + +# --- Test 3: Download the asset --- +info "Downloading ${ASSET_NAME}" +if curl -fsSL "$ASSET_URL" -o "$TEMP_DIR/$ASSET_NAME"; then + FILESIZE=$(wc -c < "$TEMP_DIR/$ASSET_NAME" | tr -d ' ') + pass "Downloaded successfully (${FILESIZE} bytes)" +else + fail "Download failed from ${ASSET_URL}" + exit 1 +fi + +# --- Test 4: Archive integrity --- +info "Verifying archive integrity" +if tar -tzf "$TEMP_DIR/$ASSET_NAME" >/dev/null 2>&1; then + pass "Archive is a valid gzip tar" +else + fail "Archive is corrupted or not a valid tar.gz" + exit 1 +fi + +# --- Test 5: Contains zeroclaw binary --- +info "Checking archive contents" +CONTENTS=$(tar -tzf "$TEMP_DIR/$ASSET_NAME") +if echo "$CONTENTS" | grep -q "^zeroclaw$"; then + pass "Archive contains 'zeroclaw' binary" +else + fail "Archive does not contain 'zeroclaw' binary" + echo "Contents:" + echo "$CONTENTS" | sed 's/^/ /' +fi + +# --- Test 6: Extract and inspect binary --- +info "Extracting and inspecting binary" +tar -xzf "$TEMP_DIR/$ASSET_NAME" -C "$TEMP_DIR" +BINARY="$TEMP_DIR/zeroclaw" + +if [[ -f "$BINARY" ]]; then + pass "Binary extracted" +else + fail "Binary not found after extraction" + exit 1 +fi + +# --- Test 7: ELF format and architecture --- +info "Checking binary format" +FILE_INFO=$(file "$BINARY") +if echo "$FILE_INFO" | grep -q "ELF"; then + pass "Binary is ELF format" +else + fail "Binary is not ELF format: $FILE_INFO" +fi + +if echo "$FILE_INFO" | grep -qi "aarch64\|ARM aarch64"; then + pass "Binary targets aarch64 architecture" +else + fail "Binary does not target aarch64: $FILE_INFO" +fi + +if echo "$FILE_INFO" | grep -qi "android\|bionic"; then + pass "Binary is linked for Android/Bionic" +else + # Android binaries may not always show "android" in file output, + # check with readelf if available + if command -v readelf >/dev/null 2>&1; then + INTERP=$(readelf -l "$BINARY" 2>/dev/null | grep -o '/[^ ]*linker[^ ]*' || true) + if echo "$INTERP" | grep -qi "android\|bionic"; then + pass "Binary uses Android linker: $INTERP" + else + warn "Could not confirm Android linkage (interpreter: ${INTERP:-unknown})" + warn "file output: $FILE_INFO" + fi + else + warn "Could not confirm Android linkage (readelf not available)" + warn "file output: $FILE_INFO" + fi +fi + +# --- Test 8: Binary is stripped --- +info "Checking binary optimization" +if echo "$FILE_INFO" | grep -q "stripped"; then + pass "Binary is stripped (release optimized)" +else + warn "Binary may not be stripped" +fi + +# --- Test 9: Binary is not dynamically linked to glibc --- +info "Checking for glibc dependencies" +if command -v readelf >/dev/null 2>&1; then + NEEDED=$(readelf -d "$BINARY" 2>/dev/null | grep NEEDED || true) + if echo "$NEEDED" | grep -qi "libc\.so\.\|libpthread\|libdl"; then + # Check if it's glibc or bionic + if echo "$NEEDED" | grep -qi "libc\.so\.6"; then + fail "Binary links against glibc (libc.so.6) — will not work on Termux" + else + pass "Binary links against libc (likely Bionic)" + fi + else + pass "No glibc dependencies detected" + fi +else + warn "readelf not available — skipping dynamic library check" +fi + +# --- Test 10: SHA256 checksum verification --- +info "Verifying SHA256 checksum" +CHECKSUMS_URL="https://github.com/zeroclaw-labs/zeroclaw/releases/download/${TAG}/SHA256SUMS" +if curl -fsSL "$CHECKSUMS_URL" -o "$TEMP_DIR/SHA256SUMS" 2>/dev/null; then + EXPECTED=$(grep "$ASSET_NAME" "$TEMP_DIR/SHA256SUMS" | awk '{print $1}') + if [[ -n "$EXPECTED" ]]; then + if command -v sha256sum >/dev/null 2>&1; then + ACTUAL=$(sha256sum "$TEMP_DIR/$ASSET_NAME" | awk '{print $1}') + elif command -v shasum >/dev/null 2>&1; then + ACTUAL=$(shasum -a 256 "$TEMP_DIR/$ASSET_NAME" | awk '{print $1}') + else + warn "No sha256sum or shasum available" + ACTUAL="" + fi + + if [[ -n "$ACTUAL" && "$ACTUAL" == "$EXPECTED" ]]; then + pass "SHA256 checksum matches" + elif [[ -n "$ACTUAL" ]]; then + fail "SHA256 mismatch: expected=$EXPECTED actual=$ACTUAL" + fi + else + warn "No checksum entry for ${ASSET_NAME} in SHA256SUMS" + fi +else + warn "Could not download SHA256SUMS" +fi + +# --- Test 11: install.sh Termux detection --- +info "Validating install.sh Termux detection" +INSTALL_SH="install.sh" +if [[ ! -f "$INSTALL_SH" ]]; then + INSTALL_SH="$(dirname "$0")/../install.sh" +fi + +if [[ -f "$INSTALL_SH" ]]; then + if grep -q 'TERMUX_VERSION' "$INSTALL_SH"; then + pass "install.sh checks TERMUX_VERSION" + else + fail "install.sh does not check TERMUX_VERSION" + fi + + if grep -q 'aarch64-linux-android' "$INSTALL_SH"; then + pass "install.sh maps to aarch64-linux-android target" + else + fail "install.sh does not map to aarch64-linux-android" + fi + + # Simulate Termux detection (mock uname as Linux since we may run on macOS) + detect_result=$( + bash -c ' + TERMUX_VERSION="0.118" + os="Linux" + arch="aarch64" + case "$os:$arch" in + Linux:aarch64|Linux:arm64) + if [[ -n "${TERMUX_VERSION:-}" || -d "/data/data/com.termux" ]]; then + echo "aarch64-linux-android" + else + echo "aarch64-unknown-linux-gnu" + fi + ;; + esac + ' + ) + if [[ "$detect_result" == "aarch64-linux-android" ]]; then + pass "Termux detection returns correct target (simulated)" + else + fail "Termux detection returned: $detect_result (expected aarch64-linux-android)" + fi +else + warn "install.sh not found — skipping detection tests" +fi + +# --- Summary --- +echo +if [[ "$FAILURES" -eq 0 ]]; then + echo -e "${GREEN}${BOLD}All tests passed!${RESET}" + echo -e "${DIM}The Termux release artifact for ${TAG} is valid.${RESET}" +else + echo -e "${RED}${BOLD}${FAILURES} test(s) failed.${RESET}" + exit 1 +fi diff --git a/third_party/zeroclaw/dist/aur/.SRCINFO b/third_party/zeroclaw/dist/aur/.SRCINFO new file mode 100644 index 0000000..7cf9b26 --- /dev/null +++ b/third_party/zeroclaw/dist/aur/.SRCINFO @@ -0,0 +1,16 @@ +pkgbase = zeroclaw + pkgdesc = Zero overhead. Zero compromise. 100% Rust. The fastest, smallest AI assistant. + pkgver = 0.5.9 + pkgrel = 1 + url = https://github.com/zeroclaw-labs/zeroclaw + arch = x86_64 + license = MIT + license = Apache-2.0 + makedepends = cargo + makedepends = git + depends = gcc-libs + depends = openssl + source = zeroclaw-0.5.9.tar.gz::https://github.com/zeroclaw-labs/zeroclaw/archive/refs/tags/v0.5.9.tar.gz + sha256sums = SKIP + +pkgname = zeroclaw diff --git a/third_party/zeroclaw/dist/aur/PKGBUILD b/third_party/zeroclaw/dist/aur/PKGBUILD new file mode 100644 index 0000000..13dffc5 --- /dev/null +++ b/third_party/zeroclaw/dist/aur/PKGBUILD @@ -0,0 +1,32 @@ +# Maintainer: zeroclaw-labs +pkgname=zeroclaw +pkgver=0.5.9 +pkgrel=1 +pkgdesc="Zero overhead. Zero compromise. 100% Rust. The fastest, smallest AI assistant." +arch=('x86_64') +url="https://github.com/zeroclaw-labs/zeroclaw" +license=('MIT' 'Apache-2.0') +depends=('gcc-libs' 'openssl') +makedepends=('cargo' 'git') +source=("${pkgname}-${pkgver}.tar.gz::https://github.com/zeroclaw-labs/zeroclaw/archive/refs/tags/v${pkgver}.tar.gz") +sha256sums=('SKIP') + +prepare() { + cd "${pkgname}-${pkgver}" + export RUSTUP_TOOLCHAIN=stable + cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')" +} + +build() { + cd "${pkgname}-${pkgver}" + export RUSTUP_TOOLCHAIN=stable + export CARGO_TARGET_DIR=target + cargo build --frozen --release --profile dist +} + +package() { + cd "${pkgname}-${pkgver}" + install -Dm0755 -t "${pkgdir}/usr/bin/" "target/dist/zeroclaw" + install -Dm0644 LICENSE-MIT "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE-MIT" + install -Dm0644 LICENSE-APACHE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE-APACHE" +} diff --git a/third_party/zeroclaw/dist/scoop/zeroclaw.json b/third_party/zeroclaw/dist/scoop/zeroclaw.json new file mode 100644 index 0000000..151ddf9 --- /dev/null +++ b/third_party/zeroclaw/dist/scoop/zeroclaw.json @@ -0,0 +1,27 @@ +{ + "version": "0.5.9", + "description": "Zero overhead. Zero compromise. 100% Rust. The fastest, smallest AI assistant.", + "homepage": "https://github.com/zeroclaw-labs/zeroclaw", + "license": "MIT|Apache-2.0", + "architecture": { + "64bit": { + "url": "https://github.com/zeroclaw-labs/zeroclaw/releases/download/v0.5.9/zeroclaw-x86_64-pc-windows-msvc.zip", + "hash": "", + "bin": "zeroclaw.exe" + } + }, + "checkver": { + "github": "https://github.com/zeroclaw-labs/zeroclaw" + }, + "autoupdate": { + "architecture": { + "64bit": { + "url": "https://github.com/zeroclaw-labs/zeroclaw/releases/download/v$version/zeroclaw-x86_64-pc-windows-msvc.zip" + } + }, + "hash": { + "url": "https://github.com/zeroclaw-labs/zeroclaw/releases/download/v$version/SHA256SUMS", + "regex": "([a-f0-9]{64})\\s+zeroclaw-x86_64-pc-windows-msvc\\.zip" + } + } +} diff --git a/third_party/zeroclaw/docker-compose.yml b/third_party/zeroclaw/docker-compose.yml new file mode 100644 index 0000000..87d1c35 --- /dev/null +++ b/third_party/zeroclaw/docker-compose.yml @@ -0,0 +1,71 @@ +# ZeroClaw Docker Compose Example +# +# Quick start: +# 1. Copy this file and set your API key +# 2. Run: docker compose up -d +# 3. Access gateway at http://localhost:42617 +# +# For more info: https://github.com/zeroclaw-labs/zeroclaw + +services: + zeroclaw: + image: ghcr.io/zeroclaw-labs/zeroclaw:latest + # For ARM64 environments where the distroless image exits immediately, + # switch to the Debian compatibility image instead: + # image: ghcr.io/zeroclaw-labs/zeroclaw:debian + # Or build locally (distroless, no shell): + # build: . + # Or build the Debian variant (includes bash, git, curl): + # build: + # context: . + # dockerfile: Dockerfile.debian + container_name: zeroclaw + restart: unless-stopped + + environment: + # Required: Your LLM provider API key + - API_KEY=${API_KEY:-} + # Or use the prefixed version: + # - ZEROCLAW_API_KEY=${ZEROCLAW_API_KEY:-} + + # Optional: LLM provider (default: openrouter) + # Options: openrouter, openai, anthropic, ollama + - PROVIDER=${PROVIDER:-openrouter} + + # Allow public bind inside Docker (required for container networking) + - ZEROCLAW_ALLOW_PUBLIC_BIND=true + # Default gateway port inside container + - ZEROCLAW_GATEWAY_PORT=${ZEROCLAW_GATEWAY_PORT:-42617} + + # Optional: Model override + # - ZEROCLAW_MODEL=anthropic/claude-sonnet-4-20250514 + + volumes: + # Persist workspace and config (must match WORKDIR/HOME in Dockerfile) + - zeroclaw-data:/zeroclaw-data + + ports: + # Gateway API port (override HOST_PORT if 42617 is taken) + - "${HOST_PORT:-42617}:${ZEROCLAW_GATEWAY_PORT:-42617}" + + # Resource limits + deploy: + resources: + limits: + cpus: '2' + memory: 512M + reservations: + cpus: '0.5' + memory: 32M + + # Health check — uses lightweight status instead of full diagnostics. + # For images with curl, prefer: curl -f http://localhost:42617/health + healthcheck: + test: ["CMD", "zeroclaw", "status", "--format=exit-code"] + interval: 60s + timeout: 10s + retries: 3 + start_period: 10s + +volumes: + zeroclaw-data: diff --git a/third_party/zeroclaw/docs/README.ar.md b/third_party/zeroclaw/docs/README.ar.md new file mode 100644 index 0000000..8f8165b --- /dev/null +++ b/third_party/zeroclaw/docs/README.ar.md @@ -0,0 +1,96 @@ +# مركز توثيق ZeroClaw + +هذه الصفحة هي نقطة الدخول الرئيسية لنظام التوثيق. + +آخر تحديث: **20 فبراير 2026**. + +المراكز المترجمة: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## ابدأ من هنا + +| أريد أن… | اقرأ هذا | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| تثبيت وتشغيل ZeroClaw بسرعة | [README.md (البدء السريع)](../README.md#quick-start) | +| إعداد بأمر واحد | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| البحث عن أوامر حسب المهمة | [commands-reference.md](reference/cli/commands-reference.md) | +| التحقق السريع من مفاتيح وقيم الإعدادات الافتراضية | [config-reference.md](reference/api/config-reference.md) | +| إعداد مزودين/نقاط وصول مخصصة | [custom-providers.md](contributing/custom-providers.md) | +| إعداد مزود Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| استخدام أنماط تكامل LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| تشغيل بيئة التنفيذ (دليل العمليات اليومية) | [operations-runbook.md](ops/operations-runbook.md) | +| استكشاف مشاكل التثبيت/التشغيل/القنوات وإصلاحها | [troubleshooting.md](ops/troubleshooting.md) | +| تشغيل إعداد وتشخيص غرف Matrix المشفرة | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| تصفح التوثيق حسب الفئة | [SUMMARY.md](SUMMARY.md) | +| عرض لقطة توثيق طلبات السحب/المشاكل | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## شجرة القرار السريعة (10 ثوانٍ) + +- تحتاج إلى الإعداد أو التثبيت الأولي؟ ← [setup-guides/README.md](setup-guides/README.md) +- تحتاج مفاتيح CLI/الإعدادات بالتحديد؟ ← [reference/README.md](reference/README.md) +- تحتاج عمليات الإنتاج/الخدمة؟ ← [ops/README.md](ops/README.md) +- ترى أعطالاً أو تراجعات؟ ← [troubleshooting.md](ops/troubleshooting.md) +- تعمل على تقوية الأمان أو خارطة الطريق؟ ← [security/README.md](security/README.md) +- تعمل مع لوحات/أجهزة طرفية؟ ← [hardware/README.md](hardware/README.md) +- المساهمة/المراجعة/سير عمل CI؟ ← [contributing/README.md](contributing/README.md) +- تريد الخريطة الكاملة؟ ← [SUMMARY.md](SUMMARY.md) + +## المجموعات (موصى بها) + +- البدء: [setup-guides/README.md](setup-guides/README.md) +- كتالوجات المراجع: [reference/README.md](reference/README.md) +- العمليات والنشر: [ops/README.md](ops/README.md) +- توثيق الأمان: [security/README.md](security/README.md) +- العتاد/الأجهزة الطرفية: [hardware/README.md](hardware/README.md) +- المساهمة/CI: [contributing/README.md](contributing/README.md) +- لقطات المشروع: [maintainers/README.md](maintainers/README.md) + +## حسب الجمهور + +### المستخدمون / المشغّلون + +- [commands-reference.md](reference/cli/commands-reference.md) — البحث عن أوامر حسب سير العمل +- [providers-reference.md](reference/api/providers-reference.md) — معرّفات المزودين، الأسماء المستعارة، متغيرات بيئة بيانات الاعتماد +- [channels-reference.md](reference/api/channels-reference.md) — قدرات القنوات ومسارات الإعداد +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — إعداد غرف Matrix المشفرة (E2EE) وتشخيص عدم الاستجابة +- [config-reference.md](reference/api/config-reference.md) — مفاتيح الإعدادات عالية الأهمية والقيم الافتراضية الآمنة +- [custom-providers.md](contributing/custom-providers.md) — أنماط تكامل المزود المخصص/عنوان URL الأساسي +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — إعداد Z.AI/GLM ومصفوفة نقاط الوصول +- [langgraph-integration.md](contributing/langgraph-integration.md) — تكامل احتياطي لحالات حدود النموذج/استدعاء الأدوات +- [operations-runbook.md](ops/operations-runbook.md) — عمليات التشغيل اليومية وتدفقات التراجع +- [troubleshooting.md](ops/troubleshooting.md) — بصمات الأعطال الشائعة وخطوات الاسترداد + +### المساهمون / المشرفون + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### الأمان / الموثوقية + +> ملاحظة: يتضمن هذا القسم مستندات مقترحات/خارطة طريق. للسلوك الحالي، ابدأ بـ [config-reference.md](reference/api/config-reference.md) و[operations-runbook.md](ops/operations-runbook.md) و[troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## التنقل في النظام والحوكمة + +- جدول المحتويات الموحد: [SUMMARY.md](SUMMARY.md) +- خريطة هيكل التوثيق (اللغة/القسم/الوظيفة): [structure/README.md](maintainers/structure-README.md) +- جرد/تصنيف التوثيق: [docs-inventory.md](maintainers/docs-inventory.md) +- لقطة فرز المشروع: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## لغات أخرى + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.bn.md b/third_party/zeroclaw/docs/README.bn.md new file mode 100644 index 0000000..240f364 --- /dev/null +++ b/third_party/zeroclaw/docs/README.bn.md @@ -0,0 +1,96 @@ +# ZeroClaw ডকুমেন্টেশন হাব + +এই পৃষ্ঠাটি ডকুমেন্টেশন সিস্টেমের প্রধান প্রবেশ বিন্দু। + +সর্বশেষ আপডেট: **২০ ফেব্রুয়ারি ২০২৬**। + +স্থানীয়কৃত হাব: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## এখান থেকে শুরু করুন + +| আমি চাই… | এটি পড়ুন | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| দ্রুত ZeroClaw ইনস্টল ও চালু করতে | [README.md (দ্রুত শুরু)](../README.md#quick-start) | +| এক-ক্লিকে বুটস্ট্র্যাপ করতে | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| কাজ অনুযায়ী কমান্ড খুঁজতে | [commands-reference.md](reference/cli/commands-reference.md) | +| দ্রুত কনফিগ কী ও ডিফল্ট মান যাচাই করতে | [config-reference.md](reference/api/config-reference.md) | +| কাস্টম প্রোভাইডার/এন্ডপয়েন্ট সেটআপ করতে | [custom-providers.md](contributing/custom-providers.md) | +| Z.AI / GLM প্রোভাইডার সেটআপ করতে | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| LangGraph ইন্টিগ্রেশন প্যাটার্ন ব্যবহার করতে | [langgraph-integration.md](contributing/langgraph-integration.md) | +| রানটাইম পরিচালনা করতে (দৈনন্দিন অপারেশন গাইড) | [operations-runbook.md](ops/operations-runbook.md) | +| ইনস্টলেশন/রানটাইম/চ্যানেল সমস্যা সমাধান করতে | [troubleshooting.md](ops/troubleshooting.md) | +| Matrix এনক্রিপ্টেড রুম সেটআপ ও ডায়াগনস্টিক চালাতে | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| বিভাগ অনুযায়ী ডকুমেন্টেশন ব্রাউজ করতে | [SUMMARY.md](SUMMARY.md) | +| প্রকল্পের PR/ইস্যু ডক স্ন্যাপশট দেখতে | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## দ্রুত সিদ্ধান্ত গাছ (১০ সেকেন্ড) + +- সেটআপ বা প্রাথমিক ইনস্টলেশন দরকার? → [setup-guides/README.md](setup-guides/README.md) +- সুনির্দিষ্ট CLI/কনফিগ কী দরকার? → [reference/README.md](reference/README.md) +- প্রোডাকশন/সার্ভিস অপারেশন দরকার? → [ops/README.md](ops/README.md) +- ব্যর্থতা বা রিগ্রেশন দেখছেন? → [troubleshooting.md](ops/troubleshooting.md) +- নিরাপত্তা শক্তিশালীকরণ বা রোডম্যাপে কাজ করছেন? → [security/README.md](security/README.md) +- বোর্ড/পেরিফেরাল নিয়ে কাজ করছেন? → [hardware/README.md](hardware/README.md) +- অবদান/রিভিউ/CI ওয়ার্কফ্লো? → [contributing/README.md](contributing/README.md) +- সম্পূর্ণ মানচিত্র চান? → [SUMMARY.md](SUMMARY.md) + +## সংগ্রহ (প্রস্তাবিত) + +- শুরু করুন: [setup-guides/README.md](setup-guides/README.md) +- রেফারেন্স ক্যাটালগ: [reference/README.md](reference/README.md) +- অপারেশন ও ডিপ্লয়মেন্ট: [ops/README.md](ops/README.md) +- নিরাপত্তা ডকুমেন্টেশন: [security/README.md](security/README.md) +- হার্ডওয়্যার/পেরিফেরাল: [hardware/README.md](hardware/README.md) +- অবদান/CI: [contributing/README.md](contributing/README.md) +- প্রকল্প স্ন্যাপশট: [maintainers/README.md](maintainers/README.md) + +## দর্শক অনুযায়ী + +### ব্যবহারকারী / অপারেটর + +- [commands-reference.md](reference/cli/commands-reference.md) — ওয়ার্কফ্লো অনুযায়ী কমান্ড খোঁজা +- [providers-reference.md](reference/api/providers-reference.md) — প্রোভাইডার আইডি, উপনাম, ক্রেডেনশিয়াল এনভায়রনমেন্ট ভেরিয়েবল +- [channels-reference.md](reference/api/channels-reference.md) — চ্যানেল সক্ষমতা ও কনফিগারেশন পাথ +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — Matrix এনক্রিপ্টেড রুম (E2EE) সেটআপ ও সাড়া না দেওয়ার ডায়াগনস্টিক +- [config-reference.md](reference/api/config-reference.md) — উচ্চ-গুরুত্বপূর্ণ কনফিগ কী ও নিরাপদ ডিফল্ট +- [custom-providers.md](contributing/custom-providers.md) — কাস্টম প্রোভাইডার/বেস URL ইন্টিগ্রেশন প্যাটার্ন +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM সেটআপ ও এন্ডপয়েন্ট ম্যাট্রিক্স +- [langgraph-integration.md](contributing/langgraph-integration.md) — মডেল/টুল-কল এজ কেসের জন্য ফলব্যাক ইন্টিগ্রেশন +- [operations-runbook.md](ops/operations-runbook.md) — দৈনন্দিন রানটাইম অপারেশন ও রোলব্যাক ফ্লো +- [troubleshooting.md](ops/troubleshooting.md) — সাধারণ ব্যর্থতার স্বাক্ষর ও পুনরুদ্ধার পদক্ষেপ + +### অবদানকারী / রক্ষণাবেক্ষণকারী + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### নিরাপত্তা / নির্ভরযোগ্যতা + +> দ্রষ্টব্য: এই বিভাগে প্রস্তাবনা/রোডম্যাপ ডকুমেন্ট রয়েছে। বর্তমান আচরণের জন্য [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md), এবং [troubleshooting.md](ops/troubleshooting.md) দিয়ে শুরু করুন। + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## সিস্টেম নেভিগেশন ও গভর্ন্যান্স + +- একীভূত সূচিপত্র: [SUMMARY.md](SUMMARY.md) +- ডক কাঠামো মানচিত্র (ভাষা/অংশ/ফাংশন): [structure/README.md](maintainers/structure-README.md) +- ডকুমেন্টেশন তালিকা/শ্রেণীবিভাগ: [docs-inventory.md](maintainers/docs-inventory.md) +- প্রকল্প ট্রায়াজ স্ন্যাপশট: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## অন্যান্য ভাষা + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.cs.md b/third_party/zeroclaw/docs/README.cs.md new file mode 100644 index 0000000..fa896f2 --- /dev/null +++ b/third_party/zeroclaw/docs/README.cs.md @@ -0,0 +1,96 @@ +# Dokumentační hub ZeroClaw + +Tato stránka je hlavním vstupním bodem do dokumentačního systému. + +Poslední aktualizace: **20. února 2026**. + +Lokalizované huby: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Začněte zde + +| Chci… | Přečtěte si toto | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Rychle nainstalovat a spustit ZeroClaw | [README.md (Rychlý start)](../README.md#quick-start) | +| Bootstrap jedním příkazem | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Najít příkazy podle úkolu | [commands-reference.md](reference/cli/commands-reference.md) | +| Rychle ověřit konfigurační klíče a výchozí hodnoty | [config-reference.md](reference/api/config-reference.md) | +| Nastavit vlastní poskytovatele/endpointy | [custom-providers.md](contributing/custom-providers.md) | +| Nastavit poskytovatele Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Použít integrační vzory LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Provozovat runtime (provozní příručka) | [operations-runbook.md](ops/operations-runbook.md) | +| Řešit problémy s instalací/runtime/kanály | [troubleshooting.md](ops/troubleshooting.md) | +| Spustit nastavení a diagnostiku šifrovaných místností Matrix | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Procházet dokumentaci podle kategorie | [SUMMARY.md](SUMMARY.md) | +| Zobrazit snapshot dokumentace PR/issues projektu | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Rychlý rozhodovací strom (10 sekund) + +- Potřebujete nastavení nebo počáteční instalaci? → [setup-guides/README.md](setup-guides/README.md) +- Potřebujete přesné CLI/konfigurační klíče? → [reference/README.md](reference/README.md) +- Potřebujete produkční/servisní operace? → [ops/README.md](ops/README.md) +- Vidíte selhání nebo regrese? → [troubleshooting.md](ops/troubleshooting.md) +- Pracujete na posílení zabezpečení nebo roadmapě? → [security/README.md](security/README.md) +- Pracujete s deskami/periferiemi? → [hardware/README.md](hardware/README.md) +- Přispívání/revize/CI workflow? → [contributing/README.md](contributing/README.md) +- Chcete kompletní mapu? → [SUMMARY.md](SUMMARY.md) + +## Kolekce (doporučené) + +- Začínáme: [setup-guides/README.md](setup-guides/README.md) +- Referenční katalogy: [reference/README.md](reference/README.md) +- Provoz a nasazení: [ops/README.md](ops/README.md) +- Dokumentace zabezpečení: [security/README.md](security/README.md) +- Hardware/periferie: [hardware/README.md](hardware/README.md) +- Přispívání/CI: [contributing/README.md](contributing/README.md) +- Snapshoty projektu: [maintainers/README.md](maintainers/README.md) + +## Podle publika + +### Uživatelé / Operátoři + +- [commands-reference.md](reference/cli/commands-reference.md) — vyhledávání příkazů podle workflow +- [providers-reference.md](reference/api/providers-reference.md) — ID poskytovatelů, aliasy, proměnné prostředí pro přihlašovací údaje +- [channels-reference.md](reference/api/channels-reference.md) — schopnosti kanálů a konfigurační cesty +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — nastavení šifrovaných místností Matrix (E2EE) a diagnostika nereagování +- [config-reference.md](reference/api/config-reference.md) — klíčové konfigurační hodnoty a bezpečné výchozí nastavení +- [custom-providers.md](contributing/custom-providers.md) — vzory integrace vlastního poskytovatele/base URL +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — nastavení Z.AI/GLM a matice endpointů +- [langgraph-integration.md](contributing/langgraph-integration.md) — záložní integrace pro okrajové případy modelu/volání nástrojů +- [operations-runbook.md](ops/operations-runbook.md) — každodenní runtime operace a postupy rollbacku +- [troubleshooting.md](ops/troubleshooting.md) — běžné signatury selhání a kroky obnovy + +### Přispěvatelé / Správci + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Zabezpečení / Spolehlivost + +> Poznámka: tato sekce zahrnuje dokumenty návrhů/roadmapy. Pro aktuální chování začněte s [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) a [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Systémová navigace a správa + +- Jednotný obsah: [SUMMARY.md](SUMMARY.md) +- Mapa struktury dokumentace (jazyk/část/funkce): [structure/README.md](maintainers/structure-README.md) +- Inventář/klasifikace dokumentace: [docs-inventory.md](maintainers/docs-inventory.md) +- Snapshot třídění projektu: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Další jazyky + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.da.md b/third_party/zeroclaw/docs/README.da.md new file mode 100644 index 0000000..5893c35 --- /dev/null +++ b/third_party/zeroclaw/docs/README.da.md @@ -0,0 +1,96 @@ +# ZeroClaw Dokumentationshub + +Denne side er det primære indgangspunkt til dokumentationssystemet. + +Sidst opdateret: **20. februar 2026**. + +Lokaliserede hubs: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Start her + +| Jeg vil… | Læs dette | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Hurtigt installere og køre ZeroClaw | [README.md (Hurtig start)](../README.md#quick-start) | +| Bootstrap med én kommando | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Finde kommandoer efter opgave | [commands-reference.md](reference/cli/commands-reference.md) | +| Hurtigt tjekke konfigurationsnøgler og standardværdier | [config-reference.md](reference/api/config-reference.md) | +| Opsætte brugerdefinerede udbydere/endpoints | [custom-providers.md](contributing/custom-providers.md) | +| Opsætte Z.AI / GLM-udbyderen | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Bruge LangGraph-integrationsmønstre | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Drifte runtime (driftshåndbog) | [operations-runbook.md](ops/operations-runbook.md) | +| Fejlfinde installations-/runtime-/kanalproblemer | [troubleshooting.md](ops/troubleshooting.md) | +| Køre opsætning og diagnostik for krypterede Matrix-rum | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Gennemse dokumentation efter kategori | [SUMMARY.md](SUMMARY.md) | +| Se projektets PR/issue-dokumentationssnapshot | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Hurtigt beslutningstræ (10 sekunder) + +- Har du brug for opsætning eller førstegangsinstallation? → [setup-guides/README.md](setup-guides/README.md) +- Har du brug for præcise CLI/konfigurationsnøgler? → [reference/README.md](reference/README.md) +- Har du brug for produktions-/servicedrift? → [ops/README.md](ops/README.md) +- Ser du fejl eller regressioner? → [troubleshooting.md](ops/troubleshooting.md) +- Arbejder du på sikkerhedshærdning eller roadmap? → [security/README.md](security/README.md) +- Arbejder du med boards/periferienheder? → [hardware/README.md](hardware/README.md) +- Bidrag/review/CI-workflow? → [contributing/README.md](contributing/README.md) +- Vil du se det fulde kort? → [SUMMARY.md](SUMMARY.md) + +## Samlinger (anbefalet) + +- Kom i gang: [setup-guides/README.md](setup-guides/README.md) +- Referencekataloger: [reference/README.md](reference/README.md) +- Drift og udrulning: [ops/README.md](ops/README.md) +- Sikkerhedsdokumentation: [security/README.md](security/README.md) +- Hardware/periferienheder: [hardware/README.md](hardware/README.md) +- Bidrag/CI: [contributing/README.md](contributing/README.md) +- Projektsnapshots: [maintainers/README.md](maintainers/README.md) + +## Efter målgruppe + +### Brugere / Operatører + +- [commands-reference.md](reference/cli/commands-reference.md) — kommandoopslag efter workflow +- [providers-reference.md](reference/api/providers-reference.md) — udbyder-ID'er, aliaser, legitimationsoplysningers miljøvariabler +- [channels-reference.md](reference/api/channels-reference.md) — kanalegenskaber og konfigurationsstier +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — opsætning af krypterede Matrix-rum (E2EE) og diagnostik ved manglende svar +- [config-reference.md](reference/api/config-reference.md) — vigtige konfigurationsnøgler og sikre standardværdier +- [custom-providers.md](contributing/custom-providers.md) — integrationsmønstre for brugerdefineret udbyder/base-URL +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM-opsætning og endpoint-matrix +- [langgraph-integration.md](contributing/langgraph-integration.md) — fallback-integration for model/tool-call-edgecases +- [operations-runbook.md](ops/operations-runbook.md) — daglig runtime-drift og rollback-flows +- [troubleshooting.md](ops/troubleshooting.md) — almindelige fejlsignaturer og genoprettelsestrin + +### Bidragydere / Vedligeholdere + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Sikkerhed / Pålidelighed + +> Bemærk: dette afsnit inkluderer forslags-/roadmap-dokumenter. For aktuel adfærd, start med [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) og [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Systemnavigation og governance + +- Samlet indholdsfortegnelse: [SUMMARY.md](SUMMARY.md) +- Dokumentationsstrukturkort (sprog/del/funktion): [structure/README.md](maintainers/structure-README.md) +- Dokumentationsinventar/-klassificering: [docs-inventory.md](maintainers/docs-inventory.md) +- Projekt-triage-snapshot: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Andre sprog + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.de.md b/third_party/zeroclaw/docs/README.de.md new file mode 100644 index 0000000..a33e50e --- /dev/null +++ b/third_party/zeroclaw/docs/README.de.md @@ -0,0 +1,96 @@ +# ZeroClaw Dokumentations-Hub + +Diese Seite ist der zentrale Einstiegspunkt in das Dokumentationssystem. + +Zuletzt aktualisiert: **20. Februar 2026**. + +Lokalisierte Hubs: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Hier starten + +| Ich möchte… | Dies lesen | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| ZeroClaw schnell installieren und starten | [README.md (Schnellstart)](../README.md#quick-start) | +| Bootstrap mit einem Befehl | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Befehle nach Aufgabe finden | [commands-reference.md](reference/cli/commands-reference.md) | +| Schnell Konfigurationsschlüssel und Standardwerte prüfen | [config-reference.md](reference/api/config-reference.md) | +| Benutzerdefinierte Anbieter/Endpunkte einrichten | [custom-providers.md](contributing/custom-providers.md) | +| Den Z.AI / GLM-Anbieter einrichten | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| LangGraph-Integrationsmuster verwenden | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Die Laufzeitumgebung betreiben (Betriebshandbuch) | [operations-runbook.md](ops/operations-runbook.md) | +| Installations-/Laufzeit-/Kanalprobleme beheben | [troubleshooting.md](ops/troubleshooting.md) | +| Matrix-verschlüsselte-Raum-Einrichtung und Diagnose ausführen | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Dokumentation nach Kategorie durchsuchen | [SUMMARY.md](SUMMARY.md) | +| Projekt-PR/Issue-Dokumentations-Snapshot ansehen | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Schneller Entscheidungsbaum (10 Sekunden) + +- Einrichtung oder Erstinstallation nötig? → [setup-guides/README.md](setup-guides/README.md) +- Genaue CLI-/Konfigurationsschlüssel benötigt? → [reference/README.md](reference/README.md) +- Produktions-/Servicebetrieb benötigt? → [ops/README.md](ops/README.md) +- Fehler oder Regressionen sichtbar? → [troubleshooting.md](ops/troubleshooting.md) +- Arbeiten an Sicherheitshärtung oder Roadmap? → [security/README.md](security/README.md) +- Arbeiten mit Boards/Peripheriegeräten? → [hardware/README.md](hardware/README.md) +- Beitragen/Review/CI-Workflow? → [contributing/README.md](contributing/README.md) +- Vollständige Karte gewünscht? → [SUMMARY.md](SUMMARY.md) + +## Sammlungen (empfohlen) + +- Einstieg: [setup-guides/README.md](setup-guides/README.md) +- Referenzkataloge: [reference/README.md](reference/README.md) +- Betrieb und Bereitstellung: [ops/README.md](ops/README.md) +- Sicherheitsdokumentation: [security/README.md](security/README.md) +- Hardware/Peripheriegeräte: [hardware/README.md](hardware/README.md) +- Beitragen/CI: [contributing/README.md](contributing/README.md) +- Projekt-Snapshots: [maintainers/README.md](maintainers/README.md) + +## Nach Zielgruppe + +### Benutzer / Betreiber + +- [commands-reference.md](reference/cli/commands-reference.md) — Befehlssuche nach Workflow +- [providers-reference.md](reference/api/providers-reference.md) — Anbieter-IDs, Aliase, Umgebungsvariablen für Anmeldedaten +- [channels-reference.md](reference/api/channels-reference.md) — Kanalfähigkeiten und Konfigurationspfade +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — Matrix-verschlüsselter-Raum-Einrichtung (E2EE) und Diagnose bei ausbleibender Antwort +- [config-reference.md](reference/api/config-reference.md) — wichtige Konfigurationsschlüssel und sichere Standardwerte +- [custom-providers.md](contributing/custom-providers.md) — Integrationsmuster für benutzerdefinierte Anbieter/Basis-URL +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM-Einrichtung und Endpunkt-Matrix +- [langgraph-integration.md](contributing/langgraph-integration.md) — Fallback-Integration für Modell-/Tool-Call-Grenzfälle +- [operations-runbook.md](ops/operations-runbook.md) — täglicher Laufzeitbetrieb und Rollback-Abläufe +- [troubleshooting.md](ops/troubleshooting.md) — häufige Fehlersignaturen und Wiederherstellungsschritte + +### Mitwirkende / Betreuer + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Sicherheit / Zuverlässigkeit + +> Hinweis: Dieser Bereich enthält Vorschlags-/Roadmap-Dokumente. Für das aktuelle Verhalten beginnen Sie mit [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) und [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Systemnavigation und Governance + +- Einheitliches Inhaltsverzeichnis: [SUMMARY.md](SUMMARY.md) +- Dokumentationsstrukturkarte (Sprache/Teil/Funktion): [structure/README.md](maintainers/structure-README.md) +- Dokumentationsinventar/-klassifizierung: [docs-inventory.md](maintainers/docs-inventory.md) +- Projekt-Triage-Snapshot: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Andere Sprachen + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.el.md b/third_party/zeroclaw/docs/README.el.md new file mode 100644 index 0000000..e279e95 --- /dev/null +++ b/third_party/zeroclaw/docs/README.el.md @@ -0,0 +1,96 @@ +# Κέντρο Τεκμηρίωσης ZeroClaw + +Αυτή η σελίδα είναι το κύριο σημείο εισόδου για το σύστημα τεκμηρίωσης. + +Τελευταία ενημέρωση: **20 Φεβρουαρίου 2026**. + +Τοπικοποιημένα κέντρα: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Ξεκινήστε Εδώ + +| Θέλω να… | Διαβάστε αυτό | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Εγκαταστήσω και εκτελέσω το ZeroClaw γρήγορα | [README.md (Γρήγορη Εκκίνηση)](../README.md#quick-start) | +| Εκκίνηση με μία εντολή | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Βρω εντολές ανά εργασία | [commands-reference.md](reference/cli/commands-reference.md) | +| Ελέγξω γρήγορα κλειδιά και προεπιλογές ρυθμίσεων | [config-reference.md](reference/api/config-reference.md) | +| Ρυθμίσω προσαρμοσμένους παρόχους/endpoints | [custom-providers.md](contributing/custom-providers.md) | +| Ρυθμίσω τον πάροχο Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Χρησιμοποιήσω τα πρότυπα ενσωμάτωσης LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Λειτουργήσω το runtime (runbook ημέρας-2) | [operations-runbook.md](ops/operations-runbook.md) | +| Αντιμετωπίσω προβλήματα εγκατάστασης/runtime/καναλιού | [troubleshooting.md](ops/troubleshooting.md) | +| Εκτελέσω ρύθμιση και διαγνωστικά κρυπτογραφημένων δωματίων Matrix | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Περιηγηθώ στα έγγραφα ανά κατηγορία | [SUMMARY.md](SUMMARY.md) | +| Δω το στιγμιότυπο εγγράφων PR/issues του έργου | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Δέντρο Γρήγορης Απόφασης (10 δευτερόλεπτα) + +- Χρειάζεστε αρχική ρύθμιση ή εγκατάσταση; → [setup-guides/README.md](setup-guides/README.md) +- Χρειάζεστε ακριβή κλειδιά CLI/ρυθμίσεων; → [reference/README.md](reference/README.md) +- Χρειάζεστε λειτουργίες παραγωγής/υπηρεσίας; → [ops/README.md](ops/README.md) +- Βλέπετε αποτυχίες ή παλινδρομήσεις; → [troubleshooting.md](ops/troubleshooting.md) +- Εργάζεστε στη σκλήρυνση ασφαλείας ή τον οδικό χάρτη; → [security/README.md](security/README.md) +- Εργάζεστε με πλακέτες/περιφερειακά; → [hardware/README.md](hardware/README.md) +- Συνεισφορά/αξιολόγηση/ροή εργασίας CI; → [contributing/README.md](contributing/README.md) +- Θέλετε τον πλήρη χάρτη; → [SUMMARY.md](SUMMARY.md) + +## Συλλογές (Συνιστώνται) + +- Εκκίνηση: [setup-guides/README.md](setup-guides/README.md) +- Κατάλογοι αναφοράς: [reference/README.md](reference/README.md) +- Λειτουργίες & ανάπτυξη: [ops/README.md](ops/README.md) +- Έγγραφα ασφαλείας: [security/README.md](security/README.md) +- Υλικό/περιφερειακά: [hardware/README.md](hardware/README.md) +- Συνεισφορά/CI: [contributing/README.md](contributing/README.md) +- Στιγμιότυπα έργου: [maintainers/README.md](maintainers/README.md) + +## Ανά Κοινό + +### Χρήστες / Χειριστές + +- [commands-reference.md](reference/cli/commands-reference.md) — αναζήτηση εντολών ανά ροή εργασίας +- [providers-reference.md](reference/api/providers-reference.md) — αναγνωριστικά παρόχων, ψευδώνυμα, μεταβλητές περιβάλλοντος διαπιστευτηρίων +- [channels-reference.md](reference/api/channels-reference.md) — δυνατότητες καναλιών και διαδρομές ρύθμισης +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — ρύθμιση κρυπτογραφημένων δωματίων Matrix (E2EE) και διαγνωστικά μη-απόκρισης +- [config-reference.md](reference/api/config-reference.md) — κλειδιά ρυθμίσεων υψηλής σήμανσης και ασφαλείς προεπιλογές +- [custom-providers.md](contributing/custom-providers.md) — πρότυπα ενσωμάτωσης προσαρμοσμένου παρόχου/βασικού URL +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — ρύθμιση Z.AI/GLM και πίνακας endpoints +- [langgraph-integration.md](contributing/langgraph-integration.md) — εφεδρική ενσωμάτωση για ακραίες περιπτώσεις μοντέλου/κλήσης εργαλείου +- [operations-runbook.md](ops/operations-runbook.md) — λειτουργίες runtime ημέρας-2 και ροές επαναφοράς +- [troubleshooting.md](ops/troubleshooting.md) — συνήθεις υπογραφές αποτυχίας και βήματα αποκατάστασης + +### Συνεισφέροντες / Συντηρητές + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Ασφάλεια / Αξιοπιστία + +> Σημείωση: αυτή η περιοχή περιλαμβάνει έγγραφα πρότασης/οδικού χάρτη. Για την τρέχουσα συμπεριφορά, ξεκινήστε από [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md), και [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Πλοήγηση Συστήματος & Διακυβέρνηση + +- Ενοποιημένος πίνακας περιεχομένων: [SUMMARY.md](SUMMARY.md) +- Χάρτης δομής εγγράφων (γλώσσα/τμήμα/λειτουργία): [structure/README.md](maintainers/structure-README.md) +- Απογραφή/ταξινόμηση τεκμηρίωσης: [docs-inventory.md](maintainers/docs-inventory.md) +- Στιγμιότυπο διαλογής έργου: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Άλλες γλώσσες + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.es.md b/third_party/zeroclaw/docs/README.es.md new file mode 100644 index 0000000..21bb982 --- /dev/null +++ b/third_party/zeroclaw/docs/README.es.md @@ -0,0 +1,96 @@ +# Centro de Documentación ZeroClaw + +Esta página es el punto de entrada principal del sistema de documentación. + +Última actualización: **20 de febrero de 2026**. + +Centros localizados: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Comience Aquí + +| Quiero… | Leer esto | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Instalar y ejecutar ZeroClaw rápidamente | [README.md (Inicio Rápido)](../README.md#quick-start) | +| Arranque con un solo comando | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Encontrar comandos por tarea | [commands-reference.md](reference/cli/commands-reference.md) | +| Verificar rápidamente claves y valores predeterminados de config | [config-reference.md](reference/api/config-reference.md) | +| Configurar proveedores/endpoints personalizados | [custom-providers.md](contributing/custom-providers.md) | +| Configurar el proveedor Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Usar los patrones de integración LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Operar el runtime (runbook día-2) | [operations-runbook.md](ops/operations-runbook.md) | +| Solucionar problemas de instalación/runtime/canal | [troubleshooting.md](ops/troubleshooting.md) | +| Ejecutar configuración y diagnósticos de salas cifradas Matrix | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Navegar la documentación por categoría | [SUMMARY.md](SUMMARY.md) | +| Ver la instantánea de docs de PR/issues del proyecto | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Árbol de Decisión Rápida (10 segundos) + +- ¿Necesita configuración o instalación inicial? → [setup-guides/README.md](setup-guides/README.md) +- ¿Necesita claves exactas de CLI/configuración? → [reference/README.md](reference/README.md) +- ¿Necesita operaciones de producción/servicio? → [ops/README.md](ops/README.md) +- ¿Ve fallos o regresiones? → [troubleshooting.md](ops/troubleshooting.md) +- ¿Trabaja en endurecimiento de seguridad o hoja de ruta? → [security/README.md](security/README.md) +- ¿Trabaja con placas/periféricos? → [hardware/README.md](hardware/README.md) +- ¿Contribución/revisión/flujo de trabajo CI? → [contributing/README.md](contributing/README.md) +- ¿Quiere el mapa completo? → [SUMMARY.md](SUMMARY.md) + +## Colecciones (Recomendadas) + +- Inicio: [setup-guides/README.md](setup-guides/README.md) +- Catálogos de referencia: [reference/README.md](reference/README.md) +- Operaciones y despliegue: [ops/README.md](ops/README.md) +- Documentación de seguridad: [security/README.md](security/README.md) +- Hardware/periféricos: [hardware/README.md](hardware/README.md) +- Contribución/CI: [contributing/README.md](contributing/README.md) +- Instantáneas del proyecto: [maintainers/README.md](maintainers/README.md) + +## Por Audiencia + +### Usuarios / Operadores + +- [commands-reference.md](reference/cli/commands-reference.md) — búsqueda de comandos por flujo de trabajo +- [providers-reference.md](reference/api/providers-reference.md) — IDs de proveedores, alias, variables de entorno de credenciales +- [channels-reference.md](reference/api/channels-reference.md) — capacidades de canales y rutas de configuración +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — configuración de salas cifradas Matrix (E2EE) y diagnósticos de no-respuesta +- [config-reference.md](reference/api/config-reference.md) — claves de configuración de alta señalización y valores predeterminados seguros +- [custom-providers.md](contributing/custom-providers.md) — patrones de integración de proveedor personalizado/URL base +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — configuración Z.AI/GLM y matriz de endpoints +- [langgraph-integration.md](contributing/langgraph-integration.md) — integración de respaldo para casos límite de modelo/llamada de herramienta +- [operations-runbook.md](ops/operations-runbook.md) — operaciones runtime día-2 y flujos de rollback +- [troubleshooting.md](ops/troubleshooting.md) — firmas de fallo comunes y pasos de recuperación + +### Contribuidores / Mantenedores + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Seguridad / Fiabilidad + +> Nota: esta zona incluye documentos de propuesta/hoja de ruta. Para el comportamiento actual, comience por [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md), y [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Navegación del Sistema y Gobernanza + +- Tabla de contenidos unificada: [SUMMARY.md](SUMMARY.md) +- Mapa de estructura de docs (idioma/sección/función): [structure/README.md](maintainers/structure-README.md) +- Inventario/clasificación de la documentación: [docs-inventory.md](maintainers/docs-inventory.md) +- Instantánea de triaje del proyecto: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Otros idiomas + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.fi.md b/third_party/zeroclaw/docs/README.fi.md new file mode 100644 index 0000000..f2da994 --- /dev/null +++ b/third_party/zeroclaw/docs/README.fi.md @@ -0,0 +1,96 @@ +# ZeroClaw-dokumentaatiokeskus + +Tämä sivu on dokumentaatiojärjestelmän ensisijainen aloituspiste. + +Viimeksi päivitetty: **20. helmikuuta 2026**. + +Lokalisoidut keskukset: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Aloita Tästä + +| Haluan… | Lue tämä | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Asentaa ja ajaa ZeroClaw nopeasti | [README.md (Pikaopas)](../README.md#quick-start) | +| Käynnistys yhdellä komennolla | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Löytää komentoja tehtävän mukaan | [commands-reference.md](reference/cli/commands-reference.md) | +| Tarkistaa nopeasti asetusavaimet ja oletusarvot | [config-reference.md](reference/api/config-reference.md) | +| Määrittää mukautettuja tarjoajia/päätepisteitä | [custom-providers.md](contributing/custom-providers.md) | +| Määrittää Z.AI / GLM -tarjoajan | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Käyttää LangGraph-integrointimalleja | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Käyttää ajonaikaa (päivä-2 runbook) | [operations-runbook.md](ops/operations-runbook.md) | +| Ratkaista asennus-/ajonaika-/kanavaongelmia | [troubleshooting.md](ops/troubleshooting.md) | +| Ajaa Matrix-salattujen huoneiden asetukset ja diagnostiikka | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Selata dokumentaatiota kategorioittain | [SUMMARY.md](SUMMARY.md) | +| Nähdä projektin PR/issue-dokumenttien tilannekuva | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Nopea Päätöspuu (10 sekuntia) + +- Tarvitsetko alkuasennuksen tai -määrityksen? → [setup-guides/README.md](setup-guides/README.md) +- Tarvitsetko tarkat CLI/asetusavaimet? → [reference/README.md](reference/README.md) +- Tarvitsetko tuotanto-/palvelutoimintoja? → [ops/README.md](ops/README.md) +- Näetkö virheitä tai regressioita? → [troubleshooting.md](ops/troubleshooting.md) +- Työskenteletkö tietoturvan koventamisen tai tiekartan parissa? → [security/README.md](security/README.md) +- Työskenteletkö levyjen/oheislaitteiden kanssa? → [hardware/README.md](hardware/README.md) +- Osallistuminen/katselmointi/CI-työnkulku? → [contributing/README.md](contributing/README.md) +- Haluatko täydellisen kartan? → [SUMMARY.md](SUMMARY.md) + +## Kokoelmat (Suositellut) + +- Aloitus: [setup-guides/README.md](setup-guides/README.md) +- Viiteluettelot: [reference/README.md](reference/README.md) +- Toiminta ja käyttöönotto: [ops/README.md](ops/README.md) +- Tietoturvadokumentit: [security/README.md](security/README.md) +- Laitteisto/oheislaitteet: [hardware/README.md](hardware/README.md) +- Osallistuminen/CI: [contributing/README.md](contributing/README.md) +- Projektin tilannekuvat: [maintainers/README.md](maintainers/README.md) + +## Yleisön Mukaan + +### Käyttäjät / Operaattorit + +- [commands-reference.md](reference/cli/commands-reference.md) — komentojen haku työnkulun mukaan +- [providers-reference.md](reference/api/providers-reference.md) — tarjoajien tunnisteet, aliakset, tunnistetietojen ympäristömuuttujat +- [channels-reference.md](reference/api/channels-reference.md) — kanavien ominaisuudet ja asetuspolut +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — Matrix-salattujen huoneiden (E2EE) asetukset ja vastaamattomuuden diagnostiikka +- [config-reference.md](reference/api/config-reference.md) — korkean signaalin asetusavaimet ja turvalliset oletusarvot +- [custom-providers.md](contributing/custom-providers.md) — mukautetun tarjoajan/perus-URL:n integrointimallit +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM-asetukset ja päätepistematriisi +- [langgraph-integration.md](contributing/langgraph-integration.md) — varaintegrointi mallin/työkalukutsun reunatapauksille +- [operations-runbook.md](ops/operations-runbook.md) — ajonaikan päivä-2 toiminnot ja palautustyönkulut +- [troubleshooting.md](ops/troubleshooting.md) — yleiset virhesignatuurit ja palautusaskeleet + +### Osallistujat / Ylläpitäjät + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Tietoturva / Luotettavuus + +> Huomautus: tämä alue sisältää ehdotus-/tiekartadokumentteja. Nykyisestä toiminnasta aloita kohdista [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) ja [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Järjestelmänavigaatio & Hallintotapa + +- Yhtenäinen sisällysluettelo: [SUMMARY.md](SUMMARY.md) +- Dokumenttien rakennekartta (kieli/osio/toiminto): [structure/README.md](maintainers/structure-README.md) +- Dokumentaation inventaario/luokittelu: [docs-inventory.md](maintainers/docs-inventory.md) +- Projektin lajittelun tilannekuva: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Muut kielet + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.fr.md b/third_party/zeroclaw/docs/README.fr.md new file mode 100644 index 0000000..c3ad151 --- /dev/null +++ b/third_party/zeroclaw/docs/README.fr.md @@ -0,0 +1,95 @@ +# Hub de Documentation ZeroClaw + +Cette page est le point d'entrée principal du système de documentation. + +Dernière mise à jour : **20 février 2026**. + +Hubs localisés : [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Commencez Ici + +| Je veux… | Lire ceci | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Installer et exécuter ZeroClaw rapidement | [README.md (Démarrage Rapide)](../README.md#quick-start) | +| Bootstrap en une seule commande | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Trouver des commandes par tâche | [commands-reference.md](reference/cli/commands-reference.md) | +| Vérifier rapidement les valeurs par défaut et clés de config | [config-reference.md](reference/api/config-reference.md) | +| Configurer des fournisseurs/endpoints personnalisés | [custom-providers.md](contributing/custom-providers.md) | +| Configurer le fournisseur Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Utiliser les modèles d'intégration LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Opérer le runtime (runbook jour-2) | [operations-runbook.md](ops/operations-runbook.md) | +| Dépanner les problèmes d'installation/runtime/canal | [troubleshooting.md](ops/troubleshooting.md) | +| Exécuter la configuration et diagnostics de salles chiffrées Matrix | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Parcourir les docs par catégorie | [SUMMARY.md](SUMMARY.md) | +| Voir l'instantané docs des PR/issues du projet | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Arbre de Décision Rapide (10 secondes) + +- Besoin de configuration ou installation initiale ? → [setup-guides/README.md](setup-guides/README.md) +- Besoin de clés CLI/config exactes ? → [reference/README.md](reference/README.md) +- Besoin d'opérations de production/service ? → [ops/README.md](ops/README.md) +- Vous voyez des échecs ou régressions ? → [troubleshooting.md](ops/troubleshooting.md) +- Vous travaillez sur le durcissement sécurité ou la roadmap ? → [security/README.md](security/README.md) +- Vous travaillez avec des cartes/périphériques ? → [hardware/README.md](hardware/README.md) +- Contribution/revue/workflow CI ? → [contributing/README.md](contributing/README.md) +- Vous voulez la carte complète ? → [SUMMARY.md](SUMMARY.md) + +## Collections (Recommandées) + +- Démarrage : [setup-guides/README.md](setup-guides/README.md) +- Catalogues de référence : [reference/README.md](reference/README.md) +- Opérations & déploiement : [ops/README.md](ops/README.md) +- Docs sécurité : [security/README.md](security/README.md) +- Matériel/périphériques : [hardware/README.md](hardware/README.md) +- Contribution/CI : [contributing/README.md](contributing/README.md) +- Instantanés projet : [maintainers/README.md](maintainers/README.md) + +## Par Audience + +### Utilisateurs / Opérateurs + +- [commands-reference.md](reference/cli/commands-reference.md) — recherche de commandes par workflow +- [providers-reference.md](reference/api/providers-reference.md) — IDs fournisseurs, alias, variables d'environnement d'identifiants +- [channels-reference.md](reference/api/channels-reference.md) — capacités des canaux et chemins de configuration +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — configuration de salles chiffrées Matrix (E2EE) et diagnostics de non-réponse +- [config-reference.md](reference/api/config-reference.md) — clés de configuration à haute signalisation et valeurs par défaut sécurisées +- [custom-providers.md](contributing/custom-providers.md) — modèles d'intégration de fournisseur personnalisé/URL de base +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — configuration Z.AI/GLM et matrice d'endpoints +- [langgraph-integration.md](contributing/langgraph-integration.md) — intégration de secours pour les cas limites de modèle/appel d'outil +- [operations-runbook.md](ops/operations-runbook.md) — opérations runtime jour-2 et flux de rollback +- [troubleshooting.md](ops/troubleshooting.md) — signatures d'échec courantes et étapes de récupération + +### Contributeurs / Mainteneurs + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Sécurité / Fiabilité + +> Note : cette zone inclut des docs de proposition/roadmap. Pour le comportement actuel, commencez par [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md), et [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Navigation Système & Gouvernance + +- Table des matières unifiée : [SUMMARY.md](SUMMARY.md) +- Carte de structure docs (langue/partie/fonction) : [structure/README.md](maintainers/structure-README.md) +- Inventaire/classification de la documentation : [docs-inventory.md](maintainers/docs-inventory.md) +- Instantané de triage du projet : [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Autres langues + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.he.md b/third_party/zeroclaw/docs/README.he.md new file mode 100644 index 0000000..1469d8f --- /dev/null +++ b/third_party/zeroclaw/docs/README.he.md @@ -0,0 +1,96 @@ +# מרכז התיעוד של ZeroClaw + +דף זה הוא נקודת הכניסה הראשית למערכת התיעוד. + +עדכון אחרון: **20 בפברואר 2026**. + +מרכזים מתורגמים: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## התחילו כאן + +| אני רוצה… | קראו זאת | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| להתקין ולהריץ את ZeroClaw במהירות | [README.md (התחלה מהירה)](../README.md#quick-start) | +| אתחול בפקודה אחת | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| למצוא פקודות לפי משימה | [commands-reference.md](reference/cli/commands-reference.md) | +| לבדוק במהירות מפתחות ובררות מחדל של הגדרות | [config-reference.md](reference/api/config-reference.md) | +| להגדיר ספקים/נקודות קצה מותאמים אישית | [custom-providers.md](contributing/custom-providers.md) | +| להגדיר את ספק Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| להשתמש בתבניות שילוב LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| להפעיל את סביבת הריצה (runbook יום-2) | [operations-runbook.md](ops/operations-runbook.md) | +| לפתור בעיות התקנה/סביבת ריצה/ערוץ | [troubleshooting.md](ops/troubleshooting.md) | +| להריץ הגדרה ואבחון של חדרים מוצפנים ב-Matrix | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| לדפדף בתיעוד לפי קטגוריה | [SUMMARY.md](SUMMARY.md) | +| לראות תמונת מצב של PR/issues של הפרויקט | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## עץ החלטה מהיר (10 שניות) + +- צריכים הגדרה או התקנה ראשונית? → [setup-guides/README.md](setup-guides/README.md) +- צריכים מפתחות CLI/הגדרות מדויקים? → [reference/README.md](reference/README.md) +- צריכים פעולות ייצור/שירות? → [ops/README.md](ops/README.md) +- רואים כשלים או רגרסיות? → [troubleshooting.md](ops/troubleshooting.md) +- עובדים על הקשחת אבטחה או מפת דרכים? → [security/README.md](security/README.md) +- עובדים עם לוחות/ציוד היקפי? → [hardware/README.md](hardware/README.md) +- תרומה/סקירה/זרימת עבודה CI? → [contributing/README.md](contributing/README.md) +- רוצים את המפה המלאה? → [SUMMARY.md](SUMMARY.md) + +## אוספים (מומלצים) + +- התחלה: [setup-guides/README.md](setup-guides/README.md) +- קטלוגי עיון: [reference/README.md](reference/README.md) +- תפעול ופריסה: [ops/README.md](ops/README.md) +- תיעוד אבטחה: [security/README.md](security/README.md) +- חומרה/ציוד היקפי: [hardware/README.md](hardware/README.md) +- תרומה/CI: [contributing/README.md](contributing/README.md) +- תמונות מצב של הפרויקט: [maintainers/README.md](maintainers/README.md) + +## לפי קהל יעד + +### משתמשים / מפעילים + +- [commands-reference.md](reference/cli/commands-reference.md) — חיפוש פקודות לפי זרימת עבודה +- [providers-reference.md](reference/api/providers-reference.md) — מזהי ספקים, כינויים, משתני סביבה של אישורים +- [channels-reference.md](reference/api/channels-reference.md) — יכולות ערוצים ונתיבי הגדרה +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — הגדרת חדרים מוצפנים ב-Matrix (E2EE) ואבחון אי-תגובה +- [config-reference.md](reference/api/config-reference.md) — מפתחות הגדרה בעלי אות חזק ובררות מחדל בטוחות +- [custom-providers.md](contributing/custom-providers.md) — תבניות שילוב ספק מותאם אישית/URL בסיס +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — הגדרת Z.AI/GLM ומטריצת נקודות קצה +- [langgraph-integration.md](contributing/langgraph-integration.md) — שילוב חלופי למקרי קצה של מודל/קריאת כלי +- [operations-runbook.md](ops/operations-runbook.md) — פעולות סביבת ריצה יום-2 וזרימות שחזור +- [troubleshooting.md](ops/troubleshooting.md) — חתימות כשל נפוצות וצעדי שחזור + +### תורמים / מתחזקים + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### אבטחה / אמינות + +> הערה: אזור זה כולל מסמכי הצעה/מפת דרכים. להתנהגות הנוכחית, התחילו מ-[config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md), ו-[troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## ניווט במערכת וממשל + +- תוכן עניינים מאוחד: [SUMMARY.md](SUMMARY.md) +- מפת מבנה תיעוד (שפה/חלק/פונקציה): [structure/README.md](maintainers/structure-README.md) +- מלאי/סיווג תיעוד: [docs-inventory.md](maintainers/docs-inventory.md) +- תמונת מצב של מיון הפרויקט: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## שפות אחרות + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.hi.md b/third_party/zeroclaw/docs/README.hi.md new file mode 100644 index 0000000..914171b --- /dev/null +++ b/third_party/zeroclaw/docs/README.hi.md @@ -0,0 +1,96 @@ +# ZeroClaw दस्तावेज़ीकरण केंद्र + +यह पृष्ठ दस्तावेज़ीकरण प्रणाली का प्राथमिक प्रवेश बिंदु है। + +अंतिम अपडेट: **20 फरवरी 2026**। + +स्थानीयकृत केंद्र: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## यहाँ से शुरू करें + +| मैं चाहता/चाहती हूँ… | यह पढ़ें | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| ZeroClaw को जल्दी से इंस्टॉल और चलाना | [README.md (त्वरित प्रारंभ)](../README.md#quick-start) | +| एक कमांड में बूटस्ट्रैप | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| कार्य के अनुसार कमांड खोजना | [commands-reference.md](reference/cli/commands-reference.md) | +| कॉन्फ़िग कुंजियों और डिफ़ॉल्ट मानों को जल्दी जाँचना | [config-reference.md](reference/api/config-reference.md) | +| कस्टम प्रदाता/एंडपॉइंट कॉन्फ़िगर करना | [custom-providers.md](contributing/custom-providers.md) | +| Z.AI / GLM प्रदाता कॉन्फ़िगर करना | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| LangGraph एकीकरण पैटर्न का उपयोग करना | [langgraph-integration.md](contributing/langgraph-integration.md) | +| रनटाइम संचालित करना (दिन-2 रनबुक) | [operations-runbook.md](ops/operations-runbook.md) | +| इंस्टॉलेशन/रनटाइम/चैनल समस्याओं का निवारण | [troubleshooting.md](ops/troubleshooting.md) | +| Matrix एन्क्रिप्टेड कमरों का सेटअप और डायग्नोस्टिक्स चलाना | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| श्रेणी के अनुसार दस्तावेज़ ब्राउज़ करना | [SUMMARY.md](SUMMARY.md) | +| प्रोजेक्ट PR/issues दस्तावेज़ स्नैपशॉट देखना | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## त्वरित निर्णय वृक्ष (10 सेकंड) + +- प्रारंभिक सेटअप या इंस्टॉलेशन चाहिए? → [setup-guides/README.md](setup-guides/README.md) +- सटीक CLI/कॉन्फ़िग कुंजियाँ चाहिए? → [reference/README.md](reference/README.md) +- प्रोडक्शन/सर्विस ऑपरेशन चाहिए? → [ops/README.md](ops/README.md) +- विफलताएँ या रिग्रेशन दिख रहे हैं? → [troubleshooting.md](ops/troubleshooting.md) +- सुरक्षा सख्ती या रोडमैप पर काम कर रहे हैं? → [security/README.md](security/README.md) +- बोर्ड/पेरिफेरल्स के साथ काम कर रहे हैं? → [hardware/README.md](hardware/README.md) +- योगदान/समीक्षा/CI वर्कफ़्लो? → [contributing/README.md](contributing/README.md) +- पूरा नक्शा चाहिए? → [SUMMARY.md](SUMMARY.md) + +## संग्रह (अनुशंसित) + +- प्रारंभ: [setup-guides/README.md](setup-guides/README.md) +- संदर्भ सूचियाँ: [reference/README.md](reference/README.md) +- संचालन और तैनाती: [ops/README.md](ops/README.md) +- सुरक्षा दस्तावेज़: [security/README.md](security/README.md) +- हार्डवेयर/पेरिफेरल्स: [hardware/README.md](hardware/README.md) +- योगदान/CI: [contributing/README.md](contributing/README.md) +- प्रोजेक्ट स्नैपशॉट: [maintainers/README.md](maintainers/README.md) + +## दर्शक वर्ग के अनुसार + +### उपयोगकर्ता / ऑपरेटर + +- [commands-reference.md](reference/cli/commands-reference.md) — वर्कफ़्लो के अनुसार कमांड खोज +- [providers-reference.md](reference/api/providers-reference.md) — प्रदाता ID, उपनाम, क्रेडेंशियल पर्यावरण चर +- [channels-reference.md](reference/api/channels-reference.md) — चैनल क्षमताएँ और कॉन्फ़िगरेशन पथ +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — Matrix एन्क्रिप्टेड कमरा (E2EE) सेटअप और गैर-प्रतिक्रिया डायग्नोस्टिक्स +- [config-reference.md](reference/api/config-reference.md) — उच्च-संकेत कॉन्फ़िग कुंजियाँ और सुरक्षित डिफ़ॉल्ट +- [custom-providers.md](contributing/custom-providers.md) — कस्टम प्रदाता/बेस URL एकीकरण पैटर्न +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM सेटअप और एंडपॉइंट मैट्रिक्स +- [langgraph-integration.md](contributing/langgraph-integration.md) — मॉडल/टूल-कॉल एज केस के लिए फ़ॉलबैक एकीकरण +- [operations-runbook.md](ops/operations-runbook.md) — रनटाइम दिन-2 ऑपरेशन और रोलबैक फ़्लो +- [troubleshooting.md](ops/troubleshooting.md) — सामान्य विफलता हस्ताक्षर और पुनर्प्राप्ति चरण + +### योगदानकर्ता / अनुरक्षक + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### सुरक्षा / विश्वसनीयता + +> नोट: इस क्षेत्र में प्रस्ताव/रोडमैप दस्तावेज़ शामिल हैं। वर्तमान व्यवहार के लिए, [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md), और [troubleshooting.md](ops/troubleshooting.md) से शुरू करें। + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## सिस्टम नेविगेशन और शासन + +- एकीकृत विषय सूची: [SUMMARY.md](SUMMARY.md) +- दस्तावेज़ संरचना नक्शा (भाषा/भाग/कार्य): [structure/README.md](maintainers/structure-README.md) +- दस्तावेज़ीकरण सूची/वर्गीकरण: [docs-inventory.md](maintainers/docs-inventory.md) +- प्रोजेक्ट ट्राइएज स्नैपशॉट: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## अन्य भाषाएँ + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.hu.md b/third_party/zeroclaw/docs/README.hu.md new file mode 100644 index 0000000..99a1235 --- /dev/null +++ b/third_party/zeroclaw/docs/README.hu.md @@ -0,0 +1,99 @@ +# ZeroClaw Dokumentációs Központ + +Ez az oldal a dokumentációs rendszer fő belépési pontja. + +Utolsó frissítés: **2026. február 21.** + +Honosított központok: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Kezdje itt + +| Szeretném… | Olvassa el | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Gyorsan telepíteni és futtatni a ZeroClaw-t | [README.md (Gyorsindítás)](../README.md#quick-start) | +| Egylépéses bootstrap | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Frissítés vagy eltávolítás macOS-en | [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) | +| Parancsok keresése feladat szerint | [commands-reference.md](reference/cli/commands-reference.md) | +| Konfigurációs alapértékek és kulcsok gyors ellenőrzése | [config-reference.md](reference/api/config-reference.md) | +| Egyéni szolgáltatók/végpontok beállítása | [custom-providers.md](contributing/custom-providers.md) | +| Z.AI / GLM szolgáltató beállítása | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| LangGraph integrációs minták használata | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Futtatókörnyezet üzemeltetése (2. napi kézikönyv) | [operations-runbook.md](ops/operations-runbook.md) | +| Telepítési/futtatási/csatorna problémák elhárítása | [troubleshooting.md](ops/troubleshooting.md) | +| Matrix titkosított szoba beállítás és diagnosztika futtatása | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Dokumentáció böngészése kategória szerint | [SUMMARY.md](SUMMARY.md) | +| Projekt PR/issue dokumentációs pillanatkép megtekintése | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Gyors Döntési Fa (10 másodperc) + +- Első telepítés vagy beállítás szükséges? → [setup-guides/README.md](setup-guides/README.md) +- Pontos CLI/konfigurációs kulcsok kellenek? → [reference/README.md](reference/README.md) +- Éles/szolgáltatás üzemeltetés szükséges? → [ops/README.md](ops/README.md) +- Hibákat vagy regressziókat tapasztal? → [troubleshooting.md](ops/troubleshooting.md) +- Biztonsági megerősítésen vagy ütemterven dolgozik? → [security/README.md](security/README.md) +- Kártyákkal/perifériákkal dolgozik? → [hardware/README.md](hardware/README.md) +- Hozzájárulás/áttekintés/CI munkafolyamat? → [contributing/README.md](contributing/README.md) +- Teljes térképet szeretne? → [SUMMARY.md](SUMMARY.md) + +## Gyűjtemények (Ajánlott) + +- Első lépések: [setup-guides/README.md](setup-guides/README.md) +- Referencia katalógusok: [reference/README.md](reference/README.md) +- Üzemeltetés és telepítés: [ops/README.md](ops/README.md) +- Biztonsági dokumentáció: [security/README.md](security/README.md) +- Hardver/perifériák: [hardware/README.md](hardware/README.md) +- Hozzájárulás/CI: [contributing/README.md](contributing/README.md) +- Projekt pillanatképek: [maintainers/README.md](maintainers/README.md) + +## Célközönség szerint + +### Felhasználók / Üzemeltetők + +- [commands-reference.md](reference/cli/commands-reference.md) — parancskeresés munkafolyamat szerint +- [providers-reference.md](reference/api/providers-reference.md) — szolgáltató azonosítók, álnevek, hitelesítési környezeti változók +- [channels-reference.md](reference/api/channels-reference.md) — csatorna képességek és beállítási útvonalak +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — Matrix titkosított szoba (E2EE) beállítás és válaszhiány diagnosztika +- [config-reference.md](reference/api/config-reference.md) — kiemelt konfigurációs kulcsok és biztonságos alapértékek +- [custom-providers.md](contributing/custom-providers.md) — egyéni szolgáltató/alap URL integrációs sablonok +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM beállítás és végpont mátrix +- [langgraph-integration.md](contributing/langgraph-integration.md) — tartalék integráció modell/eszközhívás szélsőséges esetekhez +- [operations-runbook.md](ops/operations-runbook.md) — 2. napi futtatókörnyezet üzemeltetés és visszaállítási folyamat +- [troubleshooting.md](ops/troubleshooting.md) — gyakori hibajelek és helyreállítási lépések + +### Közreműködők / Karbantartók + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Biztonság / Megbízhatóság + +> Megjegyzés: ez a terület javaslat/ütemterv dokumentumokat is tartalmaz. A jelenlegi viselkedésért kezdje a [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) és [troubleshooting.md](ops/troubleshooting.md) fájlokkal. + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Rendszernavigáció és Irányítás + +- Egységes tartalomjegyzék: [SUMMARY.md](SUMMARY.md) +- Dokumentáció szerkezeti térkép (nyelv/rész/funkció): [structure/README.md](maintainers/structure-README.md) +- Dokumentáció leltár/osztályozás: [docs-inventory.md](maintainers/docs-inventory.md) +- i18n dokumentáció index: [i18n/README.md](i18n/README.md) +- i18n lefedettségi térkép: [i18n-coverage.md](maintainers/i18n-coverage.md) +- Projekt triage pillanatkép: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Más nyelvek + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.id.md b/third_party/zeroclaw/docs/README.id.md new file mode 100644 index 0000000..0552b7c --- /dev/null +++ b/third_party/zeroclaw/docs/README.id.md @@ -0,0 +1,99 @@ +# Pusat Dokumentasi ZeroClaw + +Halaman ini adalah titik masuk utama untuk sistem dokumentasi. + +Pembaruan terakhir: **21 Februari 2026**. + +Hub terlokalisasi: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Mulai di Sini + +| Saya ingin… | Baca ini | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Menginstal dan menjalankan ZeroClaw dengan cepat | [README.md (Mulai Cepat)](../README.md#quick-start) | +| Bootstrap dalam satu perintah | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Memperbarui atau menghapus di macOS | [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) | +| Mencari perintah berdasarkan tugas | [commands-reference.md](reference/cli/commands-reference.md) | +| Memeriksa default dan kunci konfigurasi dengan cepat | [config-reference.md](reference/api/config-reference.md) | +| Mengonfigurasi penyedia/endpoint kustom | [custom-providers.md](contributing/custom-providers.md) | +| Mengonfigurasi penyedia Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Menggunakan pola integrasi LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Mengoperasikan runtime (buku panduan hari ke-2) | [operations-runbook.md](ops/operations-runbook.md) | +| Memecahkan masalah instalasi/runtime/kanal | [troubleshooting.md](ops/troubleshooting.md) | +| Menjalankan pengaturan ruang terenkripsi Matrix dan diagnostik | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Menjelajahi dokumentasi berdasarkan kategori | [SUMMARY.md](SUMMARY.md) | +| Melihat snapshot dokumen PR/issue proyek | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Pohon Keputusan Cepat (10 detik) + +- Butuh pengaturan atau instalasi pertama kali? → [setup-guides/README.md](setup-guides/README.md) +- Butuh kunci CLI/konfigurasi yang tepat? → [reference/README.md](reference/README.md) +- Butuh operasi produksi/layanan? → [ops/README.md](ops/README.md) +- Melihat kegagalan atau regresi? → [troubleshooting.md](ops/troubleshooting.md) +- Bekerja pada penguatan keamanan atau peta jalan? → [security/README.md](security/README.md) +- Bekerja dengan papan/periferal? → [hardware/README.md](hardware/README.md) +- Kontribusi/review/alur kerja CI? → [contributing/README.md](contributing/README.md) +- Ingin peta lengkap? → [SUMMARY.md](SUMMARY.md) + +## Koleksi (Direkomendasikan) + +- Memulai: [setup-guides/README.md](setup-guides/README.md) +- Katalog referensi: [reference/README.md](reference/README.md) +- Operasi & deployment: [ops/README.md](ops/README.md) +- Dokumentasi keamanan: [security/README.md](security/README.md) +- Perangkat keras/periferal: [hardware/README.md](hardware/README.md) +- Kontribusi/CI: [contributing/README.md](contributing/README.md) +- Snapshot proyek: [maintainers/README.md](maintainers/README.md) + +## Berdasarkan Audiens + +### Pengguna / Operator + +- [commands-reference.md](reference/cli/commands-reference.md) — pencarian perintah berdasarkan alur kerja +- [providers-reference.md](reference/api/providers-reference.md) — ID penyedia, alias, variabel lingkungan kredensial +- [channels-reference.md](reference/api/channels-reference.md) — kemampuan kanal dan jalur pengaturan +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — pengaturan ruang terenkripsi Matrix (E2EE) dan diagnostik tanpa respons +- [config-reference.md](reference/api/config-reference.md) — kunci konfigurasi penting dan default aman +- [custom-providers.md](contributing/custom-providers.md) — template integrasi penyedia kustom/URL dasar +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — pengaturan Z.AI/GLM dan matriks endpoint +- [langgraph-integration.md](contributing/langgraph-integration.md) — integrasi fallback untuk kasus tepi model/pemanggilan alat +- [operations-runbook.md](ops/operations-runbook.md) — operasi runtime hari ke-2 dan alur rollback +- [troubleshooting.md](ops/troubleshooting.md) — tanda kegagalan umum dan langkah pemulihan + +### Kontributor / Pengelola + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Keamanan / Keandalan + +> Catatan: area ini mencakup dokumen proposal/peta jalan. Untuk perilaku saat ini, mulailah dengan [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md), dan [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Navigasi Sistem & Tata Kelola + +- Daftar isi terpadu: [SUMMARY.md](SUMMARY.md) +- Peta struktur dokumentasi (bahasa/bagian/fungsi): [structure/README.md](maintainers/structure-README.md) +- Inventaris/klasifikasi dokumentasi: [docs-inventory.md](maintainers/docs-inventory.md) +- Indeks dokumentasi i18n: [i18n/README.md](i18n/README.md) +- Peta cakupan i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) +- Snapshot triase proyek: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Bahasa lain + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.it.md b/third_party/zeroclaw/docs/README.it.md new file mode 100644 index 0000000..ef5c6a5 --- /dev/null +++ b/third_party/zeroclaw/docs/README.it.md @@ -0,0 +1,99 @@ +# Hub della Documentazione ZeroClaw + +Questa pagina è il punto di ingresso principale del sistema di documentazione. + +Ultimo aggiornamento: **21 febbraio 2026**. + +Hub localizzati: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Inizia Qui + +| Voglio… | Leggi questo | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Installare ed eseguire ZeroClaw rapidamente | [README.md (Avvio Rapido)](../README.md#quick-start) | +| Bootstrap con un singolo comando | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Aggiornare o disinstallare su macOS | [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) | +| Trovare comandi per attività | [commands-reference.md](reference/cli/commands-reference.md) | +| Controllare rapidamente valori predefiniti e chiavi di configurazione | [config-reference.md](reference/api/config-reference.md) | +| Configurare provider/endpoint personalizzati | [custom-providers.md](contributing/custom-providers.md) | +| Configurare il provider Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Usare i pattern di integrazione LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Gestire il runtime (runbook giorno 2) | [operations-runbook.md](ops/operations-runbook.md) | +| Risolvere problemi di installazione/runtime/canale | [troubleshooting.md](ops/troubleshooting.md) | +| Eseguire configurazione e diagnostica delle stanze crittografate Matrix | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Sfogliare la documentazione per categoria | [SUMMARY.md](SUMMARY.md) | +| Vedere lo snapshot dei documenti PR/issue del progetto | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Albero Decisionale Rapido (10 secondi) + +- Serve configurazione o installazione iniziale? → [setup-guides/README.md](setup-guides/README.md) +- Servono chiavi CLI/configurazione esatte? → [reference/README.md](reference/README.md) +- Servono operazioni di produzione/servizio? → [ops/README.md](ops/README.md) +- Si verificano errori o regressioni? → [troubleshooting.md](ops/troubleshooting.md) +- Si lavora sul rafforzamento della sicurezza o sulla roadmap? → [security/README.md](security/README.md) +- Si lavora con schede/periferiche? → [hardware/README.md](hardware/README.md) +- Contribuzione/revisione/workflow CI? → [contributing/README.md](contributing/README.md) +- Vuoi la mappa completa? → [SUMMARY.md](SUMMARY.md) + +## Collezioni (Raccomandate) + +- Per iniziare: [setup-guides/README.md](setup-guides/README.md) +- Cataloghi di riferimento: [reference/README.md](reference/README.md) +- Operazioni e deployment: [ops/README.md](ops/README.md) +- Documentazione sulla sicurezza: [security/README.md](security/README.md) +- Hardware/periferiche: [hardware/README.md](hardware/README.md) +- Contribuzione/CI: [contributing/README.md](contributing/README.md) +- Snapshot del progetto: [maintainers/README.md](maintainers/README.md) + +## Per Pubblico + +### Utenti / Operatori + +- [commands-reference.md](reference/cli/commands-reference.md) — ricerca comandi per workflow +- [providers-reference.md](reference/api/providers-reference.md) — ID provider, alias, variabili d'ambiente per le credenziali +- [channels-reference.md](reference/api/channels-reference.md) — capacità dei canali e percorsi di configurazione +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — configurazione stanze crittografate Matrix (E2EE) e diagnostica mancata risposta +- [config-reference.md](reference/api/config-reference.md) — chiavi di configurazione importanti e valori predefiniti sicuri +- [custom-providers.md](contributing/custom-providers.md) — template di integrazione provider personalizzato/URL base +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — configurazione Z.AI/GLM e matrice degli endpoint +- [langgraph-integration.md](contributing/langgraph-integration.md) — integrazione di fallback per casi limite modello/chiamata strumenti +- [operations-runbook.md](ops/operations-runbook.md) — operazioni runtime giorno 2 e flusso di rollback +- [troubleshooting.md](ops/troubleshooting.md) — firme di errore comuni e passaggi di ripristino + +### Contributori / Manutentori + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Sicurezza / Affidabilità + +> Nota: quest'area include documenti di proposta/roadmap. Per il comportamento attuale, iniziare con [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) e [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Navigazione di Sistema e Governance + +- Indice unificato: [SUMMARY.md](SUMMARY.md) +- Mappa della struttura documentale (lingua/parte/funzione): [structure/README.md](maintainers/structure-README.md) +- Inventario/classificazione della documentazione: [docs-inventory.md](maintainers/docs-inventory.md) +- Indice documentazione i18n: [i18n/README.md](i18n/README.md) +- Mappa di copertura i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) +- Snapshot di triage del progetto: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Altre lingue + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.ja.md b/third_party/zeroclaw/docs/README.ja.md new file mode 100644 index 0000000..3cfd4a3 --- /dev/null +++ b/third_party/zeroclaw/docs/README.ja.md @@ -0,0 +1,92 @@ +# ZeroClaw ドキュメントハブ(日本語) + +このページは日本語のドキュメント入口です。 + +最終同期日: **2026-02-18**。 + +> 注: コマンド名・設定キー・API パスは英語のまま記載します。実装の一次情報は英語版ドキュメントを優先してください。 + +## すぐに参照したい項目 + +| やりたいこと | 参照先 | +|---|---| +| すぐにセットアップしたい | [../README.ja.md](../README.ja.md) / [../README.md](../README.md) | +| ワンコマンドで導入したい | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| コマンドを用途別に確認したい | [commands-reference.md](reference/cli/commands-reference.md) | +| 設定キーと既定値を確認したい | [config-reference.md](reference/api/config-reference.md) | +| カスタム Provider / endpoint を追加したい | [custom-providers.md](contributing/custom-providers.md) | +| Z.AI / GLM Provider を設定したい | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| LangGraph ツール連携を使いたい | [langgraph-integration.md](contributing/langgraph-integration.md) | +| 日常運用(runbook)を確認したい | [operations-runbook.md](ops/operations-runbook.md) | +| インストール/実行トラブルを解決したい | [troubleshooting.md](ops/troubleshooting.md) | +| 統合 TOC から探したい | [SUMMARY.md](SUMMARY.md) | +| PR/Issue の現状を把握したい | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## 10秒ルーティング(まずここ) + +- 初回セットアップや導入をしたい → [setup-guides/README.md](setup-guides/README.md) +- CLI/設定キーを正確に確認したい → [reference/README.md](reference/README.md) +- 本番運用やサービス管理をしたい → [ops/README.md](ops/README.md) +- エラーや不具合を解消したい → [troubleshooting.md](ops/troubleshooting.md) +- セキュリティ方針やロードマップを見たい → [security/README.md](security/README.md) +- ボード/周辺機器を扱いたい → [hardware/README.md](hardware/README.md) +- 貢献・レビュー・CIを確認したい → [contributing/README.md](contributing/README.md) +- 全体マップを見たい → [SUMMARY.md](SUMMARY.md) + +## カテゴリ別ナビゲーション(推奨) + +- 入門: [setup-guides/README.md](setup-guides/README.md) +- リファレンス: [reference/README.md](reference/README.md) +- 運用 / デプロイ: [ops/README.md](ops/README.md) +- セキュリティ: [security/README.md](security/README.md) +- ハードウェア: [hardware/README.md](hardware/README.md) +- コントリビュート / CI: [contributing/README.md](contributing/README.md) +- プロジェクトスナップショット: [maintainers/README.md](maintainers/README.md) + +## ロール別 + +### ユーザー / オペレーター + +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [troubleshooting.md](ops/troubleshooting.md) + +### コントリビューター / メンテナー + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### セキュリティ / 信頼性 + +> 注: このセクションには proposal/roadmap 文書が含まれ、想定段階のコマンドや設定が記載される場合があります。現行動作は [config-reference.md](reference/api/config-reference.md)、[operations-runbook.md](ops/operations-runbook.md)、[troubleshooting.md](ops/troubleshooting.md) を優先してください。 + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +## ドキュメント運用 / 分類 + +- 統合 TOC: [SUMMARY.md](SUMMARY.md) +- ドキュメント構造マップ(言語/カテゴリ/機能): [structure/README.md](maintainers/structure-README.md) +- ドキュメント一覧 / 分類: [docs-inventory.md](maintainers/docs-inventory.md) + +## 他言語 + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.ko.md b/third_party/zeroclaw/docs/README.ko.md new file mode 100644 index 0000000..b315a85 --- /dev/null +++ b/third_party/zeroclaw/docs/README.ko.md @@ -0,0 +1,99 @@ +# ZeroClaw 문서 허브 + +이 페이지는 문서 시스템의 기본 진입점입니다. + +마지막 업데이트: **2026년 2월 21일**. + +현지화된 허브: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## 여기서 시작하세요 + +| 하고 싶은 것… | 이것을 읽으세요 | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| ZeroClaw를 빠르게 설치하고 실행 | [README.md (빠른 시작)](../README.md#quick-start) | +| 한 번의 명령으로 부트스트랩 | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| macOS에서 업데이트 또는 제거 | [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) | +| 작업별 명령어 찾기 | [commands-reference.md](reference/cli/commands-reference.md) | +| 구성 기본값과 키를 빠르게 확인 | [config-reference.md](reference/api/config-reference.md) | +| 사용자 정의 프로바이더/엔드포인트 구성 | [custom-providers.md](contributing/custom-providers.md) | +| Z.AI / GLM 프로바이더 구성 | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| LangGraph 통합 패턴 사용 | [langgraph-integration.md](contributing/langgraph-integration.md) | +| 런타임 운영 (2일차 런북) | [operations-runbook.md](ops/operations-runbook.md) | +| 설치/런타임/채널 문제 해결 | [troubleshooting.md](ops/troubleshooting.md) | +| Matrix 암호화 방 설정 및 진단 실행 | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| 카테고리별 문서 찾아보기 | [SUMMARY.md](SUMMARY.md) | +| 프로젝트 PR/이슈 문서 스냅샷 보기 | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## 빠른 의사결정 트리 (10초) + +- 초기 설정 또는 설치가 필요한가요? → [setup-guides/README.md](setup-guides/README.md) +- 정확한 CLI/구성 키가 필요한가요? → [reference/README.md](reference/README.md) +- 프로덕션/서비스 운영이 필요한가요? → [ops/README.md](ops/README.md) +- 실패 또는 회귀가 발생하고 있나요? → [troubleshooting.md](ops/troubleshooting.md) +- 보안 강화 또는 로드맵 작업 중인가요? → [security/README.md](security/README.md) +- 보드/주변 장치 작업 중인가요? → [hardware/README.md](hardware/README.md) +- 기여/검토/CI 워크플로우? → [contributing/README.md](contributing/README.md) +- 전체 맵이 필요한가요? → [SUMMARY.md](SUMMARY.md) + +## 컬렉션 (권장) + +- 시작하기: [setup-guides/README.md](setup-guides/README.md) +- 참조 카탈로그: [reference/README.md](reference/README.md) +- 운영 및 배포: [ops/README.md](ops/README.md) +- 보안 문서: [security/README.md](security/README.md) +- 하드웨어/주변 장치: [hardware/README.md](hardware/README.md) +- 기여/CI: [contributing/README.md](contributing/README.md) +- 프로젝트 스냅샷: [maintainers/README.md](maintainers/README.md) + +## 대상별 + +### 사용자 / 운영자 + +- [commands-reference.md](reference/cli/commands-reference.md) — 워크플로우별 명령어 검색 +- [providers-reference.md](reference/api/providers-reference.md) — 프로바이더 ID, 별칭, 자격 증명 환경 변수 +- [channels-reference.md](reference/api/channels-reference.md) — 채널 기능 및 설정 경로 +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — Matrix 암호화 방(E2EE) 설정 및 무응답 진단 +- [config-reference.md](reference/api/config-reference.md) — 주요 구성 키 및 보안 기본값 +- [custom-providers.md](contributing/custom-providers.md) — 사용자 정의 프로바이더/기본 URL 통합 템플릿 +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM 설정 및 엔드포인트 매트릭스 +- [langgraph-integration.md](contributing/langgraph-integration.md) — 모델/도구 호출 엣지 케이스를 위한 폴백 통합 +- [operations-runbook.md](ops/operations-runbook.md) — 2일차 런타임 운영 및 롤백 흐름 +- [troubleshooting.md](ops/troubleshooting.md) — 일반적인 실패 시그니처 및 복구 단계 + +### 기여자 / 유지보수자 + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 보안 / 신뢰성 + +> 참고: 이 영역에는 제안/로드맵 문서가 포함되어 있습니다. 현재 동작에 대해서는 [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md), [troubleshooting.md](ops/troubleshooting.md)를 먼저 참조하세요. + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## 시스템 탐색 및 거버넌스 + +- 통합 목차: [SUMMARY.md](SUMMARY.md) +- 문서 구조 맵 (언어/부분/기능): [structure/README.md](maintainers/structure-README.md) +- 문서 인벤토리/분류: [docs-inventory.md](maintainers/docs-inventory.md) +- i18n 문서 색인: [i18n/README.md](i18n/README.md) +- i18n 커버리지 맵: [i18n-coverage.md](maintainers/i18n-coverage.md) +- 프로젝트 트리아지 스냅샷: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## 다른 언어 + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.md b/third_party/zeroclaw/docs/README.md new file mode 100644 index 0000000..eb361fa --- /dev/null +++ b/third_party/zeroclaw/docs/README.md @@ -0,0 +1,91 @@ +# ZeroClaw Documentation Hub + +This page is the primary entry point for the documentation system. + +Last refreshed: **February 21, 2026**. + +Localized hubs: +[العربية](README.ar.md) · [বাংলা](README.bn.md) · [Čeština](README.cs.md) · [Dansk](README.da.md) · [Deutsch](README.de.md) · [Ελληνικά](README.el.md) · [Español](README.es.md) · [Suomi](README.fi.md) · [Français](README.fr.md) · [עברית](README.he.md) · [हिन्दी](README.hi.md) · [Magyar](README.hu.md) · [Bahasa Indonesia](README.id.md) · [Italiano](README.it.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Norsk Bokmål](README.nb.md) · [Nederlands](README.nl.md) · [Polski](README.pl.md) · [Português](README.pt.md) · [Română](README.ro.md) · [Русский](README.ru.md) · [Svenska](README.sv.md) · [ไทย](README.th.md) · [Tagalog](README.tl.md) · [Türkçe](README.tr.md) · [Українська](README.uk.md) · [اردو](README.ur.md) · [Tiếng Việt](README.vi.md) · [简体中文](README.zh-CN.md). + +## Start Here + +| I want to… | Read this | +|---|---| +| Install and run ZeroClaw quickly | [README.md (Quick Start)](../README.md#quick-start) | +| Bootstrap in one command | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Update or uninstall on macOS | [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) | +| Find commands by task | [commands-reference.md](reference/cli/commands-reference.md) | +| Check config defaults and keys quickly | [config-reference.md](reference/api/config-reference.md) | +| Configure custom providers/endpoints | [custom-providers.md](contributing/custom-providers.md) | +| Configure Z.AI / GLM provider | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Use LangGraph integration patterns | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Operate runtime (day-2 runbook) | [operations-runbook.md](ops/operations-runbook.md) | +| Troubleshoot install/runtime/channel issues | [troubleshooting.md](ops/troubleshooting.md) | +| Run Matrix encrypted-room setup and diagnostics | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Browse docs by category | [SUMMARY.md](SUMMARY.md) | +| See project PR/issue docs snapshot | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Quick Decision Tree (10 seconds) + +- Need first-time setup or install? → [setup-guides/README.md](setup-guides/README.md) +- Need exact CLI/config keys? → [reference/README.md](reference/README.md) +- Need production/service operations? → [ops/README.md](ops/README.md) +- Seeing failures or regressions? → [troubleshooting.md](ops/troubleshooting.md) +- Working on security hardening or roadmap? → [security/README.md](security/README.md) +- Working with boards/peripherals? → [hardware/README.md](hardware/README.md) +- Contributing/reviewing/CI workflow? → [contributing/README.md](contributing/README.md) +- Want the full map? → [SUMMARY.md](SUMMARY.md) + +## Collections (Recommended) + +- Getting started: [setup-guides/README.md](setup-guides/README.md) +- Reference catalogs: [reference/README.md](reference/README.md) +- Operations & deployment: [ops/README.md](ops/README.md) +- Security docs: [security/README.md](security/README.md) +- Hardware/peripherals: [hardware/README.md](hardware/README.md) +- Contributing/CI: [contributing/README.md](contributing/README.md) +- Project snapshots: [maintainers/README.md](maintainers/README.md) + +## By Audience + +### Users / Operators + +- [commands-reference.md](reference/cli/commands-reference.md) — command lookup by workflow +- [providers-reference.md](reference/api/providers-reference.md) — provider IDs, aliases, credential env vars +- [channels-reference.md](reference/api/channels-reference.md) — channel capabilities and setup paths +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — Matrix encrypted-room (E2EE) setup and no-response diagnostics +- [config-reference.md](reference/api/config-reference.md) — high-signal config keys and secure defaults +- [custom-providers.md](contributing/custom-providers.md) — custom provider/base URL integration templates +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM setup and endpoint matrix +- [langgraph-integration.md](contributing/langgraph-integration.md) — fallback integration for model/tool-calling edge cases +- [operations-runbook.md](ops/operations-runbook.md) — day-2 runtime operations and rollback flow +- [troubleshooting.md](ops/troubleshooting.md) — common failure signatures and recovery steps + +### Contributors / Maintainers + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Security / Reliability + +> Note: this area includes proposal/roadmap docs. For current behavior, start with [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md), and [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## System Navigation & Governance + +- Unified TOC: [SUMMARY.md](SUMMARY.md) +- Docs structure map (language/part/function): [structure/README.md](maintainers/structure-README.md) +- Documentation inventory/classification: [docs-inventory.md](maintainers/docs-inventory.md) +- i18n docs index: [i18n/README.md](i18n/README.md) +- i18n coverage map: [i18n-coverage.md](maintainers/i18n-coverage.md) +- Project triage snapshot: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) diff --git a/third_party/zeroclaw/docs/README.nb.md b/third_party/zeroclaw/docs/README.nb.md new file mode 100644 index 0000000..c16fee9 --- /dev/null +++ b/third_party/zeroclaw/docs/README.nb.md @@ -0,0 +1,99 @@ +# ZeroClaw Dokumentasjonshub + +Denne siden er hovedinngangen til dokumentasjonssystemet. + +Sist oppdatert: **21. februar 2026**. + +Lokaliserte huber: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Start her + +| Jeg vil… | Les dette | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Installere og kjøre ZeroClaw raskt | [README.md (Hurtigstart)](../README.md#quick-start) | +| Bootstrap med en enkelt kommando | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Oppdatere eller avinstallere på macOS | [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) | +| Finne kommandoer etter oppgave | [commands-reference.md](reference/cli/commands-reference.md) | +| Raskt sjekke konfigurasjonsstandarder og nøkler | [config-reference.md](reference/api/config-reference.md) | +| Konfigurere egendefinerte leverandører/endepunkter | [custom-providers.md](contributing/custom-providers.md) | +| Konfigurere Z.AI / GLM-leverandøren | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Bruke LangGraph-integrasjonsmønstre | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Drifte kjøretidsmiljøet (dag 2-runbook) | [operations-runbook.md](ops/operations-runbook.md) | +| Feilsøke installasjon/kjøretid/kanal-problemer | [troubleshooting.md](ops/troubleshooting.md) | +| Kjøre Matrix-kryptert rom-oppsett og diagnostikk | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Bla gjennom dokumentasjon etter kategori | [SUMMARY.md](SUMMARY.md) | +| Se prosjektets PR/issue-dokumentasjonsøyeblikksbilde | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Raskt beslutningstre (10 sekunder) + +- Trenger førstegangsoppsett eller installasjon? → [setup-guides/README.md](setup-guides/README.md) +- Trenger nøyaktige CLI/konfigurasjonsnøkler? → [reference/README.md](reference/README.md) +- Trenger produksjons-/tjenestedrift? → [ops/README.md](ops/README.md) +- Ser du feil eller regresjoner? → [troubleshooting.md](ops/troubleshooting.md) +- Jobber med sikkerhetsherding eller veikart? → [security/README.md](security/README.md) +- Jobber med kort/periferiutstyr? → [hardware/README.md](hardware/README.md) +- Bidrag/gjennomgang/CI-arbeidsflyt? → [contributing/README.md](contributing/README.md) +- Vil du ha det fullstendige kartet? → [SUMMARY.md](SUMMARY.md) + +## Samlinger (Anbefalt) + +- Kom i gang: [setup-guides/README.md](setup-guides/README.md) +- Referansekataloger: [reference/README.md](reference/README.md) +- Drift og utrulling: [ops/README.md](ops/README.md) +- Sikkerhetsdokumentasjon: [security/README.md](security/README.md) +- Maskinvare/periferiutstyr: [hardware/README.md](hardware/README.md) +- Bidrag/CI: [contributing/README.md](contributing/README.md) +- Prosjektøyeblikksbilder: [maintainers/README.md](maintainers/README.md) + +## Etter målgruppe + +### Brukere / Operatører + +- [commands-reference.md](reference/cli/commands-reference.md) — kommandooppslag etter arbeidsflyt +- [providers-reference.md](reference/api/providers-reference.md) — leverandør-IDer, aliaser, legitimasjonsmiljøvariabler +- [channels-reference.md](reference/api/channels-reference.md) — kanalegenskaper og oppsettstier +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — Matrix kryptert rom (E2EE)-oppsett og diagnostikk for manglende svar +- [config-reference.md](reference/api/config-reference.md) — viktige konfigurasjonsnøkler og sikre standardverdier +- [custom-providers.md](contributing/custom-providers.md) — maler for egendefinert leverandør/basis-URL-integrasjon +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM-oppsett og endepunktmatrise +- [langgraph-integration.md](contributing/langgraph-integration.md) — reserveintegrasjon for modell/verktøykall-grensetilfeller +- [operations-runbook.md](ops/operations-runbook.md) — dag 2 kjøretidsdrift og tilbakestillingsflyt +- [troubleshooting.md](ops/troubleshooting.md) — vanlige feilsignaturer og gjenopprettingstrinn + +### Bidragsytere / Vedlikeholdere + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Sikkerhet / Pålitelighet + +> Merk: dette området inkluderer forslags-/veikartdokumenter. For nåværende oppførsel, start med [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) og [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Systemnavigasjon og styring + +- Samlet innholdsfortegnelse: [SUMMARY.md](SUMMARY.md) +- Dokumentasjonsstrukturkart (språk/del/funksjon): [structure/README.md](maintainers/structure-README.md) +- Dokumentasjonsinventar/klassifisering: [docs-inventory.md](maintainers/docs-inventory.md) +- i18n-dokumentasjonsindeks: [i18n/README.md](i18n/README.md) +- i18n-dekningskart: [i18n-coverage.md](maintainers/i18n-coverage.md) +- Prosjekttriageringsøyeblikksbilde: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Andre språk + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.nl.md b/third_party/zeroclaw/docs/README.nl.md new file mode 100644 index 0000000..1473600 --- /dev/null +++ b/third_party/zeroclaw/docs/README.nl.md @@ -0,0 +1,96 @@ +# ZeroClaw Documentatiehub + +Deze pagina is het primaire toegangspunt voor het documentatiesysteem. + +Laatst bijgewerkt: **20 februari 2026**. + +Gelokaliseerde hubs: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Begin Hier + +| Ik wil… | Lees dit | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| ZeroClaw snel installeren en uitvoeren | [README.md (Snelle Start)](../README.md#quick-start) | +| Bootstrap met één commando | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Commando's zoeken op taak | [commands-reference.md](reference/cli/commands-reference.md) | +| Snel configuratiesleutels en standaardwaarden controleren | [config-reference.md](reference/api/config-reference.md) | +| Aangepaste providers/endpoints configureren | [custom-providers.md](contributing/custom-providers.md) | +| Z.AI / GLM-provider instellen | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| LangGraph-integratiepatronen gebruiken | [langgraph-integration.md](contributing/langgraph-integration.md) | +| De runtime beheren (dag-2 runbook) | [operations-runbook.md](ops/operations-runbook.md) | +| Installatie-/runtime-/kanaalproblemen oplossen | [troubleshooting.md](ops/troubleshooting.md) | +| Matrix versleutelde ruimtes configureren en diagnosticeren | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Documentatie per categorie bekijken | [SUMMARY.md](SUMMARY.md) | +| Docs-momentopname van project-PR's/issues bekijken | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Snelle Beslisboom (10 seconden) + +- Eerste installatie of configuratie nodig? → [setup-guides/README.md](setup-guides/README.md) +- Exacte CLI-/configuratiesleutels nodig? → [reference/README.md](reference/README.md) +- Productie-/servicebeheer nodig? → [ops/README.md](ops/README.md) +- Fouten of regressies? → [troubleshooting.md](ops/troubleshooting.md) +- Bezig met beveiligingsverharding of roadmap? → [security/README.md](security/README.md) +- Werken met boards/randapparatuur? → [hardware/README.md](hardware/README.md) +- Bijdrage/review/CI-workflow? → [contributing/README.md](contributing/README.md) +- De volledige kaart bekijken? → [SUMMARY.md](SUMMARY.md) + +## Collecties (Aanbevolen) + +- Aan de slag: [setup-guides/README.md](setup-guides/README.md) +- Referentiecatalogi: [reference/README.md](reference/README.md) +- Beheer & implementatie: [ops/README.md](ops/README.md) +- Beveiligingsdocs: [security/README.md](security/README.md) +- Hardware/randapparatuur: [hardware/README.md](hardware/README.md) +- Bijdrage/CI: [contributing/README.md](contributing/README.md) +- Projectmomentopnamen: [maintainers/README.md](maintainers/README.md) + +## Per Doelgroep + +### Gebruikers / Beheerders + +- [commands-reference.md](reference/cli/commands-reference.md) — commando's zoeken op workflow +- [providers-reference.md](reference/api/providers-reference.md) — provider-ID's, aliassen, omgevingsvariabelen voor inloggegevens +- [channels-reference.md](reference/api/channels-reference.md) — kanaalmogelijkheden en configuratiepaden +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — Matrix versleutelde ruimtes (E2EE) instellen en diagnostiek bij geen reactie +- [config-reference.md](reference/api/config-reference.md) — configuratiesleutels met hoog belang en veilige standaardwaarden +- [custom-providers.md](contributing/custom-providers.md) — integratie-patronen voor aangepaste providers/basis-URL +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM-configuratie en endpointmatrix +- [langgraph-integration.md](contributing/langgraph-integration.md) — fallback-integratie voor model-/toolaanroep-randgevallen +- [operations-runbook.md](ops/operations-runbook.md) — dag-2 runtime-operaties en rollbackflows +- [troubleshooting.md](ops/troubleshooting.md) — veelvoorkomende foutpatronen en herstelstappen + +### Bijdragers / Beheerders + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Beveiliging / Betrouwbaarheid + +> Opmerking: dit gedeelte bevat voorstel-/roadmapdocumenten. Voor het huidige gedrag, begin met [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) en [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Systeemnavigatie & Governance + +- Uniforme inhoudsopgave: [SUMMARY.md](SUMMARY.md) +- Documentatiestructuurkaart (taal/deel/functie): [structure/README.md](maintainers/structure-README.md) +- Documentatie-inventaris/-classificatie: [docs-inventory.md](maintainers/docs-inventory.md) +- Projecttriage-momentopname: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Andere talen + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.pl.md b/third_party/zeroclaw/docs/README.pl.md new file mode 100644 index 0000000..d18d5ab --- /dev/null +++ b/third_party/zeroclaw/docs/README.pl.md @@ -0,0 +1,96 @@ +# Centrum Dokumentacji ZeroClaw + +Ta strona jest głównym punktem wejścia do systemu dokumentacji. + +Ostatnia aktualizacja: **20 lutego 2026**. + +Zlokalizowane centra: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Zacznij tutaj + +| Chcę… | Przeczytaj to | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Szybko zainstalować i uruchomić ZeroClaw | [README.md (Szybki Start)](../README.md#quick-start) | +| Bootstrap jednym poleceniem | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Znaleźć polecenia według zadania | [commands-reference.md](reference/cli/commands-reference.md) | +| Szybko sprawdzić klucze konfiguracji i wartości domyślne | [config-reference.md](reference/api/config-reference.md) | +| Skonfigurować niestandardowych dostawców/endpointy | [custom-providers.md](contributing/custom-providers.md) | +| Skonfigurować dostawcę Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Użyć wzorców integracji LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Zarządzać środowiskiem uruchomieniowym (runbook dzień-2) | [operations-runbook.md](ops/operations-runbook.md) | +| Rozwiązać problemy z instalacją/runtime/kanałami | [troubleshooting.md](ops/troubleshooting.md) | +| Skonfigurować i zdiagnozować szyfrowane pokoje Matrix | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Przeglądać dokumentację według kategorii | [SUMMARY.md](SUMMARY.md) | +| Zobaczyć migawkę dokumentacji PR-ów/issues projektu | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Szybkie Drzewo Decyzyjne (10 sekund) + +- Potrzebujesz pierwszej instalacji lub konfiguracji? → [setup-guides/README.md](setup-guides/README.md) +- Potrzebujesz dokładnych kluczy CLI/konfiguracji? → [reference/README.md](reference/README.md) +- Potrzebujesz operacji produkcyjnych/serwisowych? → [ops/README.md](ops/README.md) +- Widzisz błędy lub regresje? → [troubleshooting.md](ops/troubleshooting.md) +- Pracujesz nad wzmocnieniem bezpieczeństwa lub mapą drogową? → [security/README.md](security/README.md) +- Pracujesz z płytkami/peryferiami? → [hardware/README.md](hardware/README.md) +- Kontrybuowanie/recenzja/workflow CI? → [contributing/README.md](contributing/README.md) +- Chcesz zobaczyć pełną mapę? → [SUMMARY.md](SUMMARY.md) + +## Kolekcje (Zalecane) + +- Rozpoczęcie pracy: [setup-guides/README.md](setup-guides/README.md) +- Katalogi referencyjne: [reference/README.md](reference/README.md) +- Operacje i wdrożenie: [ops/README.md](ops/README.md) +- Dokumentacja bezpieczeństwa: [security/README.md](security/README.md) +- Hardware/peryferia: [hardware/README.md](hardware/README.md) +- Kontrybuowanie/CI: [contributing/README.md](contributing/README.md) +- Migawki projektu: [maintainers/README.md](maintainers/README.md) + +## Według Odbiorców + +### Użytkownicy / Operatorzy + +- [commands-reference.md](reference/cli/commands-reference.md) — wyszukiwanie poleceń według workflow +- [providers-reference.md](reference/api/providers-reference.md) — ID dostawców, aliasy, zmienne środowiskowe uwierzytelniania +- [channels-reference.md](reference/api/channels-reference.md) — możliwości kanałów i ścieżki konfiguracji +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — konfiguracja szyfrowanych pokojów Matrix (E2EE) i diagnostyka braku odpowiedzi +- [config-reference.md](reference/api/config-reference.md) — klucze konfiguracji o wysokim znaczeniu i bezpieczne wartości domyślne +- [custom-providers.md](contributing/custom-providers.md) — wzorce integracji niestandardowych dostawców/bazowego URL +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — konfiguracja Z.AI/GLM i matryca endpointów +- [langgraph-integration.md](contributing/langgraph-integration.md) — integracja awaryjna dla przypadków brzegowych modelu/wywołania narzędzi +- [operations-runbook.md](ops/operations-runbook.md) — operacje runtime dzień-2 i przepływy rollbacku +- [troubleshooting.md](ops/troubleshooting.md) — typowe sygnatury błędów i kroki odzyskiwania + +### Kontrybutorzy / Opiekunowie + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Bezpieczeństwo / Niezawodność + +> Uwaga: ta sekcja zawiera dokumenty propozycji/mapy drogowej. Dla aktualnego zachowania zacznij od [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) i [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Nawigacja Systemowa i Zarządzanie + +- Ujednolicony spis treści: [SUMMARY.md](SUMMARY.md) +- Mapa struktury dokumentacji (język/część/funkcja): [structure/README.md](maintainers/structure-README.md) +- Inwentarz/klasyfikacja dokumentacji: [docs-inventory.md](maintainers/docs-inventory.md) +- Migawka triażu projektu: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Inne języki + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.pt.md b/third_party/zeroclaw/docs/README.pt.md new file mode 100644 index 0000000..510067b --- /dev/null +++ b/third_party/zeroclaw/docs/README.pt.md @@ -0,0 +1,96 @@ +# Centro de Documentação ZeroClaw + +Esta página é o ponto de entrada principal do sistema de documentação. + +Última atualização: **20 de fevereiro de 2026**. + +Centros localizados: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Comece Aqui + +| Eu quero… | Leia isto | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Instalar e executar o ZeroClaw rapidamente | [README.md (Início Rápido)](../README.md#quick-start) | +| Bootstrap com um único comando | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Encontrar comandos por tarefa | [commands-reference.md](reference/cli/commands-reference.md) | +| Verificar rapidamente chaves de configuração e valores padrão | [config-reference.md](reference/api/config-reference.md) | +| Configurar provedores/endpoints personalizados | [custom-providers.md](contributing/custom-providers.md) | +| Configurar o provedor Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Usar padrões de integração LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Operar o runtime (runbook dia-2) | [operations-runbook.md](ops/operations-runbook.md) | +| Resolver problemas de instalação/runtime/canal | [troubleshooting.md](ops/troubleshooting.md) | +| Configurar e diagnosticar salas criptografadas Matrix | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Navegar na documentação por categoria | [SUMMARY.md](SUMMARY.md) | +| Ver instantâneo de docs de PRs/issues do projeto | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Árvore de Decisão Rápida (10 segundos) + +- Precisa de instalação ou configuração inicial? → [setup-guides/README.md](setup-guides/README.md) +- Precisa de chaves CLI/configuração exatas? → [reference/README.md](reference/README.md) +- Precisa de operações de produção/serviço? → [ops/README.md](ops/README.md) +- Vê falhas ou regressões? → [troubleshooting.md](ops/troubleshooting.md) +- Trabalhando em endurecimento de segurança ou roadmap? → [security/README.md](security/README.md) +- Trabalhando com placas/periféricos? → [hardware/README.md](hardware/README.md) +- Contribuição/revisão/workflow CI? → [contributing/README.md](contributing/README.md) +- Quer o mapa completo? → [SUMMARY.md](SUMMARY.md) + +## Coleções (Recomendadas) + +- Primeiros passos: [setup-guides/README.md](setup-guides/README.md) +- Catálogos de referência: [reference/README.md](reference/README.md) +- Operações e implantação: [ops/README.md](ops/README.md) +- Documentação de segurança: [security/README.md](security/README.md) +- Hardware/periféricos: [hardware/README.md](hardware/README.md) +- Contribuição/CI: [contributing/README.md](contributing/README.md) +- Instantâneos do projeto: [maintainers/README.md](maintainers/README.md) + +## Por Público + +### Usuários / Operadores + +- [commands-reference.md](reference/cli/commands-reference.md) — busca de comandos por workflow +- [providers-reference.md](reference/api/providers-reference.md) — IDs de provedores, aliases, variáveis de ambiente de credenciais +- [channels-reference.md](reference/api/channels-reference.md) — capacidades dos canais e caminhos de configuração +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — configuração de salas criptografadas Matrix (E2EE) e diagnóstico de não resposta +- [config-reference.md](reference/api/config-reference.md) — chaves de configuração de alto sinal e valores padrão seguros +- [custom-providers.md](contributing/custom-providers.md) — padrões de integração de provedor personalizado/URL base +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — configuração Z.AI/GLM e matriz de endpoints +- [langgraph-integration.md](contributing/langgraph-integration.md) — integração de fallback para casos extremos de modelo/chamada de ferramenta +- [operations-runbook.md](ops/operations-runbook.md) — operações runtime dia-2 e fluxos de rollback +- [troubleshooting.md](ops/troubleshooting.md) — assinaturas de falha comuns e etapas de recuperação + +### Contribuidores / Mantenedores + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Segurança / Confiabilidade + +> Nota: esta seção inclui documentos de proposta/roadmap. Para o comportamento atual, comece com [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) e [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Navegação do Sistema e Governança + +- Índice unificado: [SUMMARY.md](SUMMARY.md) +- Mapa da estrutura de docs (idioma/parte/função): [structure/README.md](maintainers/structure-README.md) +- Inventário/classificação da documentação: [docs-inventory.md](maintainers/docs-inventory.md) +- Instantâneo de triagem do projeto: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Outros idiomas + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.ro.md b/third_party/zeroclaw/docs/README.ro.md new file mode 100644 index 0000000..fc4554e --- /dev/null +++ b/third_party/zeroclaw/docs/README.ro.md @@ -0,0 +1,96 @@ +# Centrul de Documentație ZeroClaw + +Această pagină este punctul de intrare principal al sistemului de documentație. + +Ultima actualizare: **20 februarie 2026**. + +Centre localizate: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Începeți Aici + +| Vreau să… | Citiți aceasta | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Instalez și rulez ZeroClaw rapid | [README.md (Start Rapid)](../README.md#quick-start) | +| Bootstrap cu o singură comandă | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Găsesc comenzi după sarcină | [commands-reference.md](reference/cli/commands-reference.md) | +| Verific rapid cheile de configurare și valorile implicite | [config-reference.md](reference/api/config-reference.md) | +| Configurez furnizori/endpoint-uri personalizate | [custom-providers.md](contributing/custom-providers.md) | +| Configurez furnizorul Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Folosesc modelele de integrare LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Administrez runtime-ul (runbook ziua-2) | [operations-runbook.md](ops/operations-runbook.md) | +| Depanez probleme de instalare/runtime/canal | [troubleshooting.md](ops/troubleshooting.md) | +| Configurez și diagnostichez camerele criptate Matrix | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Navighez documentația pe categorii | [SUMMARY.md](SUMMARY.md) | +| Văd instantaneul documentației PR-urilor/issue-urilor proiectului | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Arbore de Decizie Rapid (10 secunde) + +- Aveți nevoie de instalare sau configurare inițială? → [setup-guides/README.md](setup-guides/README.md) +- Aveți nevoie de chei CLI/configurare exacte? → [reference/README.md](reference/README.md) +- Aveți nevoie de operațiuni de producție/serviciu? → [ops/README.md](ops/README.md) +- Vedeți erori sau regresii? → [troubleshooting.md](ops/troubleshooting.md) +- Lucrați la consolidarea securității sau foaia de parcurs? → [security/README.md](security/README.md) +- Lucrați cu plăci/periferice? → [hardware/README.md](hardware/README.md) +- Contribuție/recenzie/workflow CI? → [contributing/README.md](contributing/README.md) +- Doriți harta completă? → [SUMMARY.md](SUMMARY.md) + +## Colecții (Recomandate) + +- Primii pași: [setup-guides/README.md](setup-guides/README.md) +- Cataloage de referință: [reference/README.md](reference/README.md) +- Operațiuni și implementare: [ops/README.md](ops/README.md) +- Documentație de securitate: [security/README.md](security/README.md) +- Hardware/periferice: [hardware/README.md](hardware/README.md) +- Contribuție/CI: [contributing/README.md](contributing/README.md) +- Instantanee ale proiectului: [maintainers/README.md](maintainers/README.md) + +## După Public + +### Utilizatori / Operatori + +- [commands-reference.md](reference/cli/commands-reference.md) — căutare comenzi după workflow +- [providers-reference.md](reference/api/providers-reference.md) — ID-uri furnizori, aliasuri, variabile de mediu pentru acreditări +- [channels-reference.md](reference/api/channels-reference.md) — capacitățile canalelor și căile de configurare +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — configurarea camerelor criptate Matrix (E2EE) și diagnosticarea lipsei de răspuns +- [config-reference.md](reference/api/config-reference.md) — chei de configurare cu semnal ridicat și valori implicite sigure +- [custom-providers.md](contributing/custom-providers.md) — modele de integrare furnizor personalizat/URL de bază +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — configurare Z.AI/GLM și matricea endpoint-urilor +- [langgraph-integration.md](contributing/langgraph-integration.md) — integrare de rezervă pentru cazurile limită ale modelului/apelului de instrumente +- [operations-runbook.md](ops/operations-runbook.md) — operațiuni runtime ziua-2 și fluxuri de rollback +- [troubleshooting.md](ops/troubleshooting.md) — semnături de erori comune și pași de recuperare + +### Contribuitori / Întreținători + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Securitate / Fiabilitate + +> Notă: această secțiune include documente de propunere/foaie de parcurs. Pentru comportamentul actual, începeți cu [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) și [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Navigare în Sistem și Guvernanță + +- Cuprins unificat: [SUMMARY.md](SUMMARY.md) +- Harta structurii documentației (limbă/parte/funcție): [structure/README.md](maintainers/structure-README.md) +- Inventar/clasificare a documentației: [docs-inventory.md](maintainers/docs-inventory.md) +- Instantaneu de triaj al proiectului: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Alte limbi + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.ru.md b/third_party/zeroclaw/docs/README.ru.md new file mode 100644 index 0000000..2b63e96 --- /dev/null +++ b/third_party/zeroclaw/docs/README.ru.md @@ -0,0 +1,92 @@ +# Документация ZeroClaw (Русский) + +Эта страница — русскоязычная точка входа в документацию. + +Последняя синхронизация: **2026-02-18**. + +> Примечание: команды, ключи конфигурации и API-пути сохраняются на английском. Для первоисточника ориентируйтесь на англоязычные документы. + +## Быстрые ссылки + +| Что нужно | Куда смотреть | +|---|---| +| Быстро установить и запустить | [../README.ru.md](../README.ru.md) / [../README.md](../README.md) | +| Установить одной командой | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Найти команды по задаче | [commands-reference.md](reference/cli/commands-reference.md) | +| Проверить ключи конфигурации и дефолты | [config-reference.md](reference/api/config-reference.md) | +| Подключить кастомный provider / endpoint | [custom-providers.md](contributing/custom-providers.md) | +| Настроить provider Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Использовать интеграцию LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Операционный runbook (day-2) | [operations-runbook.md](ops/operations-runbook.md) | +| Быстро устранить типовые проблемы | [troubleshooting.md](ops/troubleshooting.md) | +| Открыть общий TOC docs | [SUMMARY.md](SUMMARY.md) | +| Посмотреть snapshot PR/Issue | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Дерево решений на 10 секунд + +- Нужна первая установка и быстрый старт → [setup-guides/README.md](setup-guides/README.md) +- Нужны точные команды и ключи конфигурации → [reference/README.md](reference/README.md) +- Нужны операции/сервисный режим/деплой → [ops/README.md](ops/README.md) +- Есть ошибки, сбои или регрессии → [troubleshooting.md](ops/troubleshooting.md) +- Нужны материалы по безопасности и roadmap → [security/README.md](security/README.md) +- Работаете с платами и периферией → [hardware/README.md](hardware/README.md) +- Нужны процессы вклада, ревью и CI → [contributing/README.md](contributing/README.md) +- Нужна полная карта docs → [SUMMARY.md](SUMMARY.md) + +## Навигация по категориям (рекомендуется) + +- Старт и установка: [setup-guides/README.md](setup-guides/README.md) +- Справочники: [reference/README.md](reference/README.md) +- Операции и деплой: [ops/README.md](ops/README.md) +- Безопасность: [security/README.md](security/README.md) +- Аппаратная часть: [hardware/README.md](hardware/README.md) +- Вклад и CI: [contributing/README.md](contributing/README.md) +- Снимки проекта: [maintainers/README.md](maintainers/README.md) + +## По ролям + +### Пользователи / Операторы + +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [troubleshooting.md](ops/troubleshooting.md) + +### Контрибьюторы / Мейнтейнеры + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Безопасность / Надёжность + +> Примечание: часть документов в этом разделе относится к proposal/roadmap и может содержать гипотетические команды/конфигурации. Для текущего поведения сначала смотрите [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md), [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Инвентаризация и структура docs + +- Единый TOC: [SUMMARY.md](SUMMARY.md) +- Карта структуры docs (язык/раздел/функция): [structure/README.md](maintainers/structure-README.md) +- Инвентарь и классификация docs: [docs-inventory.md](maintainers/docs-inventory.md) + +## Другие языки + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.sv.md b/third_party/zeroclaw/docs/README.sv.md new file mode 100644 index 0000000..f48b0c9 --- /dev/null +++ b/third_party/zeroclaw/docs/README.sv.md @@ -0,0 +1,96 @@ +# ZeroClaw Dokumentationshubb + +Denna sida är den primära ingångspunkten för dokumentationssystemet. + +Senast uppdaterad: **20 februari 2026**. + +Lokaliserade hubbar: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Börja Här + +| Jag vill… | Läs detta | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Installera och köra ZeroClaw snabbt | [README.md (Snabbstart)](../README.md#quick-start) | +| Bootstrap med ett enda kommando | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Hitta kommandon efter uppgift | [commands-reference.md](reference/cli/commands-reference.md) | +| Snabbt kontrollera konfigurationsnycklar och standardvärden | [config-reference.md](reference/api/config-reference.md) | +| Konfigurera anpassade leverantörer/endpoints | [custom-providers.md](contributing/custom-providers.md) | +| Konfigurera Z.AI / GLM-leverantören | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Använda LangGraph-integrationsmönster | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Hantera runtime (dag-2 runbook) | [operations-runbook.md](ops/operations-runbook.md) | +| Felsöka installations-/runtime-/kanalproblem | [troubleshooting.md](ops/troubleshooting.md) | +| Konfigurera och diagnostisera krypterade Matrix-rum | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Bläddra i dokumentation efter kategori | [SUMMARY.md](SUMMARY.md) | +| Se dokumentationsöversikt för projektets PR:er/issues | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Snabbt Beslutsträd (10 sekunder) + +- Behöver initial installation eller konfiguration? → [setup-guides/README.md](setup-guides/README.md) +- Behöver exakta CLI-/konfigurationsnycklar? → [reference/README.md](reference/README.md) +- Behöver produktions-/tjänsteoperationer? → [ops/README.md](ops/README.md) +- Ser du fel eller regressioner? → [troubleshooting.md](ops/troubleshooting.md) +- Arbetar med säkerhetshärdning eller färdplan? → [security/README.md](security/README.md) +- Arbetar med kort/kringutrustning? → [hardware/README.md](hardware/README.md) +- Bidrag/granskning/CI-arbetsflöde? → [contributing/README.md](contributing/README.md) +- Vill du se hela kartan? → [SUMMARY.md](SUMMARY.md) + +## Samlingar (Rekommenderade) + +- Kom igång: [setup-guides/README.md](setup-guides/README.md) +- Referenskataloger: [reference/README.md](reference/README.md) +- Drift och driftsättning: [ops/README.md](ops/README.md) +- Säkerhetsdokumentation: [security/README.md](security/README.md) +- Hårdvara/kringutrustning: [hardware/README.md](hardware/README.md) +- Bidrag/CI: [contributing/README.md](contributing/README.md) +- Projektögonblicksbilder: [maintainers/README.md](maintainers/README.md) + +## Per Målgrupp + +### Användare / Operatörer + +- [commands-reference.md](reference/cli/commands-reference.md) — sök kommandon efter arbetsflöde +- [providers-reference.md](reference/api/providers-reference.md) — leverantörs-ID:n, alias, miljövariabler för autentiseringsuppgifter +- [channels-reference.md](reference/api/channels-reference.md) — kanalkapaciteter och konfigurationsvägar +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — konfiguration av krypterade Matrix-rum (E2EE) och diagnostik vid uteblivet svar +- [config-reference.md](reference/api/config-reference.md) — konfigurationsnycklar med hög signalstyrka och säkra standardvärden +- [custom-providers.md](contributing/custom-providers.md) — integrationsmönster för anpassad leverantör/bas-URL +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM-konfiguration och endpointmatris +- [langgraph-integration.md](contributing/langgraph-integration.md) — reservintegration för modell-/verktygsanropsspecialfall +- [operations-runbook.md](ops/operations-runbook.md) — dag-2 runtime-operationer och rollback-flöden +- [troubleshooting.md](ops/troubleshooting.md) — vanliga felmönster och återställningssteg + +### Bidragsgivare / Underhållare + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Säkerhet / Tillförlitlighet + +> Observera: denna sektion innehåller förslags-/färdplansdokument. För aktuellt beteende, börja med [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) och [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Systemnavigering och Styrning + +- Enhetlig innehållsförteckning: [SUMMARY.md](SUMMARY.md) +- Dokumentationsstrukturkarta (språk/del/funktion): [structure/README.md](maintainers/structure-README.md) +- Dokumentationsinventering/-klassificering: [docs-inventory.md](maintainers/docs-inventory.md) +- Projekttriageringsögonblicksbild: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Andra språk + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.th.md b/third_party/zeroclaw/docs/README.th.md new file mode 100644 index 0000000..56fde95 --- /dev/null +++ b/third_party/zeroclaw/docs/README.th.md @@ -0,0 +1,96 @@ +# ศูนย์กลางเอกสาร ZeroClaw + +หน้านี้เป็นจุดเริ่มต้นหลักของระบบเอกสาร + +อัปเดตล่าสุด: **21 กุมภาพันธ์ 2026** + +ศูนย์กลางภาษาต่าง ๆ: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## เริ่มต้นที่นี่ + +| ฉันต้องการ… | อ่านสิ่งนี้ | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| ติดตั้งและรัน ZeroClaw อย่างรวดเร็ว | [README.md (เริ่มต้นอย่างรวดเร็ว)](../README.md#quick-start) | +| ติดตั้งด้วยคำสั่งเดียว | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| ค้นหาคำสั่งตามงาน | [commands-reference.md](reference/cli/commands-reference.md) | +| ตรวจสอบคีย์และค่าเริ่มต้นของการตั้งค่าอย่างรวดเร็ว | [config-reference.md](reference/api/config-reference.md) | +| ตั้งค่าผู้ให้บริการ/endpoint แบบกำหนดเอง | [custom-providers.md](contributing/custom-providers.md) | +| ตั้งค่าผู้ให้บริการ Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| ใช้รูปแบบการรวม LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| ดำเนินงาน runtime (คู่มือปฏิบัติการวันที่ 2) | [operations-runbook.md](ops/operations-runbook.md) | +| แก้ไขปัญหาการติดตั้ง/runtime/ช่องทาง | [troubleshooting.md](ops/troubleshooting.md) | +| รันการตั้งค่าและวินิจฉัยห้อง Matrix แบบเข้ารหัส | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| เรียกดูเอกสารตามหมวดหมู่ | [SUMMARY.md](SUMMARY.md) | +| ดูสแนปช็อตเอกสาร PR/issue ของโปรเจกต์ | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## แผนผังการตัดสินใจอย่างรวดเร็ว (10 วินาที) + +- ต้องการการตั้งค่าหรือการติดตั้งเบื้องต้น? → [setup-guides/README.md](setup-guides/README.md) +- ต้องการคีย์ CLI/config ที่แน่นอน? → [reference/README.md](reference/README.md) +- ต้องการการดำเนินงานระดับโปรดักชัน/เซอร์วิส? → [ops/README.md](ops/README.md) +- พบความล้มเหลวหรือการถดถอย? → [troubleshooting.md](ops/troubleshooting.md) +- ทำงานเกี่ยวกับการเสริมความปลอดภัยหรือแผนงาน? → [security/README.md](security/README.md) +- ทำงานกับบอร์ด/อุปกรณ์ต่อพ่วง? → [hardware/README.md](hardware/README.md) +- การมีส่วนร่วม/รีวิว/เวิร์กโฟลว์ CI? → [contributing/README.md](contributing/README.md) +- ต้องการแผนที่ทั้งหมด? → [SUMMARY.md](SUMMARY.md) + +## คอลเลกชัน (แนะนำ) + +- เริ่มต้น: [setup-guides/README.md](setup-guides/README.md) +- แคตตาล็อกอ้างอิง: [reference/README.md](reference/README.md) +- การดำเนินงานและการปรับใช้: [ops/README.md](ops/README.md) +- เอกสารความปลอดภัย: [security/README.md](security/README.md) +- ฮาร์ดแวร์/อุปกรณ์ต่อพ่วง: [hardware/README.md](hardware/README.md) +- การมีส่วนร่วม/CI: [contributing/README.md](contributing/README.md) +- สแนปช็อตโปรเจกต์: [maintainers/README.md](maintainers/README.md) + +## ตามกลุ่มผู้ใช้ + +### ผู้ใช้ / ผู้ดำเนินงาน + +- [commands-reference.md](reference/cli/commands-reference.md) — ค้นหาคำสั่งตามเวิร์กโฟลว์ +- [providers-reference.md](reference/api/providers-reference.md) — ID ผู้ให้บริการ, นามแฝง, ตัวแปรสภาพแวดล้อมข้อมูลรับรอง +- [channels-reference.md](reference/api/channels-reference.md) — ความสามารถของช่องทางและเส้นทางการตั้งค่า +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — การตั้งค่าห้อง Matrix แบบเข้ารหัส (E2EE) และการวินิจฉัยการไม่ตอบสนอง +- [config-reference.md](reference/api/config-reference.md) — คีย์การตั้งค่าที่สำคัญและค่าเริ่มต้นที่ปลอดภัย +- [custom-providers.md](contributing/custom-providers.md) — รูปแบบการรวมผู้ให้บริการแบบกำหนดเอง/URL ฐาน +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — การตั้งค่า Z.AI/GLM และเมทริกซ์ endpoint +- [langgraph-integration.md](contributing/langgraph-integration.md) — การรวมแบบ fallback สำหรับกรณีพิเศษของโมเดล/การเรียกเครื่องมือ +- [operations-runbook.md](ops/operations-runbook.md) — การดำเนินงาน runtime วันที่ 2 และโฟลว์การย้อนกลับ +- [troubleshooting.md](ops/troubleshooting.md) — ลายเซ็นความล้มเหลวทั่วไปและขั้นตอนการกู้คืน + +### ผู้มีส่วนร่วม / ผู้ดูแล + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### ความปลอดภัย / ความน่าเชื่อถือ + +> หมายเหตุ: ส่วนนี้รวมเอกสารข้อเสนอ/แผนงาน สำหรับพฤติกรรมปัจจุบัน เริ่มต้นที่ [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) และ [troubleshooting.md](ops/troubleshooting.md) + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## การนำทางระบบและการกำกับดูแล + +- สารบัญรวม: [SUMMARY.md](SUMMARY.md) +- แผนที่โครงสร้างเอกสาร (ภาษา/ส่วน/ฟังก์ชัน): [structure/README.md](maintainers/structure-README.md) +- รายการ/การจำแนกเอกสาร: [docs-inventory.md](maintainers/docs-inventory.md) +- สแนปช็อตการคัดกรองโปรเจกต์: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## ภาษาอื่น ๆ + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.tl.md b/third_party/zeroclaw/docs/README.tl.md new file mode 100644 index 0000000..b2429d5 --- /dev/null +++ b/third_party/zeroclaw/docs/README.tl.md @@ -0,0 +1,96 @@ +# Sentro ng Dokumentasyon ng ZeroClaw + +Ang pahinang ito ang pangunahing entry point ng sistema ng dokumentasyon. + +Huling na-update: **Pebrero 21, 2026**. + +Mga lokal na sentro: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Magsimula Dito + +| Gusto ko… | Basahin ito | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| I-install at patakbuhin ang ZeroClaw nang mabilis | [README.md (Mabilis na Pagsisimula)](../README.md#quick-start) | +| Bootstrap sa isang utos | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Hanapin ang mga utos ayon sa gawain | [commands-reference.md](reference/cli/commands-reference.md) | +| Mabilisang suriin ang mga config key at default na halaga | [config-reference.md](reference/api/config-reference.md) | +| Mag-set up ng custom na provider/endpoint | [custom-providers.md](contributing/custom-providers.md) | +| I-set up ang Z.AI / GLM provider | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Gamitin ang mga pattern ng integrasyon ng LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Pamahalaan ang runtime (day-2 runbook) | [operations-runbook.md](ops/operations-runbook.md) | +| I-troubleshoot ang mga isyu sa pag-install/runtime/channel | [troubleshooting.md](ops/troubleshooting.md) | +| Patakbuhin ang setup at diagnostics ng encrypted Matrix room | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| I-browse ang mga dokumento ayon sa kategorya | [SUMMARY.md](SUMMARY.md) | +| Tingnan ang snapshot ng mga PR/issue ng proyekto | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Mabilisang Decision Tree (10 segundo) + +- Kailangan ng setup o unang pag-install? → [setup-guides/README.md](setup-guides/README.md) +- Kailangan ng eksaktong CLI/config key? → [reference/README.md](reference/README.md) +- Kailangan ng production/service operations? → [ops/README.md](ops/README.md) +- May nakikitang pagkabigo o regression? → [troubleshooting.md](ops/troubleshooting.md) +- Nagtatrabaho sa security hardening o roadmap? → [security/README.md](security/README.md) +- Nagtatrabaho sa mga board/peripheral? → [hardware/README.md](hardware/README.md) +- Kontribusyon/review/CI workflow? → [contributing/README.md](contributing/README.md) +- Gusto mo ang buong mapa? → [SUMMARY.md](SUMMARY.md) + +## Mga Koleksyon (Inirerekomenda) + +- Pagsisimula: [setup-guides/README.md](setup-guides/README.md) +- Mga katalogo ng reference: [reference/README.md](reference/README.md) +- Operasyon at deployment: [ops/README.md](ops/README.md) +- Mga dokumento ng seguridad: [security/README.md](security/README.md) +- Hardware/peripheral: [hardware/README.md](hardware/README.md) +- Kontribusyon/CI: [contributing/README.md](contributing/README.md) +- Mga snapshot ng proyekto: [maintainers/README.md](maintainers/README.md) + +## Ayon sa Audience + +### Mga Gumagamit / Operator + +- [commands-reference.md](reference/cli/commands-reference.md) — paghahanap ng utos ayon sa workflow +- [providers-reference.md](reference/api/providers-reference.md) — mga ID ng provider, alias, credential environment variable +- [channels-reference.md](reference/api/channels-reference.md) — mga kakayahan ng channel at landas ng configuration +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — setup ng encrypted Matrix room (E2EE) at diagnostics ng hindi pagtugon +- [config-reference.md](reference/api/config-reference.md) — mahahalagang config key at secure na default +- [custom-providers.md](contributing/custom-providers.md) — pattern ng integrasyon ng custom provider/base URL +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — setup ng Z.AI/GLM at endpoint matrix +- [langgraph-integration.md](contributing/langgraph-integration.md) — fallback na integrasyon para sa edge case ng model/tool call +- [operations-runbook.md](ops/operations-runbook.md) — day-2 runtime operations at rollback flow +- [troubleshooting.md](ops/troubleshooting.md) — karaniwang failure signature at mga hakbang sa pagbawi + +### Mga Kontribyutor / Maintainer + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Seguridad / Pagiging Maaasahan + +> Paalala: Kasama sa seksyong ito ang mga proposal/roadmap na dokumento. Para sa kasalukuyang gawi, magsimula sa [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md), at [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Nabigasyon ng Sistema at Pamamahala + +- Pinag-isang talaan ng nilalaman: [SUMMARY.md](SUMMARY.md) +- Mapa ng istruktura ng docs (wika/bahagi/function): [structure/README.md](maintainers/structure-README.md) +- Imbentaryo/klasipikasyon ng dokumentasyon: [docs-inventory.md](maintainers/docs-inventory.md) +- Snapshot ng triage ng proyekto: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Iba Pang Wika + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.tr.md b/third_party/zeroclaw/docs/README.tr.md new file mode 100644 index 0000000..7f79eb7 --- /dev/null +++ b/third_party/zeroclaw/docs/README.tr.md @@ -0,0 +1,96 @@ +# ZeroClaw Dokümantasyon Merkezi + +Bu sayfa, dokümantasyon sisteminin ana giriş noktasıdır. + +Son güncelleme: **21 Şubat 2026**. + +Yerelleştirilmiş merkezler: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Buradan Başlayın + +| Yapmak istediğim… | Bunu oku | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| ZeroClaw'ı hızlıca kurup çalıştırmak | [README.md (Hızlı Başlangıç)](../README.md#quick-start) | +| Tek komutla kurulum | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Göreve göre komut bulmak | [commands-reference.md](reference/cli/commands-reference.md) | +| Yapılandırma anahtarlarını ve varsayılan değerleri hızlıca kontrol | [config-reference.md](reference/api/config-reference.md) | +| Özel sağlayıcı/endpoint yapılandırmak | [custom-providers.md](contributing/custom-providers.md) | +| Z.AI / GLM sağlayıcısını yapılandırmak | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| LangGraph entegrasyon kalıplarını kullanmak | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Çalışma zamanını yönetmek (2. gün runbook) | [operations-runbook.md](ops/operations-runbook.md) | +| Kurulum/çalışma zamanı/kanal sorunlarını gidermek | [troubleshooting.md](ops/troubleshooting.md) | +| Şifreli Matrix odası kurulumu ve tanılama çalıştırmak | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Dokümantasyonu kategoriye göre göz atmak | [SUMMARY.md](SUMMARY.md) | +| Proje PR/sorun anlık görüntüsünü görmek | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Hızlı Karar Ağacı (10 saniye) + +- Kurulum veya ilk yükleme mi gerekiyor? → [setup-guides/README.md](setup-guides/README.md) +- Tam CLI/yapılandırma anahtarları mı gerekiyor? → [reference/README.md](reference/README.md) +- Üretim/servis operasyonları mı gerekiyor? → [ops/README.md](ops/README.md) +- Hatalar veya gerilemeler mi görüyorsunuz? → [troubleshooting.md](ops/troubleshooting.md) +- Güvenlik sertleştirme veya yol haritası üzerinde mi çalışıyorsunuz? → [security/README.md](security/README.md) +- Kartlar/çevre birimleri ile mi çalışıyorsunuz? → [hardware/README.md](hardware/README.md) +- Katkı/inceleme/CI iş akışı mı? → [contributing/README.md](contributing/README.md) +- Tam haritayı mı istiyorsunuz? → [SUMMARY.md](SUMMARY.md) + +## Koleksiyonlar (Önerilen) + +- Başlangıç: [setup-guides/README.md](setup-guides/README.md) +- Referans katalogları: [reference/README.md](reference/README.md) +- Operasyonlar ve dağıtım: [ops/README.md](ops/README.md) +- Güvenlik belgeleri: [security/README.md](security/README.md) +- Donanım/çevre birimleri: [hardware/README.md](hardware/README.md) +- Katkı/CI: [contributing/README.md](contributing/README.md) +- Proje anlık görüntüleri: [maintainers/README.md](maintainers/README.md) + +## Hedef Kitleye Göre + +### Kullanıcılar / Operatörler + +- [commands-reference.md](reference/cli/commands-reference.md) — iş akışına göre komut arama +- [providers-reference.md](reference/api/providers-reference.md) — sağlayıcı kimlikleri, takma adlar, kimlik bilgisi ortam değişkenleri +- [channels-reference.md](reference/api/channels-reference.md) — kanal yetenekleri ve yapılandırma yolları +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — şifreli Matrix odası (E2EE) kurulumu ve yanıt vermeme tanılaması +- [config-reference.md](reference/api/config-reference.md) — yüksek önemli yapılandırma anahtarları ve güvenli varsayılanlar +- [custom-providers.md](contributing/custom-providers.md) — özel sağlayıcı/temel URL entegrasyon kalıpları +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM yapılandırması ve endpoint matrisi +- [langgraph-integration.md](contributing/langgraph-integration.md) — model/araç çağrısı uç durumları için yedek entegrasyon +- [operations-runbook.md](ops/operations-runbook.md) — 2. gün çalışma zamanı operasyonları ve geri alma akışı +- [troubleshooting.md](ops/troubleshooting.md) — yaygın hata imzaları ve kurtarma adımları + +### Katkıda Bulunanlar / Bakımcılar + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Güvenlik / Güvenilirlik + +> Not: Bu bölüm öneri/yol haritası belgelerini içerir. Mevcut davranış için [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) ve [troubleshooting.md](ops/troubleshooting.md) ile başlayın. + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Sistem Navigasyonu ve Yönetişim + +- Birleşik içindekiler: [SUMMARY.md](SUMMARY.md) +- Dokümantasyon yapı haritası (dil/bölüm/işlev): [structure/README.md](maintainers/structure-README.md) +- Dokümantasyon envanteri/sınıflandırması: [docs-inventory.md](maintainers/docs-inventory.md) +- Proje triyaj anlık görüntüsü: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Diğer Diller + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.uk.md b/third_party/zeroclaw/docs/README.uk.md new file mode 100644 index 0000000..88ac5d8 --- /dev/null +++ b/third_party/zeroclaw/docs/README.uk.md @@ -0,0 +1,96 @@ +# Центр документації ZeroClaw + +Ця сторінка є основною точкою входу до системи документації. + +Останнє оновлення: **21 лютого 2026**. + +Локалізовані центри: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md). + +## Почніть тут + +| Я хочу… | Читати це | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Швидко встановити та запустити ZeroClaw | [README.md (Швидкий старт)](../README.md#quick-start) | +| Налаштування однією командою | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Знайти команди за завданням | [commands-reference.md](reference/cli/commands-reference.md) | +| Швидко перевірити ключі конфігурації та значення за замовчуванням | [config-reference.md](reference/api/config-reference.md) | +| Налаштувати власного провайдера/endpoint | [custom-providers.md](contributing/custom-providers.md) | +| Налаштувати провайдера Z.AI / GLM | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| Використовувати шаблони інтеграції LangGraph | [langgraph-integration.md](contributing/langgraph-integration.md) | +| Керувати середовищем виконання (runbook 2-го дня) | [operations-runbook.md](ops/operations-runbook.md) | +| Усунути проблеми встановлення/виконання/каналів | [troubleshooting.md](ops/troubleshooting.md) | +| Запустити налаштування та діагностику зашифрованих кімнат Matrix | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| Переглянути документацію за категоріями | [SUMMARY.md](SUMMARY.md) | +| Переглянути знімок PR/issues проекту | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Дерево швидких рішень (10 секунд) + +- Потрібне налаштування або початкове встановлення? → [setup-guides/README.md](setup-guides/README.md) +- Потрібні точні ключі CLI/конфігурації? → [reference/README.md](reference/README.md) +- Потрібні операції виробництва/сервісу? → [ops/README.md](ops/README.md) +- Бачите збої або регресії? → [troubleshooting.md](ops/troubleshooting.md) +- Працюєте над зміцненням безпеки або дорожньою картою? → [security/README.md](security/README.md) +- Працюєте з платами/периферією? → [hardware/README.md](hardware/README.md) +- Внесок/рецензування/робочий процес CI? → [contributing/README.md](contributing/README.md) +- Хочете повну карту? → [SUMMARY.md](SUMMARY.md) + +## Колекції (Рекомендовані) + +- Початок роботи: [setup-guides/README.md](setup-guides/README.md) +- Довідкові каталоги: [reference/README.md](reference/README.md) +- Операції та розгортання: [ops/README.md](ops/README.md) +- Документація з безпеки: [security/README.md](security/README.md) +- Обладнання/периферія: [hardware/README.md](hardware/README.md) +- Внесок/CI: [contributing/README.md](contributing/README.md) +- Знімки проекту: [maintainers/README.md](maintainers/README.md) + +## За аудиторією + +### Користувачі / Оператори + +- [commands-reference.md](reference/cli/commands-reference.md) — пошук команд за робочим процесом +- [providers-reference.md](reference/api/providers-reference.md) — ідентифікатори провайдерів, псевдоніми, змінні середовища облікових даних +- [channels-reference.md](reference/api/channels-reference.md) — можливості каналів та шляхи конфігурації +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — налаштування зашифрованих кімнат Matrix (E2EE) та діагностика відсутності відповіді +- [config-reference.md](reference/api/config-reference.md) — ключові параметри конфігурації та безпечні значення за замовчуванням +- [custom-providers.md](contributing/custom-providers.md) — шаблони інтеграції власного провайдера/базової URL-адреси +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — налаштування Z.AI/GLM та матриця endpoint +- [langgraph-integration.md](contributing/langgraph-integration.md) — резервна інтеграція для крайніх випадків моделі/виклику інструментів +- [operations-runbook.md](ops/operations-runbook.md) — операції середовища виконання 2-го дня та потік відкату +- [troubleshooting.md](ops/troubleshooting.md) — типові сигнатури збоїв та кроки відновлення + +### Учасники / Супровідники + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### Безпека / Надійність + +> Примітка: цей розділ містить документи пропозицій/дорожньої карти. Для поточної поведінки почніть з [config-reference.md](reference/api/config-reference.md), [operations-runbook.md](ops/operations-runbook.md) та [troubleshooting.md](ops/troubleshooting.md). + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## Навігація системою та управління + +- Єдиний зміст: [SUMMARY.md](SUMMARY.md) +- Карта структури документації (мова/розділ/функція): [structure/README.md](maintainers/structure-README.md) +- Інвентаризація/класифікація документації: [docs-inventory.md](maintainers/docs-inventory.md) +- Знімок тріажу проекту: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## Інші мови + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.ur.md b/third_party/zeroclaw/docs/README.ur.md new file mode 100644 index 0000000..aff5785 --- /dev/null +++ b/third_party/zeroclaw/docs/README.ur.md @@ -0,0 +1,96 @@ +# ZeroClaw دستاویزات کا مرکز + +یہ صفحہ دستاویزات کے نظام کا بنیادی داخلی نقطہ ہے۔ + +آخری تازہ کاری: **21 فروری 2026**۔ + +مقامی مراکز: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](i18n/vi/README.md)۔ + +## یہاں سے شروع کریں + +| مجھے چاہیے… | یہ پڑھیں | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| ZeroClaw کو تیزی سے انسٹال اور چلانا | [README.md (فوری آغاز)](../README.md#quick-start) | +| ایک کمانڈ سے بوٹسٹریپ | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| کام کے مطابق کمانڈز تلاش کرنا | [commands-reference.md](reference/cli/commands-reference.md) | +| کنفیگریشن کیز اور ڈیفالٹ اقدار کی فوری جانچ | [config-reference.md](reference/api/config-reference.md) | +| حسب ضرورت فراہم کنندہ/اینڈ پوائنٹ ترتیب دینا | [custom-providers.md](contributing/custom-providers.md) | +| Z.AI / GLM فراہم کنندہ ترتیب دینا | [zai-glm-setup.md](setup-guides/zai-glm-setup.md) | +| LangGraph انضمام کے نمونے استعمال کرنا | [langgraph-integration.md](contributing/langgraph-integration.md) | +| رن ٹائم چلانا (دوسرے دن کا رن بک) | [operations-runbook.md](ops/operations-runbook.md) | +| تنصیب/رن ٹائم/چینل مسائل حل کرنا | [troubleshooting.md](ops/troubleshooting.md) | +| خفیہ کردہ Matrix کمرے کی ترتیب اور تشخیص چلانا | [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) | +| زمرے کے مطابق دستاویزات براؤز کرنا | [SUMMARY.md](SUMMARY.md) | +| پراجیکٹ PR/مسائل کا سنیپ شاٹ دیکھنا | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## فوری فیصلے کا درخت (10 سیکنڈ) + +- سیٹ اپ یا ابتدائی تنصیب درکار ہے؟ → [setup-guides/README.md](setup-guides/README.md) +- درست CLI/کنفیگریشن کیز درکار ہیں؟ → [reference/README.md](reference/README.md) +- پروڈکشن/سروس آپریشنز درکار ہیں؟ → [ops/README.md](ops/README.md) +- ناکامیاں یا رجعت نظر آ رہی ہے؟ → [troubleshooting.md](ops/troubleshooting.md) +- سیکیورٹی مضبوطی یا روڈ میپ پر کام کر رہے ہیں؟ → [security/README.md](security/README.md) +- بورڈز/پیریفرلز کے ساتھ کام کر رہے ہیں؟ → [hardware/README.md](hardware/README.md) +- شراکت/جائزہ/CI ورک فلو؟ → [contributing/README.md](contributing/README.md) +- مکمل نقشہ چاہیے؟ → [SUMMARY.md](SUMMARY.md) + +## مجموعے (تجویز کردہ) + +- آغاز: [setup-guides/README.md](setup-guides/README.md) +- حوالہ جاتی فہرستیں: [reference/README.md](reference/README.md) +- آپریشنز اور تعیناتی: [ops/README.md](ops/README.md) +- سیکیورٹی دستاویزات: [security/README.md](security/README.md) +- ہارڈویئر/پیریفرلز: [hardware/README.md](hardware/README.md) +- شراکت/CI: [contributing/README.md](contributing/README.md) +- پراجیکٹ سنیپ شاٹس: [maintainers/README.md](maintainers/README.md) + +## سامعین کے مطابق + +### صارفین / آپریٹرز + +- [commands-reference.md](reference/cli/commands-reference.md) — ورک فلو کے مطابق کمانڈ تلاش +- [providers-reference.md](reference/api/providers-reference.md) — فراہم کنندہ IDs، عرفی نام، اسناد ماحولیاتی متغیرات +- [channels-reference.md](reference/api/channels-reference.md) — چینل کی صلاحیتیں اور کنفیگریشن کے راستے +- [matrix-e2ee-guide.md](security/matrix-e2ee-guide.md) — خفیہ کردہ Matrix کمرے (E2EE) کی ترتیب اور عدم جواب کی تشخیص +- [config-reference.md](reference/api/config-reference.md) — اہم کنفیگریشن کیز اور محفوظ ڈیفالٹ اقدار +- [custom-providers.md](contributing/custom-providers.md) — حسب ضرورت فراہم کنندہ/بیس URL انضمام کے نمونے +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) — Z.AI/GLM ترتیب اور اینڈ پوائنٹ میٹرکس +- [langgraph-integration.md](contributing/langgraph-integration.md) — ماڈل/ٹول کال ایج کیسز کے لیے فال بیک انضمام +- [operations-runbook.md](ops/operations-runbook.md) — دوسرے دن کے رن ٹائم آپریشنز اور رول بیک فلو +- [troubleshooting.md](ops/troubleshooting.md) — عام ناکامی کے نشانات اور بحالی کے اقدامات + +### شراکت دار / دیکھ بھال کنندگان + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### سیکیورٹی / قابل اعتمادی + +> نوٹ: اس حصے میں تجویز/روڈ میپ دستاویزات شامل ہیں۔ موجودہ رویے کے لیے [config-reference.md](reference/api/config-reference.md)، [operations-runbook.md](ops/operations-runbook.md) اور [troubleshooting.md](ops/troubleshooting.md) سے شروع کریں۔ + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [audit-logging.md](security/audit-logging.md) +- [resource-limits.md](ops/resource-limits.md) +- [security-roadmap.md](security/security-roadmap.md) + +## نظام نیویگیشن اور گورننس + +- متحد فہرست مضامین: [SUMMARY.md](SUMMARY.md) +- دستاویزات ساختی نقشہ (زبان/حصہ/فنکشن): [structure/README.md](maintainers/structure-README.md) +- دستاویزات کی فہرست/درجہ بندی: [docs-inventory.md](maintainers/docs-inventory.md) +- پراجیکٹ ٹرائج سنیپ شاٹ: [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) + +## دیگر زبانیں + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/README.vi.md b/third_party/zeroclaw/docs/README.vi.md new file mode 100644 index 0000000..693c9c3 --- /dev/null +++ b/third_party/zeroclaw/docs/README.vi.md @@ -0,0 +1,96 @@ +# Hub Tài liệu ZeroClaw (Tiếng Việt) + +Đây là trang chủ tiếng Việt của hệ thống tài liệu. + +Đồng bộ lần cuối: **2026-02-21**. + +> Lưu ý: Tên lệnh, khóa cấu hình và đường dẫn API giữ nguyên tiếng Anh. Khi có sai khác, tài liệu tiếng Anh là bản gốc. Cây tài liệu tiếng Việt đầy đủ nằm tại [i18n/vi/](i18n/vi/README.md). + +Hub bản địa hóa: [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [Русский](README.ru.md) · [Français](README.fr.md) · [Tiếng Việt](README.vi.md). + +## Tra cứu nhanh + +| Tôi muốn… | Xem tài liệu | +| -------------------------------------------------- | ------------------------------------------------------------------------------ | +| Cài đặt và chạy nhanh | [README.vi.md (Khởi động nhanh)](../README.vi.md) / [../README.md](../README.md) | +| Cài đặt bằng một lệnh | [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) | +| Tìm lệnh theo tác vụ | [commands-reference.md](i18n/vi/commands-reference.md) | +| Kiểm tra giá trị mặc định và khóa cấu hình | [config-reference.md](i18n/vi/config-reference.md) | +| Kết nối provider / endpoint tùy chỉnh | [custom-providers.md](i18n/vi/custom-providers.md) | +| Cấu hình Z.AI / GLM provider | [zai-glm-setup.md](i18n/vi/zai-glm-setup.md) | +| Sử dụng tích hợp LangGraph | [langgraph-integration.md](i18n/vi/langgraph-integration.md) | +| Vận hành hàng ngày (runbook) | [operations-runbook.md](i18n/vi/operations-runbook.md) | +| Khắc phục sự cố cài đặt/chạy/kênh | [troubleshooting.md](i18n/vi/troubleshooting.md) | +| Cấu hình Matrix phòng mã hóa (E2EE) | [matrix-e2ee-guide.md](i18n/vi/matrix-e2ee-guide.md) | +| Xem theo danh mục | [SUMMARY.md](i18n/vi/SUMMARY.md) | +| Xem bản chụp PR/Issue | [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) | + +## Tìm nhanh (10 giây) + +- Cài đặt lần đầu hoặc khởi động nhanh → [getting-started/README.md](i18n/vi/getting-started/README.md) +- Cần tra cứu lệnh CLI / khóa cấu hình → [reference/README.md](i18n/vi/reference/README.md) +- Cần vận hành / triển khai sản phẩm → [operations/README.md](i18n/vi/operations/README.md) +- Gặp lỗi hoặc hồi quy → [troubleshooting.md](i18n/vi/troubleshooting.md) +- Tìm hiểu bảo mật và lộ trình → [security/README.md](i18n/vi/security/README.md) +- Làm việc với bo mạch / thiết bị ngoại vi → [hardware/README.md](i18n/vi/hardware/README.md) +- Đóng góp / review / quy trình CI → [contributing/README.md](i18n/vi/contributing/README.md) +- Xem toàn bộ bản đồ tài liệu → [SUMMARY.md](i18n/vi/SUMMARY.md) + +## Danh mục (Khuyến nghị) + +- Bắt đầu: [getting-started/README.md](i18n/vi/getting-started/README.md) +- Tra cứu: [reference/README.md](i18n/vi/reference/README.md) +- Vận hành & triển khai: [operations/README.md](i18n/vi/operations/README.md) +- Bảo mật: [security/README.md](i18n/vi/security/README.md) +- Phần cứng & ngoại vi: [hardware/README.md](i18n/vi/hardware/README.md) +- Đóng góp & CI: [contributing/README.md](i18n/vi/contributing/README.md) +- Ảnh chụp dự án: [project/README.md](i18n/vi/project/README.md) + +## Theo vai trò + +### Người dùng / Vận hành + +- [commands-reference.md](i18n/vi/commands-reference.md) — tra cứu lệnh theo tác vụ +- [providers-reference.md](i18n/vi/providers-reference.md) — ID provider, bí danh, biến môi trường xác thực +- [channels-reference.md](i18n/vi/channels-reference.md) — khả năng kênh và hướng dẫn thiết lập +- [matrix-e2ee-guide.md](i18n/vi/matrix-e2ee-guide.md) — thiết lập phòng mã hóa Matrix (E2EE) +- [config-reference.md](i18n/vi/config-reference.md) — khóa cấu hình quan trọng và giá trị mặc định an toàn +- [custom-providers.md](i18n/vi/custom-providers.md) — mẫu tích hợp provider / base URL tùy chỉnh +- [zai-glm-setup.md](i18n/vi/zai-glm-setup.md) — thiết lập Z.AI/GLM và ma trận endpoint +- [langgraph-integration.md](i18n/vi/langgraph-integration.md) — tích hợp dự phòng cho model/tool-calling +- [operations-runbook.md](i18n/vi/operations-runbook.md) — vận hành runtime hàng ngày và quy trình rollback +- [troubleshooting.md](i18n/vi/troubleshooting.md) — dấu hiệu lỗi thường gặp và cách khắc phục + +### Người đóng góp / Bảo trì + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](i18n/vi/pr-workflow.md) +- [reviewer-playbook.md](i18n/vi/reviewer-playbook.md) +- [ci-map.md](i18n/vi/ci-map.md) +- [actions-source-policy.md](i18n/vi/actions-source-policy.md) + +### Bảo mật / Độ tin cậy + +> Lưu ý: Mục này gồm tài liệu đề xuất/lộ trình, có thể chứa lệnh hoặc cấu hình chưa triển khai. Để biết hành vi thực tế, xem [config-reference.md](i18n/vi/config-reference.md), [operations-runbook.md](i18n/vi/operations-runbook.md) và [troubleshooting.md](i18n/vi/troubleshooting.md) trước. + +- [security/README.md](i18n/vi/security/README.md) +- [agnostic-security.md](i18n/vi/agnostic-security.md) +- [frictionless-security.md](i18n/vi/frictionless-security.md) +- [sandboxing.md](i18n/vi/sandboxing.md) +- [audit-logging.md](i18n/vi/audit-logging.md) +- [resource-limits.md](i18n/vi/resource-limits.md) +- [security-roadmap.md](i18n/vi/security-roadmap.md) + +## Quản lý tài liệu + +- Mục lục thống nhất (TOC): [SUMMARY.md](i18n/vi/SUMMARY.md) +- Bản đồ cấu trúc docs (ngôn ngữ/phần/chức năng): [structure/README.md](maintainers/structure-README.md) +- Danh mục và phân loại tài liệu: [docs-inventory.md](maintainers/docs-inventory.md) + +## Ngôn ngữ khác + +- English: [README.md](README.md) +- 简体中文: [README.zh-CN.md](README.zh-CN.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) diff --git a/third_party/zeroclaw/docs/README.zh-CN.md b/third_party/zeroclaw/docs/README.zh-CN.md new file mode 100644 index 0000000..243b193 --- /dev/null +++ b/third_party/zeroclaw/docs/README.zh-CN.md @@ -0,0 +1,98 @@ +# ZeroClaw 文档导航(简体中文) + +这是文档系统的中文入口页。 + +最后对齐:**2026-03-14**。 + +> 说明:命令、配置键、API 路径保持英文;实现细节以英文文档为准。 + +## 快速入口 + +| 我想要… | 建议阅读 | +|---|---| +| 快速安装并运行 | [../README.zh-CN.md](../README.zh-CN.md) / [../README.md](../README.md) | +| macOS 平台更新与卸载 | [macos-update-uninstall.md](i18n/zh-CN/setup-guides/macos-update-uninstall.zh-CN.md) | +| 一键安装与初始化 | [one-click-bootstrap.md](i18n/zh-CN/setup-guides/one-click-bootstrap.zh-CN.md) | +| 按任务找命令 | [commands-reference.md](i18n/zh-CN/reference/cli/commands-reference.zh-CN.md) | +| 快速查看配置默认值与关键项 | [config-reference.md](i18n/zh-CN/reference/api/config-reference.zh-CN.md) | +| 接入自定义 Provider / endpoint | [custom-providers.md](i18n/zh-CN/contributing/custom-providers.zh-CN.md) | +| 配置 Z.AI / GLM Provider | [zai-glm-setup.md](i18n/zh-CN/setup-guides/zai-glm-setup.zh-CN.md) | +| 使用 LangGraph 工具调用集成 | [langgraph-integration.md](i18n/zh-CN/contributing/langgraph-integration.zh-CN.md) | +| 进行日常运维(runbook) | [operations-runbook.md](i18n/zh-CN/ops/operations-runbook.zh-CN.md) | +| 快速排查安装/运行/通道问题 | [troubleshooting.md](i18n/zh-CN/ops/troubleshooting.zh-CN.md) | +| Matrix 加密房间配置与诊断 | [matrix-e2ee-guide.md](i18n/zh-CN/security/matrix-e2ee-guide.zh-CN.md) | +| 统一目录导航 | [SUMMARY.md](SUMMARY.md) | +| 查看 PR/Issue 扫描快照 | [project-triage-snapshot-2026-02-18.md](i18n/zh-CN/maintainers/project-triage-snapshot-2026-02-18.zh-CN.md) | + +## 10 秒决策树(先看这个) + +- 首次安装或快速启动 → [setup-guides/README.md](i18n/zh-CN/setup-guides/README.zh-CN.md) +- 需要精确命令或配置键 → [reference/README.md](i18n/zh-CN/reference/README.zh-CN.md) +- 需要部署与服务化运维 → [ops/README.md](i18n/zh-CN/ops/README.zh-CN.md) +- 遇到报错、异常或回归 → [troubleshooting.md](i18n/zh-CN/ops/troubleshooting.zh-CN.md) +- 查看安全现状与路线图 → [security/README.md](i18n/zh-CN/security/README.zh-CN.md) +- 接入板卡与外设 → [hardware/README.md](i18n/zh-CN/hardware/README.zh-CN.md) +- 参与贡献、评审与 CI → [contributing/README.md](i18n/zh-CN/contributing/README.zh-CN.md) +- 查看完整文档地图 → [SUMMARY.md](SUMMARY.md) + +## 按目录浏览(推荐) + +- 入门文档: [setup-guides/README.md](i18n/zh-CN/setup-guides/README.zh-CN.md) +- 参考手册: [reference/README.md](i18n/zh-CN/reference/README.zh-CN.md) +- 运维与部署: [ops/README.md](i18n/zh-CN/ops/README.zh-CN.md) +- 安全文档: [security/README.md](i18n/zh-CN/security/README.zh-CN.md) +- 硬件与外设: [hardware/README.md](i18n/zh-CN/hardware/README.zh-CN.md) +- 贡献与 CI: [contributing/README.md](i18n/zh-CN/contributing/README.zh-CN.md) +- 项目快照: [maintainers/README.md](i18n/zh-CN/maintainers/README.zh-CN.md) + +## 按角色 + +### 用户 / 运维 + +- [commands-reference.md](i18n/zh-CN/reference/cli/commands-reference.zh-CN.md) — 按工作流查询命令 +- [providers-reference.md](i18n/zh-CN/reference/api/providers-reference.zh-CN.md) — Provider ID、别名、凭证环境变量 +- [channels-reference.md](i18n/zh-CN/reference/api/channels-reference.zh-CN.md) — 通道功能与配置路径 +- [matrix-e2ee-guide.md](i18n/zh-CN/security/matrix-e2ee-guide.zh-CN.md) — Matrix 加密房间(E2EE)配置与无响应诊断 +- [config-reference.md](i18n/zh-CN/reference/api/config-reference.zh-CN.md) — 高优先级配置项与安全默认值 +- [custom-providers.md](i18n/zh-CN/contributing/custom-providers.zh-CN.md) — 自定义 Provider/基础 URL 集成模板 +- [zai-glm-setup.md](i18n/zh-CN/setup-guides/zai-glm-setup.zh-CN.md) — Z.AI/GLM 配置与端点矩阵 +- [langgraph-integration.md](i18n/zh-CN/contributing/langgraph-integration.zh-CN.md) — 模型/工具调用边缘场景的降级集成方案 +- [operations-runbook.md](i18n/zh-CN/ops/operations-runbook.zh-CN.md) — 日常运行时运维与回滚流程 +- [troubleshooting.md](i18n/zh-CN/ops/troubleshooting.zh-CN.md) — 常见故障特征与恢复步骤 + +### 贡献者 / 维护者 + +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](i18n/zh-CN/contributing/pr-workflow.zh-CN.md) +- [reviewer-playbook.md](i18n/zh-CN/contributing/reviewer-playbook.zh-CN.md) +- [ci-map.md](i18n/zh-CN/contributing/ci-map.zh-CN.md) +- [actions-source-policy.md](i18n/zh-CN/contributing/actions-source-policy.zh-CN.md) + +### 安全 / 稳定性 + +> 说明:本分组内有 proposal/roadmap 文档,可能包含设想中的命令或配置。当前可执行行为请优先阅读 [config-reference.md](i18n/zh-CN/reference/api/config-reference.md)、[operations-runbook.md](i18n/zh-CN/ops/operations-runbook.md)、[troubleshooting.md](i18n/zh-CN/ops/troubleshooting.zh-CN.md)。 + +- [security/README.md](i18n/zh-CN/security/README.zh-CN.md) +- [agnostic-security.md](i18n/zh-CN/security/agnostic-security.zh-CN.md) +- [frictionless-security.md](i18n/zh-CN/security/frictionless-security.zh-CN.md) +- [sandboxing.md](i18n/zh-CN/security/sandboxing.zh-CN.md) +- [resource-limits.md](i18n/zh-CN/ops/resource-limits.zh-CN.md) +- [audit-logging.md](i18n/zh-CN/security/audit-logging.zh-CN.md) +- [security-roadmap.md](i18n/zh-CN/security/security-roadmap.zh-CN.md) + +## 文档治理与分类 + +- 统一目录(TOC):[SUMMARY.md](SUMMARY.md) +- 文档结构图(按语言/分区/功能):[structure/README.md](i18n/zh-CN/maintainers/structure-README.zh-CN.md) +- 文档清单与分类:[docs-inventory.md](i18n/zh-CN/maintainers/docs-inventory.zh-CN.md) +- 国际化文档索引:[i18n/README.md](i18n/README.md) +- 国际化覆盖度地图:[i18n-coverage.md](i18n/zh-CN/maintainers/i18n-coverage.zh-CN.md) +- 项目分诊快照:[project-triage-snapshot-2026-02-18.md](i18n/zh-CN/maintainers/project-triage-snapshot-2026-02-18.zh-CN.md) + +## 其他语言 + +- English: [README.md](README.md) +- 日本語: [README.ja.md](README.ja.md) +- Русский: [README.ru.md](README.ru.md) +- Français: [README.fr.md](README.fr.md) +- Tiếng Việt: [i18n/vi/README.md](i18n/vi/README.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.ar.md b/third_party/zeroclaw/docs/SUMMARY.ar.md new file mode 100644 index 0000000..f58376f --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.ar.md @@ -0,0 +1,89 @@ +# ملخص توثيق ZeroClaw (جدول المحتويات الموحد) + +هذا الملف هو جدول المحتويات المرجعي لنظام التوثيق. + +> 📖 [النسخة الإنجليزية](SUMMARY.md) + +آخر تحديث: **18 فبراير 2026**. + +## نقاط الدخول حسب اللغة + +- خريطة هيكل التوثيق (اللغة/القسم/الوظيفة): [structure/README.md](maintainers/structure-README.md) +- README بالإنجليزية: [../README.md](../README.md) +- README بالصينية: [../README.zh-CN.md](../README.zh-CN.md) +- README باليابانية: [../README.ja.md](../README.ja.md) +- README بالروسية: [../README.ru.md](../README.ru.md) +- README بالفرنسية: [../README.fr.md](../README.fr.md) +- README بالفيتنامية: [../README.vi.md](../README.vi.md) +- التوثيق بالإنجليزية: [README.md](README.md) +- التوثيق بالصينية: [README.zh-CN.md](README.zh-CN.md) +- التوثيق باليابانية: [README.ja.md](README.ja.md) +- التوثيق بالروسية: [README.ru.md](README.ru.md) +- التوثيق بالفرنسية: [README.fr.md](README.fr.md) +- التوثيق بالفيتنامية: [i18n/vi/README.md](i18n/vi/README.md) +- فهرس الترجمة: [i18n/README.md](i18n/README.md) +- خريطة تغطية الترجمة: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## الفئات + +### 1) البدء السريع + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) مرجع الأوامر والإعدادات والتكاملات + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) التشغيل والنشر + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) تصميم الأمان والمقترحات + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) العتاد والأجهزة الطرفية + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) المساهمة وCI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) حالة المشروع واللقطات + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.bn.md b/third_party/zeroclaw/docs/SUMMARY.bn.md new file mode 100644 index 0000000..a433f46 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.bn.md @@ -0,0 +1,89 @@ +# ZeroClaw ডকুমেন্টেশন সারাংশ (একীভূত সূচিপত্র) + +এই ফাইলটি ডকুমেন্টেশন সিস্টেমের প্রামাণিক সূচিপত্র। + +> 📖 [ইংরেজি সংস্করণ](SUMMARY.md) + +সর্বশেষ আপডেট: **১৮ ফেব্রুয়ারি ২০২৬**। + +## ভাষা অনুযায়ী প্রবেশ বিন্দু + +- ডক কাঠামো মানচিত্র (ভাষা/অংশ/ফাংশন): [structure/README.md](maintainers/structure-README.md) +- ইংরেজি README: [../README.md](../README.md) +- চীনা README: [../README.zh-CN.md](../README.zh-CN.md) +- জাপানি README: [../README.ja.md](../README.ja.md) +- রুশ README: [../README.ru.md](../README.ru.md) +- ফরাসি README: [../README.fr.md](../README.fr.md) +- ভিয়েতনামি README: [../README.vi.md](../README.vi.md) +- ইংরেজি ডকুমেন্টেশন: [README.md](README.md) +- চীনা ডকুমেন্টেশন: [README.zh-CN.md](README.zh-CN.md) +- জাপানি ডকুমেন্টেশন: [README.ja.md](README.ja.md) +- রুশ ডকুমেন্টেশন: [README.ru.md](README.ru.md) +- ফরাসি ডকুমেন্টেশন: [README.fr.md](README.fr.md) +- ভিয়েতনামি ডকুমেন্টেশন: [i18n/vi/README.md](i18n/vi/README.md) +- স্থানীয়করণ সূচক: [i18n/README.md](i18n/README.md) +- i18n কভারেজ মানচিত্র: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## বিভাগসমূহ + +### ১) দ্রুত শুরু + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### ২) কমান্ড, কনফিগারেশন ও ইন্টিগ্রেশন রেফারেন্স + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### ৩) পরিচালনা ও ডিপ্লয়মেন্ট + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### ৪) নিরাপত্তা নকশা ও প্রস্তাবনা + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### ৫) হার্ডওয়্যার ও পেরিফেরাল + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### ৬) অবদান ও CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### ৭) প্রকল্পের অবস্থা ও স্ন্যাপশট + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.cs.md b/third_party/zeroclaw/docs/SUMMARY.cs.md new file mode 100644 index 0000000..c1f9ba2 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.cs.md @@ -0,0 +1,89 @@ +# Souhrn dokumentace ZeroClaw (Jednotný obsah) + +Tento soubor je kanonický obsah dokumentačního systému. + +> 📖 [Anglická verze](SUMMARY.md) + +Poslední aktualizace: **18. února 2026**. + +## Vstupní body podle jazyka + +- Mapa struktury dokumentace (jazyk/část/funkce): [structure/README.md](maintainers/structure-README.md) +- README v angličtině: [../README.md](../README.md) +- README v čínštině: [../README.zh-CN.md](../README.zh-CN.md) +- README v japonštině: [../README.ja.md](../README.ja.md) +- README v ruštině: [../README.ru.md](../README.ru.md) +- README ve francouzštině: [../README.fr.md](../README.fr.md) +- README ve vietnamštině: [../README.vi.md](../README.vi.md) +- Dokumentace v angličtině: [README.md](README.md) +- Dokumentace v čínštině: [README.zh-CN.md](README.zh-CN.md) +- Dokumentace v japonštině: [README.ja.md](README.ja.md) +- Dokumentace v ruštině: [README.ru.md](README.ru.md) +- Dokumentace ve francouzštině: [README.fr.md](README.fr.md) +- Dokumentace ve vietnamštině: [i18n/vi/README.md](i18n/vi/README.md) +- Index lokalizace: [i18n/README.md](i18n/README.md) +- Mapa pokrytí i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Kategorie + +### 1) Rychlý start + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Reference příkazů, konfigurace a integrací + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Provoz a nasazení + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Návrh zabezpečení a návrhy + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardware a periferie + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Přispívání a CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Stav projektu a snapshoty + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.da.md b/third_party/zeroclaw/docs/SUMMARY.da.md new file mode 100644 index 0000000..6d4908b --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.da.md @@ -0,0 +1,89 @@ +# ZeroClaw Dokumentationsoversigt (Samlet indholdsfortegnelse) + +Denne fil er den kanoniske indholdsfortegnelse for dokumentationssystemet. + +> 📖 [Engelsk version](SUMMARY.md) + +Sidst opdateret: **18. februar 2026**. + +## Indgangspunkter efter sprog + +- Dokumentationsstrukturkort (sprog/del/funktion): [structure/README.md](maintainers/structure-README.md) +- README på engelsk: [../README.md](../README.md) +- README på kinesisk: [../README.zh-CN.md](../README.zh-CN.md) +- README på japansk: [../README.ja.md](../README.ja.md) +- README på russisk: [../README.ru.md](../README.ru.md) +- README på fransk: [../README.fr.md](../README.fr.md) +- README på vietnamesisk: [../README.vi.md](../README.vi.md) +- Dokumentation på engelsk: [README.md](README.md) +- Dokumentation på kinesisk: [README.zh-CN.md](README.zh-CN.md) +- Dokumentation på japansk: [README.ja.md](README.ja.md) +- Dokumentation på russisk: [README.ru.md](README.ru.md) +- Dokumentation på fransk: [README.fr.md](README.fr.md) +- Dokumentation på vietnamesisk: [i18n/vi/README.md](i18n/vi/README.md) +- Lokaliseringsindeks: [i18n/README.md](i18n/README.md) +- i18n-dækningskort: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Kategorier + +### 1) Hurtig start + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Kommando-, konfigurations- og integrationsreference + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Drift og udrulning + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Sikkerhedsdesign og forslag + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardware og periferienheder + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Bidrag og CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Projektstatus og snapshots + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.de.md b/third_party/zeroclaw/docs/SUMMARY.de.md new file mode 100644 index 0000000..3179f30 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.de.md @@ -0,0 +1,89 @@ +# ZeroClaw Dokumentationsübersicht (Einheitliches Inhaltsverzeichnis) + +Diese Datei ist das kanonische Inhaltsverzeichnis des Dokumentationssystems. + +> 📖 [Englische Version](SUMMARY.md) + +Zuletzt aktualisiert: **18. Februar 2026**. + +## Einstiegspunkte nach Sprache + +- Dokumentationsstrukturkarte (Sprache/Teil/Funktion): [structure/README.md](maintainers/structure-README.md) +- README auf Englisch: [../README.md](../README.md) +- README auf Chinesisch: [../README.zh-CN.md](../README.zh-CN.md) +- README auf Japanisch: [../README.ja.md](../README.ja.md) +- README auf Russisch: [../README.ru.md](../README.ru.md) +- README auf Französisch: [../README.fr.md](../README.fr.md) +- README auf Vietnamesisch: [../README.vi.md](../README.vi.md) +- Dokumentation auf Englisch: [README.md](README.md) +- Dokumentation auf Chinesisch: [README.zh-CN.md](README.zh-CN.md) +- Dokumentation auf Japanisch: [README.ja.md](README.ja.md) +- Dokumentation auf Russisch: [README.ru.md](README.ru.md) +- Dokumentation auf Französisch: [README.fr.md](README.fr.md) +- Dokumentation auf Vietnamesisch: [i18n/vi/README.md](i18n/vi/README.md) +- Lokalisierungsindex: [i18n/README.md](i18n/README.md) +- i18n-Abdeckungskarte: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Kategorien + +### 1) Schnellstart + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Befehls-, Konfigurations- und Integrationsreferenz + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Betrieb und Bereitstellung + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Sicherheitsdesign und Vorschläge + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardware und Peripheriegeräte + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Beitragen und CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Projektstatus und Snapshots + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.el.md b/third_party/zeroclaw/docs/SUMMARY.el.md new file mode 100644 index 0000000..119a3db --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.el.md @@ -0,0 +1,89 @@ +# Περίληψη Τεκμηρίωσης ZeroClaw (Ενοποιημένος Πίνακας Περιεχομένων) + +Αυτό το αρχείο αποτελεί τον κανονικό πίνακα περιεχομένων του συστήματος τεκμηρίωσης. + +> 📖 [English version](SUMMARY.md) + +Τελευταία ενημέρωση: **18 Φεβρουαρίου 2026**. + +## Σημεία εισόδου ανά γλώσσα + +- Χάρτης δομής εγγράφων (γλώσσα/τμήμα/λειτουργία): [structure/README.md](maintainers/structure-README.md) +- README στα αγγλικά: [../README.md](../README.md) +- README στα κινέζικα: [../README.zh-CN.md](../README.zh-CN.md) +- README στα ιαπωνικά: [../README.ja.md](../README.ja.md) +- README στα ρωσικά: [../README.ru.md](../README.ru.md) +- README στα γαλλικά: [../README.fr.md](../README.fr.md) +- README στα βιετναμέζικα: [../README.vi.md](../README.vi.md) +- Τεκμηρίωση στα αγγλικά: [README.md](README.md) +- Τεκμηρίωση στα κινέζικα: [README.zh-CN.md](README.zh-CN.md) +- Τεκμηρίωση στα ιαπωνικά: [README.ja.md](README.ja.md) +- Τεκμηρίωση στα ρωσικά: [README.ru.md](README.ru.md) +- Τεκμηρίωση στα γαλλικά: [README.fr.md](README.fr.md) +- Τεκμηρίωση στα βιετναμέζικα: [i18n/vi/README.md](i18n/vi/README.md) +- Ευρετήριο τοπικοποίησης: [i18n/README.md](i18n/README.md) +- Χάρτης κάλυψης i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Κατηγορίες + +### 1) Γρήγορη εκκίνηση + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Αναφορά εντολών, ρυθμίσεων και ενσωματώσεων + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Λειτουργία και ανάπτυξη + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Σχεδιασμός ασφαλείας και προτάσεις + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Υλικό και περιφερειακά + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Συνεισφορά και CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Κατάσταση έργου και στιγμιότυπα + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.es.md b/third_party/zeroclaw/docs/SUMMARY.es.md new file mode 100644 index 0000000..0dd18ce --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.es.md @@ -0,0 +1,89 @@ +# Resumen de Documentación ZeroClaw (Tabla de Contenidos Unificada) + +Este archivo constituye la tabla de contenidos canónica del sistema de documentación. + +> 📖 [English version](SUMMARY.md) + +Última actualización: **18 de febrero de 2026**. + +## Puntos de entrada por idioma + +- Mapa de estructura de docs (idioma/sección/función): [structure/README.md](maintainers/structure-README.md) +- README en inglés: [../README.md](../README.md) +- README en chino: [../README.zh-CN.md](../README.zh-CN.md) +- README en japonés: [../README.ja.md](../README.ja.md) +- README en ruso: [../README.ru.md](../README.ru.md) +- README en francés: [../README.fr.md](../README.fr.md) +- README en vietnamita: [../README.vi.md](../README.vi.md) +- Documentación en inglés: [README.md](README.md) +- Documentación en chino: [README.zh-CN.md](README.zh-CN.md) +- Documentación en japonés: [README.ja.md](README.ja.md) +- Documentación en ruso: [README.ru.md](README.ru.md) +- Documentación en francés: [README.fr.md](README.fr.md) +- Documentación en vietnamita: [i18n/vi/README.md](i18n/vi/README.md) +- Índice de localización: [i18n/README.md](i18n/README.md) +- Mapa de cobertura i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Categorías + +### 1) Inicio rápido + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Referencia de comandos, configuración e integraciones + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Operaciones y despliegue + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Diseño de seguridad y propuestas + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardware y periféricos + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Contribución y CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Estado del proyecto e instantáneas + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.fi.md b/third_party/zeroclaw/docs/SUMMARY.fi.md new file mode 100644 index 0000000..af68630 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.fi.md @@ -0,0 +1,89 @@ +# ZeroClaw-dokumentaation yhteenveto (Yhtenäinen sisällysluettelo) + +Tämä tiedosto muodostaa dokumentaatiojärjestelmän kanonisen sisällysluettelon. + +> 📖 [English version](SUMMARY.md) + +Viimeksi päivitetty: **18. helmikuuta 2026**. + +## Aloituspisteet kielen mukaan + +- Dokumenttien rakennekartta (kieli/osio/toiminto): [structure/README.md](maintainers/structure-README.md) +- README englanniksi: [../README.md](../README.md) +- README kiinaksi: [../README.zh-CN.md](../README.zh-CN.md) +- README japaniksi: [../README.ja.md](../README.ja.md) +- README venäjäksi: [../README.ru.md](../README.ru.md) +- README ranskaksi: [../README.fr.md](../README.fr.md) +- README vietnamiksi: [../README.vi.md](../README.vi.md) +- Dokumentaatio englanniksi: [README.md](README.md) +- Dokumentaatio kiinaksi: [README.zh-CN.md](README.zh-CN.md) +- Dokumentaatio japaniksi: [README.ja.md](README.ja.md) +- Dokumentaatio venäjäksi: [README.ru.md](README.ru.md) +- Dokumentaatio ranskaksi: [README.fr.md](README.fr.md) +- Dokumentaatio vietnamiksi: [i18n/vi/README.md](i18n/vi/README.md) +- Lokalisointiluettelo: [i18n/README.md](i18n/README.md) +- i18n-kattavuuskartta: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Kategoriat + +### 1) Pikaopas + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Komento-, asetus- ja integrointiviitteet + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Toiminta ja käyttöönotto + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Tietoturvasuunnittelu ja ehdotukset + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Laitteisto ja oheislaitteet + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Osallistuminen ja CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Projektin tila ja tilannekuvat + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.fr.md b/third_party/zeroclaw/docs/SUMMARY.fr.md new file mode 100644 index 0000000..b9b91fd --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.fr.md @@ -0,0 +1,89 @@ +# Sommaire de la documentation ZeroClaw (Table des matières unifiée) + +Ce fichier constitue la table des matières canonique du système de documentation. + +> 📖 [English version](SUMMARY.md) + +Dernière mise à jour : **18 février 2026**. + +## Points d'entrée par langue + +- Carte de structure docs (langue/partie/fonction) : [structure/README.md](maintainers/structure-README.md) +- README en anglais : [../README.md](../README.md) +- README en chinois : [../README.zh-CN.md](../README.zh-CN.md) +- README en japonais : [../README.ja.md](../README.ja.md) +- README en russe : [../README.ru.md](../README.ru.md) +- README en français : [../README.fr.md](../README.fr.md) +- README en vietnamien : [../README.vi.md](../README.vi.md) +- Documentation en anglais : [README.md](README.md) +- Documentation en chinois : [README.zh-CN.md](README.zh-CN.md) +- Documentation en japonais : [README.ja.md](README.ja.md) +- Documentation en russe : [README.ru.md](README.ru.md) +- Documentation en français : [README.fr.md](README.fr.md) +- Documentation en vietnamien : [i18n/vi/README.md](i18n/vi/README.md) +- Index de localisation : [i18n/README.md](i18n/README.md) +- Carte de couverture i18n : [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Catégories + +### 1) Démarrage rapide + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Référence des commandes, configuration et intégrations + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Exploitation et déploiement + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Conception de la sécurité et propositions + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Matériel et périphériques + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Contribution et CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) État du projet et instantanés + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.he.md b/third_party/zeroclaw/docs/SUMMARY.he.md new file mode 100644 index 0000000..2ed5942 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.he.md @@ -0,0 +1,89 @@ +# סיכום תיעוד ZeroClaw (תוכן עניינים מאוחד) + +קובץ זה מהווה את תוכן העניינים הקנוני של מערכת התיעוד. + +> 📖 [English version](SUMMARY.md) + +עדכון אחרון: **18 בפברואר 2026**. + +## נקודות כניסה לפי שפה + +- מפת מבנה תיעוד (שפה/חלק/פונקציה): [structure/README.md](maintainers/structure-README.md) +- README באנגלית: [../README.md](../README.md) +- README בסינית: [../README.zh-CN.md](../README.zh-CN.md) +- README ביפנית: [../README.ja.md](../README.ja.md) +- README ברוסית: [../README.ru.md](../README.ru.md) +- README בצרפתית: [../README.fr.md](../README.fr.md) +- README בווייטנאמית: [../README.vi.md](../README.vi.md) +- תיעוד באנגלית: [README.md](README.md) +- תיעוד בסינית: [README.zh-CN.md](README.zh-CN.md) +- תיעוד ביפנית: [README.ja.md](README.ja.md) +- תיעוד ברוסית: [README.ru.md](README.ru.md) +- תיעוד בצרפתית: [README.fr.md](README.fr.md) +- תיעוד בווייטנאמית: [i18n/vi/README.md](i18n/vi/README.md) +- אינדקס תרגום: [i18n/README.md](i18n/README.md) +- מפת כיסוי i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## קטגוריות + +### 1) התחלה מהירה + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) עיון בפקודות, הגדרות ושילובים + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) תפעול ופריסה + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) עיצוב אבטחה והצעות + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) חומרה וציוד היקפי + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) תרומה ו-CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) מצב הפרויקט ותמונות מצב + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.hi.md b/third_party/zeroclaw/docs/SUMMARY.hi.md new file mode 100644 index 0000000..45de921 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.hi.md @@ -0,0 +1,89 @@ +# ZeroClaw दस्तावेज़ीकरण सारांश (एकीकृत विषय सूची) + +यह फ़ाइल दस्तावेज़ीकरण प्रणाली की कैनोनिकल विषय सूची है। + +> 📖 [English version](SUMMARY.md) + +अंतिम अपडेट: **18 फरवरी 2026**। + +## भाषा के अनुसार प्रवेश बिंदु + +- दस्तावेज़ संरचना नक्शा (भाषा/भाग/कार्य): [structure/README.md](maintainers/structure-README.md) +- अंग्रेज़ी README: [../README.md](../README.md) +- चीनी README: [../README.zh-CN.md](../README.zh-CN.md) +- जापानी README: [../README.ja.md](../README.ja.md) +- रूसी README: [../README.ru.md](../README.ru.md) +- फ़्रेंच README: [../README.fr.md](../README.fr.md) +- वियतनामी README: [../README.vi.md](../README.vi.md) +- अंग्रेज़ी दस्तावेज़ीकरण: [README.md](README.md) +- चीनी दस्तावेज़ीकरण: [README.zh-CN.md](README.zh-CN.md) +- जापानी दस्तावेज़ीकरण: [README.ja.md](README.ja.md) +- रूसी दस्तावेज़ीकरण: [README.ru.md](README.ru.md) +- फ़्रेंच दस्तावेज़ीकरण: [README.fr.md](README.fr.md) +- वियतनामी दस्तावेज़ीकरण: [i18n/vi/README.md](i18n/vi/README.md) +- स्थानीयकरण सूचकांक: [i18n/README.md](i18n/README.md) +- i18n कवरेज नक्शा: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## श्रेणियाँ + +### 1) त्वरित प्रारंभ + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) कमांड, कॉन्फ़िगरेशन और एकीकरण संदर्भ + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) संचालन और तैनाती + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) सुरक्षा डिज़ाइन और प्रस्ताव + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) हार्डवेयर और पेरिफेरल्स + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) योगदान और CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) प्रोजेक्ट स्थिति और स्नैपशॉट + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.hu.md b/third_party/zeroclaw/docs/SUMMARY.hu.md new file mode 100644 index 0000000..dcaad4a --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.hu.md @@ -0,0 +1,92 @@ +# ZeroClaw Dokumentáció Összefoglaló (Egységes tartalomjegyzék) + +Ez a fájl a dokumentációs rendszer kanonikus tartalomjegyzéke. + +> 📖 [English version](SUMMARY.md) + +Utolsó frissítés: **2026. február 18.** + +## Nyelvi belépési pontok + +- Dokumentáció szerkezeti térkép (nyelv/rész/funkció): [structure/README.md](maintainers/structure-README.md) +- Angol README: [../README.md](../README.md) +- Kínai README: [../README.zh-CN.md](../README.zh-CN.md) +- Japán README: [../README.ja.md](../README.ja.md) +- Orosz README: [../README.ru.md](../README.ru.md) +- Francia README: [../README.fr.md](../README.fr.md) +- Vietnámi README: [../README.vi.md](../README.vi.md) +- Angol dokumentációs központ: [README.md](README.md) +- Kínai dokumentációs központ: [README.zh-CN.md](README.zh-CN.md) +- Japán dokumentációs központ: [README.ja.md](README.ja.md) +- Orosz dokumentációs központ: [README.ru.md](README.ru.md) +- Francia dokumentációs központ: [README.fr.md](README.fr.md) +- Vietnámi dokumentációs központ: [i18n/vi/README.md](i18n/vi/README.md) +- Honosítási dokumentáció index: [i18n/README.md](i18n/README.md) +- i18n lefedettségi térkép: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Kategóriák + +### 1) Első lépések + +- [setup-guides/README.md](setup-guides/README.md) +- [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Parancs/konfiguráció referencia és integrációk + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Üzemeltetés és telepítés + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Biztonsági tervezés és javaslatok + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardver és perifériák + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Közreműködés és CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) +- [extension-examples.md](contributing/extension-examples.md) +- [testing.md](contributing/testing.md) + +### 7) Projekt állapot és pillanatképek + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.id.md b/third_party/zeroclaw/docs/SUMMARY.id.md new file mode 100644 index 0000000..9dda9ab --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.id.md @@ -0,0 +1,92 @@ +# Ringkasan Dokumentasi ZeroClaw (Daftar Isi Terpadu) + +File ini adalah daftar isi kanonik untuk sistem dokumentasi. + +> 📖 [English version](SUMMARY.md) + +Pembaruan terakhir: **18 Februari 2026**. + +## Titik Masuk Bahasa + +- Peta struktur dokumentasi (bahasa/bagian/fungsi): [structure/README.md](maintainers/structure-README.md) +- README Inggris: [../README.md](../README.md) +- README Cina: [../README.zh-CN.md](../README.zh-CN.md) +- README Jepang: [../README.ja.md](../README.ja.md) +- README Rusia: [../README.ru.md](../README.ru.md) +- README Prancis: [../README.fr.md](../README.fr.md) +- README Vietnam: [../README.vi.md](../README.vi.md) +- Hub dokumentasi Inggris: [README.md](README.md) +- Hub dokumentasi Cina: [README.zh-CN.md](README.zh-CN.md) +- Hub dokumentasi Jepang: [README.ja.md](README.ja.md) +- Hub dokumentasi Rusia: [README.ru.md](README.ru.md) +- Hub dokumentasi Prancis: [README.fr.md](README.fr.md) +- Hub dokumentasi Vietnam: [i18n/vi/README.md](i18n/vi/README.md) +- Indeks dokumentasi lokalisasi: [i18n/README.md](i18n/README.md) +- Peta cakupan i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Koleksi + +### 1) Memulai + +- [setup-guides/README.md](setup-guides/README.md) +- [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Referensi perintah/konfigurasi & integrasi + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Operasi & deployment + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Desain keamanan & proposal + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Perangkat keras & periferal + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Kontribusi & CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) +- [extension-examples.md](contributing/extension-examples.md) +- [testing.md](contributing/testing.md) + +### 7) Status proyek & snapshot + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.it.md b/third_party/zeroclaw/docs/SUMMARY.it.md new file mode 100644 index 0000000..1a31e2d --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.it.md @@ -0,0 +1,92 @@ +# Riepilogo della Documentazione ZeroClaw (Indice Unificato) + +Questo file è l'indice canonico del sistema di documentazione. + +> 📖 [English version](SUMMARY.md) + +Ultimo aggiornamento: **18 febbraio 2026**. + +## Punti di ingresso per lingua + +- Mappa della struttura documentale (lingua/parte/funzione): [structure/README.md](maintainers/structure-README.md) +- README inglese: [../README.md](../README.md) +- README cinese: [../README.zh-CN.md](../README.zh-CN.md) +- README giapponese: [../README.ja.md](../README.ja.md) +- README russo: [../README.ru.md](../README.ru.md) +- README francese: [../README.fr.md](../README.fr.md) +- README vietnamita: [../README.vi.md](../README.vi.md) +- Hub documentazione inglese: [README.md](README.md) +- Hub documentazione cinese: [README.zh-CN.md](README.zh-CN.md) +- Hub documentazione giapponese: [README.ja.md](README.ja.md) +- Hub documentazione russo: [README.ru.md](README.ru.md) +- Hub documentazione francese: [README.fr.md](README.fr.md) +- Hub documentazione vietnamita: [i18n/vi/README.md](i18n/vi/README.md) +- Indice documentazione localizzazione: [i18n/README.md](i18n/README.md) +- Mappa di copertura i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Collezioni + +### 1) Per iniziare + +- [setup-guides/README.md](setup-guides/README.md) +- [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Riferimento comandi/configurazione e integrazioni + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Operazioni e deployment + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Progettazione della sicurezza e proposte + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardware e periferiche + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Contribuzione e CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) +- [extension-examples.md](contributing/extension-examples.md) +- [testing.md](contributing/testing.md) + +### 7) Stato del progetto e snapshot + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.ja.md b/third_party/zeroclaw/docs/SUMMARY.ja.md new file mode 100644 index 0000000..4c58b83 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.ja.md @@ -0,0 +1,89 @@ +# ZeroClaw ドキュメント目次(統合目次) + +このファイルはドキュメントシステムの正規の目次です。 + +> 📖 [English version](SUMMARY.md) + +最終更新:**2026年2月18日**。 + +## 言語別入口 + +- ドキュメント構造マップ(言語/カテゴリ/機能): [structure/README.md](maintainers/structure-README.md) +- 英語 README:[../README.md](../README.md) +- 中国語 README:[../README.zh-CN.md](../README.zh-CN.md) +- 日本語 README:[../README.ja.md](../README.ja.md) +- ロシア語 README:[../README.ru.md](../README.ru.md) +- フランス語 README:[../README.fr.md](../README.fr.md) +- ベトナム語 README:[../README.vi.md](../README.vi.md) +- 英語ドキュメントハブ:[README.md](README.md) +- 中国語ドキュメントハブ:[README.zh-CN.md](README.zh-CN.md) +- 日本語ドキュメントハブ:[README.ja.md](README.ja.md) +- ロシア語ドキュメントハブ:[README.ru.md](README.ru.md) +- フランス語ドキュメントハブ:[README.fr.md](README.fr.md) +- ベトナム語ドキュメントハブ:[i18n/vi/README.md](i18n/vi/README.md) +- 国際化ドキュメント索引:[i18n/README.md](i18n/README.md) +- 国際化カバレッジマップ:[i18n-coverage.md](maintainers/i18n-coverage.md) + +## カテゴリ + +### 1) はじめに + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) コマンド・設定リファレンスと統合 + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) 運用とデプロイ + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) セキュリティ設計と提案 + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) ハードウェアと周辺機器 + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) コントリビューションと CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) プロジェクト状況とスナップショット + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.ko.md b/third_party/zeroclaw/docs/SUMMARY.ko.md new file mode 100644 index 0000000..3891d5f --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.ko.md @@ -0,0 +1,92 @@ +# ZeroClaw 문서 요약 (통합 목차) + +이 파일은 문서 시스템의 정식 목차입니다. + +> 📖 [English version](SUMMARY.md) + +마지막 업데이트: **2026년 2월 18일**. + +## 언어별 진입점 + +- 문서 구조 맵 (언어/부분/기능): [structure/README.md](maintainers/structure-README.md) +- 영어 README: [../README.md](../README.md) +- 중국어 README: [../README.zh-CN.md](../README.zh-CN.md) +- 일본어 README: [../README.ja.md](../README.ja.md) +- 러시아어 README: [../README.ru.md](../README.ru.md) +- 프랑스어 README: [../README.fr.md](../README.fr.md) +- 베트남어 README: [../README.vi.md](../README.vi.md) +- 영어 문서 허브: [README.md](README.md) +- 중국어 문서 허브: [README.zh-CN.md](README.zh-CN.md) +- 일본어 문서 허브: [README.ja.md](README.ja.md) +- 러시아어 문서 허브: [README.ru.md](README.ru.md) +- 프랑스어 문서 허브: [README.fr.md](README.fr.md) +- 베트남어 문서 허브: [i18n/vi/README.md](i18n/vi/README.md) +- 현지화 문서 색인: [i18n/README.md](i18n/README.md) +- i18n 커버리지 맵: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## 컬렉션 + +### 1) 시작하기 + +- [setup-guides/README.md](setup-guides/README.md) +- [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) 명령어/구성 참조 및 통합 + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) 운영 및 배포 + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) 보안 설계 및 제안 + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) 하드웨어 및 주변 장치 + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) 기여 및 CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) +- [extension-examples.md](contributing/extension-examples.md) +- [testing.md](contributing/testing.md) + +### 7) 프로젝트 상태 및 스냅샷 + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.md b/third_party/zeroclaw/docs/SUMMARY.md new file mode 100644 index 0000000..ca41003 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.md @@ -0,0 +1,140 @@ +# ZeroClaw Docs Summary (Unified TOC) + +This file is the canonical table of contents for the documentation system. + +Last refreshed: **February 18, 2026**. + +## Language Entry + +- Docs Structure Map (language/part/function): [structure/README.md](maintainers/structure-README.md) +- English README: [../README.md](../README.md) +- Arabic README: [../README.ar.md](../README.ar.md) +- Bengali README: [../README.bn.md](../README.bn.md) +- Czech README: [../README.cs.md](../README.cs.md) +- Danish README: [../README.da.md](../README.da.md) +- German README: [../README.de.md](../README.de.md) +- Greek README: [../README.el.md](../README.el.md) +- Spanish README: [../README.es.md](../README.es.md) +- Finnish README: [../README.fi.md](../README.fi.md) +- French README: [../README.fr.md](../README.fr.md) +- Hebrew README: [../README.he.md](../README.he.md) +- Hindi README: [../README.hi.md](../README.hi.md) +- Hungarian README: [../README.hu.md](../README.hu.md) +- Indonesian README: [../README.id.md](../README.id.md) +- Italian README: [../README.it.md](../README.it.md) +- Japanese README: [../README.ja.md](../README.ja.md) +- Korean README: [../README.ko.md](../README.ko.md) +- Norwegian Bokmål README: [../README.nb.md](../README.nb.md) +- Dutch README: [../README.nl.md](../README.nl.md) +- Polish README: [../README.pl.md](../README.pl.md) +- Portuguese README: [../README.pt.md](../README.pt.md) +- Romanian README: [../README.ro.md](../README.ro.md) +- Russian README: [../README.ru.md](../README.ru.md) +- Swedish README: [../README.sv.md](../README.sv.md) +- Thai README: [../README.th.md](../README.th.md) +- Tagalog README: [../README.tl.md](../README.tl.md) +- Turkish README: [../README.tr.md](../README.tr.md) +- Ukrainian README: [../README.uk.md](../README.uk.md) +- Urdu README: [../README.ur.md](../README.ur.md) +- Vietnamese README: [../README.vi.md](../README.vi.md) +- Chinese README: [../README.zh-CN.md](../README.zh-CN.md) +- English Docs Hub: [README.md](README.md) +- Arabic Docs Hub: [README.ar.md](README.ar.md) +- Bengali Docs Hub: [README.bn.md](README.bn.md) +- Czech Docs Hub: [README.cs.md](README.cs.md) +- Danish Docs Hub: [README.da.md](README.da.md) +- German Docs Hub: [README.de.md](README.de.md) +- Greek Docs Hub: [README.el.md](README.el.md) +- Spanish Docs Hub: [README.es.md](README.es.md) +- Finnish Docs Hub: [README.fi.md](README.fi.md) +- French Docs Hub: [README.fr.md](README.fr.md) +- Hebrew Docs Hub: [README.he.md](README.he.md) +- Hindi Docs Hub: [README.hi.md](README.hi.md) +- Hungarian Docs Hub: [README.hu.md](README.hu.md) +- Indonesian Docs Hub: [README.id.md](README.id.md) +- Italian Docs Hub: [README.it.md](README.it.md) +- Japanese Docs Hub: [README.ja.md](README.ja.md) +- Korean Docs Hub: [README.ko.md](README.ko.md) +- Norwegian Bokmål Docs Hub: [README.nb.md](README.nb.md) +- Dutch Docs Hub: [README.nl.md](README.nl.md) +- Polish Docs Hub: [README.pl.md](README.pl.md) +- Portuguese Docs Hub: [README.pt.md](README.pt.md) +- Romanian Docs Hub: [README.ro.md](README.ro.md) +- Russian Docs Hub: [README.ru.md](README.ru.md) +- Swedish Docs Hub: [README.sv.md](README.sv.md) +- Thai Docs Hub: [README.th.md](README.th.md) +- Tagalog Docs Hub: [README.tl.md](README.tl.md) +- Turkish Docs Hub: [README.tr.md](README.tr.md) +- Ukrainian Docs Hub: [README.uk.md](README.uk.md) +- Urdu Docs Hub: [README.ur.md](README.ur.md) +- Vietnamese Docs Hub: [README.vi.md](README.vi.md) +- Chinese Docs Hub: [README.zh-CN.md](README.zh-CN.md) +- i18n Docs Index: [i18n/README.md](i18n/README.md) +- i18n Coverage Map: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Collections + +### 1) Getting Started + +- [setup-guides/README.md](setup-guides/README.md) +- [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Command/Config References & Integrations + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Operations & Deployment + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Security Design & Proposals + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardware & Peripherals + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Contribution & CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) +- [extension-examples.md](contributing/extension-examples.md) +- [testing.md](contributing/testing.md) + +### 7) Project Status & Snapshot + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.nb.md b/third_party/zeroclaw/docs/SUMMARY.nb.md new file mode 100644 index 0000000..d655b6e --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.nb.md @@ -0,0 +1,92 @@ +# ZeroClaw Dokumentasjonssammendrag (Samlet innholdsfortegnelse) + +Denne filen er den kanoniske innholdsfortegnelsen for dokumentasjonssystemet. + +> 📖 [English version](SUMMARY.md) + +Sist oppdatert: **18. februar 2026**. + +## Språkinngangspunkter + +- Dokumentasjonsstrukturkart (språk/del/funksjon): [structure/README.md](maintainers/structure-README.md) +- Engelsk README: [../README.md](../README.md) +- Kinesisk README: [../README.zh-CN.md](../README.zh-CN.md) +- Japansk README: [../README.ja.md](../README.ja.md) +- Russisk README: [../README.ru.md](../README.ru.md) +- Fransk README: [../README.fr.md](../README.fr.md) +- Vietnamesisk README: [../README.vi.md](../README.vi.md) +- Engelsk dokumentasjonshub: [README.md](README.md) +- Kinesisk dokumentasjonshub: [README.zh-CN.md](README.zh-CN.md) +- Japansk dokumentasjonshub: [README.ja.md](README.ja.md) +- Russisk dokumentasjonshub: [README.ru.md](README.ru.md) +- Fransk dokumentasjonshub: [README.fr.md](README.fr.md) +- Vietnamesisk dokumentasjonshub: [i18n/vi/README.md](i18n/vi/README.md) +- Lokaliseringsdokumentasjonsindeks: [i18n/README.md](i18n/README.md) +- i18n-dekningskart: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Samlinger + +### 1) Kom i gang + +- [setup-guides/README.md](setup-guides/README.md) +- [macos-update-uninstall.md](setup-guides/macos-update-uninstall.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Kommando-/konfigurasjonsreferanse og integrasjoner + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Drift og utrulling + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Sikkerhetsdesign og forslag + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Maskinvare og periferiutstyr + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Bidrag og CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) +- [extension-examples.md](contributing/extension-examples.md) +- [testing.md](contributing/testing.md) + +### 7) Prosjektstatus og øyeblikksbilder + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.nl.md b/third_party/zeroclaw/docs/SUMMARY.nl.md new file mode 100644 index 0000000..55042cf --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.nl.md @@ -0,0 +1,89 @@ +# ZeroClaw Documentatieoverzicht (Uniforme Inhoudsopgave) + +Dit bestand is de canonieke inhoudsopgave van het documentatiesysteem. + +> 📖 [English version](SUMMARY.md) + +Laatst bijgewerkt: **18 februari 2026**. + +## Toegangspunten per taal + +- Documentatiestructuurkaart (taal/deel/functie): [structure/README.md](maintainers/structure-README.md) +- README in het Engels: [../README.md](../README.md) +- README in het Chinees: [../README.zh-CN.md](../README.zh-CN.md) +- README in het Japans: [../README.ja.md](../README.ja.md) +- README in het Russisch: [../README.ru.md](../README.ru.md) +- README in het Frans: [../README.fr.md](../README.fr.md) +- README in het Vietnamees: [../README.vi.md](../README.vi.md) +- Documentatie in het Engels: [README.md](README.md) +- Documentatie in het Chinees: [README.zh-CN.md](README.zh-CN.md) +- Documentatie in het Japans: [README.ja.md](README.ja.md) +- Documentatie in het Russisch: [README.ru.md](README.ru.md) +- Documentatie in het Frans: [README.fr.md](README.fr.md) +- Documentatie in het Vietnamees: [i18n/vi/README.md](i18n/vi/README.md) +- Lokalisatie-index: [i18n/README.md](i18n/README.md) +- i18n-dekkingskaart: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Categorieën + +### 1) Snelle start + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Commando-, configuratie- en integratiereferentie + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Beheer en implementatie + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Beveiligingsontwerp en voorstellen + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardware en randapparatuur + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Bijdrage en CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Projectstatus en momentopnamen + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.pl.md b/third_party/zeroclaw/docs/SUMMARY.pl.md new file mode 100644 index 0000000..ebabcc9 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.pl.md @@ -0,0 +1,89 @@ +# Podsumowanie Dokumentacji ZeroClaw (Ujednolicony Spis Treści) + +Ten plik stanowi kanoniczny spis treści systemu dokumentacji. + +> 📖 [English version](SUMMARY.md) + +Ostatnia aktualizacja: **18 lutego 2026**. + +## Punkty wejścia według języka + +- Mapa struktury dokumentacji (język/część/funkcja): [structure/README.md](maintainers/structure-README.md) +- README po angielsku: [../README.md](../README.md) +- README po chińsku: [../README.zh-CN.md](../README.zh-CN.md) +- README po japońsku: [../README.ja.md](../README.ja.md) +- README po rosyjsku: [../README.ru.md](../README.ru.md) +- README po francusku: [../README.fr.md](../README.fr.md) +- README po wietnamsku: [../README.vi.md](../README.vi.md) +- Dokumentacja po angielsku: [README.md](README.md) +- Dokumentacja po chińsku: [README.zh-CN.md](README.zh-CN.md) +- Dokumentacja po japońsku: [README.ja.md](README.ja.md) +- Dokumentacja po rosyjsku: [README.ru.md](README.ru.md) +- Dokumentacja po francusku: [README.fr.md](README.fr.md) +- Dokumentacja po wietnamsku: [i18n/vi/README.md](i18n/vi/README.md) +- Indeks lokalizacji: [i18n/README.md](i18n/README.md) +- Mapa pokrycia i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Kategorie + +### 1) Szybki start + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Polecenia, konfiguracja i referencje integracji + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Eksploatacja i wdrożenie + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Projektowanie bezpieczeństwa i propozycje + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardware i peryferia + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Kontrybuowanie i CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Status projektu i migawki + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.pt.md b/third_party/zeroclaw/docs/SUMMARY.pt.md new file mode 100644 index 0000000..26bc961 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.pt.md @@ -0,0 +1,89 @@ +# Resumo da Documentação ZeroClaw (Índice Unificado) + +Este arquivo constitui o índice canônico do sistema de documentação. + +> 📖 [English version](SUMMARY.md) + +Última atualização: **18 de fevereiro de 2026**. + +## Pontos de entrada por idioma + +- Mapa da estrutura de docs (idioma/parte/função): [structure/README.md](maintainers/structure-README.md) +- README em inglês: [../README.md](../README.md) +- README em chinês: [../README.zh-CN.md](../README.zh-CN.md) +- README em japonês: [../README.ja.md](../README.ja.md) +- README em russo: [../README.ru.md](../README.ru.md) +- README em francês: [../README.fr.md](../README.fr.md) +- README em vietnamita: [../README.vi.md](../README.vi.md) +- Documentação em inglês: [README.md](README.md) +- Documentação em chinês: [README.zh-CN.md](README.zh-CN.md) +- Documentação em japonês: [README.ja.md](README.ja.md) +- Documentação em russo: [README.ru.md](README.ru.md) +- Documentação em francês: [README.fr.md](README.fr.md) +- Documentação em vietnamita: [i18n/vi/README.md](i18n/vi/README.md) +- Índice de localização: [i18n/README.md](i18n/README.md) +- Mapa de cobertura i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Categorias + +### 1) Início rápido + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Referência de comandos, configuração e integrações + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Operações e implantação + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Design de segurança e propostas + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardware e periféricos + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Contribuição e CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Estado do projeto e instantâneos + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.ro.md b/third_party/zeroclaw/docs/SUMMARY.ro.md new file mode 100644 index 0000000..0b8dd83 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.ro.md @@ -0,0 +1,89 @@ +# Rezumatul Documentației ZeroClaw (Cuprins Unificat) + +Acest fișier constituie cuprinsul canonic al sistemului de documentație. + +> 📖 [English version](SUMMARY.md) + +Ultima actualizare: **18 februarie 2026**. + +## Puncte de intrare pe limbă + +- Harta structurii documentației (limbă/parte/funcție): [structure/README.md](maintainers/structure-README.md) +- README în engleză: [../README.md](../README.md) +- README în chineză: [../README.zh-CN.md](../README.zh-CN.md) +- README în japoneză: [../README.ja.md](../README.ja.md) +- README în rusă: [../README.ru.md](../README.ru.md) +- README în franceză: [../README.fr.md](../README.fr.md) +- README în vietnameză: [../README.vi.md](../README.vi.md) +- Documentație în engleză: [README.md](README.md) +- Documentație în chineză: [README.zh-CN.md](README.zh-CN.md) +- Documentație în japoneză: [README.ja.md](README.ja.md) +- Documentație în rusă: [README.ru.md](README.ru.md) +- Documentație în franceză: [README.fr.md](README.fr.md) +- Documentație în vietnameză: [i18n/vi/README.md](i18n/vi/README.md) +- Index de localizare: [i18n/README.md](i18n/README.md) +- Hartă de acoperire i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Categorii + +### 1) Start rapid + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Referință comenzi, configurare și integrări + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Operațiuni și implementare + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Design de securitate și propuneri + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardware și periferice + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Contribuție și CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Starea proiectului și instantanee + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.ru.md b/third_party/zeroclaw/docs/SUMMARY.ru.md new file mode 100644 index 0000000..a8f5749 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.ru.md @@ -0,0 +1,89 @@ +# Содержание документации ZeroClaw (Единое оглавление) + +Этот файл является каноническим оглавлением системы документации. + +> 📖 [English version](SUMMARY.md) + +Последнее обновление: **18 февраля 2026 г.** + +## Языковые точки входа + +- Карта структуры docs (язык/раздел/функция): [structure/README.md](maintainers/structure-README.md) +- README на английском: [../README.md](../README.md) +- README на китайском: [../README.zh-CN.md](../README.zh-CN.md) +- README на японском: [../README.ja.md](../README.ja.md) +- README на русском: [../README.ru.md](../README.ru.md) +- README на французском: [../README.fr.md](../README.fr.md) +- README на вьетнамском: [../README.vi.md](../README.vi.md) +- Документация на английском: [README.md](README.md) +- Документация на китайском: [README.zh-CN.md](README.zh-CN.md) +- Документация на японском: [README.ja.md](README.ja.md) +- Документация на русском: [README.ru.md](README.ru.md) +- Документация на французском: [README.fr.md](README.fr.md) +- Документация на вьетнамском: [i18n/vi/README.md](i18n/vi/README.md) +- Индекс локализации: [i18n/README.md](i18n/README.md) +- Карта покрытия локализации: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Разделы + +### 1) Начало работы + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Справочник команд, конфигурации и интеграций + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Эксплуатация и развёртывание + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Проектирование безопасности и предложения + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Оборудование и периферия + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Участие в проекте и CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Состояние проекта и снимки + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.sv.md b/third_party/zeroclaw/docs/SUMMARY.sv.md new file mode 100644 index 0000000..357077c --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.sv.md @@ -0,0 +1,89 @@ +# ZeroClaw Dokumentationssammanfattning (Enhetlig Innehållsförteckning) + +Denna fil utgör den kanoniska innehållsförteckningen för dokumentationssystemet. + +> 📖 [English version](SUMMARY.md) + +Senast uppdaterad: **18 februari 2026**. + +## Ingångspunkter per språk + +- Dokumentationsstrukturkarta (språk/del/funktion): [structure/README.md](maintainers/structure-README.md) +- README på engelska: [../README.md](../README.md) +- README på kinesiska: [../README.zh-CN.md](../README.zh-CN.md) +- README på japanska: [../README.ja.md](../README.ja.md) +- README på ryska: [../README.ru.md](../README.ru.md) +- README på franska: [../README.fr.md](../README.fr.md) +- README på vietnamesiska: [../README.vi.md](../README.vi.md) +- Dokumentation på engelska: [README.md](README.md) +- Dokumentation på kinesiska: [README.zh-CN.md](README.zh-CN.md) +- Dokumentation på japanska: [README.ja.md](README.ja.md) +- Dokumentation på ryska: [README.ru.md](README.ru.md) +- Dokumentation på franska: [README.fr.md](README.fr.md) +- Dokumentation på vietnamesiska: [i18n/vi/README.md](i18n/vi/README.md) +- Lokaliseringsindex: [i18n/README.md](i18n/README.md) +- i18n-täckningskarta: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Kategorier + +### 1) Snabbstart + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Kommando-, konfigurations- och integrationsreferens + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Drift och driftsättning + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Säkerhetsdesign och förslag + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hårdvara och kringutrustning + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Bidrag och CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Projektstatus och ögonblicksbilder + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.th.md b/third_party/zeroclaw/docs/SUMMARY.th.md new file mode 100644 index 0000000..4caa105 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.th.md @@ -0,0 +1,89 @@ +# สรุปเอกสาร ZeroClaw (สารบัญรวม) + +ไฟล์นี้เป็นสารบัญหลักของระบบเอกสาร + +> 📖 [English version](SUMMARY.md) + +อัปเดตล่าสุด: **18 กุมภาพันธ์ 2026** + +## จุดเริ่มต้นตามภาษา + +- แผนที่โครงสร้างเอกสาร (ภาษา/ส่วน/ฟังก์ชัน): [structure/README.md](maintainers/structure-README.md) +- README ภาษาอังกฤษ: [../README.md](../README.md) +- README ภาษาจีน: [../README.zh-CN.md](../README.zh-CN.md) +- README ภาษาญี่ปุ่น: [../README.ja.md](../README.ja.md) +- README ภาษารัสเซีย: [../README.ru.md](../README.ru.md) +- README ภาษาฝรั่งเศส: [../README.fr.md](../README.fr.md) +- README ภาษาเวียดนาม: [../README.vi.md](../README.vi.md) +- เอกสารภาษาอังกฤษ: [README.md](README.md) +- เอกสารภาษาจีน: [README.zh-CN.md](README.zh-CN.md) +- เอกสารภาษาญี่ปุ่น: [README.ja.md](README.ja.md) +- เอกสารภาษารัสเซีย: [README.ru.md](README.ru.md) +- เอกสารภาษาฝรั่งเศส: [README.fr.md](README.fr.md) +- เอกสารภาษาเวียดนาม: [i18n/vi/README.md](i18n/vi/README.md) +- ดัชนีการแปล: [i18n/README.md](i18n/README.md) +- แผนที่ความครอบคลุม i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## หมวดหมู่ + +### 1) เริ่มต้นอย่างรวดเร็ว + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) คู่มือคำสั่ง การตั้งค่า และการรวมระบบ + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) การดำเนินงานและการปรับใช้ + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) การออกแบบความปลอดภัยและข้อเสนอ + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) ฮาร์ดแวร์และอุปกรณ์ต่อพ่วง + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) การมีส่วนร่วมและ CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) สถานะโปรเจกต์และสแนปช็อต + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.tl.md b/third_party/zeroclaw/docs/SUMMARY.tl.md new file mode 100644 index 0000000..fd86634 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.tl.md @@ -0,0 +1,89 @@ +# Buod ng Dokumentasyon ng ZeroClaw (Pinag-isang Talaan ng Nilalaman) + +Ang file na ito ang canonical na talaan ng nilalaman ng sistema ng dokumentasyon. + +> 📖 [English version](SUMMARY.md) + +Huling na-update: **Pebrero 18, 2026**. + +## Mga Entry Point Ayon sa Wika + +- Mapa ng istruktura ng docs (wika/bahagi/function): [structure/README.md](maintainers/structure-README.md) +- README sa Ingles: [../README.md](../README.md) +- README sa Tsino: [../README.zh-CN.md](../README.zh-CN.md) +- README sa Hapones: [../README.ja.md](../README.ja.md) +- README sa Ruso: [../README.ru.md](../README.ru.md) +- README sa Pranses: [../README.fr.md](../README.fr.md) +- README sa Vietnamese: [../README.vi.md](../README.vi.md) +- Dokumentasyon sa Ingles: [README.md](README.md) +- Dokumentasyon sa Tsino: [README.zh-CN.md](README.zh-CN.md) +- Dokumentasyon sa Hapones: [README.ja.md](README.ja.md) +- Dokumentasyon sa Ruso: [README.ru.md](README.ru.md) +- Dokumentasyon sa Pranses: [README.fr.md](README.fr.md) +- Dokumentasyon sa Vietnamese: [i18n/vi/README.md](i18n/vi/README.md) +- Index ng lokalisasyon: [i18n/README.md](i18n/README.md) +- Mapa ng saklaw ng i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Mga Kategorya + +### 1) Mabilis na Pagsisimula + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Reference ng Utos, Configuration, at Integrasyon + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Operasyon at Deployment + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Disenyo ng Seguridad at mga Panukala + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Hardware at Peripheral + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Kontribusyon at CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Estado ng Proyekto at mga Snapshot + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.tr.md b/third_party/zeroclaw/docs/SUMMARY.tr.md new file mode 100644 index 0000000..01684c7 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.tr.md @@ -0,0 +1,89 @@ +# ZeroClaw Dokümantasyon Özeti (Birleşik İçindekiler) + +Bu dosya, dokümantasyon sisteminin kanonik içindekiler tablosudur. + +> 📖 [English version](SUMMARY.md) + +Son güncelleme: **18 Şubat 2026**. + +## Dile Göre Giriş Noktaları + +- Dokümantasyon yapı haritası (dil/bölüm/işlev): [structure/README.md](maintainers/structure-README.md) +- İngilizce README: [../README.md](../README.md) +- Çince README: [../README.zh-CN.md](../README.zh-CN.md) +- Japonca README: [../README.ja.md](../README.ja.md) +- Rusça README: [../README.ru.md](../README.ru.md) +- Fransızca README: [../README.fr.md](../README.fr.md) +- Vietnamca README: [../README.vi.md](../README.vi.md) +- İngilizce dokümantasyon: [README.md](README.md) +- Çince dokümantasyon: [README.zh-CN.md](README.zh-CN.md) +- Japonca dokümantasyon: [README.ja.md](README.ja.md) +- Rusça dokümantasyon: [README.ru.md](README.ru.md) +- Fransızca dokümantasyon: [README.fr.md](README.fr.md) +- Vietnamca dokümantasyon: [i18n/vi/README.md](i18n/vi/README.md) +- Yerelleştirme dizini: [i18n/README.md](i18n/README.md) +- i18n kapsam haritası: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Kategoriler + +### 1) Hızlı Başlangıç + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Komut, Yapılandırma ve Entegrasyon Referansı + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Operasyonlar ve Dağıtım + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Güvenlik Tasarımı ve Öneriler + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Donanım ve Çevre Birimleri + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Katkı ve CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Proje Durumu ve Anlık Görüntüler + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.uk.md b/third_party/zeroclaw/docs/SUMMARY.uk.md new file mode 100644 index 0000000..a2cd2f5 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.uk.md @@ -0,0 +1,89 @@ +# Зміст документації ZeroClaw (Єдиний зміст) + +Цей файл є канонічним змістом системи документації. + +> 📖 [English version](SUMMARY.md) + +Останнє оновлення: **18 лютого 2026**. + +## Точки входу за мовою + +- Карта структури документації (мова/розділ/функція): [structure/README.md](maintainers/structure-README.md) +- README англійською: [../README.md](../README.md) +- README китайською: [../README.zh-CN.md](../README.zh-CN.md) +- README японською: [../README.ja.md](../README.ja.md) +- README російською: [../README.ru.md](../README.ru.md) +- README французькою: [../README.fr.md](../README.fr.md) +- README в'єтнамською: [../README.vi.md](../README.vi.md) +- Документація англійською: [README.md](README.md) +- Документація китайською: [README.zh-CN.md](README.zh-CN.md) +- Документація японською: [README.ja.md](README.ja.md) +- Документація російською: [README.ru.md](README.ru.md) +- Документація французькою: [README.fr.md](README.fr.md) +- Документація в'єтнамською: [i18n/vi/README.md](i18n/vi/README.md) +- Індекс локалізації: [i18n/README.md](i18n/README.md) +- Карта покриття i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Категорії + +### 1) Швидкий старт + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Довідник команд, конфігурації та інтеграцій + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Експлуатація та розгортання + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Проектування безпеки та пропозиції + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Обладнання та периферія + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Внесок та CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Стан проекту та знімки + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.ur.md b/third_party/zeroclaw/docs/SUMMARY.ur.md new file mode 100644 index 0000000..9248167 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.ur.md @@ -0,0 +1,89 @@ +# ZeroClaw دستاویزات کا خلاصہ (متحد فہرست مضامین) + +یہ فائل دستاویزات کے نظام کی معیاری فہرست مضامین ہے۔ + +> 📖 [English version](SUMMARY.md) + +آخری تازہ کاری: **18 فروری 2026**۔ + +## زبان کے مطابق داخلی نقاط + +- دستاویزات ساختی نقشہ (زبان/حصہ/فنکشن): [structure/README.md](maintainers/structure-README.md) +- انگریزی README: [../README.md](../README.md) +- چینی README: [../README.zh-CN.md](../README.zh-CN.md) +- جاپانی README: [../README.ja.md](../README.ja.md) +- روسی README: [../README.ru.md](../README.ru.md) +- فرانسیسی README: [../README.fr.md](../README.fr.md) +- ویتنامی README: [../README.vi.md](../README.vi.md) +- انگریزی دستاویزات: [README.md](README.md) +- چینی دستاویزات: [README.zh-CN.md](README.zh-CN.md) +- جاپانی دستاویزات: [README.ja.md](README.ja.md) +- روسی دستاویزات: [README.ru.md](README.ru.md) +- فرانسیسی دستاویزات: [README.fr.md](README.fr.md) +- ویتنامی دستاویزات: [i18n/vi/README.md](i18n/vi/README.md) +- لوکلائزیشن انڈیکس: [i18n/README.md](i18n/README.md) +- i18n کوریج نقشہ: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## زمرے + +### 1) فوری آغاز + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) کمانڈز، کنفیگریشن اور انضمام کا حوالہ + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) آپریشنز اور تعیناتی + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) سیکیورٹی ڈیزائن اور تجاویز + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) ہارڈویئر اور پیریفرلز + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) شراکت اور CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) پراجیکٹ کی حالت اور سنیپ شاٹس + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.vi.md b/third_party/zeroclaw/docs/SUMMARY.vi.md new file mode 100644 index 0000000..6b49182 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.vi.md @@ -0,0 +1,89 @@ +# Tóm tắt Tài liệu ZeroClaw (Mục lục Thống nhất) + +Tệp này là mục lục chính thức của hệ thống tài liệu. + +> 📖 [English version](SUMMARY.md) + +Cập nhật lần cuối: **18 tháng 2, 2026**. + +## Điểm vào theo Ngôn ngữ + +- Bản đồ cấu trúc tài liệu (ngôn ngữ/phần/chức năng): [structure/README.md](maintainers/structure-README.md) +- README tiếng Anh: [../README.md](../README.md) +- README tiếng Trung: [../README.zh-CN.md](../README.zh-CN.md) +- README tiếng Nhật: [../README.ja.md](../README.ja.md) +- README tiếng Nga: [../README.ru.md](../README.ru.md) +- README tiếng Pháp: [../README.fr.md](../README.fr.md) +- README tiếng Việt: [../README.vi.md](../README.vi.md) +- Tài liệu tiếng Anh: [README.md](README.md) +- Tài liệu tiếng Trung: [README.zh-CN.md](README.zh-CN.md) +- Tài liệu tiếng Nhật: [README.ja.md](README.ja.md) +- Tài liệu tiếng Nga: [README.ru.md](README.ru.md) +- Tài liệu tiếng Pháp: [README.fr.md](README.fr.md) +- Tài liệu tiếng Việt: [README.vi.md](README.vi.md) +- Chỉ mục bản địa hóa: [i18n/README.md](i18n/README.md) +- Bản đồ phủ sóng i18n: [i18n-coverage.md](maintainers/i18n-coverage.md) + +## Danh mục + +### 1) Bắt đầu Nhanh + +- [setup-guides/README.md](setup-guides/README.md) +- [one-click-bootstrap.md](setup-guides/one-click-bootstrap.md) + +### 2) Tham chiếu Lệnh, Cấu hình và Tích hợp + +- [reference/README.md](reference/README.md) +- [commands-reference.md](reference/cli/commands-reference.md) +- [providers-reference.md](reference/api/providers-reference.md) +- [channels-reference.md](reference/api/channels-reference.md) +- [nextcloud-talk-setup.md](setup-guides/nextcloud-talk-setup.md) +- [config-reference.md](reference/api/config-reference.md) +- [custom-providers.md](contributing/custom-providers.md) +- [zai-glm-setup.md](setup-guides/zai-glm-setup.md) +- [langgraph-integration.md](contributing/langgraph-integration.md) + +### 3) Vận hành và Triển khai + +- [ops/README.md](ops/README.md) +- [operations-runbook.md](ops/operations-runbook.md) +- [release-process.md](contributing/release-process.md) +- [troubleshooting.md](ops/troubleshooting.md) +- [network-deployment.md](ops/network-deployment.md) +- [mattermost-setup.md](setup-guides/mattermost-setup.md) + +### 4) Thiết kế Bảo mật và Đề xuất + +- [security/README.md](security/README.md) +- [agnostic-security.md](security/agnostic-security.md) +- [frictionless-security.md](security/frictionless-security.md) +- [sandboxing.md](security/sandboxing.md) +- [resource-limits.md](ops/resource-limits.md) +- [audit-logging.md](security/audit-logging.md) +- [security-roadmap.md](security/security-roadmap.md) + +### 5) Phần cứng và Thiết bị Ngoại vi + +- [hardware/README.md](hardware/README.md) +- [hardware-peripherals-design.md](hardware/hardware-peripherals-design.md) +- [adding-boards-and-tools.md](contributing/adding-boards-and-tools.md) +- [nucleo-setup.md](hardware/nucleo-setup.md) +- [arduino-uno-q-setup.md](hardware/arduino-uno-q-setup.md) +- [datasheets/nucleo-f401re.md](hardware/datasheets/nucleo-f401re.md) +- [datasheets/arduino-uno.md](hardware/datasheets/arduino-uno.md) +- [datasheets/esp32.md](hardware/datasheets/esp32.md) + +### 6) Đóng góp và CI + +- [contributing/README.md](contributing/README.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](contributing/pr-workflow.md) +- [reviewer-playbook.md](contributing/reviewer-playbook.md) +- [ci-map.md](contributing/ci-map.md) +- [actions-source-policy.md](contributing/actions-source-policy.md) + +### 7) Trạng thái Dự án và Ảnh chụp + +- [maintainers/README.md](maintainers/README.md) +- [project-triage-snapshot-2026-02-18.md](maintainers/project-triage-snapshot-2026-02-18.md) +- [docs-inventory.md](maintainers/docs-inventory.md) diff --git a/third_party/zeroclaw/docs/SUMMARY.zh-CN.md b/third_party/zeroclaw/docs/SUMMARY.zh-CN.md new file mode 100644 index 0000000..44a02d0 --- /dev/null +++ b/third_party/zeroclaw/docs/SUMMARY.zh-CN.md @@ -0,0 +1,114 @@ +# ZeroClaw 文档目录(统一目录) + +本文件为文档系统的规范目录。 + +> 📖 [English version](SUMMARY.md) + +最后更新:**2026年3月14日**。 + +## 语言入口 + +- 文档结构图(按语言/分区/功能):[structure/README.md](i18n/zh-CN/maintainers/structure-README.zh-CN.md) +- 英文 README:[../README.md](../README.md) +- 中文 README:[../README.zh-CN.md](../README.zh-CN.md) +- 日文 README:[../README.ja.md](../README.ja.md) +- 俄文 README:[../README.ru.md](../README.ru.md) +- 法文 README:[../README.fr.md](../README.fr.md) +- 越南文 README:[../README.vi.md](../README.vi.md) +- 英文文档中心:[README.md](README.md) +- 中文文档中心:[README.zh-CN.md](README.zh-CN.md) +- 日文文档中心:[README.ja.md](README.ja.md) +- 俄文文档中心:[README.ru.md](README.ru.md) +- 法文文档中心:[README.fr.md](README.fr.md) +- 越南文文档中心:[i18n/vi/README.md](i18n/vi/README.md) +- 国际化文档索引:[i18n/README.md](i18n/README.md) +- 国际化覆盖图:[i18n-coverage.md](i18n/zh-CN/maintainers/i18n-coverage.zh-CN.md) + +## 分类 + +### 1) 快速入门 + +- [setup-guides/README.md](i18n/zh-CN/setup-guides/README.zh-CN.md) +- [macos-update-uninstall.md](i18n/zh-CN/setup-guides/macos-update-uninstall.zh-CN.md) +- [one-click-bootstrap.md](i18n/zh-CN/setup-guides/one-click-bootstrap.zh-CN.md) +- [mattermost-setup.md](i18n/zh-CN/setup-guides/mattermost-setup.zh-CN.md) +- [nextcloud-talk-setup.md](i18n/zh-CN/setup-guides/nextcloud-talk-setup.zh-CN.md) +- [zai-glm-setup.md](i18n/zh-CN/setup-guides/zai-glm-setup.zh-CN.md) + +### 2) 命令 / 配置参考与集成 + +- [reference/README.md](i18n/zh-CN/reference/README.zh-CN.md) +- [commands-reference.md](i18n/zh-CN/reference/cli/commands-reference.zh-CN.md) +- [providers-reference.md](i18n/zh-CN/reference/api/providers-reference.zh-CN.md) +- [channels-reference.md](i18n/zh-CN/reference/api/channels-reference.zh-CN.md) +- [config-reference.md](i18n/zh-CN/reference/api/config-reference.zh-CN.md) +- [custom-providers.md](i18n/zh-CN/contributing/custom-providers.zh-CN.md) +- [langgraph-integration.md](i18n/zh-CN/contributing/langgraph-integration.zh-CN.md) + +### 3) SOP(标准操作流程) + +- [reference/sop/README.md](i18n/zh-CN/reference/sop/README.zh-CN.md) +- [reference/sop/syntax.md](i18n/zh-CN/reference/sop/syntax.zh-CN.md) +- [reference/sop/cookbook.md](i18n/zh-CN/reference/sop/cookbook.zh-CN.md) +- [reference/sop/connectivity.md](i18n/zh-CN/reference/sop/connectivity.zh-CN.md) +- [reference/sop/observability.md](i18n/zh-CN/reference/sop/observability.zh-CN.md) + +### 4) 运维与部署 + +- [ops/README.md](i18n/zh-CN/ops/README.zh-CN.md) +- [operations-runbook.md](i18n/zh-CN/ops/operations-runbook.zh-CN.md) +- [release-process.md](i18n/zh-CN/contributing/release-process.zh-CN.md) +- [troubleshooting.md](i18n/zh-CN/ops/troubleshooting.zh-CN.md) +- [network-deployment.md](i18n/zh-CN/ops/network-deployment.zh-CN.md) +- [proxy-agent-playbook.md](i18n/zh-CN/ops/proxy-agent-playbook.zh-CN.md) +- [resource-limits.md](i18n/zh-CN/ops/resource-limits.zh-CN.md) + +### 5) 安全设计与提案 + +- [security/README.md](i18n/zh-CN/security/README.zh-CN.md) +- [matrix-e2ee-guide.md](i18n/zh-CN/security/matrix-e2ee-guide.zh-CN.md) +- [agnostic-security.md](i18n/zh-CN/security/agnostic-security.zh-CN.md) +- [frictionless-security.md](i18n/zh-CN/security/frictionless-security.zh-CN.md) +- [sandboxing.md](i18n/zh-CN/security/sandboxing.zh-CN.md) +- [audit-logging.md](i18n/zh-CN/security/audit-logging.zh-CN.md) +- [security-roadmap.md](i18n/zh-CN/security/security-roadmap.zh-CN.md) + +### 6) 硬件与外设 + +- [hardware/README.md](i18n/zh-CN/hardware/README.zh-CN.md) +- [hardware-peripherals-design.md](i18n/zh-CN/hardware/hardware-peripherals-design.zh-CN.md) +- [adding-boards-and-tools.md](i18n/zh-CN/contributing/adding-boards-and-tools.zh-CN.md) +- [nucleo-setup.md](i18n/zh-CN/hardware/nucleo-setup.zh-CN.md) +- [arduino-uno-q-setup.md](i18n/zh-CN/hardware/arduino-uno-q-setup.zh-CN.md) +- [android-setup.md](i18n/zh-CN/hardware/android-setup.zh-CN.md) +- [datasheets/nucleo-f401re.md](i18n/zh-CN/hardware/datasheets/nucleo-f401re.zh-CN.md) +- [datasheets/arduino-uno.md](i18n/zh-CN/hardware/datasheets/arduino-uno.zh-CN.md) +- [datasheets/esp32.md](i18n/zh-CN/hardware/datasheets/esp32.zh-CN.md) + +### 7) 贡献与 CI + +- [contributing/README.md](i18n/zh-CN/contributing/README.zh-CN.md) +- [../CONTRIBUTING.md](../CONTRIBUTING.md) +- [pr-workflow.md](i18n/zh-CN/contributing/pr-workflow.zh-CN.md) +- [reviewer-playbook.md](i18n/zh-CN/contributing/reviewer-playbook.zh-CN.md) +- [ci-map.md](i18n/zh-CN/contributing/ci-map.zh-CN.md) +- [actions-source-policy.md](i18n/zh-CN/contributing/actions-source-policy.zh-CN.md) +- [extension-examples.md](i18n/zh-CN/contributing/extension-examples.zh-CN.md) +- [testing.md](i18n/zh-CN/contributing/testing.zh-CN.md) +- [testing-telegram.md](i18n/zh-CN/contributing/testing-telegram.zh-CN.md) +- [cargo-slicer-speedup.md](i18n/zh-CN/contributing/cargo-slicer-speedup.zh-CN.md) +- [change-playbooks.md](i18n/zh-CN/contributing/change-playbooks.zh-CN.md) +- [cla.md](i18n/zh-CN/contributing/cla.zh-CN.md) +- [doc-template.md](i18n/zh-CN/contributing/doc-template.zh-CN.md) +- [docs-contract.md](i18n/zh-CN/contributing/docs-contract.zh-CN.md) +- [pr-discipline.md](i18n/zh-CN/contributing/pr-discipline.zh-CN.md) + +### 8) 项目状态与快照 + +- [maintainers/README.md](i18n/zh-CN/maintainers/README.zh-CN.md) +- [project-triage-snapshot-2026-02-18.md](i18n/zh-CN/maintainers/project-triage-snapshot-2026-02-18.zh-CN.md) +- [docs-inventory.md](i18n/zh-CN/maintainers/docs-inventory.zh-CN.md) +- [refactor-candidates.md](i18n/zh-CN/maintainers/refactor-candidates.zh-CN.md) +- [repo-map.md](i18n/zh-CN/maintainers/repo-map.zh-CN.md) +- [structure-README.md](i18n/zh-CN/maintainers/structure-README.zh-CN.md) +- [trademark.md](i18n/zh-CN/maintainers/trademark.zh-CN.md) diff --git a/third_party/zeroclaw/docs/aardvark-integration.md b/third_party/zeroclaw/docs/aardvark-integration.md new file mode 100644 index 0000000..10e91bf --- /dev/null +++ b/third_party/zeroclaw/docs/aardvark-integration.md @@ -0,0 +1,325 @@ +# Aardvark Integration — How It Works + +A plain-language walkthrough of every piece and how they connect. + +--- + +## The Big Picture + +``` +┌──────────────────────────────────────────────────────────────┐ +│ STARTUP (boot) │ +│ │ +│ 1. Ask aardvark-sys: "any adapters plugged in?" │ +│ 2. For each one found → register a device + transport │ +│ 3. Load tools only if hardware was found │ +└──────────────────────────────────────────┬───────────────────┘ + │ + ┌──────────────────────▼──────────────────────┐ + │ RUNTIME (agent loop) │ + │ │ + │ User: "scan i2c bus" │ + │ → agent calls i2c_scan tool │ + │ → tool builds a ZcCommand │ + │ → AardvarkTransport sends to hardware │ + │ → response flows back as text │ + └──────────────────────────────────────────────┘ +``` + +--- + +## Layer by Layer + +### Layer 1 — `aardvark-sys` (the USB talker) + +**File:** `crates/aardvark-sys/src/lib.rs` + +This is the only layer that ever touches the raw C library. +Think of it as a thin translator: it turns C function calls into safe Rust. + +**Algorithm:** + +``` +find_devices() + → call aa_find_devices(16, buf) // ask C lib how many adapters + → return Vec of port numbers // [0, 1, ...] one per adapter + +open_port(port) + → call aa_open(port) // open that specific adapter + → if handle ≤ 0, return OpenFailed + → else return AardvarkHandle{ _port: handle } + +i2c_scan(handle) + → for addr in 0x08..=0x77 // every valid 7-bit address + try aa_i2c_read(addr, 1 byte) // knock on the door + if ACK → add to list // device answered + → return list of live addresses + +i2c_read(handle, addr, len) + → aa_i2c_read(addr, len bytes) + → return bytes as Vec + +i2c_write(handle, addr, data) + → aa_i2c_write(addr, data) + +spi_transfer(handle, bytes_to_send) + → aa_spi_write(bytes) // full-duplex: sends + receives + → return received bytes + +gpio_set(handle, direction, value) + → aa_gpio_direction(direction) // which pins are outputs + → aa_gpio_put(value) // set output levels + +gpio_get(handle) + → aa_gpio_get() // read all pin levels as bitmask + +Drop(handle) + → aa_close(handle._port) // always close on drop +``` + +**In stub mode** (no SDK): every method returns `Err(NotFound)` immediately. `find_devices()` returns `[]`. Nothing crashes. + +--- + +### Layer 2 — `AardvarkTransport` (the bridge) + +**File:** `src/hardware/aardvark.rs` + +The rest of ZeroClaw speaks a single language: `ZcCommand` → `ZcResponse`. +`AardvarkTransport` translates between that protocol and the aardvark-sys calls above. + +**Algorithm:** + +``` +send(ZcCommand) → ZcResponse + + extract command name from cmd.name + extract parameters from cmd.params (serde_json values) + + match cmd.name: + + "i2c_scan" → open handle → call i2c_scan() + → format found addresses as hex list + → return ZcResponse{ output: "0x48, 0x68" } + + "i2c_read" → parse addr (hex string) + len (number) + → open handle → i2c_enable(bitrate) + → call i2c_read(addr, len) + → format bytes as hex + → return ZcResponse{ output: "0xAB 0xCD" } + + "i2c_write" → parse addr + data bytes + → open handle → i2c_write(addr, data) + → return ZcResponse{ output: "ok" } + + "spi_transfer" → parse bytes_hex string → decode to Vec + → open handle → spi_enable(bitrate) + → spi_transfer(bytes) + → return received bytes as hex + + "gpio_set" → parse direction + value bitmasks + → open handle → gpio_set(dir, val) + → return ZcResponse{ output: "ok" } + + "gpio_get" → open handle → gpio_get() + → return bitmask value as string + + on any AardvarkError → return ZcResponse{ error: "..." } +``` + +**Key design choice — lazy open:** The handle is opened fresh for every command and dropped at the end. This means no held connection, no state to clean up, and no "is it still open?" logic anywhere. + +--- + +### Layer 3 — Tools (what the agent calls) + +**File:** `src/hardware/aardvark_tools.rs` + +Each tool is a thin wrapper. It: +1. Validates the agent's JSON input +2. Resolves which physical device to use +3. Builds a `ZcCommand` +4. Calls `AardvarkTransport.send()` +5. Returns the result as text + +``` +I2cScanTool.call(args) + → look up "device" in args (default: "aardvark0") + → find that device in the registry + → build ZcCommand{ name: "i2c_scan", params: {} } + → send to AardvarkTransport + → return "Found: 0x48, 0x68" (or "No devices found") + +I2cReadTool.call(args) + → require args["addr"] and args["len"] + → build ZcCommand{ name: "i2c_read", params: {addr, len} } + → send → return hex bytes + +I2cWriteTool.call(args) + → require args["addr"] and args["data"] (hex or array) + → build ZcCommand{ name: "i2c_write", params: {addr, data} } + → send → return "ok" or error + +SpiTransferTool.call(args) + → require args["bytes"] (hex string) + → build ZcCommand{ name: "spi_transfer", params: {bytes} } + → send → return received bytes + +GpioAardvarkTool.call(args) + → require args["direction"] + args["value"] (set) + OR no extra args (get) + → build appropriate ZcCommand + → send → return result + +DatasheetTool.call(args) + → action = args["action"]: "search" | "download" | "list" | "read" + → "search": return a Google/vendor search URL for the device + → "download": fetch PDF from args["url"] → save to ~/.zeroclaw/hardware/datasheets/ + → "list": scan the datasheets directory → return filenames + → "read": open a saved PDF and return its text +``` + +--- + +### Layer 4 — Device Registry (the address book) + +**File:** `src/hardware/device.rs` + +The registry is a runtime map of every connected device. +Each entry stores: alias, kind, capabilities, transport handle. + +``` +register("aardvark", vid=0x2b76, ...) + → DeviceKind::from_vid(0x2b76) → DeviceKind::Aardvark + → DeviceRuntime::from_kind() → DeviceRuntime::Aardvark + → assign alias "aardvark0" (then "aardvark1" for second, etc.) + → store entry in HashMap + +attach_transport("aardvark0", AardvarkTransport, capabilities{i2c,spi,gpio}) + → store Arc in the entry + +has_aardvark() + → any entry where kind == Aardvark → true / false + +resolve_aardvark_device(args) + → read "device" param (default: "aardvark0") + → look up alias in HashMap + → return (alias, DeviceContext{ transport, capabilities }) +``` + +--- + +### Layer 5 — `boot()` (startup wiring) + +**File:** `src/hardware/mod.rs` + +`boot()` runs once at startup. For Aardvark: + +``` +boot() + ... + aardvark_ports = aardvark_sys::AardvarkHandle::find_devices() + // → [] in stub mode, [0] if one adapter is plugged in + + for (i, port) in aardvark_ports: + alias = registry.register("aardvark", vid=0x2b76, ...) + // → "aardvark0", "aardvark1", ... + + transport = AardvarkTransport::new(port, bitrate=100kHz) + registry.attach_transport(alias, transport, {i2c:true, spi:true, gpio:true}) + + log "[registry] aardvark0 ready → Total Phase port 0" + ... +``` + +--- + +### Layer 6 — Tool Registry (the loader) + +**File:** `src/hardware/tool_registry.rs` + +After `boot()`, the tool registry checks what hardware is present and loads +only the relevant tools: + +``` +ToolRegistry::load(devices) + + # always loaded (Pico / GPIO) + register: gpio_write, gpio_read, gpio_toggle, pico_flash, device_list, device_status + + # only loaded if an Aardvark was found at boot + if devices.has_aardvark(): + register: i2c_scan, i2c_read, i2c_write, spi_transfer, gpio_aardvark, datasheet +``` + +This is why the `hardware_feature_registers_all_six_tools` test still passes in stub mode — `has_aardvark()` returns false, 0 extra tools load, count stays at 6. + +--- + +## Full Flow Diagram + +``` + SDK FILES aardvark-sys ZeroClaw core + (vendor/) (crates/) (src/) +───────────────────────────────────────────────────────────────── + + aardvark.h ──► build.rs boot() + aardvark.so (bindgen) ──► find_devices() + │ │ + bindings.rs │ vec![0] (one adapter) + │ ▼ + lib.rs register("aardvark0") + AardvarkHandle attach_transport(AardvarkTransport) + │ │ + │ ▼ + │ ToolRegistry::load() + │ has_aardvark() == true + │ → load 6 aardvark tools + │ +───────────────────────────────────────────────────────────────── + + USER MESSAGE: "scan the i2c bus" + + agent loop + │ + ▼ + I2cScanTool.call() + │ + ▼ + resolve_aardvark_device("aardvark0") + │ returns transport Arc + ▼ + AardvarkTransport.send(ZcCommand{ name: "i2c_scan" }) + │ + ▼ + AardvarkHandle::open_port(0) ← opens USB connection + │ + ▼ + aa_i2c_read(0x08..0x77) ← probes each address + │ + ▼ + AardvarkHandle dropped ← USB connection closed + │ + ▼ + ZcResponse{ output: "Found: 0x48, 0x68" } + │ + ▼ + agent sends reply to user: "I found two I2C devices: 0x48 and 0x68" +``` + +--- + +## Stub vs Real Side by Side + +| | Stub mode (now) | Real hardware | +|---|---|---| +| `find_devices()` | returns `[]` | returns `[0]` | +| `open_port(0)` | `Err(NotFound)` | opens USB, returns handle | +| `i2c_scan()` | `[]` | probes bus, returns addresses | +| tools loaded | only the 6 Pico tools | 6 Pico + 6 Aardvark tools | +| `has_aardvark()` | `false` | `true` | +| SDK needed | no | yes (`vendor/aardvark.h` + `.so`) | + +The only code that changes when you plug in real hardware is inside +`crates/aardvark-sys/src/lib.rs` — every other layer is already wired up +and waiting. diff --git a/third_party/zeroclaw/docs/architecture/adr-004-tool-shared-state-ownership.md b/third_party/zeroclaw/docs/architecture/adr-004-tool-shared-state-ownership.md new file mode 100644 index 0000000..aef5200 --- /dev/null +++ b/third_party/zeroclaw/docs/architecture/adr-004-tool-shared-state-ownership.md @@ -0,0 +1,202 @@ +# ADR-004: Tool Shared State Ownership Contract + +**Status:** Accepted + +**Date:** 2026-03-22 + +**Issue:** [#4057](https://github.com/zeroclaw/zeroclaw/issues/4057) + +## Context + +ZeroClaw tools execute in a multi-client environment where a single daemon +process serves requests from multiple connected clients simultaneously. Several +tools already maintain long-lived shared state: + +- **`DelegateParentToolsHandle`** (`src/tools/mod.rs`): + `Arc>>>` — holds parent tools for delegate agents + with no per-client isolation. +- **`ChannelMapHandle`** (`src/tools/reaction.rs`): + `Arc>>>` — global channel map shared + across all clients. +- **`CanvasStore`** (`src/tools/canvas.rs`): + `Arc>>` — canvas IDs are plain strings + with no client namespace. + +These patterns emerged organically. As the tool surface grows and more clients +connect concurrently, we need a clear contract governing ownership, identity, +isolation, lifecycle, and reload behavior for tool-held shared state. Without +this contract, new tools risk introducing data leaks between clients, stale +state after config reloads, or inconsistent initialization timing. + +Additional context: + +- The tool registry is immutable after startup, built once in + `all_tools_with_runtime()`. +- Client identity is currently derived from IP address only + (`src/gateway/mod.rs`), which is insufficient for reliable namespacing. +- `SecurityPolicy` is scoped per agent, not per client. +- `WorkspaceManager` provides some isolation but workspace switching is global. + +## Decision + +### 1. Ownership: May tools own long-lived shared state? + +**Yes.** Tools MAY own long-lived shared state, provided they follow the +established **handle pattern**: wrap the state in `Arc>` (or +`Arc>`) and expose a cloneable handle type. + +This pattern is already proven by three independent implementations: + +| Handle | Location | Inner type | +|--------|----------|-----------| +| `DelegateParentToolsHandle` | `src/tools/mod.rs` | `Vec>` | +| `ChannelMapHandle` | `src/tools/reaction.rs` | `HashMap>` | +| `CanvasStore` | `src/tools/canvas.rs` | `HashMap` | + +Tools that need shared state MUST: + +- Define a named handle type alias (e.g., `pub type FooHandle = Arc>`). +- Accept the handle at construction time rather than creating global state. +- Document the concurrency contract in the handle type's doc comment. + +Tools MUST NOT use static mutable state (`lazy_static!`, `OnceCell` with +interior mutability) for per-request or per-client data. + +### 2. Identity assignment: Who constructs identity keys? + +**The daemon SHOULD provide identity.** Tools MUST NOT construct their own +client identity keys. + +A new `ClientId` type should be introduced (opaque, `Clone + Eq + Hash + Send + Sync`) +that the daemon assigns at connection time. This replaces the current approach +of using raw IP addresses (`src/gateway/mod.rs:259-306`), which breaks when +multiple clients share a NAT address or when proxied connections arrive. + +`ClientId` is passed to tools that require per-client state namespacing as part +of the tool execution context. Tools that do not need per-client isolation +(e.g., the immutable tool registry) may ignore it. + +The `ClientId` contract: + +- Generated by the gateway layer at connection establishment. +- Opaque to tools — tools must not parse or derive meaning from the value. +- Stable for the lifetime of a single client session. +- Passed through the execution context, not stored globally. + +### 3. Lifecycle: When may tools run startup-style validation? + +**Validation runs once at first registration, and again when config changes +are detected.** + +The lifecycle phases are: + +1. **Construction** — tool is instantiated with handles and config. No I/O or + validation occurs here. +2. **Registration** — tool is registered in the tool registry via + `all_tools_with_runtime()`. At this point the tool MAY perform one-time + startup validation (e.g., checking that required credentials exist, verifying + external service connectivity). +3. **Execution** — tool handles individual requests. No re-validation unless + the config-change signal fires (see Reload Semantics below). +4. **Shutdown** — daemon is stopping. Tools with open resources SHOULD clean up + gracefully via `Drop` or an explicit shutdown method. + +Tools MUST NOT perform blocking validation during execution-phase calls. +Validation results SHOULD be cached in the tool's handle state and checked +via a fast path during execution. + +### 4. Isolation: What must be isolated per client? + +State falls into two categories with different isolation requirements: + +**MUST be isolated per client:** + +- Security-sensitive state: credentials, API keys, quotas, rate-limit counters, + per-client authorization decisions. +- User-specific session data: conversation context, user preferences, + workspace-scoped file paths. + +Isolation mechanism: tools holding per-client state MUST key their internal +maps by `ClientId`. The handle pattern naturally supports this by using +`HashMap` inside the `RwLock`. + +**MAY be shared across clients (with namespace prefixing):** + +- Broadcast/display state: canvas frames (`CanvasStore`), notification channels + (`ChannelMapHandle`). +- Read-only reference data: tool registry, static configuration, model + metadata. + +When shared state uses string keys (e.g., canvas IDs, channel names), tools +SHOULD support optional namespace prefixing (e.g., `{client_id}:{canvas_name}`) +to allow per-client isolation when needed without mandating it for broadcast +use cases. + +Tools MUST NOT store per-client secrets in shared (non-isolated) state +structures. + +### 5. Reload semantics: What invalidates prior shared state on config change? + +**Config changes detected via hash comparison MUST invalidate cached +validation state.** + +The reload contract: + +- The daemon computes a hash of the tool-relevant config section at startup and + after each config reload event. +- When the hash changes, the daemon signals affected tools to re-run their + registration-phase validation. +- Tools MUST treat their cached validation result as stale when signaled and + re-validate before the next execution. + +Specific invalidation rules: + +| Config change | Invalidation scope | +|--------------|-------------------| +| Credential/secret rotation | Per-tool validation cache; per-client credential state | +| Tool enable/disable | Full tool registry rebuild via `all_tools_with_runtime()` | +| Security policy change | `SecurityPolicy` re-derivation; per-agent policy state | +| Workspace directory change | `WorkspaceManager` state; file-path-dependent tool state | +| Provider config change | Provider-dependent tools re-validate connectivity | + +Tools MAY retain non-security shared state (e.g., canvas content, channel +subscriptions) across config reloads unless the reload explicitly affects that +state's validity. + +## Consequences + +### Positive + +- **Consistency:** All new tools follow the same handle pattern, making shared + state discoverable and auditable. +- **Safety:** Per-client isolation of security-sensitive state prevents data + leaks in multi-tenant scenarios. +- **Clarity:** Explicit lifecycle phases eliminate ambiguity about when + validation runs. +- **Evolvability:** The `ClientId` abstraction decouples tools from transport + details, supporting future identity mechanisms (tokens, certificates). + +### Negative + +- **Migration cost:** Existing tools (`CanvasStore`, `ReactionTool`) may need + refactoring to accept `ClientId` and namespace their state. +- **Complexity:** Tools that were simple singletons now need to consider + multi-client semantics even if they currently have one client. +- **Performance:** Per-client keying adds a hash lookup on each access, though + this is negligible compared to I/O costs. + +### Neutral + +- The tool registry remains immutable after startup; this ADR does not change + that invariant. +- `SecurityPolicy` remains per-agent; this ADR documents that client isolation + is orthogonal to agent-level policy. + +## References + +- `src/tools/mod.rs` — `DelegateParentToolsHandle`, `all_tools_with_runtime()` +- `src/tools/reaction.rs` — `ChannelMapHandle`, `ReactionTool` +- `src/tools/canvas.rs` — `CanvasStore`, `CanvasEntry` +- `src/tools/traits.rs` — `Tool` trait +- `src/gateway/mod.rs` — client IP extraction (`forwarded_client_ip`, `resolve_client_ip`) +- `src/security/` — `SecurityPolicy` diff --git a/third_party/zeroclaw/docs/assets/Hardware_architecture.jpg b/third_party/zeroclaw/docs/assets/Hardware_architecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8daf589a8f456391c82a8a488b15483d861e6a55 GIT binary patch literal 85764 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%0D-QY1xbptb-x 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 literal 0 HcmV?d00001 diff --git a/third_party/zeroclaw/docs/assets/architecture-diagrams.md b/third_party/zeroclaw/docs/assets/architecture-diagrams.md new file mode 100644 index 0000000..3360362 --- /dev/null +++ b/third_party/zeroclaw/docs/assets/architecture-diagrams.md @@ -0,0 +1,832 @@ +# ZeroClaw Architecture Diagrams + +This document provides visual representations of ZeroClaw's architecture, execution modes, and data flows. + +--- + +## 1. Execution Modes + +**Ways ZeroClaw can be run:** + +```mermaid +flowchart TD + Start[zeroclaw CLI] --> Onboard[onboard
Setup wizard] + Start --> Agent[agent
Interactive CLI] + Start --> Gateway[gateway
HTTP server] + Start --> Daemon[daemon
Long-running runtime] + Start --> Channel[channel
Messaging platforms] + Start --> Service[service
OS service mgmt] + Start --> Models[models
Provider catalog] + Start --> Cron[cron
Scheduled tasks] + Start --> Hardware[hardware
Peripheral discovery] + Start --> Peripheral[peripheral
Hardware management] + Start --> Status[status
System overview] + Start --> Doctor[doctor
Diagnostics] + Start --> Migrate[migrate
Data import] + Start --> Skills[skills
User capabilities] + Start --> Integrations[integrations
Browse 50+ apps] + + Agent --> AgentSingle[-m message
One-shot] + Agent --> AgentInteractive[Interactive REPL
stdin/stdout] + + Daemon --> DaemonSupervised[Supervised runtime
Gateway + Channels + Scheduler] +``` + +--- + +## 2. System Architecture Overview + +**High-level component structure:** + +```mermaid +flowchart TB + subgraph CLI[CLI Entry Point] + Main[main.rs] + end + + subgraph Core[Core Subsystems] + Config[config/
Configuration & Schema] + Agent[agent/
Orchestration Loop] + Providers[providers/
LLM Adapters] + Channels[channels/
Messaging Platforms] + Tools[tools/
Tool Execution] + Memory[memory/
Storage Backends] + Security[security/
Policy & Pairing] + Runtime[runtime/
Execution Adapters] + Gateway[gateway/
HTTP/Webhook Server] + Daemon[daemon/
Supervised Runtime] + Peripherals[peripherals/
Hardware Control] + Observability[observability/
Telemetry & Metrics] + RAG[rag/
Hardware Documentation] + Cron[cron/
Scheduler] + Skills[skills/
User Capabilities] + end + + subgraph Integrations[Integrations] + Composio[Composio
1000+ Apps] + Browser[Browser
Brave Integration] + Tunnel[Tunnel
Cloudflare/boringproxy] + end + + Main --> Config + Main --> Agent + Main --> Gateway + Main --> Daemon + Main --> Channels + + Agent --> Providers + Agent --> Tools + Agent --> Memory + Agent --> Security + Agent --> Runtime + Agent --> Peripherals + Agent --> RAG + Agent --> Skills + + Channels --> Agent + Gateway --> Agent + + Daemon --> Gateway + Daemon --> Channels + Daemon --> Cron + Daemon --> Observability + + Tools --> Composio + Tools --> Browser + Gateway --> Tunnel + + classDef coreComp fill:#4A90E2,stroke:#1E3A5F,color:#fff + classDef integComp fill:#50C878,stroke:#1E3A5F,color:#fff + classDef cliComp fill:#F5A623,stroke:#1E3A5F,color:#fff + + class Config,Agent,Providers,Channels,Tools,Memory,Security,Runtime,Gateway,Daemon,Peripherals,Observability,RAG,Cron,Skills coreComp + class Composio,Browser,Tunnel integComp + class Main cliComp +``` + +--- + +## 3. Message Flow Through The System + +**How a user message becomes a response:** + +```mermaid +sequenceDiagram + participant User + participant Channel as Channel Layer + participant Dispatcher as Message Dispatcher + participant Agent as Agent Loop + participant Provider as LLM Provider + participant Tools as Tool Registry + participant Memory as Memory Backend + + User->>Channel: Send message + Channel->>Dispatcher: ChannelMessage{id, sender, content} + Dispatcher->>Memory: Recall context + Memory-->>Dispatcher: Relevant memories + Dispatcher->>Agent: process_message() + + Note over Agent: Build system prompt
+ memory context + + Agent->>Provider: chat_with_tools(history) + Provider-->>Agent: LLM response + + alt Tool calls present + loop For each tool call + Agent->>Tools: execute(args) + Tools-->>Agent: ToolResult + end + Agent->>Provider: chat_with_tools(+ tool results) + Provider-->>Agent: Final response + end + + Agent-->>Dispatcher: Response text + Dispatcher->>Memory: Store conversation + Dispatcher-->>Channel: SendMessage{content, recipient} + Channel-->>User: Reply +``` + +--- + +## 4. Agent Loop Execution Flow + +**The core agent orchestration loop:** + +```mermaid +flowchart TD + Start[[Start: User Message]] --> BuildContext[Build Context] + + BuildContext --> MemoryRecall[Memory.recall
Retrieve relevant entries] + BuildContext --> HardwareRAG{Hardware
enabled?} + HardwareRAG -->|Yes| LoadDatasheets[Load Hardware RAG
Pin aliases + chunks] + HardwareRAG -->|No| BuildPrompt[Build System Prompt] + LoadDatasheets --> BuildPrompt + + MemoryRecall --> Enrich[Enrich Message
memory + RAG context] + Enrich --> BuildPrompt + + BuildPrompt --> InitHistory[Initialize History
system + user message] + + InitHistory --> ToolLoop{Tool Call Loop
max 10 iterations} + + ToolLoop --> LLMRequest[Provider.chat_with_tools
or chat_with_history] + LLMRequest --> ParseResponse[Parse Response] + + ParseResponse --> HasTools{Tool calls
present?} + + HasTools -->|No| SaveResponse[Push assistant response] + SaveResponse --> Return[[Return: Final Response]] + + HasTools -->|Yes| Approval{Needs
approval?} + Approval -->|Yes & Denied| DenyTool[Record denied] + DenyTool --> NextIteration + + Approval -->|No / Approved| ExecuteTools[Execute Tools
in parallel] + + ExecuteTools --> ScrubResults[Scrub credentials
from output] + ScrubResults --> AddResults[Add tool results
to history] + AddResults --> NextIteration + + DenyTool --> NextIteration[Increment iteration] + NextIteration --> MaxIter{Reached
max 10?} + MaxIter -->|Yes| Error[[Error: Max iterations]] + MaxIter -->|No| ToolLoop + + classDef contextStep fill:#E8F4FD,stroke:#4A90E2 + classDef llmStep fill:#FFF4E6,stroke:#F5A623 + classDef toolStep fill:#E8FDF5,stroke:#50C878 + classDef errorStep fill:#FDE8E8,stroke:#D0021B + + class BuildContext,MemoryRecall,HardwareRAG,LoadDatasheets,Enrich,BuildPrompt,InitHistory contextStep + class LLMRequest,ParseResponse llmStep + class ExecuteTools,ScrubResults,AddResults toolStep + class Error errorStep +``` + +--- + +## 5. Daemon Supervision Model + +**How the daemon keeps components alive:** + +```mermaid +flowchart TB + Start[[zeroclaw daemon]] --> SpawnComponents + + SpawnComponents --> SpawnState[Spawn State Writer
5s flush interval] + SpawnComponents --> SpawnGateway[Spawn Gateway Supervisor] + SpawnComponents --> SpawnChannels{Channels
configured?} + SpawnComponents --> SpawnHeartbeat{Heartbeat
enabled?} + SpawnComponents --> SpawnScheduler{Cron
enabled?} + + SpawnChannels -->|Yes| SpawnChannelSup[Spawn Channel Supervisor] + SpawnChannels -->|No| MarkChannelsOK[Mark channels OK
disabled] + + SpawnHeartbeat -->|Yes| SpawnHeartbeatWorker[Spawn Heartbeat Worker] + SpawnHeartbeat -->|No| MarkHeartbeatOK[Mark heartbeat OK
disabled] + + SpawnScheduler -->|Yes| SpawnSchedulerWorker[Spawn Cron Scheduler] + SpawnScheduler -->|No| MarkSchedulerOK[Mark scheduler OK
disabled] + + SpawnGateway --> GatewayLoop{Gateway Loop} + SpawnChannelSup --> ChannelLoop{Channel Loop} + SpawnHeartbeatWorker --> HeartbeatLoop{Heartbeat Loop} + SpawnSchedulerWorker --> SchedulerLoop{Scheduler Loop} + + GatewayLoop --> GatewayRun[run_gateway] + GatewayRun --> GatewayExit{Exit OK?} + GatewayExit -->|No| GatewayError[Mark error + log] + GatewayExit -->|Yes| GatewayUnexpected[Mark: unexpected exit] + GatewayError --> GatewayBackoff[Wait with backoff] + GatewayUnexpected --> GatewayBackoff + GatewayBackoff --> GatewayLoop + + ChannelLoop --> ChannelRun[start_channels] + ChannelRun --> ChannelExit{Exit OK?} + ChannelExit -->|No| ChannelError[Mark error + log] + ChannelExit -->|Yes| ChannelUnexpected[Mark: unexpected exit] + ChannelError --> ChannelBackoff[Wait with backoff] + ChannelUnexpected --> ChannelBackoff + ChannelBackoff --> ChannelLoop + + HeartbeatLoop --> HeartbeatRun[Collect tasks + Agent runs] + HeartbeatRun --> HeartbeatExit{Exit OK?} + HeartbeatExit -->|No| HeartbeatError[Mark error + log] + HeartbeatExit -->|Yes| HeartbeatUnexpected[Mark: unexpected exit] + HeartbeatError --> HeartbeatBackoff[Wait with backoff] + HeartbeatUnexpected --> HeartbeatBackoff + HeartbeatBackoff --> HeartbeatLoop + + SchedulerLoop --> SchedulerRun[cron::scheduler::run] + SchedulerRun --> SchedulerExit{Exit OK?} + SchedulerExit -->|No| SchedulerError[Mark error + log] + SchedulerExit -->|Yes| SchedulerUnexpected[Mark: unexpected exit] + SchedulerError --> SchedulerBackoff[Wait with backoff] + SchedulerUnexpected --> SchedulerBackoff + SchedulerBackoff --> SchedulerLoop + + MarkChannelsOK --> Running[Daemon Running
Ctrl+C to stop] + MarkHeartbeatOK --> Running + MarkSchedulerOK --> Running + SpawnState --> Running + + Running --> StopRequest[Ctrl+C received] + StopRequest --> AbortAll[Abort all tasks] + AbortAll --> JoinAll[Wait for tasks] + JoinAll --> Done[[Daemon stopped]] + + classDef supervisor fill:#FDE8E8,stroke:#D0021B + classDef running fill:#E8FDF5,stroke:#50C878 + classDef component fill:#E8F4FD,stroke:#4A90E2 + + class SpawnGateway,SpawnChannelSup,SpawnHeartbeatWorker,SpawnSchedulerWorker,SpawnState supervisor + class Running running + class GatewayRun,ChannelRun,HeartbeatRun,SchedulerRun component +``` + +--- + +## 6. Gateway HTTP Endpoints + +**The gateway's HTTP API structure:** + +```mermaid +flowchart TB + Client[HTTP Client] --> Gateway[ZeroClaw Gateway] + + Gateway --> PairPOST[POST /pair
Exchange one-time code
for bearer token] + Gateway --> HealthGET[GET /health
Status check] + Gateway --> WebhookPOST[POST /webhook
Main agent endpoint] + Gateway --> WAVerify[GET /whatsapp
Meta verification] + Gateway --> WAMessage[POST /whatsapp
WhatsApp webhook] + + PairPOST --> PairLimiter[Rate Limiter
pair req/min] + PairLimiter --> PairGuard[PairingGuard
Code validation] + PairGuard --> PairResponse[{paired, token, persisted}] + + WebhookPOST --> WebhookLimiter[Rate Limiter
webhook req/min] + WebhookLimiter --> WebhookPairing{Pairing
required?} + WebhookPairing -->|Yes| BearerAuth[Bearer token check] + WebhookPairing -->|No| WebhookSecret{Secret
configured?} + WebhookSecret -->|Yes| SecretCheck[X-Webhook-Secret
HMAC-SHA256 verify] + WebhookSecret -->|No| Idempotency[Idempotency check
X-Idempotency-Key] + BearerAuth --> Idempotency + SecretCheck --> Idempotency + + Idempotency --> MemoryStore[Auto-save to memory] + MemoryStore --> ProviderCall[Provider.simple_chat] + ProviderCall --> WebhookResponse[{response, model}] + + WAVerify --> TokenCheck[verify_token check
constant-time compare] + TokenCheck --> Challenge[Return hub.challenge] + + WAMessage --> SignatureCheck[X-Hub-Signature-256
HMAC-SHA256 verify] + SignatureCheck --> ParsePayload[Parse messages] + ParsePayload --> ForEach[For each message] + ForEach --> WAMemory[Auto-save to memory] + WAMemory --> WAProvider[Provider.simple_chat] + WAProvider --> WASend[WhatsAppChannel.send] + + classDef auth fill:#FDE8E8,stroke:#D0021B + classDef processing fill:#E8F4FD,stroke:#4A90E2 + classDef response fill:#E8FDF5,stroke:#50C878 + + class PairLimiter,PairGuard,BearerAuth,SecretCheck auth + class MemoryStore,ProviderCall,TokenCheck,ParsePayload,ForEach,WAMemory,WAProvider processing + class PairResponse,WebhookResponse,Challenge,WASend response +``` + +--- + +## 7. Channel Message Dispatch + +**How channels route messages to the agent:** + +```mermaid +flowchart TB + subgraph Channels[Channel Listeners] + TG[Telegram] + DC[Discord] + SL[Slack] + IM[iMessage] + MX[Matrix] + SIG[Signal] + WA[WhatsApp] + Email[Email] + IRC[IRC] + Lark[Lark] + DT[DingTalk] + QQ[QQ] + end + + Channels --> MPSC[MPSC Channel
100-buffer queue] + + MPSC --> Semaphore[Semaphore
Max in-flight limit] + Semaphore --> WorkerPool[Worker Pool
JoinSet] + + WorkerPool --> Process[process_channel_message] + + Process --> LogReceive[Log: 💬 from user] + LogReceive --> MemoryRecall[build_memory_context] + MemoryRecall --> AutoSave[Auto-save if enabled] + + AutoSave --> StartTyping[channel.start_typing] + StartTyping --> Timeout[300s timeout guard] + + Timeout --> AgentCall[run_tool_call_loop
silent mode] + AgentCall --> StopTyping[channel.stop_typing] + + StopTyping --> Success{Success?} + Success -->|Yes| LogReply[Log: 🤖 Reply time] + Success -->|No| LogError[Log: ❌ LLM error] + Success -->|Timeout| LogTimeout[Log: ❌ Timeout] + + LogReply --> SendReply[channel.send reply] + LogError --> SendError[channel.send error msg] + LogTimeout --> SendTimeout[channel.send timeout msg] + + SendReply --> Done[Message complete] + SendError --> Done + SendTimeout --> Done + + Done --> NextWorker[Join next worker] + NextWorker --> WorkerPool + + classDef channel fill:#E8F4FD,stroke:#4A90E2 + classDef queue fill:#FFF4E6,stroke:#F5A623 + classDef process fill:#FDE8E8,stroke:#D0021B + classDef success fill:#E8FDF5,stroke:#50C878 + + class TG,DC,SL,IM,MX,SIG,WA,Email,IRC,Lark,DT,QQ channel + class MPSC,Semaphore,WorkerPool queue + class Process,LogReceive,MemoryRecall,AutoSave,StartTyping,Timeout,AgentCall,StopTyping process + class LogReply,SendReply,Done,NextWorker success +``` + +--- + +## 8. Memory System Architecture + +**Storage backends and data flow:** + +```mermaid +flowchart TB + subgraph Frontend[Memory Frontends] + AutoSave[Auto-save hooks
user_msg, assistant_resp] + StoreTool[memory_store tool] + RecallTool[memory_recall tool] + ForgetTool[memory_forget tool] + GetTool[memory_get tool] + ListTool[memory_list tool] + CountTool[memory_count tool] + end + + subgraph Backends[Memory Backends] + Sqlite[(sqlite
Default, local file)] + Markdown[(markdown
Daily .md files)] + Lucid[(lucid
Cloud sync)] + None[(none
In-memory only)] + end + + subgraph Categories[Memory Categories] + Conv[Conversation
Chat transcripts] + Daily[Daily
Session summaries] + Core[Core
Long-term facts] + end + + AutoSave --> MemoryTrait[Memory trait] + StoreTool --> MemoryTrait + RecallTool --> MemoryTrait + ForgetTool --> MemoryTrait + GetTool --> MemoryTrait + ListTool --> MemoryTrait + CountTool --> MemoryTrait + + MemoryTrait --> Factory[create_memory factory] + Factory -->|config.memory.backend| BackendSelect{Backend?} + + BackendSelect -->|sqlite| Sqlite + BackendSelect -->|markdown| Markdown + BackendSelect -->|lucid| Lucid + BackendSelect -->|none| None + + Sqlite --> Categories + Markdown --> Categories + Lucid --> Categories + + Categories --> Storage[(Persistent Storage)] + + RAG[Hardware RAG] -.->|load_chunks| Markdown + + classDef frontend fill:#E8F4FD,stroke:#4A90E2 + classDef backend fill:#FFF4E6,stroke:#F5A623 + classDef category fill:#E8FDF5,stroke:#50C878 + classDef storage fill:#FDE8E8,stroke:#D0021B + + class AutoSave,StoreTool,RecallTool,ForgetTool,GetTool,ListTool,CountTool frontend + class Sqlite,Markdown,Lucid,None backend + class Conv,Daily,Core category + class Storage storage +``` + +--- + +## 9. Provider and Model Routing + +**LLM provider abstraction and routing:** + +```mermaid +flowchart TB + subgraph Providers[Supported Providers] + OR[OpenRouter] + Anth[Anthropic] + OAI[OpenAI] + OpenRouter[openrouter] + MiniMax[minimax] + DeepSeek[deepseek] + Kimi[kimi] + Custom[custom URL] + end + + subgraph Routing[Model Routing] + Routes[model_routes config
Pattern -> Provider] + end + + subgraph Factory[Provider Factory] + Resilient[create_resilient_provider
Retry + Timeout] + Routed[create_routed_provider
Model-based routing] + end + + subgraph Traits[Provider Trait] + ChatSystem[chat_with_system
Simple chat] + ChatHistory[chat_with_history
Multi-turn] + ChatTools[chat_with_tools
Native function calling] + Warmup[warmup
Connection pool warmup] + SupportsNative[supports_native_tools
Capability check] + end + + Providers --> Factory + Routes --> Factory + + Factory --> Traits + + ChatSystem --> LLM1[LLM API Call] + ChatHistory --> LLM2[LLM API Call] + ChatTools --> LLM3[LLM API Call + Functions] + + LLM1 --> Response[ChatMessage
text + role] + LLM2 --> Response + LLM3 --> ToolResponse[ChatMessage + ToolCalls
id, name, arguments] + + classDef provider fill:#E8F4FD,stroke:#4A90E2 + classDef routing fill:#FFF4E6,stroke:#F5A623 + classDef factory fill:#E8FDF5,stroke:#50C878 + classDef trait fill:#FDE8E8,stroke:#D0021B + + class OR,Anth,OAI,OpenRouter,MiniMax,DeepSeek,Kimi,Custom provider + class Routes routing + class Resilient,Routed factory + class ChatSystem,ChatHistory,ChatTools,Warmup,SupportsNative trait +``` + +--- + +## 10. Tool Execution Architecture + +**Tool registry, execution, and security:** + +```mermaid +flowchart TB + subgraph ToolCategories[Tool Categories] + Core[Core Tools
shell, file_read, file_write] + Memory[Memory Tools
store, recall, forget] + Schedule[Schedule Tools
cron_add, cron_list, etc.] + Browser[Browser
Brave integration] + Composio[Composio
1000+ app actions] + Hardware[Hardware
gpio_read, gpio_write,
arduino_upload, etc.] + Delegate[Delegate
Sub-agent routing] + Screenshot[screenshot
Screen capture] + end + + subgraph Registry[Tool Registry] + AllTools[all_tools_with_runtime
Factory function] + DefaultTools[default_tools
Base set] + PeripheralTools[create_peripheral_tools
Hardware-specific] + end + + subgraph Security[Security Policy] + AllowedCmds[allowed_commands
Allowlist] + WorkspaceOnly[workspace_only
Path restriction] + MaxActions[max_actions_per_hour
Rate limit] + MaxCost[max_cost_per_day_cents
Cost cap] + Approval[approval manager
Supervised tools] + end + + subgraph Execution[Tool Execution] + Validate[Input validation
Schema check] + Approve{Approval
needed?} + Execute[execute async] + Scrub[Scrub credentials
from output] + Result[ToolResult
success, output, error] + end + + ToolCategories --> Registry + Registry --> Security + Security --> Execution + + Validate --> Approve + Approve -->|Yes| Prompt[Prompt CLI] + Approve -->|No / Approved| Execute + Approve -->|Denied| Denied[Return denied] + + Prompt --> UserChoice{User choice?} + UserChoice -->|Yes| Execute + UserChoice -->|No| Denied + + Execute --> Scrub + Scrub --> Result + Result --> Return[Return to agent loop] + + classDef tools fill:#E8F4FD,stroke:#4A90E2 + classDef registry fill:#FFF4E6,stroke:#F5A623 + classDef security fill:#FDE8E8,stroke:#D0021B + classDef exec fill:#E8FDF5,stroke:#50C878 + + class Core,Memory,Schedule,Browser,Composio,Hardware,Delegate,Screenshot tools + class AllTools,DefaultTools,PeripheralTools registry + class AllowedCmds,WorkspaceOnly,MaxActions,MaxCost,Approval security + class Validate,Approve,Prompt,Execute,Scrub,Result,Return exec +``` + +--- + +## 11. Configuration Loading + +**How configuration is loaded and merged:** + +```mermaid +flowchart TB + Start[Config::load_or_init] --> Exists{Config file
exists?} + + Exists -->|No| RunWizard[Run onboard wizard] + RunWizard --> Save[Save config.toml] + Save --> Load[Load from file] + + Exists -->|Yes| Load + + Load --> Parse[TOML parse] + Parse --> Defaults[Apply defaults
Config::default] + + Defaults --> EnvOverrides[apply_env_overrides
ZEROCLAW_* env vars] + + EnvOverrides --> Validate[Schema validation] + + Validate --> Valid{Valid?} + Valid -->|No| Error[[Error: invalid config]] + Valid -->|Yes| Complete[Complete Config] + + Complete --> Paths[Paths
workspace_dir, config_path] + Complete --> Providers[default_provider,
api_key, api_url] + Complete --> Model[default_model,
default_temperature] + Complete --> Gateway[gateway config
port, host, pairing] + Complete --> Channels[channels_config
telegram, discord, etc.] + Complete --> Memory[memory config
backend, auto_save] + Complete --> Security[autonomy config
level, allowed_commands] + Complete --> Reliability[reliability config
timeouts, retries] + Complete --> Observability[observability
backend, metrics] + Complete --> Runtime[runtime config
kind, exec] + Complete --> Peripherals[peripherals
boards, datasheet_dir] + Complete --> Cron[cron config
enabled, db_path] + Complete --> Composio[composio
enabled, api_key] + Complete --> Browser[browser
enabled, allowlist] + Complete --> Tunnel[tunnel
provider, token] + + classDef config fill:#E8F4FD,stroke:#4A90E2 + classDef error fill:#FDE8E8,stroke:#D0021B + classDef section fill:#FFF4E6,stroke:#F5A623 + + class Load,Parse,Defaults,EnvOverrides,Validate,Complete config + class Error error + class Paths,Providers,Model,Gateway,Channels,Memory,Security,Reliability,Observability,Runtime,Peripherals,Cron,Composio,Browser,Tunnel section +``` + +--- + +## 12. Hardware Peripherals Integration + +**Hardware board support and control:** + +```mermaid +flowchart TB + subgraph Boards[Supported Boards] + Nucleo[Nucleo-F401RE
STM32F401RETx] + Uno[Arduino Uno
ATmega328P] + UnoQ[Uno Q
ESP32 WiFi bridge] + RPi[RPi GPIO
Native Linux] + ESP32[ESP32
Direct serial] + end + + subgraph Transport[Transport Layer] + Serial[Serial port
/dev/ttyACM0, /dev/ttyUSB0] + USB[USB probe-rs
ST-Link JTAG] + Native[Native GPIO
Linux sysfs] + end + + subgraph Peripherals[Peripheral System] + Create[create_peripheral_tools
Factory function] + GPIO[gpio_read/write
Digital I/O] + Upload[arduino_upload
Sketch flash] + MemMap[hardware_memory_map
Address ranges] + BoardInfo[hardware_board_info
Chip identification] + MemRead[hardware_memory_read
Register dump] + Capabilities[hardware_capabilities
Pin enumeration] + end + + subgraph RAG[Hardware RAG] + Datasheets[datasheet_dir
.md documentation] + Chunks[Chunked embedding
Semantic search] + PinAliases[Pin alias mapping
red_led → 13] + end + + Boards --> Transport + Transport --> Peripherals + + RAG -.->|Context injection| Peripherals + + Create --> ToolRegistry[Tool registry] + GPIO --> ToolRegistry + Upload --> ToolRegistry + MemMap --> ToolRegistry + BoardInfo --> ToolRegistry + MemRead --> ToolRegistry + Capabilities --> ToolRegistry + + ToolRegistry --> Agent[Agent loop integration] + + classDef board fill:#E8F4FD,stroke:#4A90E2 + classDef transport fill:#FFF4E6,stroke:#F5A623 + classDef peripheral fill:#E8FDF5,stroke:#50C878 + classDef rag fill:#FDE8E8,stroke:#D0021B + + class Nucleo,Uno,UnoQ,RPi,ESP32 board + class Serial,USB,Native transport + class Create,GPIO,Upload,MemMap,BoardInfo,MemRead,Capabilities,ToolRegistry peripheral + class Datasheets,Chunks,PinAliases rag +``` + +--- + +## 13. Observable Events + +**Telemetry and observability flow:** + +```mermaid +flowchart TB + subgraph Observers[Observer Backends] + Noop[NoopObserver
No-op / testing] + Console[ConsoleObserver
Stdout logging] + Metrics[MetricsObserver
Prometheus format] + end + + subgraph Events[Observable Events] + AgentStart[AgentStart
provider, model] + LlmRequest[LlmRequest
provider, model, msg_count] + LlmResponse[LlmResponse
duration, success, error] + ToolCallStart[ToolCallStart
tool name] + ToolCall[ToolCall
tool, duration, success] + TurnComplete[TurnComplete
end of agent loop] + AgentEnd[AgentEnd
duration, tokens, cost] + end + + subgraph Outputs[Outputs] + Stdout[stdout trace logs] + MetricsFile[metrics.json
JSON lines] + Prometheus[Prometheus
Text format] + end + + Events --> Observers + Observers --> Outputs + + AgentStart --> Record[record_event] + LlmRequest --> Record + LlmResponse --> Record + ToolCallStart --> Record + ToolCall --> Record + TurnComplete --> Record + AgentEnd --> Record + + Record --> Dispatch[Dispatch to backend] + Dispatch --> Console + Dispatch --> Metrics + + Console --> Stdout + Metrics --> MetricsFile + + classDef observer fill:#E8F4FD,stroke:#4A90E2 + classDef event fill:#FFF4E6,stroke:#F5A623 + classDef output fill:#E8FDF5,stroke:#50C878 + + class Noop,Console,Metrics observer + class AgentStart,LlmRequest,LlmResponse,ToolCallStart,ToolCall,TurnComplete,AgentEnd,Record,Dispatch event + class Stdout,MetricsFile,Prometheus output +``` + +--- + +## Summary Diagram + +**Quick reference overview:** + +```mermaid +mindmap + root((ZeroClaw)) + Modes + Agent CLI + Interactive + Single-shot + Gateway + HTTP API + Webhooks + Daemon + Supervised + Multi-component + Channels + 12+ platforms + Components + Agent Loop + Tool calling + Memory aware + Providers + 50+ LLMs + Model routing + Channels + Real-time + Supervised + Tools + 30+ tools + Hardware control + Memory + 4 backends + RAG-capable + Security + Pairing + Approval + Policy + Integrations + Composio + 1000+ apps + Browser + Brave + Tunnel + Cloudflare + boringproxy + Hardware + STM32 + Arduino + ESP32 + RPi GPIO +``` + +--- + +*Generated for ZeroClaw v0.1.0 - Architecture Documentation* diff --git a/third_party/zeroclaw/docs/assets/architecture.svg b/third_party/zeroclaw/docs/assets/architecture.svg new file mode 100644 index 0000000..72ea548 --- /dev/null +++ b/third_party/zeroclaw/docs/assets/architecture.svg @@ -0,0 +1,312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ZeroClaw Architecture + Zero overhead. Zero compromise. 100% Rust. 100% Agnostic. 8 pluggable traits. + + + + Chat Apps + + + Telegram + + Discord + + Slack + + iMessage + + Matrix + + Webhook + + CLI + + + any Channel trait + + + + + + + Security Layer + + + + Gateway Pairing + 6-digit OTP + bearer tokens + constant-time comparison + + + + Auth Gate + Channel allowlists + webhook_secret + + + + Rate Limiter + sliding window, cost/day cap + + + + Filesystem Sandbox + path jail + null byte block + symlink escape detection + + + + Encrypted Secrets + XOR + local key file (0600) + + + + + + + Agnostic Tunnel + Bring Your Own + + + Cloudflare + + Tailscale + + ngrok + + Custom (bore, frp, ssh...) + + + any Tunnel trait + + + + + + + AI Providers (22+) + Any OpenAI-compatible API + + + + OpenRouter + + Anthropic + + OpenAI + + Ollama + + + Venice + + Groq + + Mistral + + xAI / Grok + + + DeepSeek + + Together AI + + Fireworks + + Perplexity + + + Cohere + + Cloudflare AI + + Bedrock + + custom:URL + + + any Provider trait / custom:URL + + + + + + + Agent Loop + + + + Message + In + + + Memory Recall + ctx + + + LLM + AI + + + Tools + exec + + + Memory Save + store + + + Response + Out + + + + Composio + 1000+ OAuth + + + + + + + + + + + Memory Search Engine (All Custom) + No Pinecone, no Elasticsearch, no LangChain + + + + Vector DB + SQLite BLOB + cosine similarity + + + Keyword + FTS5 virtual tables + BM25 + + + Hybrid Merge + Weighted vector + keyword fusion + + + Embeddings + OpenAI / custom URL / noop + + + Chunking + Markdown-aware + heading ctx + + + Caching + embedding_cache + LRU eviction + + + Safe Reindex: rebuild FTS5 + re-embed missing vectors atomically | LIKE fallback | Upsert/Delete/Reindex + + + + + + + Sandbox + + Command allowlist + Path jail + traversal block + Browser domain allowlist + Null byte + Symlink escape block + System dirs + Dotfiles blocked + Default: Supervised + workspace-only + Levels: ReadOnly / Supervised / Full + + + + + + Heartbeat & Cron + + HEARTBEAT.md periodic tasks + Scheduled actions + Skills loader (TOML manifests) + 50+ integrations registry + Observability (noop/log/multi) + + + + + + + Setup Wizard -- zeroclaw onboard (quick default | --interactive for full wizard) + 7 steps, under 60 seconds | Live connection testing | Secure defaults + + + + 1. Workspace + ~/.zeroclaw/ + + + 2. AI Provider + 22+ or custom URL + + + 3. Channels + 7 channels + live test + + + 4. Tunnel + 5 providers or skip + + + 5. Tool Mode + Sovereign / Composio + + + 6. Personalize + name, style, timezone + + + 7. Scaffold + 8 workspace MD files + + + + + + + + + + + Full summary: Provider, Model, Channels, Tunnel, Composio, Secrets, Gateway, Autonomy, Memory + + + + Ready -- zeroclaw agent + + + ~3.4MB binary | <10ms startup | 1,050 tests | 22+ providers | 8 traits | 18,900+ lines of Rust | 0 clippy warnings + diff --git a/third_party/zeroclaw/docs/assets/zeroclaw-banner.png b/third_party/zeroclaw/docs/assets/zeroclaw-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..78460bd5940db6110d9a8fab3f6aa7c0364986f8 GIT binary patch literal 871066 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

$@H!TMR3UeG$e2 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�VkLqeCGHh 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�W5HS_`xh2z_-l2=}m=!6+d~+)69% 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 SRK(8GsGN{F+K~9mJj*g0~#hwlmwv=sBNloLE4h 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�rNUuM|i24jIL} zUcJ^gfn*Ev1oPaJ(fb&i;h93v==4!NyOKB3oiG=cP&b*_bJrnr0JkY-+tCZk=Wc8H zeDN8dvb??~Z(_M+%SE$cuLkf0X(W;#KYa17pfHUpsq5QjQ?l}@tYdR&>qjYXC)O65 zJ1_TQ)MC(>ATlt}P`A<2=s*NmzktbAMl$PzSp&wsyu> zm#4uKo}aWq9<*;H1rk*GhTMz#u`yL1p{_}_)5G;bDsxsUa)2Tw`$&V8?kodPVwKzv z*SP^e;SxoYQ+)p{<`&&ZF6!>q2eLW{$rj{r<-r6g-ki=5x;kT4ZejBha>hY*M3l~v3j)oo zqXeMlriFsAn4k@OVW*YRuoGiSv(&Dx z=XCsd9x@ia!;!R^38O8NDAr&rEooYpxHIB}B5y%Vn!c(Ew=(mAxe3yuP=oJjqx7l${qRMKvvXX#uYi zx0LM&tsW#=X|$TrC4f1~VxiI87-Gb;J+(^8&X5ueooS(4LHJzh#@|x=e**)`CtBp| ziJ*tW5E+=-Jj85waa!L$=7GQ2>w{St>)$T5ms$Q%R($OBdDqve^M%{rU*->e=yB=(s+-`&u_AF_GZFre9@O7a*T|ZD49+$)39IX=%Ib6dkB> zp<{HUC-B5FA+vYo#KiSm1p!}8W`CTzB%!@;uu@owtfUZY5&U?pnmP23+3>Mnam&

-jv8(AbMd&9@N2kHo9F29SFWFa@47_Q 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

+Ro)RVu=YPHfAS)PCumC8f=im6910 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

hkONmvhY^7<}hv z$~P|FcpQv|#xarU(vz^EB&=J|JQJ@@g7VcTvb0nn-rjj|!l3sKP7lxn^sH)Bgnica z?YlMjmF=g_-;ep6)~g1Qr_Sj2cN*2u{v;+VV0&Pno*Qfw zPSUyBsS2Oqh!CLuB$|mynnhTs+zQE-h@8|ikqcC^(Hj$tR5nr=X%sQ4MmCVkWaFOo z(u}N5iIM?gGC1cMt(K%c4?*~O;`@yvF&wVzZliJ^slmp3Wb@bW6NczEjijv33{4+< znme7eso<{@M&5iQOwL?%a|H=LF!6F`81018LJ+;(Q#XJm9 z$10U*&PggkLPineZ0%rs6+QE` zVR*pWrs%qNZv9cr-s&24<*V9C_ZG62+z6Y?NruuCfye|l?xnB^P*f;1c{XUFD86W` z{)aCzHlKHwBtr16)=)<5a2eDds#j?l?VOX=HH*4B)v8DO{2Tkx?7s$l+nD-*Fl@}StQ0mT%Eq-gluS3IrHD1XVkLK1i+qbjx z?4uLPlWljEV~h|mahRukx?sWOIrn$Zw4ZYakvQ~}Qh~x(; zft;ZSYY~PxTu-#L+LF1|ekRfN{{Rl?Nu%o$i)$Hf745`jFkc+xvnv(A zBRI$Rx~Vj$8jkTajgz|mzpwaXfS$+CSC$whQ|56Rjlnk@fB-oIu0ELOwQ^kB+VZ5jL%9Ujx^#lT^AEyC5`-f0NYp{T4kx#~uyT z(@ZNJ=!hiNjOvCq>M(k3&j9=S@OE`0Ry@DbJa-D1I;qcYkH7WU!1#Rxp=@oTlGthq zD#k5lPFOfog2NncXUNZgOy$#drDv!0bE6RXs&g*Cqqq4Qo;I`b9;yAC^8d!)*PVaHm!_E;}ZDO=q1^UQd?%!fa zgfQL})aQ+)f(K*BJv(z+I`C@IWP2GcWR8bQ@XYqklff*a;oE%DBcm4N9Bv?O91QL2 zn&hd8jI?`v&Z>A>CYt;#bQTtuR~cPq-XjcOG-aEqjUq6|u?<1%X9saJP<^F!vib-y6+?upC{=H6l;<*0O7kZTOTU$bh?*-h)J$Pg9 z-@SGz$CHwpyMNb_=1P>kqN!F%CHMYs^DpVT#5a4A}Jp{VD#DuA5ZW#?YY@#eEcch>u>AOzhz-*8qGcPo5H}zwn@~18Z?T`0X={RfJS)Z3y^pi z!C@-DcIRWn!F$PUX5V~L(=F|c@>oqUkd1~g0?5U30Vk32=bU5Z`c#F+0Ef?9vt1;T%vQIcNNZnE-!77%gU-pnp2Oui}N8x(;!*{XehxCrJ98oz#)Z zrL1}00Md`1aZ3=JY{e*r#1CCRXIgkdcP~3j+J?*c!~(EqrF79N7$oy zK3Xx(H*R7HWgKMVj&t{+yK8Hb;V5YIGc|vQn!&kEI^p2CwH(`d62`(moeL+-0Z!zR z$m_@~27cBuT-zNne7kS`e_!y|IeX6!>pEk`mmYgT%-=Ma3$%3H0mvY-_UZuitycGo zxSdEe?ydcQ!+s`ipKG#6?ryxet)iGSe(^Jn(_ zlI`TQ(%$NHv^<}X&SDrO6;tcekVoZN*QXaAYieMdjGE}rpe%GPHuN;jc{TmC$+W3p zQI{A4ft-Q?&T<%Mit(yqDo5S5n*P79BhjOTqTf1hN&Vl~>UqbG^x3>0eH8X&-&oyB z3^80TL{jb;0mmVS7~Bs-$;EmYYX1OPT(Z%lixGp48S_Qx{{REZJVB>Ld7+I�Y|9 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
M9cc&xKIo2KBc9%!{Rc=wBF;Gvc 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≀?gGE0N& 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öjk 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≧0 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

ufF=g+cn&x!Jg!MU{oA=C<9hx1-m$84 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 z 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 n_Q$0-Mo(+ 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 @Hr&f?+i;n|ua%|CGMvJXEyo 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�I@+0RDY9u|(R&o9-HDJi|7ln|%GM{k+T7?#u91^VXU@lp6V+u%^HphM zTKQ0g-08ae1Gnb>-1=pJswj!Bv%#yD$=<%@Jm*RXZ;ZSO8+2H}y~eO?{JE!%c+v>E z15ZYglLNe=P~b4X((J|xzManr+52bH&Hw%{v;<1;%Ah&GpIf(PTa#_{C0^|KzoLJs zV~ee!C}gTz)Uk63QQeOJb<+ zr@<^8o-~+~w--m$=bh&6cyWtZWz?DRcMa^`<`G_Ckt=t!W2Bd{Dm?A$OjKe&&c<^e z@0vz``wZ0>K4hOA_VrNip; z><1z$G?!*IU=n%!VFJ(oqrIr8;bsptMTValjwvtJfIr3+xyIOu~dmN-79UD zqS-;(B1YS16x?V+DR>VH=JSoVaROYud1}kYpGBm9R zcNXuyF7OmMBWv6)s@h|s&K}IhCcUS$&#-P{xTma_8Ng&1-Ybl{ylch(#XpHOv-;$t zj}hQPtPzNGr6_0icTTvhi$knAxY+fFpH67xP<;-Nw7%7lHDSdX$vm*qfSRN>+YL7&~zYNI1s3r!^4j%whGbRbNUD&vUnl>#a%Tpd0U zL;W(tx|=RaO0+!4^{K3L_^rn=Ai>Jb4UjaLEg;vzfl(9gzv@mg|KM7~2nc^V%&aQd zzHS67hXe$^atF$~`*_1V4uhHV9pA}~wzuhM{>H6VPj)Is|#Se-z?0%WhdqwwM{TbN8 zFY!D_KZhwhee8HOv#FxRXw+_`f(7M^t^Kd6NiBufg}3^rSpwCvxVKz^Zk7G)dEm%= zl4sP$J+P5bIbf2eARAE7x|3E*T zCQm&Ktc~qfn%y5!z%F?71q?1lP>7HyN3JK^scY*l@JF!~cSQe(=^r!OJ=<1yUDj4g z?XF_)yR<)=h(3z=qUoEus_*p!)`3b=HcIItl|2c{_jYs+dAln)T~LimzU zF~|$=c1fB~ack~TSV9j%eepD1n`eSO~j!-{@Q{$aXO!_L< zyoe5o35AX+a_;Tr)b5>^kmC=)WidW20-ZA=Q71~qQysgUu(E&}KFSTS3EUp6WM)NQ zKSobKidt<`IXv+6&2bfVQqK0-oHdNZWC?x)*jNu-0p4{157=7boY6lT%ewtjwgQ*1 zXGX+02`o7EPwt0_aa0onoPMlU_F$2Z`_pip5)|U9tPEk=m|gXwa3r5*aXc~zxv7P5 zX3ZznQ2=qJ+7?erk(0Prit&*r0az-QQ@%+kblkJMYY?{g2IC!#aQIsL6Y8zA|7el#3)*dLEpb$ipJbm`#B3zCN}!ioJPYP0Ajy1Vb%B-kRnk@K%nS94rdtg4&$g2WJ+S=<0>|o zPFjvf>>6`d>6mz)g?e6T4Z{sWgOVjAqjb5+&;Es7`JwS*Q$oTWl>?VgR`j%3c@GHm znj4WVoHCB4*$b$b4%ZY8NGQtDooGlCm-2B5C&V|7(&UIJ|{5NMXAE5pcqfxQx<{*o!Q%PsgC_Rr)Z@h}(j?l(e4MQFH`aLW5<=nrpK z0{di9sotq!2-&H==2`v8opHuSHsCe!2Xva38IWZh@Fijl;Wauj&6@tDQDy`BctP|} zoY>Q|Arfhy7LPpnRhQmjVM~9MBD79dsfrGUa+u7r4oNy*#COnDKltwt-}+wUpvKkP zN%amncfE}#tYs#pW~>KuKMqgI8qD>24c*-s?u6xAhyR(e)l~bV!!>Z^oaRz?Podjz zM~KIxkSxCRflsC(vtk>h$)C1jZ;gh6j&9%?B)-_mz4w-SaFia0 zz4x4WjJwF7m$k3{Mlf`e%yn7*-H-pQ{0F*G&)Nbq)34kWMxyj+`Ay}1>Pcjsk5T6w zNNdgyfFQ8>$1M}h}S=lo&iCP{UgdUD~nxzla76bT*#DmHpMi!;7N2J|dC z{{Ey|Kc1OJk~Uw&#}F%zIjjtGi9RXbm{w?GRd`qb!$-Ln`V+yqXB|tY@@fX{oR}`- z2fuc)eS!%x`7Lio%3&oPwR4_7C1{NCi*)VMR~qleJS^|)P;wur}dbgirE!=aIy zJ`V?K^Os(~qLmslj|O=zLb#_>{BSHF>gGvq$8B;Y-g&Hl!@nZ={yA%1Bip;Fo;}iB z!9RqgLX&2sFjN3ZuAvcQd4{Xm2A7OFK*x6ew-$jyoYM@~c$9w-vwIcY2C3CpuGuw24Z7_W5znCqhzA?E22|i6gNm9X zSgYh|#bF*Y7*XniTIy6e%k6xRQoK4qV|jhic(GwqIlVS#?ojq5U3Vaa{S5DeX#$>p z1vhrN6Zcv6|3TLddsy?x>c8%)YMY`tJQjTfg{Q@^wi4?s+;tQe-1S+0neX7^5HZ^)dEe_z z6FR43KbHJ6SocHIaZp=(*_#K<%6KFGdERwyCh!sc+?P}b#YGov4Gj}JQ%gy17Gr%` zzx8b1PNU6bHI{dP@#8XiCu&eH{nL}_GiRbFUE{$D;;=c;^WpuIN zn{|WwZnE|*!<%lmckU2s219-rj=)+j@z>~fpW6{WKB5F!sfIggr>1_>Y#<%!F(m(0 zuC_N%R*#Y1g*%ENpC+D+(gG;f45#F9G!OI!#5?YGujrEF02} zNmiJfPc}fFS-QctDx&F#awFT(3apc{bTN@@Y#BoJQq=)|%^si~w_R?w`vB|(CM16| zs8HQ6_T8Cfy&dTl9NpsQZ_@E^Ue;VI8I;}xq8@>&_lD3 ziUYGUVw#88K{x|?rFSkrR`&M`s&O_8-F4ed1?KYeecR}_Q2@cU`cJn z7W63kfDaJ!1F0Et++HjX$UYs=X8X4}yqKxgh$ZghZe93E)ZobvFgMagqONf7>yRmv79XvIkt%lvB zjmvrW>I&{_?)!sF&^Mwt55d{f&`fk)*ntkE{VWjykl_ab4d;=$r zvb_QW_>=1Eu zE$8KMKBR>;Grq(ZTimOtg-l4%XP67XqK)5cf^lwhbJ>&*OF(JVK}kfPXku$;QVShB zcQ_S+RorG5R1tXxlX7+wFT#!QT#dx{0T@7@FM#^Ufd7ymqLTq2%{ zso7LkP%D+oQq+WO+~3O%fsbpn<7%AAZW5fYfJGQU)d^8{cNrP3=k-25&TiZHN&=x$GlQ6K0Gg4ke!{r{L*VGB__amH0?0Zo&Ia@^1i8l zM84vyIQ+7!ntTbEa`bg^f$9K}NdUmqu&Sg3E7M!<{%fl<_WZa+$AWpy4C|Y^1oTnb z*M6XrMfS4mp_t^}9%B>1^>li_g|I5`yJNSaynU{o{x&mBHhygfE24B5Xz?IcWc(E6pAr8RDX&&=*kpDCAi)Yuqy!&=KQx8s z*dmp)!<{25pms+F7)^+O7Mb-;B}WUZONQYqVZYKIlT+djWt|U9$^PV}lme-a^bkm~ zAPs-^0JVGI^1o2y<1-v?cx3ETbhzeq*BB^Kr~(*OaR*ng4Z)rL5%D=DUa99QsplM< z3Lvio4w6-Y?&>D9IVNIuyUfLgyLoo^r*tf`7ra(>&1C#W>n5Tj?mugp+F31`xMa5d z*uZ2Qet`e*eAt6)?m_keVR2T|=l4|{zo4|=_yJjo@lIYtZlS46J>b01&6x7o-smC_ z%Z3qWU9Nm+!^AJHD1~WeV=lQBW7Z(QC9f(fPP3sN`mk>0)RGM#Tw&-DtPYMU24f|^%d*$%*rbADWDO1#*IzpyQs0krt!O^Jvb ztFj_{iVxpUv_jv)HOoGhTQl-(m;gfke#DJ?f*#i&Ts!v6b1khk?y#pu)&)>vSHNW6 zb$hL{M~@Iq#xs4^fVQAz%dR9G+2S@h9OfMDY`|(o$(j!t>yg0 zQN0nTkN6$B;Gvh(f6zQOJ7(X;QfkZRTcykofr&~ca`K87S7XBU0xVZmc}0K9x>Yp< zy=DbcJPyk$ZMH&ixA(8#DUm+qzLe)Y3IvMRcV}$1{{tN}s2K0NGU`UW&iM~?GNxNT z*n$ z_HIj+`s(5Nn6QLJu$+8PKR~Q-FlVP(ANVxWG3ZJl{qPxBts6;I=U*Bva+7J&szRb? zcdH^mCar3T`;re^9NjW&oR42vOM4^K>3qTl6eoA&de))!?4RWf|I!NU`ih2$$*k8PXE~v#RlB6?(%zq&C1JBl z9}5l#@=QQVqEA<4Ca&xH-3&7>4%09{3`pZGPb8kV zunMjfFBHREkb>rTJidLj=fmR1iH3W>{r0_Gbu0e7@u2VYG15K^b>69)Cz;IoxA&$5 z5FUF!>b|MSmz{5)e*Wm%w+vx{FmWqu3pt@_sE9UpJS%)H5aHkL93Axnzw+~AQ3-u> zxbD$WW~etlD}q?I?IK=iMj)`mz}&!}5#jo^7~CN5Kah5<^WVNw!eGm81bk?l&qwgy zdZvLLIxq#|vjh8eGlBk*AwZ$IE4P8UX!0M(+_P*T{V4`pw(V`X=d!yMk;{w+Y=Z@YFRB^s)YOQ75v-ty*gDg zGsSyVAl|k|K$Sh1VPj$;YtBgVEK@IhcPn}&pNWLnFY&=xhV4!y1{S>s-iN)o68XRU zw_I!gw0)3uUs`REs#L$V1xkL_J2t*&sb}Guy|92e%OYkWGecPAE9FMa{;aCs^Kz=9 zO0(?D_@=>(4o@``dTbbccw-@qzw|eO>M0-?5jbO!G*2-&BNh8I#`-cvPzpQNk1lNJ zQX^}Cyx84z@Iv0F=i;Py-4+t^f2~jy^b-+G?&j7%Z{;-Pdln}J$n!B5$ZGG+tW2p# z4s731l1ejawXhGmsP%KJhan*9V{bB*A{is@;LtG}ZXphyX1wu?yLS7Td9;J7=$h>3 zB|xuqdw6_p&7uC|s%_}thEVfnOLS-8jwtPAY0B7r&ZTR;05D}O+cLaUW;grAp}2K2 z^u~yfWuD(|MBUWFprh3Y<=4*N%2C@5BH#1te4K?DA41#UJ)vy3GF$)GQnv_*MWM6e z#Hn(L^)22r04s)3aN+Q*xA}Rnoegm!4qmoxE)L|!ig^4xw>gxbXbmXs0>()S_*^V* zbZ3BJv5yDlhHxOW1?VyX-u&7;$^K7-M*+jKApLs?HH1NMaUNwYkmk`N`vOcD>XEY$ zcWgnp@;1}Td2mgm41&ks;F|~s7O?vPEgPUgzBLs2FveOSCL+E+NOu&kw4uCr3Rp2( zMkK$M3$E3sN_&wK>x0Ut4p>{*n@V9D$lYbe8nMi7;cFCkV`bAI)0AMop!YzU=@z5j zW^*xch6MNX;akX|;U5W`bMIH6HOCxxZ=ip4;NFk`CUP3djeat{UE^tUI#;+8e;-tByLAwUZgMgT-Ylic?+pM-+PZ1%Kixgcft=wuP7>8 zYsF`G2>}WSzYet!lA%MsE~r4eDqh#>fBD_eIkEtlrroCROE6`Sc4=7v)eM$E~pJ=r$t}8 zbL=0X5seeDI3cT}S;l4oR#sr>d3M%?l=IH<=}zi87i0^RW@8DOJ>7!)(LsiGV@5L7 za}`as?r9^K^u-95h0!a7x~jfEwbLUr2*Z^t!p?#51z87s)C2=3ks5J&F#*DY3h?IL zwDa*G?6v;>2%&!6ZjFXT;b-IDCBR@ctUdjxr|M@iRJRLUy5iHcFWj@~&G>orpQ+*u z5bcZALB&``oUS9npzq`DaOajp=~UhQ4iMSL#QH~n`7$8qngCB%-^#Hr@W zQ*~0&qPK!}9+8qmx`C`?e7h_`_oFLNuxICF8sZob0ffZidnbl@km|pUuQMcSY=T&N zMbX#oU03*!#%uCsuT;t)(`LfT4q8n<=Y%G|cN`e!iVFl4J&Y++Ex{BsVS(&;ql0HB&UT0B~kN8EIUd(aG|v&J%=CW z3q}dE(>q8~ymRdIF8C3i8z6*d>$t|l8@b^UFGC~_{T)>Sv*ws3IXIF`uQBU0hN>lOu%r`spU z#L~2!+i!Evbd59UN0Unz2YgNYKjd{ze&&u0U#Slq>y%okDIC=5c&Iax+ImiX9-ub% z%AX0NX6$PPE)h+t0(l-!sk%<8_4jQo!ZL&y-!cj6A%X%))X+V@>ss{#A6C_uS2eyh zU>xXAejifGU2J>9k;ck^JIiv6_*-Qdyy`OA)Rvnc^` zUJO5@{Y}=8b1MMpHy-=;PS+65G@*#8cH-pnR52ski4q;UyW(6kH|HkhQvP%#*$Iz$ zI(mmwPf8-O?mKYRSJR->55fGdFI*i4IMGrP@OrTO8T65l(`J!UjQWd$!?*P6u6YR$pd6K%aJzooCvWlLibNgvWuO=SnjBzt~~o(AL?iN z!~{j8ukvqL9`+3|bZz`o1KM@Qt1}&@UHQuMNt-&OxCwyRpS!CX6%0JtgLh!>70F-X zmE{puSUStQ6}k^Chf?Ic1QvW!J6u%9+<;9Wqrn4cIe;c+Db&cGV)mzKn}-G~|4HM6 zMzjr1unqsIvMIS#UNy1cLM+^MJ#Uz~R^IBN+q(U%hk@12EI7Q6yq~DI2WS~RNMk@F z&da;zi!(J)riLfIB0Xs*9ayb$E^w|!hd{gKnV(U&X!T9}-jNWbldYDcgRJg^uS@E4 z&UopYk3OS@5eeUH9}hgc-M%nb#XPE1(%Y;3Xqh4R!F{s-jA803LQ7{T*~|z*C_)k< zVL-WwibqP!_Hq8FI1^lee}OE=vo$(N1Z$p*8RsKVfs)`;W<<wes=|a7^TKYiqnd+1~$AEbk=zv4%mkG*FzR zJg+oY)W2!mU--d+3QwFq!oKda)^+22x&$h|ebn9Ye95@LD?S#j!ZQU*Y3TweTUuE= z9B8}?=0;O>Bz#n)04og7;DLV$3e&El@Dr&DsCM1d?CP%&YCaDxd%O}ZN)3_@`o401 z!u+mpX8XrGB_>0m4{lL%&dt>{&fRLv_O~$#t8B=^wKUwEe&v(0RYhSje zRtC(~7C6fh_uIeIU4IaGIT=vaU0{2S!+@F*bPVzLs@mH-%t*8 z?|9zTk0L15dVgs$Ym4lDtYwg?zohke$qC!*|7RD$IldQ*J`X(G46Vxp0*yF8s0AZY z%SSMZJU<-Ri!0u^m9}|`sK^rplw}f%Q5RW$Uq(1PGs$%pM%M_qd+fxQ|N2Zr2K03f z@t^~;jw7L9Y`fd=Cd}k4rub%4fax)^Sl9H6{VAfN>#f}Z#`NY1`Y0LqoCM)R5V%7` zW1ayE+DQVEjYvSXNQJy0$`1frg0jyB(uo2a@EWRB4jNc@Xv(%9IeXT?Og3+>pqmLKF`LGt)QNj0%UkPM&hk^jENlrTqgHWQ8CG04odw(V%c;FV%oc)p2UAn z5Y177``>{;S`{Dqq`~QL87X;xW%&n>0aNKyN(_l*pZ>eh`YHN5NjO5RIEuu2fju9% z92o%|fa0%#*LnYgD)4emF%RwVU5Xq}uIZh5d1oiqGk0rG?7pWe7d9+PmB+r?=x3qV zNmol3cQ+;;TKw7Y?X9@K1G|b0ABG{dH=siQfu2&hMvJva%@fQ>=97AsAT_OpI5=B`Pd${j8@4bU2CVx)VJ^cn{T6e;z{j5 z+RLz}MSN2YV&up8nH643$kGgZVOs;JLf8VoIS94IKLqGK1?T*K7xSL{YSv&2t<6)3 zB~^g)O(#)jb5{%w<03!!m?pib^Ql!fyEEvQKzViY3-N2J6R)avH2=|bOkK1l@PygD z*LAqx2+py+La0|2Aby9ZZ>Goc!I*=KDtf>45qOCOch#@i9SZ%mfEp*cZ^~-r$MwYu z(F%*%ANrqd1ODiqORyZ$2oOwreoA$}?i+d4f_c@9DQkJ4-9cTqGi z{k3GR1Rnj)!%wy9ym67d*WKIw;mEs=YL@4_ed7x{VFIhF-K-p z8=I&!2#TL3#~63rB^>U~00{^79{XZ_EJCT^;b+&X)7Mw_HviU-T7Q96*K79Gr%?uN z7h9mTm~vxRft0mNvCXly^ZtE9nQ^w>YArWMLXwe@*25vT1gx1I{03=I`*H2-iy;}l zhS@HZ6P0|}w&TC{H_pGEv_7u(6j|c3qlQ$kw=wCRou6wH$N-s3Try$g1*m^e4^c&~ z1lCH$*l1w&YEx$C0<3=KBdx6wE{h{*W+8Kyx%NdWx^{ar0u5zJFko#E)&&w*3$lE_ zbeg9PjCml2{1{48+QW`;`2He5VP%F^_y|r`2;H09LIORdqlofc3JqyV?bXj!NGqW- zHCqiMy2`XhKJJL6{+N9CKOmzZa7M=MUz+)XW7^UIA72RBB^5~gudsA@o(|?61?ZFqcIDAy zSb6R`m6Aw=?Bza1E8IsAh1jxj1{6tO;yH)}-_RE>{TL>8yB#)IS?Mu+HuQAu+kwS{ z*zq~B_Ji*mbjf>=Xa8*W_6r40dN4p6swx-c=f!%SjN4FE0?vs)J9M#EO;xP8zzk#d@}EIZ5*4EZi#GW6Wl1eAIGsVvW1m}K+;Zl+F(!RnzIR2O-<`Iry= z+KFGeHiLClhiKl-*|0>qCY~TilSx%<`xA<4S{={kfZ1T?K49o7*%~~l8o-rWgbMC( zp)Aj^2B~)m9edX81cJ*^XX3t3tVadYs`>3sjd?TH-W56tkDgRY-N}L-i(JF z%=LVuN<0mo+-kqb9JXc$4heSOc2HBN24|;WTXf_@R^H5w^j;rL!-o^xX4>kmFI@Uz zaW`v_z=QtqT}B_nkdKh4S=j%HD;?0^APNBPO`Zop0lM5S)4MxY4@cR?ccA52*fN?M z)T(yGQW<5`T3-Ca=cDgV-4EtBTiX3laD$B&eJoP>%N2K-Jcl;S*eYKv19)CFzlX0h z+I(zR2RQW}ty&6lVI9+|7-iP(rDrLWI z0yqOU9GERE410}w0~6GKz@)boa(XpR*nA$Ku3P9Os(ZY66I|E)x#9CyQBltat#UmA z9|UKkS3s3>Y53D7mov*hl%H-pZ>J?yGv2?|xVe(|9QnAq8k?R=_y{xeDcOL&@gI}r zixoHiBKb-P@y7u9HFP4J4pebH89ME@dm2vMVA_oG1S)Q()lzww2SqiOCHaN+;pDiK zZiTI6eY}J(E%b+MTh3+jv{bs&)m)cfQ5O*goy9Z5F5PuPzxvIBp3TQa%wmnV%>NV; z=C^~a^uBtgH?765So#G$TmD)OvTVl|u#AD8u0T(1TxziW-Ooo_?wg$2{T!F#DO{!h z{CJj4OEtda%?QQ2%zfoQP~VLG%dy2OWGGY`N^O9$uH%4;F4+zGSOV}?*HE4lwVyzQ z@aB@cmr=HKei4;#3wcORPE{#nnW^pRf%{$lRC2OrU$;eIHhE(u$ol=!)fu3QTj}H-?9wW?bPf&Ko2#Dvc6xJod~30Jw6CNZZO8A2vTWdS zxX+_JDJY%7lj`P#4XxzAnnK3o6TV^U7`9O0_)0gL8v1R5wRJ0<*!?w!Me` z;VGJDk(NuV(th$_pjnHyr+F!HXJt(>_2KRx$XE?u_!k4{ABAIG!6#!_*O9gi?|1`} z63-5}@&6ElB~bo5iJ_4S++xz9tlMv)kDzf7l_(pXmr;%^&+ciJAp;m3+-EVj*-3o!u1_YOfssIc z9Bof7UzD*F9|1UdC|KtXG-XQ+ha5X`t?5>Ev~*>zF{Vwq(v@3uPX%B!zoFqIQQlSq z`h`LNf!ta?CAa5Ne6;HG%NHVKV)p{Pyg@1Z7ABGNKVvidt;}}Mi2d#c#au9Es7fnZ zJG8%>U2pv+$Aj7Fc&*AFv~zS0@VR>WI&T0->5qQ*l^nEwG{DEr?L9$DJ;4F9{KdF4 zpgZb>vz(ss&v7l`Njs}#1Uw-J2mY5eQfvN5dKMzWv!EU{5J^8=_xBgNcklhbHkI#R z4bK^lO5W4AJ#H|FUU+xrTR^K{Sh>}>j-dR-NE`%8IYnkDOUSFo zj*^bnA>>1~)Eo!3>J*tW(U2<1B3Lcae2-8N|<7R~u_~9~BN0 z#*e2nWokN9PQLwB;T}+Uzha>Dy>!pJAz7U>i}_0xe|{}YzbOj!+HBeMhiSGng*wgr zfV4r$GhDQvf}{I!f#t4C=o2G&|4{i6#1kax76rgAAPDy7jBjP8h@({F^nOaZZGJYw zorO0Dw;3Uv2GaGGyu+i-Dhv==Z*rP8hc^*+(MOaHcB_HQj4cbh;qEbE#+_=QG1s+2 zSW_y}*aBtwA81fNIP00^Bv2C4!y3zX+Xp!uyM#Q}zGk!U+QwgFd1@#{L%!c$^Tg_j zDrVn|H-Z_$+gTvCuWYzYkt%jJwj~%OLG~zkbc3_-w-7q-5Qt6A{24cV*4Q}o8{lh!+1sdN_w}DUFU0trYY{yfQaHFy z&?%{}iJTb1A|n^G>`Du(CcLL7pcyYf2jH57A=brKFgBo42n_OyR0w)^Gag_Ynd1jl zSzke-nOLe)1>+2A`vt{Lxp+kgZ?#JNPiFGvDr(@Ai3Fx zc{bWFZN_)pPIx1;hxf+oO1kkCyQJ?on=UZaMFBmr++PQi?ybfxbFV7`{+D?-9Nq?Z z?Q<2^{d;u2fOG0ufy&g^_E33-Ikth~{vYU^vD)kI?>6)1Ae6w0xZZ?0o9o5ClJ#Z6 zwyu%s9qJwZX3)w1;|({NiboZrgpyTmrqNwAg~-`)!^8f>s|#LY6a&`1n9;ItCii@@uC-0?mHB=B6lk$_?P`TtH2)f z0OKC8e$nIEX=W#(zFe!Ia(Obsr*Yy|s7s4h)664M)eanPWzf@q{_ahoNxAs~&kqZ0 zvsCJaXHMtY$a{VuMvRcXaqCKCM1;3|Z`lEXccPI;g1f(&XiVUq2AJJ`?+Q9-yetG_ z$h9hobD0}Qt?$pk?$_fHW)&w8wdkS&&N|&NA81qo@?G*j0pjVHbhHq6dZq| zYlxhyz1-gEIuy(t$39B;0?CU(Var2x55~uAHQoJ@rLNCvHBQ%l{2f4#r^Ox|8Jk;HXwzzj<|faLd>hVrEUNWw&*?HD9P|6R|Z+ z*dzACEC+nMSjVaJ$y@xs9VkHTO90*pWV}`5Feq$rLW>Tlmbc!MmRrh)|7L$)n9OgP z$^EoQ_}WYTJwbG|MEDD91pasXCHgel9ZEkHvU2S}1~u)^nub@V#FJrBMyE#^Tok}h z>?hU52A!#=E0QH(lCYu~%TFE!lB4e%L6D1o$&!O%=A46Qe9d!)P}$)kJy@)Un~y@q zj?dY{sW*}?a)$E1mCSPoGiaUO`Lw&f=YCN@R;XI+RGjjl+($8m=m3GhXP=B6G|z}x zPFjx->{w}yYrzA@RusIa%WbAxFfJ|dh~Qt0JM=f;F#L|@n+mKw7~s(TtVI+z&@Dk; zB@MPQO=qRwQGMn+9P(K5;}z=$GPK;zW8NYz7gFt0Z&cShroOPX8$=kTX?##V`S);I z&W<92a09$XZzAhp;Ky%zB8ztbrA`lq@pxl6-qLRv@u|eroFeP2ou-Gqr^_!5QrJO% z>QSz5%_9445z5s|V#Ok{W0V7P=BMA6RFUij+#G*YpW-QPdreOUVCPb}_nu3pgwg8Q zM>uG0^S^Q?#p)|;r*mG!4VholSr{uwEYCd9EH5qzv!8mSKfU-KhF#uRLY)V_9#9fy z6r2TL>f-{jG8mL&Nd+==BVrZ0M}&_3WQnC)+@jq_=E8DDZq!Dc?NHWt7)nlF(#nxi zXvp%Aw|}jNzbSIi!{TK-(C`8s9=jEL5H!>8B29aQAtAgez&Lu0p+8~(2Ma;3_03yn z?=+LNCDBPles}TMpK6r7`Tc0JB5&_?p*F?+6*IM1cEdw2O)m55rDY_!DTt9&2NXjN zadFIJuiVUUKC&j(*0-c5>6$0h?V##c>2EpGl9L#WurIe+sHs1*uCX1FweGF$+rQ<$ z`G$<4%ZkRZK=ZL(ge3s}R7725z%ACr!}%J=7;Zqw8%xDLI}=UpL zxyLl;8^#O_&&JZ^9I2+yx9l0$9vWebr+<6dYVRAB31s`8E5EB4|8I;3v3E zGCYI?a!Q6mq$XB|p4f>JAJ+iL-=AOK|KNJT zFsHd+i?KS}G2a>5{le4-{naLEPM{^S7qU9=w8tR8yxp+98{(sHDjR7o#ufm9(E1Fd z)!QjacJgYkfn{{@hwf%YsC9USZBtCRohq7i(U+kTGz;T4rDD2e_zV=Nn_Whdw3>># zvL)4iU;kMw4}1ohvgm`@Imq_QBZeqDrLGZBbU$G`0(PhQZh}gPQpTyZj_Wn1x5~YKSC*ao=5HNctR&wm zZmt0&a&@TBu&nb+nN2}|J&7ihUdvfi<;oSg7&df!E3~So9S-_u?O|YGPzSA4Noc-G zySn4T!~lI;6*ZVh5ojXcqx2Ic!EJ}VFyfIBUf##0td=7*28D=p3R$!ho-`w0Iad8# z?&r3Il%7SZppu98{rPRj9UuscK^ZvHRCZcN!Q=WK3c7xi^Igy{fFDPWGVJNf_^_x= z06u@z885=usjFq)goJl44nz;pne!rA+0dia5vEsZ#F+4)Pm}G~CFv7iX(#YipO@ia zAr$d250XU74JSy(-ZNnhBS?=pAMjtD?zWio$hRE zKYD9eZ1r=wb@>xRksqk`S*C*dNc3cCRn&lLaH%+(f5E5A3;qMf>`DFw{7-IUxkq2U z-S&Ux7;O2mSY)msE7|qtE=oLql*9KNhKKXKxu3%$ zt>~6!H2J{9^s4xgLOk)ZbMec zF2K)%fz;ry%B78+CG!5pU*CzcS;-8i8Rr|jqT0f}GeYj^o_{m{Wd8b^Hjx-AqgCUj zIoJAiu+I|v=%dLos~y;z`t>PGv}o~GO-+-J<#bE>h!qe-qTh81(v^XX{#qnEi&yDD z-e)eHDBgTJ(vOo}g7m357!QMX4$c8>eHe=;ums)S0hS1uL?1gi1rjB=W$Efvb#r>c zEWd*F@D|@-VyobIb6_d5@V^$CNJ$aV!{yYMq3*GwP|n06Z!LoD?iK$Mhij*h$9v$_ ztKh8{1FqH`RSxib>Z0!(M>Y#iWRUiE#dN?d-Rx+DdhcQZr%@MOpQ=wHuFyyb{n_|7 zbZjdG+$M@?<0!TocZhL`8W&5#a4!-XyH^^sup#cV>jD#=`wv^jOCtO=|7;C8ULa@- z8EjUkbf;Kjt)8`f5YS|OeQ#CyjFeHsoR*plhFNHw&9%rGU#mtOGzJqK>z2!)nc!^| zt%Pnz$=@$z@i8eM@3&n`nd&qGNY!&ad{Q;#B`;3b)h3AYN!|pr-$Oko<-OjbezSUT zU$a*&sC7I1^yC9&);Ol77&ye;XqcWxI6j}75lpkfR5+O<-ZCtHUaUq7F6`Fk%#=lZ z_Og{0P2d0P#*y=at2S?O=h4jMxkIdXUD}eB8#*9kZ?%2UN}GSWZEov_f#MyVNtCOF zfA5~wN4Ka*wE=GVz?d}Wqu3W8$xEM{8udGpPMsag*&T0j8FUYOe5SwpX~yJ_lH=85 zVP%$&YeyWn;jwV)6`-pnf(1ZIMRTIG8R|3)9?QpgJZ7ZIF#Q?+R2n;r=JIMiR`YXp z%a`xk>_5m#DM+o@PN+GX{xEAz>6zo1WU0}Pu5?V(vm=65T>ML6?lF10%hnYk{6!~v zzC#oH|T_q-OL06__P2JwxFXCiKjXy8A)($_B5ngOW)HJK1@4x2o@ln+~B=A&9 z_oi{%Tw0`w2@m8vn@z^1a9Y&Hye~DX;5A3O*?<)rC0*>Z^Y7aq$DS1r_T75*sL=4@ zY~6WZ#L1!4IVt1bW+m?4laq$ppjX>E{}-f7VOcx~svKx)9%y$`MM*!_%E;5+T_^jI zJ!C?6s_>+PJ+g!xlKiKt?h9+U;Y*b#;)$Su$7J}i#R6e!F(~X>V@vinot94Gaize!!qoQ8(oB&2c80}&4YxcUtq6|3OOHPn6qMI5mOR+3zF`q72Bd=Qo)Y^*RgIiME=9C*=z$cqyGDd@XoT52V)&l}-Ay4Fm@oLhSPnjU) zA}_C%4-j7o+JJvG{-GU->=b%?6dcYuC-mcTIKa`JQ}}GoAr8^+Rh4_J0q&u5sZpR9hVV z6m%7O5CZn^%P3*g45mt9wX_KJ4W&mnrG|B&1;SO(g3kYL_|Dp^lU>RLB!_QQ@mb7f0G-GoekOKuBg|0(c>V>8Oi zNkElNXE`a)b!)lZa5JSaTB+df5@Ym_<;Qvx>r{i=EfbpGi^@NRglx#1pI8nvJUEBd ztR&nX+gd`OY*hngjX#uBg04AHUe`G|70=>JrInDg+q`p^l`tn5+EhXu!`%>!jHOBrLGk}o?k1b)31D;lLxMzii)_MgU+ogRy9X_)sG9Elmo$%OK zPRRs>Y1@nvrqf#ivtD`rmN+f!jR$TY*JBp^qz|QBYUtIGbUkt;EQ#a}k$xj(e17cf zdDTy=oa-x#cnyj|(1X1@`2<_SoykAxO?ImUgjNl4yYZURsvg1SYtzVjxocBpYqX<9 zlf_4&zmpr2e-+}w!d{;>O$iHoUgYuU#RKGA@`U`A;w)UUr3H(>1uTkaR1Z-aw9!Xc z+?!x)JR7rPPnV&UxMVmISc1s4!LCZDm@JqMkGtl_mF1!AEzo zS8joOzF|tBB>vXzRZscfXT(MmJ`pfK!CtH>KJ|r9^KhK`H`k!r^-10(@3)R14~7ZxMTOy_la6r5l^8(xvx&;h00S6 z(7OBtIY0R$56#6N;&r&r3rc)3f#@f2sM&Eu2V8R06Rzg3>!U$Ecjf7VNO10U^Lki&$@tgVHS<4{87Z( z(}mkvr*U6XIs}E_-utni8(Zdwz8l;aAv{#7T0<wuIU@~|_5SYUw%qwA zg}k0cdGEwFr>;F19$qaPSpfKrN=vPE_n-)yU|7Y0cSOwwG#xuB%;G;_)&oN@kg1|; zL1;(`i&w(^;52qM@RJt+S4@+jCy1Qk!1e$dndX{2!6jN%GbjX-uz&60MaDM)LrXpT5?<}d%^W3>nguPOqQf>Nm zg85XTS?1cJ#2WU|E{O0N-d`MZ_?|?{TNUrvhw!fG$j_;8{fdA9gJfgpfgg#gKZaN3c5(v_DCk9Q zLpyKwyCr?^9XwmMLo6Q;his0NSN{xcn$|~nKTcm7nQ-2jSU3_e?Pn(@eyc}2R_cP=DHEH6HvH5w3Z9wtvTvWBtrO+d;C;IT0b>suv@PRM6mHRG> zL5!91Nb@@1B6YZM)H&BA$Tgj&I^`hm+JrNnXAdTPYBm}b4V7CH_kxF(M#gOk2w(5% z7ropM4b?lc*gg0B0@EpXRm(#2v0kQbje84*8zVK^X~H74z|HKnEXneon1uD z(1(@Phb0)hYEt?T!mmao`Dl>EWLGDhp!#N294f3zv(&ACUzhYf1pU2((NPemo{!ze#XsGjezI5`o!0WaFQ?3T_&O_X~k6*k9p1gY8_ceFlHA~W0 z=lcF5(L4$c=CcDyEm3{ zL6VZPAKPA@s=R$fC_q(m2drY54yz8EXej6n7h|V75;a-ByO+x__wWRdZu^BumPkZDchcbvb7dCmBR}|Tc zV%kU4qFzFqHW-EVI#O1!63A>>t$IUC1b1(*A$XIxD{zpgS~=O+^PUdM-h?*+s|ccL z#kcWb;SiismA@6Cc4x}bcSwnd&^&YT-Is~Osp3BBne0+_FOdTQY;(tI)6mlrj*>~? zZ&&35OhAu%@44I`(n5*eAr15L#|ny$NV;xuMlb0qKq4<0OOo8qd@X2z zP}u)+$&Z)omo=TKGY!KZfT?`h-|b;?)nb^YRPeN^OKMBqP}#Ql#pCWCa}WF^GL=#| zxpdq2;(1kXAGvMa%lWg7Q&yUDD5kE$f^AAtGTL~aGs`@R*U!kV?QqD^yOcCSrt;Ls z`3sOw8p#IoOdVI%^6 zAuBVJwZE?uQ$LkVbbkD=SsYNy{j|DcJ36&F$Wivh~^Z?W4!_Pr!Tw$go z&L7>Ze0syA>*%`hb>)2a%*`^$3yr7d{7u52|Yb?3m~*{59YE(+Oc1Db%P@xx6Y2L=cu-WmJT2 z0hi`3BLelxb!)&7E#QZ$XE`q#8_c;aPUR&@w;19*jiuk<14oFXuG{QJg<^~F_ZTB> z@rBD^ARJ#R<^K<|RNU4s`-Ig3aOF~=TZU1$I%V&n*^;R0sf6DVraT3q)XTkFQdEJk ztu3bF46JMlp%Lm`yYE}J`P26Lv=)4>e37n(H2j*-G_ zpiXxmDL+dRysxv|V^u#NvrL$IC9NkA=_a{JG}zp~y*M=jgDFEvM^qt_GFX@C2m!s6 zr|my3av62XASHzdIFS^EkV0<_G0&+%93bs?KAEap)`_A`EZM;JYF zvUxi_-#OJs3?f9OU$b*T)pW&VXU+7VvL_wlYSHF6DgXm<0C_0_{si^{B>UeIX$b|T zq{utCPm# z!?~n5B##`ay|3R=LGbJ2{1ZUa@ zjS6vGG3!&ym&IRi&!weW^;8H#EA;(`F7vfP(0L)nj4<>|kK)~REJI>_1Q8k{IC}Uj zo0vf=c5j_^y!wtaF{HS;c4`f0)wGnEZd+5gUW+UF)~omAed^{aD|DXvK9h*5BVy6k zu`P-+u0nLSj!eM5<-(Ti^%S2QG@h#Gg0d=FOi-^d*?TPb zy!5NL1;745js(f+&Zkm=?0dWwKF{=awSKA715JR&*Nxy%irO-rR7RtKVdE32Sm_25 zcxEuxzx_u_bYZ@r&>#N?(S4_|yI#8=>e+;j6!`7G+Ox;-C#E#t5;3g$nc{~o(AzP} zrb%^a4c8=`&(_!Jq4&1^|W;YaeLkTnsgqf^CQ~ib&K|XdQly)tRHNSJL$~4%qG@PGzXVc5WRR-R&A<6Rp64TbPa2oHfIp~9MZ3JWE;}U zrrUwZ<&vz`l~Vevlb~R5eoSFta(Msa-cwI{K^Eul8vRWbeNWLR`-obmZ~aE_r;i3~ z(RXLRW{S> zxuZYq46h)ddB^+L_V(<*_cv-yZMs54WhGi2-PZ+b5jLBt!>MwS zY?4C8VuljUoHuVWzC&22>J&i%6Io!w-7YW0=^U@?LgAo50z`RLIgx#PcU5GC>!TkU zJy@lAhAG)kcx^8~{A9WR)wxV7J9Bz`8JEBMu;SDHuVlNwvg~ow^*#n7Q*B}tj?$j{ zJYr7dI}(nkOdKJ34^vK9-JO#>vY{T$-PUvJ-7BL2-TR!EtS&XI3Gm3X=Lwh(UKg-V zRJ$PN%09r&3*h{HMtkx;V(iCXHR?>1lsSv!ERQvn>BH@OpP#HvS^h6`wQSe6Z|Zir zw?~G9+VpWBS^vD)C6vo+g)dySVF*0ODMz;Fdw5;GJ`M#)ExEffCYq=1@rgDD=%q&| zq1%ITu4ww%?bY>8oD6dQCcXW@oXyj_i1i)EQNG#?r)ezhS0C+vKS6Iq&L?)_1VtE5 zi<`y>a>R8(VHeN3@%{LCki5o$e4o7`0>*DtKP*G!V=hjd9*ZU=LB9~6SM8wrJp8=V zSz`bh*F7YE_C3eUaeBtl=E`(Oec~#@f}{|)&ByoJU7C*;Q6ZmQp=0IoDf4V;d(o?c zL>I@Y5T&h3--@=}Msux^Ci5-ZDQA_c#xX-Z3?Y3vG-A%-S&lOc^U1t;+SxO^&n@im zugbCVW76|xEeA>#JNgHK@=%YOdY&MkO8jug^F<6^hAwZ~gQF{9@s5L&4uC`iU)dz3 zM(UyB$ts6C4-BX17FI*m2l?JGTrR$+M=QJY20ekYS0ka!Inxi?p%at&^r1fu8Mj*% znQw~{RX+cJv=JB`MB}J8FcZTv6aA#PCdxmEsK;b#isnB^Lct{vQ_%8=U{CW+V#y*u z_53#yL_A8A(zY7bNY>*4FGGQaaofq@Hy@^Yj%)E5uIy)(1)@u5P#_2WE3{gr2a}=) zW1P5Vq#5o`$I^mYrBEY7zmQ@KOVAg4VGvxvJ6y5Kl7F*><^}FLn@?Wuos;^lnGaSA z7fnWP*jCqgtRC%}sxL9u6Dz&eVg0Q1nq|jzyLpFhmv8%u9&5GcIb{mR$14neD9Nur zYAD#P{o#$uS!9M3eY>)LuboRl*YG$b%3S_S+XB+y0q-lTddZLMhc|*LC1SdyjZ0Q` z8BuBQzuTbW>dGtt{q9mY)d3TU7H?Lk0S$f{pxMbXUm1ypKNus8`BwWLr(=6$#94|A zE1GuP7QgL5I{|fZlmRbX)`IdfMBjf%t#AN3T*5j-MY@Gt)}Vpowv155mluNnp(>tX zlud#&jzcN)3<)L}12DixMg$YD(;g)s*oB+c62cJ_Of;OMJY3w3rfo}uwI3it9LB=0 z&f-oWM>oxKvI*kF>k7F)2 zx~vV(I=~A(`UZBg&%CNgpAJ+~QC6N_*tUfZ-Fs*SGBRjyl}LCE z7VnLYg-bDnX;^2PX5ZK*S&-8crCC2#Z3)L4sSas6_5;2Jec1OHQlk52BJ4QbuFFL_ zXLxPbdIan4{SUGj4=yyg0h7!UoG(_AArlYg382FONSf9M`bfSGBUM=or7)hC+{4UGNRYW5de?K-!5sCcyOWsEB;lr#nBZ!;XXpk9X{<~?E@ihWMWEtj}TI5tY; zsSsWmm+YS}ful!a2Lu3PX=-uQO_LQ2rQU=^VML*%I3p3N;A+?bm_2*9o(d18*(TE9 zKxarBTp6PQMRpV=j)qG6Wc&&Kd+8)LN@MW(fbR=0y@2c+~AX(elX=j1>QNs#}4 znR1+CK~qFNN3SnVo*~lOtpwItq;Q*yP{X*g^uXBms#}-HY>?%lUOV40*Or`^SA~ii z#oo%t9TCnRnSiVv#OqjFYZtuy$-(eWLH6oj^vzR_r(S>14M4W`zOZq{{Xk19g5fp*HnbZX9R&zGl~n~5hRFO*8*Iw11KexIH5$8p zLoE%K3S65hz)k~?Tdx6&fbBQ#IZ6)5Y*RZoU9Rk(M`9elid<^5v-OP|I^FZW5Ila# zAogQ00mBI;5n+=+o5Frz!!V=A9GD>INm%@P;!e(q`EI!6a_c!lvn2qw!syou!&Rvq z1!o8sYn1J7P{#{td_AE-Nr~R`S7%q%Z;w`NO$nZzP&U6{AZhdL6-896|H(*xRzgY3 zXM*>lYm>LLM3o)ULi@vvw{ysp&4J`Rt+R?w;rRVB)gL>;h+T@qp2iwl70()d^yy)B33&82b^EPA){FH z{3|;RQX%%dzhzl*nCJWHrSa~I4>Hm#Gd#7%_dT|Q!*-mHF?~e!Gk68er?>Y|3mkP^ zhGt5UoTi+*PLXEk3q85~A%QVbNik!7I#Om(#ltVU@~7&zcu{V6|CAWRjo`ewmsXN( zW>MGY)Fh9ZjKs>FH*!%=XM-Z|J;f?o-8uc+r>LNA$XPyXTCb@^I%~<}{i}3Odxv#r zjFP8g?WDsuR>>yU0TNsjQz)s%UmPT(--IhxQ8X2^*YwOPLAQ?wtk?kn}C`l zDcqj~6-QcicG>0lWK$%RrQzI2TpQ?b);$j@SHD%A3me&%St-STpCcU#6JQgkh;!u$ z6U7Gnd#F`l(G1f#|ED;(3T`j~M704p0};|r`%rhFjvTp7OI=kYGuedxK`iM{KOpP6 zpaKT>Xnf|QL5{wclnhO0L8xb(+EUKvfFCEykY)G+X{wD?tI`XKMctNakSF;Ob+~;v z`J8n?sk5$bsfprd!|La(wCNJ>n&xj8c`wa}_&yxcw|5Mi>L0AYO@{~YH{55Fx|#s|USfy`)zJqe&# zjhZMJ0oF(e`WQ-lDO8}4x=ij)ZHFE2nRQm`dbHgAbqWcN7v0hVwUxCI8l^2@*ja~| z8&giVI7ez$*|9eQ+d#BCl5giF-R*!A)sNy}VryiMEdiQnEK9^=ABMNQikH@`rKgg^ zFru9y;XV>hw6TJ(WC`EnUgnQ>teuvRdFOnZHh3Dg9LIm^Z(&^C;=$eVM5}-oMeE-S zMQP?9<&}0b2bv$}Mjuf6J+WS@sFmPYt2k;RYo{eZW7>6f2BOi%w55-EYMlgErR3B@}whc z;^OjD)do4BUJl1~nDyx_#@r*P@-I0IG|Wz`cj=vdM;7GGR|~g(=eb{-|MWA`Z&~X{ zNMS`w@zmg%wPa?wI|m`ubyT(%ab;38hcFPQ<0-+`Dv9+vVgC>+nK|EkPg)F3hlg+*HKu z0++%K-L7QB4W3+OmN;^=16Uh8Y3gKLDoY)idxO@42hR^qM00M8;Rv*E`w#P{i_6!4 zm7k98yf*xKptQ`=?UCc{acN7dB}7A46cPw(lyfYq9{gV4!I8Srj)!jZ@raQq*bqY*QG#^8JX%cSd^cOJj;A6qw;SrJf67^2^j@st zhi-HI5Bgw++}vqpM*f3500EZX=VVTj?B4Swj-wb0tU{4Q}rwYEhM&CpM>S6qtIe> z0637|=op{h%)JdhZxr1QTu`KJuz$<6;kdwJ0hOVM`gcP49bv;1zIEK%ColG%FAh>-Ti`Gnl7O~Y%tg1_8u zqk-!SDabhP-i=a_yNQ`qSlK2c6xur$E|mNS#6*GrG2a-8T$%LQ{_!Pi& zIs-_mTa28QTeF9DS=r^j_nM-WUY|(`ds>)+REQeC`{>0r^V8{yH>(4$o&S<1Z+m`W zslVawF^?N>BkiwB($XTYBpr|rB4IZ|(R|?eA_#_|J4JLb$>#tsv1oqALnfwGm2sUa z*o8fTMDGOA1fQEmGd#%{0g#1!vx=D;E?7QA59@h}46_@S!AnbyYsUMRAw%v0_}bVt zW{1<2zs9GjXi)jm&j6_xWyhD977k9}ht0s2#W=A{nFn-}$1*XYF3DhQ4()()FH2vf zVme@)3w3$}ufuIf*f_f!XbOU%nkCJfXdPBNbeit=jxN|8`shvRg3@f0qj$ZJ%F}yU zIv*RzukM)FkHpJmOq*zX?R!)Z-!Iu|rSvtO390?z%w+0?Dq)DnGDZJfVrxq03v73J zVJsWE!`Kk@lXazv%5p0FkwDJNACYwbqPr9b?*MUd2g2xfTd=f%G7=V#^M$5>64Mvd z36(A}w3D5VUzr6^cW^MK{717&pi(Sr>0uvT=!cejTJ@kqb2STvo?F$s& z(TtkBOJ>T)Gs*laW&msJle{I!I9kZ!O+B!gV719mZwnq_jZglqqis@vroxLzK3go% zg!P(?!-3jg(!)rM3hP#O7;Kx7rv(kyHjoplF=F8oG@mz~6n@viiXXE~cgwowr&Fd; zDFJP;ESG*^-kOgCYUNfx&IQ_sTNdp(ua}Ll>PKh&=$@D^!zL*IgOsC%4^G)mcf686 z>L+;ccFkpCPEl9ZUDBu2RC$X1=hwZsAHUuI00ENHz8zHxtco6H68bTWuA<$JJBb2= z^6Geoh{8@DJ&>FaCxftO#aUt$rpo;VNM=C7Nn{V9slNL;CC|37Cl~g$pV?SDb~XR} zp90+-HoC@8=FA{V!SIu;^73i)BeV^u$W$hjb_SSy=bln3d)Gxik)xvi@wClvX z%!1Z)$ZwlnA(*2pt>Vr|JJZ^hp9UTVb`fMLIIN|HrrC0EcTtgoKDih?UNqx5S)Su{ z%VQrkC}cuT9Z3paA=c(GA<$#U!zkh?;Zr(7cbD|Kx?vB%!`q}J1@qJq-Pjf%mPic z&_b&e(2y1~4C%gP`|!YW^P+GoYH{Y@rZ9K%^KiqHzddYP@(ZFKULZ`ywzQ3uYbAMv z>HZjtE!6Y0$o(%b2v!KILvH=Vgf0g3d0^lB>?>#OH-%U&{DYV?3L0GAx-FRauj#v` z7|Tc9)QFsaStR5qz;jTEij(y5MDN4cc+>t1&=z_%yy792P*lc?!t6TS1U; zF*BUhE;N6u__ER2p&Digev%_(houa9Y5WfT_!&0pjdHAJ_lH95=iAQ>%)>PCtE!%% zck+uwZT>;@p(4$`2ba<9Txf*MuhxT|Ah3-$Ez3}E3QlZNaNS`thZvsBd;?#a%?*0u zXJp7_KuLm|5zdT;t9a4`$%o@&wZ0Z3bJmvI3!p>g;m1BN7AXDXeDl$Md0)w8f=Dwk zP&5Ce>2@+%*TeuE^31;}Psp!Sls}kmnIGP^ZESwBn_*!xUc110%ZYp23Vn+Pmn;f@FZsp*_YqbKxN_G%j8A zbNM~pGwh9_UR$SMz$JzA&{8Q}tDfLJRY%8pVv) zT^e#{2V<+7Fk(m`cPxqCmUx;RSNHUNxIA_2S6%W-b^p_o5610u9@734-fBIq`fNJy zxbxiTo`Y=*_QBdD(K2qzvIzLii2tn=>{yu2|E)j)2GIXb?xc@KpivTC3(yEE%wmIk z)I?*t`X{<0r7jUA*fX0dKrgYT1?Pr6oE_u>nRX9O&hMm@fUs~?7b})_Hmu;gW8a~Q zHz$U#^G{7pq52QEiF2h|_fY4>#AL(f>la5D1nB=v)n}lq5(fxWcYzkYj|ze@au4iL zT`XzpIyg2C9yX>{k?w$thX|MYD$dDCp(qq&%>6*?vJ)6cvsIgX$F^9SytzUA|fP4tPuH`xQh1;TptJJ){p(7h)col zC6TC#oeDBmp)m!5GH=9|(~_jU_rTd9rpU;E;r{>4+ssB>mkcPzPqdz9h|{JRXgc&Q zfG&z6`@2Ad{ew`gk24Cnw}xkFqH&u1>UZlZaay+IjTydPN<+$-7f+CNN+>YeZ0{!4 zgsd9>Pj=b^-j=WFnN%nx8xMy7u^0fli@6|sY^hvbgC~(H4)n|*g|>X*F2N5-f-SYR zuGq`yOy$`2hjhx#%CU-zt5~14zx4&$uM;?5dE!6Io%==uVQY=!TDVI!88y?}(=9$7 zc8OIRjdlpcr$r!22&r=4N$+G&idIW{KsjSBrZb(lIil0H*xugOMjw$tix|%tnQwHAdJhF0wo)!0 zD{mE`3wE(Y>4incv&rXYNT%=Ykr*>N!m~K{t-{z7=X;Nu2tK&0XcD;Zbj6--4E@~T z%02R`%1(N#9&T0bKso$B86G1A`U`J~2$kEkiukbNic%8%Br?^iGH!Bsq+8qElMLgf zKX-JP>iOt}5~wH0ztAtgPd@jx{5tQYax3ffl5+}Md>(~ z17$lDrWotHkoQ3Ui14miJ4vNKEd^qTbeh|I$#ckwsxOG*-Xf(CKb$|?dq1#1Jq6{Y zs-qvl)~BGuC8-oJmnMHFNH(S*Fv&H1Lh89e2s@$R>0*<%M6t+T<`nE6R0phxa_u1Qypd<&E^WwK{E*d6Lr5l9KDm7HgKjWG^+qQk=Xywl7jlKu9|^a z@YSnkhS2cEkKSqf#JTMD~}ux+`X!W}~OU@CFrwm8URJHGD!v zS-{^5#4f{6Wgj4RIow{F$=`6~D+q;fHT1CO`CSUI3Y!=Em~<<^x5>Qh1Ep|k{$a>S zMQ2qtVj&~qiQRHJ#?&`!NQ+52a^msBs$S?h1;}=f7?)&tQD6dh8~ew0Ss~LP9pzp| zsBn)>n$XL;?D^j=>$Z_Hdll#jZEcH5_v|2}>G@?%d56?DXpweuU+0sgO{L!+vwl&X zYw@u7^J?*GiMKYPtQI_G`Uu}MBhJ-03qzZ0Po8Ah=;zI+hnI1UvhS z-CdkrOwu(4vVeLs2MVu~pN~FGl~u^(h~}OQxMa#!wLy`s-`&s+ zKOMX|d+Ca~n5IUq%S!%K%kJ3Oa@1~wNLJ`V+O4X|9dnQA)hAf*ttRQH=%hcdT_raH z+jZsV9&Ck@N5Q~@p8M2suZM$m&<0P z;P*COF*(1@2QLsRV3)#o^eG_BAL6=Vaz*HJyZCPtRmTFi6}3p+<;cq`{BokUH+3aB z`^4tO<(P$ePv#BP)75cJ%8qu|r_0?X9C6M&VT(_<9 zrT1N8|7-R2!gu>$Ith2LZ3x$>N^X40jTg*Q6p$JTJM-b2_KUsgCdc=!6o=`F$sIeF z+>6sb+pvcpo1A*5?jCM)I?DaqFYsql)Tn#3-qFjvH;<@4z(J&b;jfe`q>X^s2VMD- zciQCLIr1X?2h>vHxeUM|cOlU7C*DI%P;?irA?Vp${?JuHxJ?_IG6v)~jfX{FD&Amj558TF(OA`;prU;r$6;LE4 z-EmI;AdSCyE1c#6r*tN#pZAI>ztl>L+n=wJ$mRR#)7GYch2q&KK9}eECzb2x3+rs< z?I!Q{L;4C$+as-Ih$-9U2;A|;qUP1j4c8Z4aS9MpTJ$A>VF(@q5ipUE_);Q%LiKRm zEa7KNdq+}K-XXPiIq^AHf&0ca&;PvIY)Ifpzii;T|3rs0pV6Lg%xf;IF70P3E-BEN z`q*83-RAJ45t#G-(n(lp73hqHQKXBbN z|MKc!;=J*Ig@~BAR6SVTKpNTpx9DD^ek|TFuqSZ&_lAGokqy*kW+mG9f9Etdy1!sI zbdpF3i8T^H!f)m540if0bKM+ez$lg$u(}t2H*Zj3(G2LrGJ0M2WO9*>qv701k<@UF zUloW7O~uFMAIul~T&$z5tiJK8HHDe}*IbRL{an$twcF%9U%1C|cKNijzov%w?~@fS zaE#^H8e|IzTF_NEkr4qf$HAqA3w4wDOt;VUNTNdgR_+gzZ&SAk5;v+HSFJU|#6MWH zSZ+!o(8&`%4lxK+@(W*=vV=$X_U zgtNx=?!+aKS`NvlmHTMQaC?X*lq1D8`NVJOQoaa>d(gtiwNI@Z9rqL}Es*)?3o^tQ z#}w?C*(~T3YZ_haz8XVI-I--J&Qn`)v%Lm^01&e||=GsOidg zo6;@mXT8$ymrtDZJw>>dtsgVxD8yJR3E9<{3NLh(Ack-ibs&_Z0GIn)6 z0VU)K!X`DbohrxRDp62xLsQ_lrOKboLy3-Vi`6KzUu(5A*}R^!?WX1;Wsvo(`873J;?3 z;Zgkb5RrGxjC-{6OUim-Fn(|pyon6ywnoM{KB}T&VvPt-K@j`-hA`}Tt450W$~1gNSf9W_2^)fiXR! zizo>E*;PAHW6cjQ#*>Ls_IEvRwPuis{9ZCg!|gwKjib({+Uu3XGVT>Gom2sxlTRMI zT8Ppg-od+}sUsMWc}15WWSqz)g{(x;U?B9Irq1H~AF?ZBr;V;Xy9`ZYY0&Mc>yEVe zNF!c=AF3YR+G}?FU%w1EpYa(V?mEz6R!xngpB+YK#}j8U$1i3C7EaS0erVc!iapZc z!hfG~{*LlVgiU&GR$54MetPEgRBf4ERY*ks_<_BWvTq$6<2<;=)cSZ+z~We+EOW+; z@($vjwwZCd@c)h@PTDvuHm=b$GXfIe(H46Kb<8J_SEsv9K>LuKFT z1b})Dq?;vFYW4B@lX?xPINh#?3eaPz37_9nyYmPv@zHSaVmh>YXkwb~GB88wJc)fi z+w>D!B|oyVri_+EfmT)fp=KCpndlX?RDi#9p{rrhI4@`QtBvCt=wsn_^wkiOARipr zIyvCjuYs!_L+PPABHnt`?Ji`EEGLi=UI*7}GPhwX`3@F=9|ng^`K-=c=l;p_4SMwZ zefj#?tTN|Jq8;MDKS2?M;O*&)OFy233=`E49HE_kVzS#Dw5Wm0aRPfXf0vYy;SA}TKFI2UUDEA)@f+k zWhd+~N|JKFtxiP}tK7 z1mRC0?MoQ*WPAhqRaHqcXnI9wOVZPff}(dg@1}^ogZT4BGa1+yfMuL>jEXmBYVTWh z8e9gd0nhoSd9G-hP_>+jcV@v==0ZDPc)8vwRdgu29CVzw>*9x+Zi7FyM>~!$qenG! zUGKjjAF1*DHbyx0jyP* z4`@c$pSuk@sS0we8JwkU)1*j@HM7ZUXJ@OQhmtMgilO4A)tg+^{9yfKW%|4x^rvlV zFA-=YWJKOr7mykiaLA1gkTnzt&1WcgNQ#7(+^EZtTq#i+THc7_=7o}9tQqS!INzum zuKZDDY95M|Ku4U6Mam?EwR%W$>TpVyRK9o+D?6;s<5*1MjpGBE0i|js#aBy?f7PBf zczx$x1R9Ly(u2ZEt-go3nAEt?MrO76nT_PN>cUOf=j}M-gLi@8k(jyB!70ftRTJv# zyIbBl^?_H#+`OxG6HlK4qh(}UsmKNh<0uRQqw}M}gHyOz2#$z2lRYqO(Ud%L=4OgGzl#Pxfw%f!!Edz_i_bCwF zYVK?`TBpCV(DkHO@T05mtC5Oa&Oh`0$xVn;v#1w94i1Q)8ZP$mG@uw@`?v%2jaROtO+}oq2pM-G6~$<7-u9Kh<8lV z0gbMm4Tkf6eW?CGIvCn>KI+@5ntL}tKyM{9X5U6@zN{DHI(N!>z*GK(U9BMxR4&Wl zQk!#hIq4hUe`n@Rxc>|D@yqZ7HJ%&c^Yr3h!0WkIkR2f%K_!Tnku;$YZbefDJjqP2 zHtQI+#J7L0|K7i_zeh^nr{J{L>C%3m=st=+53K$KVg|nCmzaQuyYp5Edw`Zc1=2C^ zTkK>IfODj7ge+cy_Ww&jQ9K^X_2uMtQmT>`n;#ptV7L9ig@9+L%@%QW_#QB&MEuP? zK9ixpL1s1_cgME7B$kF3`9!FM)yZ+P%Swu@KFknCmKO$i$1d`Y04zX+s<4X=<9lhw z=_6v)Dvp#hz)u$jgLdf+u;?#T|Kb#oKN4EP-ua#K=<&^Ufzmr`1+A~DO4VZ4u!Y-*-VetW(P6=Ksot3^Q=FR)tFW6!)nG<_s-e4=Z!Hb=wDz&|B z-dcfpIsEdF+e99@e5`S^j<}^EKPEfHhGnV7z}~>TYm7Ausrszpc(zmi;p_T}HYxe$ zhsJF#-d(prX_c1wym^^7yk<@M3eeTwU&Awb8F}bGt_CSu>f`i>njq-d;aJ6D#7Z}Kffzim{+~>q+`iKL3 zrMiBMnRV_Q*@-$A;1jADi#w_Y_;avKB*X5 zw>`tdaD!{SnQFUnx$WdP8Hw+_nONz05B0iF10N@OHyW!4^yV9`qg9S~nAtooayx&& z|Hqi-@=5=@u^QXx`ohO3&UGTBRs9e67&f^&O={4Q5U@g)#)WO{hwNGOI1e=_hK)!7 z>NuNmfv6oGXp`#az9m4kK0>a4&3$iB_K}X@8m?;5k+cHMm!v9`3RG%_U_$F^VmHS9 zXfB0Ck-2ssJ;iSyJ9_l!aFOZPk9osCQ>|U*Q99A1)Feh0{Z-8dG1 zY40CVnjFsx?_3K>@XYZc5W5h%&g-m=X(mP?WFn5=z^PqH@d<*UlUzK>J63or#l}X~hhH{P9_QusL1b#SNb9XyJKTGhN#JwHLMRoJ8Z5x%`8b|I91a;oEz!@cAkzQBqm8jj1oA(-izi; zCA9?NPRecKs58T=6_~Ndp*U7gA`UnHlZyvS$C!ZKlQ#+q^Z7PVpC`-K;`heR7Z;Dz zy~XSCu3%M$8$KRb$?IHG6Yh!wUuyxkkS`nH4heXtBZlZZKnXFrxCgFxugV z7Q@`<8>$8cH@Bj|N9PJ2RbE6pg=35Sj}VIu;>y@?X^SObvmoN?XR%$7RcfZsF1_H6 zBe!R$G!`*5x%Akz@6u|!aM)Ia*U(y@EP8`xq4SBWJbB=+z_4Tb=2lk{QSU*e98akx zv=gACVtkpH4V>U(qu~#nsST9PwT?If-}eI&u^G}sid#-fLjWALeKsl2H>0eaGB#;zJ*&tm+sdNU{RL66_tvNDbI=-Q2~`x{FYN4*-q9qQ@>xuBWEBno#$ z@f1{dIYa!n+#G~2BCbBf%o`RcIJ>G5z* z^Z?g4@Z^4^kphVYfW79tvk@Zz;st;Lawg-#T}+0~xK#(8gQSm6HxZ;kSb1=ft?rhq zE%bdBrcj+DupD?KUOkN4t*Z;@;?6zvv0TNi$%Wqju^n=JV>xk6LkKT$rdDv|FVs?ldH6teW zp#%58EG18wjYXd8J!dQyFEhlrE2$WHq(v4FOi;73Dt6o zI^4Sdb~x&UW`&4d!V#CG1qBY3ZTK{hu8MaPywg+S^}%tS?IxtyU)&ka@{>TFJvZi6 z<%gXn=lYs#n9FbZlzLLGnN_ zzR;xzjFcpfb8A$yswre1#+B#$)o_FJ8V?JpQOu-7i$m?+x0ya`$@v8D6GBPMc5I~| z=Ft)@H1bm9u7!IL5j=7HJrx@Zg4hT%{x)cs2ZYI;gb4g)PG?Nxah%EYMl7VnbB2f= zbus=t1@MI&L?*K*VJjH9X z%uP|8wvim=IJ-fAypoqR@p0bh?AVc-qC69aH;f-{p{Ejd7F&(s^(OL{^%{Q67h8{N zlf2&Fd-U7R&~COQ(ALz0M#%^>Xtdh0(t9gy!Rh+**+|L6J8RFb6K6Ngj~(h(JNaOj zadVfL?|kL$hdDnJpJ9xI5tS%N1GU%(>QzyQ!qdP5fJS5$Ka6H^8t(xy^Kd}2oD^@+ zc!rB;L&hM)Xjl66D0}gzp#U?A3}_~00A^* zHzwr1(QF9gJ*C;{8P!`DjLE;Spt-kCll#6-HvaQ7G?lg-&}8ng_n=!KBPUFGpIkxc zb4Ci_RRL$6OA(+WZnmWO>Ws04QW1i81V4%#{ybOuDbE&X^R zXh3kB2*8jn5K0XJp=`n>E)aNzI7_NKhw{YiA~Q)IkK`g2_w&y7yyx3+wMmIWO}-E-bl~ch)K-z_^a7ZJHFGcmQ zM{wmB0$N)dG=&cdI8a*XcYrP(agcvj(FKylxi6HR$X69p)cswiJ5ck$u zOcXz{?cj%l%94`Lo0UCDSHn0a&VTaxo*;(2g##v_odOIBVMi^6FH74f;-cC~FNoVU zxuu1RB_BNIPvOHj7BLvkG~44N&<`Xrp%+_`v)6rdb~p52Y*Rh{=~89i0l(X8v;3M{ z4FaGg8`*`I5fp<1?=^yR5hXVp3Lvk9jaq1xYu`?+UT)RKT0^TW!b?>P4gqv@5|EV( z$AFyw6Mt$DZ+#n7z!vIAaV4U74@;u%DBcR2KM9NlhDvf>A0O7%ddKw(>jG0pHrHHfvTVB_`yuqCM($Lsgn-f;jQ}$5->j<@SX>74}+Yn}F2VKz>r{)4B1N7>o@eqE0K@tpV`8|&0WCKBw@aqIA-wj&r zedpk`ya zee*e*!+53Q!h}i%3ss2L6iRrxj+B@j!x39^Ov+;iS8&?w0mdJ%>nUx2mxlWGKDd@r zzb|fJtk)VVyNITvx7S@ujk`wCrVhAkYd1Ff(W;V`q{`FO#g-EC-n6_bL>%o1cp`mj zm-#t;(d+F;9!a0C*Dy)D)8+W+?TSOSL7G|A${y8aK}Fj(4D43c_8%U0dpyfnu0I*mDiy0Sm z=%y&sTC{rG!Z{U_qS;GR3|QV1KzXx*y*apjr;YS3(Hz%Titkz%b=4ETisV@T^?-QN zc}ec7)n))qBqQBm4LvdVbo;$lYW5J3T)A|Rq#$C{B+58u1WP=AWl1zO^5M!S`R-=1EN_bj zlc+wuK?y^trfFqK137vB|Cw#eil3Gjz4gH0mGwmB+8-{bZ6u zM(v+K=fT`|pQ2a4{eXGB(C&b#=X?Q?qaE+9@#w)F1!J>UXFJZS|5oUQEm=jp zedLP>$JE=8jg`1MH}(`%ht4?G+|Q`aalgM7I=9hSQX_+H@!!_)0Pgl~hwiI~^n<4m zx(Bmf-<5Xw%=U}Ews})rtEuA*mGaG4DQ0I@mw2L`jivmp_**7VCjR(8*mXj7zu1HQ z?!R|;9**02Tt+lS4l5Gf-1(jMu3IEBpwj;*U>+aI9^Z7K**4CaFWwo%xT6{~T*h4H zmaEdWZbo)QN9C@cMY<)=+oEpHe(TxxSYZ``D2v>RU~dCG3! zmCb|4ZY#&SK3oH;Z{lKRs5WMQqw+~FlvE$H=Y_*p%lG;8(TERX6klD zy!VmUmA0c3c}t64N~Pwi#NAnldqW+xPGBy`)2AoXmW z6(!S*`7fuH!^6#wY7kc!0Y6_h!V|FZbpM6T=knM7g&~N44x(qt>%zaMa^QA!0b#`# z?lD;(wgKFjkFx3DR}rgyvRBn;e8koFvB*}A(H1XBNFnP;m}Y{IHa*LpAF8g2YT z-zIJzd36`#=s{1K#iK)+2v_bn4Ly-bdFshmR~SHir>^YO2vWeLPpp{?xoMQk5;b!8jO zyf^e;m|g3i!2w|?E1h(%@6VzzOeiV(K0R@gQus?i*liyEFHGPGh9%}7B*0Z^Z=W#& z#;IG}KfDl?SlyhX!oaEsXC95+_%Cd5Xtzl}ZVre^L}U?A`D#;C*!l*aaN@djco&gDhWxQJ!cO7A2H2e*Q4kl zXt4k4KNlzYE!T|!hMn&`EsA6OiRtjte6ItQfu1(VT~@%+2T zepkS*UYfG^2i*HHr`XvUynVE)oIyV`y{pD4YB*>+4Pgkd%+`%bg zXFP#yawzpAWfriMor+xBYlY2voI=?*>Ykz*3=0SBDpRkH(kaG_S&57Q@ zt1_I_df(WCvhf)Usc!8rzrxOLdIAIDN#12ls#t;5E%CiY_pa0yruW@dB?)ym4;0oxkgd!!~$c-9RnSW=ht2>ZeF@~`^(fP z5zT|CPsrc?`MJ|3A+PL|%<{fY7=R#cGc%Ch_UNR8viGaU#(#oOT2G~%YdSccB7J$v z0n<~ySh>@*_wtnT(=T_AZZe;s{NnUwshc@zzleK!4{DrVm@@Jci1@-kA*dXc! znrn$$vbDEJa>rnsNY@I~+$(n7RHVaN9iDmO=~)H!B$A2=BfDv8`-4mDR7W}dMLFN& zZe@=(HIA`U9z0C%g=u_}SN`Vs>vogGN(x-W=&DuYS*FFTf?4Fnz3E@5w&Z&x^u*}Q zFlpR_Iuv`-l8Xy6kl)amDl{fbozy!jqhT;4KTY4vHA3QFlfTLr4~@x{1^cg$;1}XSDI@GWQm`RE)gp~3BhOTEkC&#QI$LSllsg>W6t%_S_MQE=N zxZF!r)EiJzr=(#D zKasnonW=8eFZeou@$Tb7i8gb5>(h9Y)A>Sg{=23JC{-(aw6W(#)_Q(iajv~b%JU1} zbP3KcbZ=Ha7vdF;)vx59(I~IYt`t^j?y%WwednmqdynJk1tcdx@hn>by}S$fjWEQ9>1HnWuxd@3%O?KSlHZRUU`xzqp=1l2&@N z6$4h<(e?Js#XD46F8mqZw&46@Z;N+K`d;7Adn63@v3KAG%Co-W%NL;&f-yMLNG$-h z^6lQq!-C?#&8tR6Z|JOP1t!u_?dYG-&Fz$8>}c4A-haJ{r<7c$hpZso0*3^%vBA8RTnw8Kg1=2L|b_LdB{AKcYS%7E$qg5STuh<5Rbusx>D?vHguY3?&2R z9V67nS_ll#LL`u$t0EU}=X0z~`)PQ-{Wnz@7 z8KlWk?@-&v_ho|7G-dxfF>Xvq;@Vv2^u8;#VoABS3Kclz)V1Fna~#(R*FtT)JJ(l;fI688P7FxZ#pAxIc6B$Ub>!FJW_)3JD*GmvM%Z9 zE?xA-$a$CbAVRzEr%k0aCJtPit^K1lxzxp%1tmu%>$D$*bLmD*S4zYvZN^RV#h4B8 zd2AuMMEPM#!;Z%U{(b7knLXjI0^Ksl7!;(7FIyNlKFU9%I+YOnSvZQ3L4lRGLuGvuPUdY4l zkA7}siRri+j6^<~XE{yGRrx-a@wIVSjz}u54W^cm^9T5VCejMt#w9wWLEy`H3&ooQ zSbb0EVr&0tGgVUJBQ(K?JiS!~-9}IVjH8N9lZ{MlabpR0=Q5I07>f@p_91WVg*=gU zNghL`^(RjRzO0fu`IkX<0HLrMp$_ue+mRsbD7BTqxes5YvCNgO(JZ9-Fpkaw%Zy;2 z@G55EW*0HL}^kKL$!RJf;_1Z)H#WCvOCaO2|Ub=>9Egjf3zP5^Al7)1UEX`@K- zALio21aA>&#Fzvd8?V;@WGldSnxKq7S4G&zKT|oNpDE?m%vo(Aj|G#N!{ian;@yFu zK<+GeVZc|8Hh}Xdz&(%~?Si8MNwUv7QOZ|QZale1Ik{9tci z5vV|`uy(`_zUK#=X2$^!Q_kWqQqoEN<((k>lV&_5 zE20He@V!v3TTPA%0?Fx3LkE;8{jts4!ppQjNG3?q%com)RPml5zR&#&!+sZQ8gb63 z&SenCw*G~&-n`4dsorf)i)vJ`;pqUEM#BiVTd7zkUHk{yLaRXo<7&J8vCYo2@BzXB zu*yO}`pz51kOJ2k5F>ALS6fk4>1_>4O%__UkQ_%1C3vrGan$w${>D%xu%wT1BBR9X z)e3N)ZPS;_x%$270i~08`|2Sx!}qgJn<2Hsr4!!{^xN?2z>2Ff;#bjunYy$te7GG%L+R6C*E9BaE zNVrnfS_7&4k2kn5XdxmG5}Fk$jQ5mJR!x+oS_1!M-(LPzKy5t_%rq873Vn!`Ru<6T zulg7SD>l|B@BR6>BH@JF3xALC-)eCbjvry6BmfKy3H!k@haHRAC=opM=ZBb8;4+(0 z+w1*YnXR-;2w4T^zqOhsJxf+`>{435yG|w+CZ1PwDqJkFH;XicOY&HvI&e# z;2j~yS8C_1vb`7A*(4?5071p#;GBs?5~J@WLdne6D}ak&DGcBP*eI!+-{0d9O_NfC z_nju;d!S;tBpph18!5w|E9=DOwNRlqH0#8gt6I3mHe26Vb)b*fd$@zpI(4y|EiD+{OS3ctsIi) zK`fr5*}J+ov{%n84l3O+Go~)!vl?Cms3h2 z&*yq+h!!zMgnd%GExyV{W+qkf%vLrXGbTDtZn&I8Z|wgSaqo4`OO3V5J>B!GG^+j9 zUBSD5VZNv*sLwhryyXN$WlTF%4 z-aWeV;Dpm4OvFZA8*onwo ze!itmZV5wU58$*MI8%r{Q>bTZqjB$S9~J>29#!@J-(Q9gQPq=N-yq@TnTv98AML|F zIf(a&yE>!k&4_a1!gr205c+=j5h`r65QF|=l<0^+Xg6+tM|udW0crdBOHGYUgFpM? zV5RwS^yZrtr0z$(aEnogL;0WC+9?UU9cr6bF?R*SJ*BDhAzlO0E3eBYYr#6<$okm4 zf9&{;EnO>^wDg%o_VHY!>3Er}6=?&`HqtbZ|9J@FU==SZsEyDkFA@O_3!Vf}R*3OJ zy9N&VMI{i9n1nyBzsN-F!4)=z2LDrtGj!oPM@UTMLWYkqCrJc(Tf4g-~PP)rgS z6%>vYuZ|!|X!byO9V4ItNF(ZUeUdG5ykz4hnR>FyUCVl3X{8Az;iKN7X={XR?VST! zXjh#VIr5McY0mk&n_D*vwSPkP@xQP<;t$dWUyz1iyd&;nLp0tIzCE?^FwTU2)m^5| zsio&?Ki-*&IF^kt_W5ws+jF^l(EosM^*uuxOGi`@U|L3Q8ps>U@Y5xMzV{&#Q zBRhLIIv0%DJi{^O*^6mI*M5#pjJsdxpKx_|`I;crCb!pGBV^Cl#FPu|8qQ9)QF=ge zwH&+9$~)qxwx2|~M~W1RLt5|-%7L4>d6q>ohldOoYjvT;t_hC%RBx5WJl8HzRp#^? zh{zpKJwVmNoSs`;3Q}0e8(P*mS=ds2Qh(;_$@rp?;7!)D?Yt_wd9>4}IyZN=#54Z7 zue)mqA%t8ixIbq5n3zG~JQBYK5*AWWHyXDq>1m^qNIsVoj58jk>W!hPpC#21Zf==WpoF)`Zu zHJGwxomc41kgYVzt4#@6R}=?Hf(#8eFyJ17g#8q0iVrH9P^Gq*#NGEVj2V%}R?%!# zlLCx6aE69ZBo3%4;ZQd@*}Mq|)k=W#&DG!dJi^}FE z{}4VW1Rbl5t=K$~mF2nQ`j1{3*~Q&`{;j30t)c92jZ5f+$KoP-qoHd2Gye%>Up)IS ztenDE{foJxPb)hap{_c%+X|s zoPt^`Br74hTpWKJ*OmE<{0M&n;&Q-N(RM(nj{AFZ1BYEUGY{U%Ar|{u9N{F4|k{CvpK&vV@4prI2(Vr6T!Xbk*8$OT}?>wZnkt@ij_`=7OHa4MBPVuVE zkcDg~@9ezILk2}`&SVFR4tYD&^p^#}WzZgn8aQR|ljkf{%ZKnzjk2GHl7qzY+5wMu zydKHk``p;El~s7H1BbJeDR`gpVK(nQTVv@>QC+9kXo1w|WpPb~%d-=+6{Fg!wR5Q` zgMVQs2n-hdc_?TeeuxNnsRPWLK`Ew`f1FEc0!Ox@AnOS>#+8F?CdR1lAATFuYgj5I z29~{LA0%CIUP}el`%kQna2M#&cZlDC_wh_{W$IbpGVZ>g$R2Ih$y>o?Y~gMIuM{Oi zO5k^ls1)ysGwhHA(7IXZjE=L4`L3L2L`i)e316z;7R%MemEetwhYDLFj$2oH9|&HW zEhzXWLc{*EK;)H0fuM|VFG)l=imE_$phg2&PNl2_ktU)NUoITrSUF;h2#^-b!K4N4uqLYeTR-9~Zrj@(em+XE$yJ|D}jHFQwk(SC5C$|0+ z`k#4mL+ri_psTe%Bn-En;k*w3BiG z!I&h;@J~bGyer@jzE0{v4IyuR=)3T0Jgd3MBM`9&m-7t;dD}uE@Ay`N3VpcTPh1qz zfR;QtW6-EX9-=#aMr-BOP)BfzlU~X15yP7cR=h)aLqR0Pi}H;A8P#I$-4XE@6vV+I zxzgFpQgr85baFA&vZb>R*Vz_fOi6WZ><>gp&B}DEmaxz>07mt0mTTpu^3hhpMy5}* zlL*{g_U3Ll3;wsR104+-Nh0x`p_jSfcCQ2>Wj%!bjr+O62Iffr!Wv!P1Mf_9?KczG zd{%#q>F#}jx`YwxLM2F>?DNheK|Yw;hnp^PLfuzy#igYt$=yf)$G>hRbY2_;77|lUWik*288OSOb`kfmi}#aCww|wt5(^$*}@3HW0Nt z0FEsVmGf(z@~jpP@Bwgl$YTynJ03KaUkdD#g8aUMs86|+myQ~&Klkv2KmGoj<$xu@ z5J;_$3C%_XuVv_nPE#1+iCTqNw7#wB`P$*%Tq|Ip!kVy@3S()uQRHmV=-U7jjwZR@ z@C~+~IDgyQw{W)BDK2j&M|og@v9gwZpw}jD)}NK<_G$gtP+7V1NMOE^<(a(Hgk`;{ zakMSAA|xzv&ep=tQ7Pc?x1o&7-6f$7*~?=iywJJdQWjr-3s+cLrlv|^aXmdnSyob2 zrS4ZHpLFJyI(mBN!Q!YGfjq7GRL9#N1-2 z=PZ}B@QYg%v{!RR*h!OC!cL-VhjH z8~ncl(jMp)&NF{3y-Rf*B;0pLI@ePN9nd|lQXvd-i;cFyQrN94pPC;BFa>wCZss{8 zJ`Ut{vF?TW{w?Hz=hgthNTGa=0XADrjVC#@h4p+~1qvv1%=5HSELsO8HuM)cR;Y!y z9@6_=pKh1rF>+$b5hMG)td*z-hoYftjt)9bWsraybj4wY!hiNK)O?#a$`a17zY0tOu z>f%Y#wPT&hB?e`0$b(#8_h71x?|>U0;u2e30s8%9Ctt2&qeBpnxDOhPy?hy-hOpHI z!{X}--k6E8ni*8C$#knp`ty3jB3!hqZ;DTq*swkZ6zJ{37lAT z#7E>>spfjGO!MVBh2o&*6$LY}$cMQ9$U$TV>c>2@AeF;r$F%8;d0NrT9(q3HdIE_M zxcqm{`1uht6|X#$-g8J6YPU+KCm<9GdJda(El#|qU2Z`YGlaN+gt>|^zYFYnjG1Ky!?418PVWxeT`f7r-2^wGNgGRg&s1ovG6ksb9HIOA@;~I+8VSoko}FsT?2B5r&63RI;x$KsT4se329(5dIj|q zQJubM$dip2R+BZm#x=dbonFvl&y!xzCG?Ox{3ew?aY!$Niukq+!hv=)dmQ80Qv17< zP%wr@z}Ku|RYaUQi*0XK=L}ZeFKIppLq03J5jB&du7lH}-lEFDbzb4=T6b3m+9Yp^QBwppbFk7KbX+`Kh;CjD!@o6?8HjCPMqDM z#31g|6;XZ$5{HyZ&^mkYYS8g9_bE>F>5JH~BdNvbeb00hnbihOJv`G;S=?w{1l3tW z0RYLK)n(>Mz%Y4)SX6~YGE;5m#9W1y7p8RH84%8bGsf-_Js&>0er##o*137BI;LQ} zhwbAaQVRPPlGAIka!C#+-(b* z)eT`6f^)4wgpn{pVbNnzViu<(`T!HckW_mw81uIhG^-Ao-t+BQf+Hvyob%;=lI;XNhOfrdS~PU#Oqmc~ z+}S%eM~=|7FdSLDV~LWU8u_V&}f5N==l#J7a_|xgsfOPNjb*c z<>!Fk>D`he{sl@X!&_2DPNcWIY1|!U<9-`|PW5xDdD^e%lR4b)1vcJ5v9L4%EuD3; zpeE87kwSpZY&Pc{M@12#`8~0`^M!sX!m?2SD2V>&dB(nDQ=v=g zJOf)UqSYlSO7F#+smY7)X0~$PF(slu5599o%P$kk^SH<#|LdAOjJcL+PnsRyAVAwV zgbi276lnOMV0?*OzCL8l>AR40juR49srOH*-n@PWx~?uRv!|x4O2zf&@VZjTca#S$ z2;H;j?LLAfRbgDVRGr~YK7jjgyA~yD^DEl&jygnS(d`LLjBnoj{nRn3S7Pt8)ass`=`py}JqV%>uI|SH&Ym$VdPo1$S2$Qs{r)LcU=noe zRp|8;n25;3na29~tRRLmo30w2b%rXxHpQFPB({=&wRh-NZw`3yCcc24uXtoLrzcm< zd-Z~3lgO8x2aW%m+hyNy zl(R6^&`5EOTYF$^sV;@I%ddl}LQ_o$>H za(4RQ^Inr%iT~?vlJAA@`t(jC$HrSU?T?+@wot~J=DRLYI zSDro{Qv4r}7V@jM^8TM}nvNAZ^x{%!Y4iAnssYnKH+{qHSLf)rLojxQ>I%Jv!M!^} zVGly3&82Rw3_;X5u+@_Jr``$ zwX|*-^dpT#{2zU@xy#mgCGQQDw;SvI@n5&q3<_&Mvg}`t@ogCNT?2j;TK+ldpWQe3 zTQg>R4qrv3h)+rGfhljobi3rQUfO1r+ap<$P$(i97C;uGDVV8V>V0t0@lNs5*+0GK zy1Q>br5;C$!X7psjCx|M{z~>%K>c4$l5NRPpLW8w<7N!ln#tD`Di_A;>Kkp+t-^^x z!D%(64@c{){mMv~@qzHMjZnGscO#9vn>ufIgxqDXOc!kX{p5>gR%$BoN@AAkX!p8i zJWLmM?^4?92gPqA0|b-SZ1cy)oo}yYIKE03*&V7J`M|pKAX}uU?|P`@vFRJ%4N_ei zoxP_07Z-*}rS<;{sqW!-0I^Utq6qd1%ov%esjzl1(rVuR(9x;whSHC$%@{d^y~K!^ z?U|>(J@$AYA(gkT48&$dNn&Qxlu`}XNZ8*oO%vV9ufC`!#^e|&eOdlidR%W~pn%kv z)qNP!8h4&iqpfe@H|7|7zBG4V?7K!J%4^22iRS!JC*4xZ`Y;9i(g72B+Ud4^o5F5$ z*~DQ^i`89Gleg}9DP8Fe+OSR(Q4cx8^m<~;Hrn~93J zx{;O2H!qJ+C-TcEQ9IvcY|N3V;o2m-#>ANyD$B2oMDIS?$$FsMX(qYa`7oOGE>*Vz z6EyV>7L_LXRoZR|))Hx~i7+_Vep4MCy)Jg#+;W$sc<0;c7j@DYL9F$G)#fTY7b_qyd1%L+5u^QLwfGCA_~K zOhojUf=Fr=PBi7TsZ4TRV!-tecizg>ee#-ChPTEulFnXgHrk(dxnS^dl9Bqsl-=>s za}IYCT2)|XQBG{8gYpJUb^74+kar?{qC-r+8y-OmuAK-RF?1~>*VT^BNV%f@)4c|_ zPHs9ahgFsAkSs5rs)23q%*qirR!{Cz4iuB`&|2XMcY~?8=s$vV3InX0cbjQ(#y8?D z^f&;oL${~lfdU*5F37&qW5e}+x}LOmcB5MHlMM!SWrS}|nsMo(R$9{ZY*Cm0H<56p z7qFBEbq*!2Bd%`qx|XFYrc}|f%RXy5yR%S4ld9ZOcRB6w!!N|NB>diPBeCQxskf3k zhl(6tA67V5b@b?mGJqth(;G>2rd*h8`nU<=`>_z5V&hU0LTPExCn((*9rdZM_2wVY z*%0Ae{Ady$omA-R7m8fe;q){s{$1LT4_Mt;u@@GHZWd%0jORVL=|UV+YR)*4bkEHN zGLSoco`(eQ6;!y9^a#LKw4e3jV4IWVaZyclwMvZQ@(r%{0-Ng%HkQwvS;29b{O%oP z}cZBbW6t4yJFvw0wu~mp9od-)BBWiSEs)n;#D0ycT1n`` zXvTa061_|7DdO!Bc5l!tJFTXTPU zd#X=#2el)_{^s~Ow0AM|nR;WmG8226X5Cm${!$a`t!X2hS^D>|%O?6-Y67jc0a_ZQ zz7PH*{j<6v)Q7cRRfRh>v{{Gm}irRo~oX0q099!>SE5 z;UUck=(uGS8xdQLP!WpaPuD{BOzciy7t(We$hmmNFci_Qa=>PJkFRqCyq@c}RXoaf z=8ELihQw8lpVQBYU-V&3{_@X;17GHi5U^784FO%6BlxIuS>wV1ITSpVN#O%OO%FM> zU2g}Rn?CW)45M1-8Re{kA>z5`_p~(=6x)N2pv!N`+?SZRoOfrIkKEjw_Xj|q-z0^5 zmSzu+^Y2_6SPQYmQtAf#oJ$&L#m-iYKEBEZk&B@){^^xFjJUt>NJP0hChrw&Zag+n zzIR}e_!9x0ywE`xio?PENWYSd;+^83|38YZJf7+Qk57~&bhz)nXqAw19~<>^<;#kY zyHbfYbDOX^Lhca0$x(zHqcG%}TgW*q)0iRW*qp=c`}=(V*~0^mZJ*EU{dv7#@7L>j zB&Me{spp*2v_9?ymmpmPtbxDD1M9{qlm~dtTZVG5pbUJEs~}6t;|Lo1u%6j8XWuI7 znI|%~5fJ9dD^wi@?lS3?zQ}O$T_$u(TFzS}Sd15DaKzqA)V+Eb3$!ynu!N2tvj;Ka znCAj-4ol){VVt49bm_5PNo&`ekI#vJjTh*Jo7nOwlu~wY;plrX_CC*NeDcJ7JHtJqpE5Ieud4gx))@ zhv>0;F?3HE*2PG|UJ#?MgkIAc1u>WVlb570?fZQ*Sn9d!tu4-w4e%9 z)Lu%%XsakW^e!{?$czPJ(&k~@%sb9`n}+P^Mh5tGMXMC5zT=g_$Zpenx2*QBp084p z^o&Zee?Gia-#q7Om!LGe26)DZV%!Ez*gW}j7^Z@2vXWjHLu4<2?i^FxdXWK+51>h_ zB(zF1lxCAc%^939#!MVFm%B4tBdHiwW5D2!-+fX09ou{(+hQoz$7gOZ#B|bM$=n_= zQy5SQpQU?1*FEU-J<`H0%;_Uz^tcQT+72*c8}WO?;dpnIIP|q|qv-SYKV+JVWwu(-tzH# zHqgy#m&ZSc3Uo67T2Tx@+tXobL(f2Npv=2kZ_#ICck!H_5T5Z}T|n5!nXqeNJQM;0 z*l(Tl<_t(WRqULH=6z314Oaxh`tAhnI(riMf+4_rssSAZBvWp4eUOnp7u$gs1#Y!U zhqGUgiw5&(o@PDIw;vN~QR_(c9(@I-xfZd`j;iZU=bvB0pRCPKBn`JKi8|L-yLdW0 zE9rp7p@HL4?5AG?S2M4u3B&|t2gboKVoP3s!c`{^sl7ka8?^bPWtSv6ndG28Cv`ln zuC81a5YmDyn!3A_^E@XQTZU+j^IuyYwg;{V8S2fnJ~G3!lK^HX(Cx%?=^=p;)f>R$ zZntXc=D#3=5xsyp-J>wqPHBbjbiR~z45jKknHgkX6Z}%W<(do-4~MVSlm1g1wO9uU z^>P350kX!Qu~p>HDyEz!>q0r3=iule`WK#lFXh+t-VvY_oB9boi9dzbWn$S} zj5uUsFq~*rAR^D9l#iG?fpuVOW()PQF7D5P+x0~NWfn1?XP?$yT~4T4t>>c$4k=j< zHs2kl^4+m#IHz<#g#eDCUf!i_S22TsLFd$@OnSaKz@;xeNZ$vu&j9)D6dT2ePVI~GA*gL7*SuQzM@&FAvk5CZsAoF{-dBjAre zGxNwdN1>w#_ot@q5-x4@MR+S*vviKqi*xNoZYfGUOsW+chy%>~p9qBT=s7yeC_< zHOhI^^&vrNZZg!ZYWkOFc0ke2s}szb0fUKWb&g7YrW5`v8`l?G$}sIjzyR%7z`AJ+ zhXk=ndm?q3)(+%5m?MqB$9f{?`Wb(xPq{EBNqanUsi#ryb@8ZQf|*yy_7`K%l@DZU zdBDyqpxrk}JkuF)g}~jGESTep5U&fus73JQ^sCB*|20>V4&)AlWL5@HZZ4!)2zcWP8Bp}V1Ju^^sv)(*zF3mBW9AEGBxb{+L`BNSWLPdiBRSRRi0}1u{aWX57Uc3u!3r%BuN)LF)ixfeUEwMP;%%L*5 zK7mRA8X2)&SV)gbj0?1upavBro0Pwpk*9-`{PTrhh%dzuy1qKkuGrn1p7QLZY2v5Y zvR^Nf4Vrhz4i{k};_t5d7SV#OrnQ6~3}4*I_HJ7I;<7J@@t+8yrR+2o^ePm)5;Yb3N;jM6x@=Raf6~BKqPg zG85pHHenaXW*TQmdEg^CHrcgWlSZ5y7G~D(nKGy6@{?vH>6gEiFfrYvs+b)>qikh# z`PC4%gwGN7wK1WKBpvHL_Iri$`}vGm;q5BH6iJ5Ooi%U6Hks};Q~lFZzjqE`2HKp- zC(-tRlM9}bh5-RDPyxtQmIjl1el{Ubf0V7n>@{Z8zfnOed!hx#af(u~|BYmI?oA&4 zoyQOKk`Pa7GKu>{-XM6;EvGcbu;9bj=#m_o9M?`8X9*|B9TXnC!0{`2BB%5**)bn{dRU22=`ib`>g$+nib*pr%ABL$rar=>Sd% zz`ri1Dyi#X9#g8$4P)S+Q6=p2?=M?et=(??PEe6ezh7Jb9aocqm~Tm&s(KmSyPX8I z75(hdgG+24eQJv}b+A5)IFG=0ZN}K*t9Snt^5?Yb01K`kDY1-XoEh#2x^QiE$@IhA zU1rC8_g>w)f4ZQ!Mb9U(3E7d)uqr5}7*96EaX-wo)pk6W&{8?J zulIC7erEef4n2;qhj#IVaz38JOo{A;F=TpF z-n8Dr5d)-d^Mo4C<)2>GQN~eqEfg&$Sa&c~fs0OS($YGShQ-dSb`CRDaxj5^wr(CP z&Ec6>MAn1nWu}bh_o(#!UJUmvx^FM=RR(RT=lc`J$=K)$tQtmGGeX_oi-waDCb-rd zaVOm0(Jg8ioy%1GXf9hX?Snh=MR#L>?le+n>K3(XJ%|CeXShbSN`~5xHft8HX5%~K z{1KX6jZ*m6EXTQ7aSv`oouQ=47lCWiC39gK6WGeykaBmz40T59iJRnCre<3TQ+{^6 zovzE~8Gy1bu-zH6U7J(&*7V*kl{3spq|92~)p=}SC)F-t7cU97y9J*)JK7BPC|(tJ zeWSkO6$%acykdJ{#T`a?3iZgFF)OD3S$<$uZa)!iZ|l*K*Pk@j*qSpLlqjTq#+3UrGc9qE5?#V!u6x;Szo zVfiac)3C|xN#JW(IqHthdun?td`ho3eZPdwg9G-OisLk3nw5#+32=>`t&xewJ#A$m zW?0!Pr5q`D2K7Zo`*&NZZpFVkO3Nojrli)-7<yO8P(BY8OqmPG zL$Pf2aH#ML0_f>Cyfo5z82`_EyOO>$mV8&h{nH+G>2?RYP1E=57Uoc2uIM|A_Wy2N z&&z7f3d6ebvU!z(l93KTL77*+WncpSvq)wv8t%xoiH|1L=qhjCKO2vp{_Qzp z7Ob8`UV0y>^jCK9z(LizBT(1%vj=3pF7+a#@KR_|_5>i{wTJhkyLP9{3-E_(G3>gK zu>!%?zz0P2Tq&FUEN8l9)#Hlk)$G3m zNt6keQknBgBjo!D7pI5ItxENE$s0W~oqXITz}tpn+Bq?lvi$#KfgC#bwivy%`Xg2L zZwPdRbrM5&qdK+9HWKwj=ExzvtzygoOqC(9OPpiY^qNr;$bf62t;=P4N@6G-W-!gT+8Qe8>LYV6sB|1ly|yYNM}5xF;-1)E!wy32QMa_#=u2F_k3 zKmv;d&|ZAB<8;j9e?ckt(38?v0o5l004gl0E!X`3;|aArE@WAIP%l!RH+^jwt5k=b zd68Ln|A(I8<*bm9;`Rz=;X{W0P&y*m2bc$LEfa59_<;QtEY*$=wiQG~drby@rV;Em ziqkC|%M`FVHrUEZ3l}B$pUTN&eUVLT;~Skw>+q2I1=@IO&hC)0FRvYi$PyA@^SA*4 z`wiUL#?X7UOlw9gRgMYW>tl*h5GvLLb=TL@I`p0_#&9R}te*WBPlwDXnfPXb%3tuW z%#yk8q3@?kFh%6q7rcH2tA4BHpO`7Pvz*2W_m7vkqeg^R1)kV&`m;B!wEEV1)tN|O z+1~&@>J+;VL$}&YXcY&p`96blKEF+Xbf*I?LI}N7#ByK?QE8ecjrcJ&^W3{@25j=E zI$7jlJ&+5G*pvAB+R0Gukhw4~xY*p+ao{Ma%cr9VadEiolU=s_zz%0xOU_pqFRV>> zB$LaRXQE5(wHitl*On@R9FXN}gu?Hv5%k#18Q^OGm0&w=RvJJI{#QE#zer*k9amwV z<5Qp_Zp`3H^iLTv8JBeHX8Oj5;E%nPzm{A1hp%&!$${HdDDuIoTi4m{0$n3`GI$vFX1%KUIIl%%=0 z$Q-2;fxuM7WC4d7WP%b7!-Il4j#NQw^`KQ%vDBDN8$jhkz|%26i61~a7h2K(komN1DKI=T|RyXB-e7C*-m^M^gN(sBS#_jrbK5yc>%e=B+%22OmPfB zwpi?gM&iyUAF9xT=ub8twkN3Zq5lP05%skF+%#gVmI3|QFD=EjFE^C|-5DsKSkJqK z=?t)V!yD_x6t(Y8Vcj7s&u2dDj$Z61HCEeM7}Hvmit90vTV8`Qe3*6uv<}ug9FF0D zK7&pTQ{1~1XTxu>NiyQQ$XFS{R_&F;+`WhpN=j_2OhSh(DLDxo=Rbu|m*HCxUtsIu zho^X?zLC)L2*T%hs}Pdl3t)yBEml1dBn$V!`BM*LK9z^#6uLB^K+YR zGH>#(#m?9F0Dd30=tqEoOfVgS)qL&MtUrh0MCEr#pUt|*;7(c?qte}Dz=UQCOt}l$ zBU_2Q8Lte^r0#D3s~FQ>5B+A5wXVXD*pp?}Gk5{RyA^kaB9-MTy#dieE%m(e0Ww^E zf~|`%4yfg*uCX;n1;0@klSn9E0!`%sLC^3rvrOi~^qNjKGZJCYS%7)M+Na-P^BEi` zg-U#xs-j&yG6HZ>xTOfz)gsSEyH42a{0q&`8@W6F1)b3NRN}N!C*CYAO<$AvFlg6V z>YJ6VfXyr^K)IL?_&Xyz9ftB8I&eiUv47pGq!w%}3KFvS5wqqBjjhwp3L04&ePkut zGy1_n)7tC^3&0&kKAtuQ5@igVyg?Cyh#updIabfB@d^2INPRXz-cL-l+k~+sj2{Be z%mwJhHXNb;EfJf2P5}`AJ=)z;du&a3 zJe|U+4`}r}Tyk4>#QrIx;`GX;&*c=Tew@QG2pY6UFfz(_J#v&w4%-Sp;93 zz7yp41^7l^b`rFd7T!gt!CNe6;Jm2Rgkh9X?WI3YjSn$w0ZxK?k|UdkU*)=zdmf>4 z76)!e1UYA3$sOx8%{OC4%>AlT7BiNu4?}i|E5*LQJg#XsNniT;p5vGUh)5}LuLUsA zhMCtUKhcT3_zM7iQ;ss*>-t(4QN)5W$@C~I!u3!X@*~F6tZEAIPSg;e%>6R8rem2v z<=F_B6?lMbd? zP4U_W9l%nn@n_IsG9F1SS9E@` zij_+K;PwoAZG3gSkdJ(s0?$am37_F}Xw- zvfZKQLC-u0a4IPB0BDo`7AgRDXMS>HcktEL zD&H+rn85F;*@y61WMe%-<{n}5CGxdqV0uS>zbi|eh$$A1kZFn6R=#@Ej{nHtGm|}^{#J2AB_^N#0>2KUkl}YnScoGlG)YDn z<1Tfv`%ZTzzJ~h^Tkge-3=>{H+w1G~KggBzcG9Uh{c$__jB#}p9un$Sm)$k{k3_7( z^Hczsj(3AG<%#P{Kz^+P9)Xutr_sY`1!hJi3Nt@ZpU9Sl??KP+V)#A1QT7#~LR1S) zbNc4%lvqHuub`p2FmHW3QQ&ZkfZW%e3@8Ylx#NyXQs zv>gq&iZjdipcDSH@c?ZF8LE5JQv)whFv{|K#&C0`@5gzq|NOR+U6(-_jwKn92a5*e z41?zZmX&YBmsRLf*C7F>W)u5#))8ESppR@Lsf442;n~O-mc?9)wbA5tBm!H-a;&nfSt07EACIk`&|OO?e~9>) za!3arlt;ku03abT6^sG8B8>7{`WBFK{HRZgs#4I}ELZ#}Za7Z7HA!mWRT|UoZsTaJ zGw)qM7QJ}FMm@Xd+lqIK*S36}T2$1sTI%Ao z9c?!Yaea3!jO-N}XZD@2$9tA!$ilxMhw=A%U;E4Rb4=a_E_sk{CwdFawAn5j$j%KX zM&3BRw8&k_J>RR(GaQ=d@!(t=$gk$QnHD)UsmK&`Fb0Gp6}meJFN52Z)$Aj&wU%VHS2VHzF|Di2|&X}L%jcob$ zRy8WIU&8wbS6yKA$>5%m!9L2UZYh@SYU6fN;CfH%@7r<&CrW4LT-C^}>&`}A&p$kF%Z zS0@6iKskqR^^NbI(<*yS2+K>VEd899Ynu)E7o-u{rzBxslzCWARwPXy!hbm>mMy*! z?Gw{W)B4S^HbU9|A(x|AFM7@FcbVz1Owb>B{=#oyP%2SNwLCHUDMy?xO4bMG$d#UF zaz8Qktzmmf;VA{cSd}XRS8bP*zU|j=7Q`XPd{b^^Nh0lyw&Z42raC}}KW3rJW}I{px+{G-v9AaZ`oVT+5&9?Gg>nP5-3s`z6L) zdebvHt8tp7wVBqNvn3jNYCU56=2Gb+)h2{ZXkYb>zaKLi7!A=cwxX`_`)d8RL_OEO z{CzPngXC*RC?aF!8?O{&{cCG>CN)~)zy`yZrj3%j0=TP1nJCDni<&IuU`h4#6rJ%>YkVoEA z9eHMy?Z4v^|2ZRO_ei3FH}T`p*eS=r8xMB%&c|E*u^b|%-R;vHl+t*$Ci9)_8mN(O zXJ;GOH0rEhxo@$z5>Q7=3p!tZ{qgkA^Pn37^t9uD!o9gIKRuM@!$4i>er4Z)Tmy(m z&Fe;@n)Xl&lspK8d0LWk?mHL~{`8WZC_Cak>`b#NhuGJ<^Qxt1KU2~SCBN8dOMk=w z7)QEa`CmW^6oq=qc6uO%(8C;Y+S-^DfZPz6^XhFdm`j&Gs`n*kR`{O(tSgwwcEm{^oq*A{#Rq$p*BTMsB_e zVPgO(qJm_|KZl3F0Jiv5$k-krGgVa*8pPt`IKXte)<5=1kDAqz-(5?wMD_KoN9Bx% zKLW@P9L%@mh(0hkVYjG+QC!zXIL(EKssDyuCM1SJTHp^LLLudxVYH|AO+OBDz%$cG(XChYyy3tB5{vCgT*x zkKv!EAg|r?STdbhquG?TL(H}JkmX_gHWaqKW*}B3dck-;V%XIfte4}H{CRtXqdi#m z#{Km1E#F|h{Qn%2f>)9~ZUojDYl(_UK2p^;lY2`Z^6Ql{+=^(@ZeQ2;g-M0@-WuUQ z)=(N zbRwtBlFWh?AUD2!V9mx64|g~)Lm>i7Y+vm{$){*&6%f|7zI6}irQKnm=MTNhA1s-i zmwz1kFKCzf34{T{?kw1R$k^pP$oCt@Pp1Eox&hVOlWW*yYg1G52Vh%xDu)RWe(3!0 zn)&)GG-_B6le%eUa8mF)3jkshWlFqs{CiJD>~Mbv>(?Bf-99!_)U7Yd&%~qiliDny zuJ^()w+`;JG5H7VFpsGop8JWCK0DBqVvKZfUutsr_Kv&{fuOat_P2ol@js_99#vCc zI8&HE@DbXwlyI~nO7D@3*V6Al_-S9q*Ji?eZGArS9XIZ>K1rS!Y}mNQ(RWGW#n4@v zJg~uwtao*&kX-i=@4|1h0YU=jQ#tN%ypY~sfW)-VIE6vNPb2;SzTKh?mTHdzzawId^68TeKEfRPt=bJg8LkQmjOroYs>Y zw+w$r$)@99$oc?HN!3K3#Qn9-Gsu3`s3C*J2y&uSx3R&G9#i@G21%76jmgv+4+U@- z;!ovn9W9{RJn-mA72eK&yf(fia0t5+M%)Zx^G9T=eNKI?mvprRs#*+#8OSAQe>6KIzfqFR-*EHBAo=oeq4NP zCwej}v`O-ufxI`5_HVy>+~xf1%IiCJc+LM+A#-UZAuZ>fy)qB?ri_Z3>?U5M6DQP+ zDT@aZDB18c8D|_*^L=k^bL4D~y?B@!)egM@=sa@v^;mLfi?xYbM?O-jO*R~YzFw05 zBGwLiE1@phmE z>ATTGrNEE^m2X4X;p4nBMw8oC4p4G;n5aak4Qlj|Z|;lKXWf{-{rSDT0T0$j>_L#( zDxoE>N!Q**$CH?D7Hp#4w2Xr}lDl_;M%A%00)*K z12L7h17p+a$S%GL)NQkUt%3ZFWL@GAv<5>%9BHC|xri|8lc3LK5+Uc9ggF6F=F?_#_Haek>4yl zWdUcDNW)NIq#KzPDwMug*aG~NfS!VI9#>%It}|w1tSN)|h-Ncz9IaJ)>-={uEa(`I^UE}o^y#?!KOU|wQ;GtX>w0m3_z;#mhL0SVC5|;tb0pxz}sN-!)M(uP_W*a(~SLC1k0J?DvGk}K?^sVWfQyDf&lZM z3Kek1Ha(fc24JPPwk;aY31PIleLHTR>9=htu_1i$sH?0va5Ourv%_tyX9Z2bOP`Ld zlxOC7DjMfII`0rozD?H5wVmPd*4F1A`@F#4Ce7_iT}iz?UwJD};M>7X)ifP{QA*@M zo7NT{#PVU@V%Q!z5FjEzpYs_*?jC)-XST~$nuD~?4&PJuuN2f)^D{+3$ z9`jQ~sgBWFPG`?fqIVWW>lHMJ*Tp?u-HTc#_93K)MMV`E*lM%a%&|U_ue*U`|pVgaq6?03AKT8UFL<5e+n8*D=(XnnaHEtED*CVB)Ek27ju#B zN3AR@=^69X!E|EcfT&C?=9u;;DbcE;cgdC^HdcW(!;+pAZK~_~m=_A@y~QCy!-7nf z?Adux;!VnlQ>I#=oeKH!bVSen8mmO?6|DG#8UayR1yfZC@DHjZ71zF+TB&yMX#L3w zWMY68>c1eM=#qknp$LBi{TA3SFlC7)pKY=3ko*CdM_CLfqh((R@7HbdeEcrW&)820 zwV30Pp0P3ec=3gmLUWwt*Y$wg_^-ly-yDt3p1UJ>uUqiGk>FKH?`}!BxRIbw&zEn# z7eM6~!i5aZG{JwWxu(o=G~byIsfuZp0U9*1PR!IN`{!I(kWoO2LGu9v_ii#GY1|GX zSUtI+eiT%96`U_gdZnf-*lse!GjtJDl{DLvxbOF-4B>r z`#v>uJ^s%YVvn!?eWJSj94_EWT{>1L9hbeAA^F{Ual+3WA>pu6^_17#-kw!E&B}~F zMt=HOihDyzj7ZZGBb^3GKE0qdbjtWvv*w5C z1Jd{bg6;a4*^b5jXi;jQs@T1&hGYy-jG*M+m?_BpArs;}E{%2!KS0kIi&BSq(svB>s*vYhi5mNYLEd zbuL#?$qwz!nk8_V3kvuVJ=dVhWsylzRvcP{`DCcS)57^LVpsjr{qg**5`boe8)gXu z;1$Iq1mGtmfJeZlFIpZ0>HDbw2@jy{;$~f#A7IVj8D4Q7Zd51_%C9H8E~}IoWr>kQ z!MpR$#P%Et0P}AB(8tu2Qz*P;2=?;U*npLFP+{P0!E(iG^bC8GJhg+CBYTaC+Ln6f zou(DYmf7du{ub+11*5eU8Ix7`z?99azm!4k+F~zLvNDFj#O;-KK{91S&t1xJA?IqZ zsOW~FtW+0W@!|ube=a|PM%pMXUasT4?%ndIGz?KfihK6V^ogdX^&NrSOU|j6kGIYV z34IW9w;cB;I}FX<8{4F*TR>=k*VU5(erncbsmAujIY9<1zNA)?Pxm0YQDVT9{E*w;IlR<%E z+&KYU;OJk?8ld^Nr>$2(l#K&3TA!FzzN&S4Vt9#|3&h26*y%zTN6$v{8zI{p-#I-b zzg`bqhZGr#X|>I7g1F5SpD78xQhb4%-ms+25L+Ya`~C%`lY`ZX7CRE_nxWBVk6uOE zMJ1Pv`-=J{2d6@w+}ff!B}Q^zGJB$Vj$7^pSl92jxKGDR$`+_cTklhkh>V{U-5B+Q zO91F1A_ZdbI1ykXKV?p>>Ky)6GjADtq>mnB%f@!N&6RY|UU1+gU+kz}Y1N`nR#E+1 zU!&kX{BlG+iN{nK{$4$Z7G7S5tu& zJ0#-H7;(F)^t+g-dGtHgNHUfs0kuQNn zI(ELd4#re6X_tQ~lM%`*MATZ~&f4=f=`jN#z}(?2+yG3boeKj;GOrHz!kE|cX_zAj zdepUUn@z;m^sdL!*ScFTFnSY1p_I+D9x{Bms>FSWHk}xwrzsMRlW>ilInR*nkZ9qh zzSFTS^d4C`+{m5Ncf9vCX4|5XP&tiXeS7cSCtHD3WjMGXv>fg^akNt0l>T!g>v|%>XOHR?+lvdO zR{mr&+eDA6SGJqBO3iI#0?cLxoUdo@*9TscboE9vU zFSR03o^~;T>;J3qE#p_3qg?*pa#Y2J=s@vT;9(+#Sn?bHd_}l zb_!@Z$j+ znHlFE_UfO57aQ!&m0!EaX9r1L9NdrNsnn4Dq20YsU| z5_H|m04{orJy<#?lf+i1yR$CN?`0f+S4)Y7o`i^(MCUU!kTH5MIqDq zJTf9q0)mD~ce+GG#K*?~^*!53{}!FSQ={|A!#hiC-r*w$AoxbLfcuu~`o$w2bQcEq zr~c@s2at$5FlQdZ)LvOeh0P@(rBLbArLJMVs`!B3MtU8dDq=I{Z*jRDTYC`tvCc)oYmsjnBs%#`6ramvqkVB{JrTilLw*JlzkbH#D9HH)QwaGlc1dduv?{^WyXx6_qd*Z(U@6UhLY*9wOWHHHH@j@C0Q4vEGFm2YIV(N zcJ~SYNfsxe!!-ICdfNJb8eYEi!W6hNdY zUTS{KjvOjf^BIG;t??g%ddTKkKxF_H6eb)&RphBnx#%$|lGPYJnIc?ElIkfcg%$UG zabnmO6k1FcS!u-sm5o37w@codg%Z)dxKR^VUJe$KCFH<8F+@@Q4AV=(}??1&rBhwejH$hJ+htDy7Qf6Oqk{JOCJeu=mme(1_{s0DES-UAfU`8jB|YbEKVxdLKAAgzEnU^H7&{*8DUWJ5xGJ!G^W+~F9a z!nDahh9!Nh%b!vxY5W4BoV?Rj^2s{Vg;*c-{eZX8M&L7E%+V99ynqcXz+;ser{pZ6+&-(pFbEV!5dGlpN|L~iyRngeO*izU7 zY=OrtoOJBJT5mV)8(c-i&#rD_G}5bygNHuySAO(u7yvVaoCUY2WYgUtj?a2DZOYBJ z97mmty}a$~es4cMl8j#rb)HY*W^&(dWT+&ETF(uiVj^J=5GGv^rOBOPf#td@-ZoVM zh$kCE9ltar;J=-~WZ7ig9~pkUr^-|fb>ka2mVFUD;>y)}1wPVweQY_OAAmp!^fY$e z?`T>|v$)l%!!8LCzg;${SSxYvY10+43MqT}gU8xNTgBtf8Q;;Q*5g->&atD4tbMOZ zqGMHV`mh1KI?Bv0FkV@ zUh~$SlP%2`VLtj@ac6H#cg2|f$@93|D|p{HdCPS1zEF_%bf(ym(dC>EO;$CFExSo$ zHI}xa(=RudAxB8S3y3xg>zD#Kw%mTc&_)5*O>YzZ(^5Y5@dpxsG||g^vTjImy2@ zMO0!xy?4vgzT_urFX!K%M-r6V7`L;!tE66NQJdE2;7rEmD@WVlD9(yQD z@)@vgxgX~>!;g$v3P2{WSqA)%YGqEcY$wqdj6SlA=rJ(?e2%UopHCQM#Efjq;K zoV+eO=0NPpMtpvLKfr(g+|2umH2H`P$ntRlo>GdT+h73C=rbVzON8gY4@emg1V8>X1hBq%N5&cmnm;`lh_0B51SYmXf^wqOEf?d1r&({o~tfXuI@j#TVag#VN&d%>tz5k30lcie%P8Benui zq}adNLvhwUCTIE0fX49e-Cjuky@eH`)MI|+dx7+2{f4_>(OKR z)tZUW=a^rLdnf1{?<)X<>$TV$1hnq>>g?0tvTniWp1+Ob6@^=|pV|NNN|sAUO#9sB>nUH!bW=rNz9skC zKiNCpj52(HSY3&}Rm)i5#PkdxVeXv!`@z%Sh@WYArIx_yL-##I{ zfNss){u@0vdNr}F^w}pA+>Dtpe}s?MA%+8h7l#U$liwlY($eEQjxY2ADpw(AGCMk5 z>CaPxN>NWFcyq0K6j<2fZ2Xf=rdA0cg-JJW&#x=#LNXPT@kg>G*2_^^>tBG(s0w}a zE(07}3+NWl$lm#a(f|(jBW$r*ri{^uKP|{KZP;!^NnMP6i5auhY1inyAGZnMM=PtY zUs`$aNmRSP_OTGeMuU*JfUR&+Ce_tfj|~=8C)BN{2NDs015TKTv#t}H^1l5?kAT7N zg_L)ylJ4F^+>qCFkLcTFZc33&!98Zz4BQg=wYj!#m~IGc13L!Sn^E9q)Im?N^;yBk zIZ(=%JT3YxjgubIkoHaGXDq07vSG8JzIkS)$=`9d@=yu45w0!9<@c6@ONevPDQBBdy1&d* z_(G*g?xZR2uSXF%figj2+(=O^d29Q+*IWxVptiGVhL*lOvXKz$9Lj>bpor5|>kc7N zE5F1mT=NCVd8|P2Regk_zH+*=qg^8&p)|Q!FtPNQd*17O;swzFB}+m7jn288F5>TkrN_kO5}xPlwnewfok7#X*FTOdHapTKthliIP8LHU}Cn}^qk`w zGH7UZ5Ybu%hhG`utTm+ zcfnZngsHaN!a)q7A@R}DZ)w$z%`*mIEf7Ct32B}4l##QfCEEGC?8s$W3Dcr924n`- z1~1^^T`{(WUqmY1zy4^ExCwf20tVJ@%#gd9FPmDvoO4CXa_S{3&ZX zo5}UIqO2eCWN2D|EULwuM~O5sD!QC8U9Vp7-H{wpdAJrvTS%MwZR>UDnn`qUIRqmJ zK_1iDCByG{p9r_}=`kkd=rlMXv}H6os(;;|F69n4?5A)>+U7jZ4sl-2J;*qo zoJebpbH=++#w?U{;LocH9EyMA8Xab4VE6At4DUPU8BFIqmAs((gEPl}K07Yw!g``3 z90a1AkCylCjLK{IHuPYt4|L(2nN1HR#Or$am9=(RMx?i~@kZSx-mf`d1}?k`=+)}I zt?AP%wu~x}9P_$LA~sp<+$SQWNYhJY+)vXd{1h&4VBPy^1fy`?nW9$)An{>d;a zN0!c7c`I476&r8eAd!n zdi0-bH;o@;wD*T|^seggYs=@wU(@gtRrbBjnmR}^&^j;f5LVKnA#cW^Ts6v7H zFzaxq#;mrkC2h5GHhqooY~ML8v04&j_G8GG^TKy0U){6kbA0VY7prPcs7C&h1eCBM zdA#^}PWp0N&VPAm*=^Oym6MwI=v<3ouUzC{qU0lvJC9n|qkT`WS{e(6|JrPq1^J@% zIlk04$^5Cd+;4%K^2Rbs4SZv(CR5;1Kz}iMBiKKfNyNt zwI^L15jh#spG?H$qnbD)n$md0IK{pQrrkMV>LtqG(4R!+^fu=K20fX4ja_HM5#-mN;o5X9gwl1ntT<9bwyN!qRA1G^_RJz<~;x^ zNe%W78MIZ%MqHjbP*Tnov%GuLJ1R@1dHs7umNK>pUYz|I+i2NFBG|dtZ5DWuFrE2- zKUI+vlYGQ#eVuc`^5$vjT;m7#K6}ZZ&2KiKoQ>96^~?9-;o43F!0BDED8P6k0q9aF znRMhQN(&u-3qAQ6*gbV?0Ra5;0JUoB8s?3iLr`+SbHGeCE)-ho+D-3=o)~~rB|`9V zw>(^~)-n`&6NTaCaEXT3nWe=hZqN;R7ljea;zN42EQdh*+V!J5sS+UtAs>SJTjxdug4+u?hM>fjh7az3&)#d11AtA zMU_LZ>$*cZ4n^ixdRlTfXORc|E#Jo;<8>3z4xZI<1 z_;YJHLD*#l)(O-Y; z2=;ZNb`5|}*Wku$X?KU_VdMU5YbfM(o>P;6Azb|CmQOJRQSVn-@z zqfPk!^2+n_BV4%2mfiZuy>M@1pLC#6!J+4`P3x0%JJFm)Pif)K$#9jB(9Hya&r_2!=DbUR8=`|won+@ENA3PlBIc5sHuGM~-i z{#njD%?z4rxz)jz{Fb=^(>dI&J-#+GqnHG{-*9=&dcv#gFu5df%XwAAPDFX^{~TR; zAk*(3pU9C=DK}G;5Gwb%bdbb439)Wwxvyb1N3L8&_~u$A zA8If$s5-r2PYoJ(37?-Hsi+;cH8b^q<<-Cy!US*Tr^Z#h*kRG>g);W&2S&LNLO zcWhtV`}<$Kt6G3nL_VA=(9IZYUZj(H2#<(zde1qQECPernf7=~tf=GL)FM%=*@vE{ z=&?b$AHvOHUS+kGmOEMce^l%`*`JEfL_6Kz!2Y`p zv?ky+(rqNbZ;^mgWF=jMN-A+kL~YvgK}LcZLWiRv#@}fY@@U0O+PgvSM+&2F*x?k6f}hoGVp7dhTfV=gp}m!;-8o zujIei*kS@5r@Ttizj8apKfq2FNLXFze!slHRF>v(K8eZM{;JP4KyVoz9nr0 za!FQ6KC~{VkJW3>4oRq$sQaXyPX~##-!mR=rbEm6qTO*WDU#M~xA-dRd{`#qjMi9& zk5{PgyHA?2Kl4Qfi_3>d_AOE)H|M7p(BZSty>&xG`HlWXS*F{to+SXOhE<-;f z>aX!PmG2!^PL4E!u}&U0iTY%wgnsN4HF@ez*F6Q;@j@YUo5j>WvSxxt&T5H(MfS$w zM%GGGAvT&SB5-BWqp>Ki+-Lt%;?X#p3T?GiV`oE~9j4{`0|||mrk*g<_w92sAAg>B zB5}zN^liPkTs57AF8{4onATa=I$xEj#k2I$LePRZ4I!h2G1AFpN#qzipMHGtz!o{L%hMCt?gp86bTf75>%Zcl*hk6`8wj2CW1 zbBpT`kCjf6S!!|3>MV&47G~2yZn+@dqUIq_qdCXv$k4H%bCIA1eq-KwYI%e`B~zg) zm9B}`0UNN6zyjP46QaCbrrTEF^Q9mJHKS{*yC9L4CWV8Kv`XVdM)X<`$hTZ#1@1Zn zm1-bI0ne+l_}exzr#;)gGB!dntJZ?>}>1{}O`j5K@zW|8swck=u>P zQ1f^-*#THax=GO7LH@iQz7ub46qf1sC%$big#LNY&;Jj5x-k4T77pr|`G(`9HPS9@ z(v`Q36Y~FfFV$lD%F*@bl??U_?6RpFefpXHtjcmMUoPmX&$NxJmP^R@@70bo>&~yA z~`W0cbS{I8<=&4rBSWEJM321?v^TGy7V^G6E90w(W9&8NO^TSd)P zf}>DQLC}~aNE6Wp^p|juKFD9(W({;A#j$WkeGx0;(qQWm2-!KfXxP}F4X9?Jj)*JW zoWm^5E-BPF={{3a{zezY&s8)R)AChyhfwy`e{b|2zL(5$)`>*H&CW3q(9tx`erv$k zbd_bbN)K+LgBpwhD>d@rx;!FblXsYvxst}1Xc}*o#ELL$hMEy2*usk^tjnkW{9b(G zGd%IhHaDW|*3oYAbZ?Gnj~S)W)4*-Pb$xYoWtUy~M1)r0Usx6;!f>A8y1ZR4v-{p{ z8>0c`HPzqAzYBZ;Jy_Hgp?;twBQP8I$Dg1Z^G)(on=0WbQ5FE>1|Xy1jahCn8Era_ z@OFg*xbyZ=$do}zG1CH~=sxs+!|ZFAa5&CjNIxl;Ac$RI5aKAoZdwM@YAj9|zNqpG z6Lj5$Ih1;lCTGUy5fXYWa-ty!GhP>>0ced6^F%-uX(t8>1uG4Fz34oS`w#*H-+>>L z6U;B;?1VV=3q18uo&KX0X|&(qsA%+xiiB8S&G{STiZFC_zLC>OD4FIsEaVZ=u?y90*e2N?`N9rjrtvEETANIw)(```>JW#Mzkkq zu{0XXs8=Cxts4g%i=FCV;Bg!|@bf)X zq_6V!BKbVBLrx6rOhQ!=3FVlaf3r4A>8rbbZt+_6xOTN&!#YNHokr73F6_&kXZ^CDiI6?u|KZx3DC;oz{2!8r009h1)iGN_at>765jnBWTsr``&WPakksu=>PbCiQ~hJ!;MfH z4GA2KI5~%=S6Gq*%i)E^@Czt2a6r_y5YVu6Y)vJd3n<1WF&w)k%OHS7?vfLVS;DE5 z{mgcZD9EI(LdKmuky!Q&O^2h3QUEFkB|yZX3z19|2O0fS1MxaIFD63Jqd=eSmQA0S z*#lM9iSb{AT4)|iYuk(4i%5BN>k0NMI9NBGT_!oFT*5=Wj_GV*Z9ffft;kYr3~lU6 zq?T7oy}s0E{~9mW3H!8dJigu#?&2l2G5Qzwlv}#u78@_q!!Yy}y16N#~NSAE91#c?@8v-QhwgvHE;%^6*F{QjOZvi#bE;G{- zUAv;6(s)UfA_nAOEe=7!I+9RaIB1us=@Q+CcGk|luYvZxkfiv^M(jm8`a405Tgc-B zCUq3?me?+l2(PO}=<}q%x&`Ct<=BJg`-IvL z9xqXi$%q+HjkZ?a`+qesPp|}0;0Ft|219C_?L=x}cY*v+vl?5%HMiSB6ngmr3e_I& z^!?B23*+|3RC-#-CtYf4ZK?a(Z0+S!3}qvSy;s*oQ{>F=Zc9a+xs=|%T7|fpEub-* zerjR>MpG;-RprYsF;CEp)O>1nx%`+}X4z?barODY(T%W~V#;I@A!zZzN`6HnuBvg| z$th5{_w)0c2B&FCk9I2jg<(S`0|pfKh&*F;dELxZJP~c*cKk$oILsH;{!vx3cLBAB z2mhI)-NLYQ?=27;!kN><3R(5utA#$un9=2?3A=~=FI^%P zSfb*c#uG6ypBDS}SoZi8kQ@%4@*}J9!}xoqMFxb-o<;^lWA%R&?1M%DMb@Nit6W-^CP1Kn*?}~6z_~Fp0TC`E-u5bzs)6Nh8KBe`H#;yU)=kY)0AtQ zcssk#cS2P=x$-f4HU2-%#ie<+i*s)0j40j$Ck17b+V`g;U*Zr@DGe#Nc>J977qja5 z0(nZE?QH5{hm*Re_8qr~c(H5ki)}YgdeG;g-V~}UM=HD2^YxMJ+ocPQ5h)w5296ml zD#m6`bzPm7{_s>;#A|<1@zX<=KTJyJusQF%wRK}K?t=L(Qx5s2wHu3=YU=AcbV(sO zJ%sD?M``Ew5qvkfMq){q_4^uRyRF7i`HJ7oF{L!4-e9*KSq<^)h<%>*A+0Ay^(rM! zk;i^CvhC}t7T}oogU#kIznP)Kv>urR3Lf3t+)H@Fjuy0es4c7+6K!O?ILX3$w|N=8 z@uo)`q&w|9T6k4;=)%Mmqro%HsY{;|-W*6eaqEE9dFG+iB!-VTHcr;NR?O!-MeBBs zEqWy|;=;hSX!&P1@|TMXdP140K`G2k`UA&n*l%TprRcPpHsZ(OVV4CS88};jC4-OOuw|$^!Mi&2>ibV-M!j zGleR9f4@8v!wZ{XUHA(FJQnS}D3${uYG$v6DQ+JyDkKlM*qTo~V!tB?}BSMS?DqLmxwO&P75~@s-PSqCvqR1co1?00=m5#iJrJAW#K}xfe7gF4ddl?dO zZc<+#WSzGv^n2y3SJS>_2OL@r!)42D7}yySIL&Rq?RdIX&Qfieyj!lf(F8G2qHJB-!RVN#8UDjX?v5ZCr<)9 z9>I^H$4ah$@aL@{BMg&sgIlV`C@Vb^j?K zl^3f1p(?Olp6Mr|kDof6@blZvJV4x>dg6(%5I>O-0AkTp1Z{Q(I@-`q66Sp)>?PC6 zmbaB%ICsB3#H-){bun#K!c$Jwz-=d6v3j9ZoY+N$cP{FP&Ew^($JWA=#2js^M@hUx z*q4Etiy}BjJ-Ka9xts7xAnvv(0clBhkW=8b#3ee|YDjiSe5(;8)Yd8v1u+K3LFd&I zR)5N?;tZxcW&J-TkBulaly)Gev*}A?? zEs#CEd_5-5x!E~AyxYdg{!{Iic8*iI=<}&?fLogWS&_9hPx!T3vI;Wb`^1M}ck}iH z-}2Ug38g+4;HSuHnO6U+n=P8GgkK0KFj{_cV^**iCd5)Po(28iHa#cuo)(BOJ(!VU zyZV0pI(~^S<-KbeAAdnx0HhTCera|~C${p#Rc}KdQbB!7RbwXpdW82>W?hrL4rXSE zJ4Cs1*#D05?D3l?n9(op%E$_dwh4%HPkQbXi9C+;l@I2Z+&q6%{1pGrP~}->T2AGY zvWi)8iwDP!hr$#xqCd=rr3UowIJ94R(h)67Jua*YvlkSSh4Dwa?DY3N9TMh>me*X* zd^JqjZm!zG1lGb&)>ZbEwd5kRsC8AFgXA8{SxHXo`P2JjKi(0c8z^WSl$z~(K}WK- z9=}ZbBIO7mIWn*~J{Tp&z@>&)((t zfSp_xjWiNa5LzjoyyE6CYFepHsv}Vc+#0m=3v2981`ispOjx&ME)%{Sc^UeA_eAvD z%O6nR1vDP1HvAiUZ}+K(A*%O)mt_H$QcV;C=S93R!$fhKg~!-ap9;$mBaCp2-2cIqm&Vtq8PaMD4c5 zo7;?;@#!;>rqHdiUF#92ZBSIu`%JbZFm6x;F18f@@n=Yg}BK z9c}1kF#D%{1`hy;t-$lK6g5=X4 z6M`;fivl_*D0nJ>tBE=NE+3nzD(Asx`8k{a{Yxc08&96&@XU0I0{}uz+Z^Dv1qA~> z@=)2o2AD%c8t*S`K4M0hb4olWYQPOKFueA<updD$N=I1>s%A@m%TE*6w(ig;a@6x?x`^^mwBO^a}DLRHF0MtwU!7KtDiKN zAe%SwWd6by(~qvX0N;CNb@;2$@+TQ)wBHA-&~}9w${V2e8}s-IRvG5oMZ6kq!+bGm zs$?akw(?9_{893p550E^#-Gx*ZoKdwcBw6oWhK%-jdU;Q9j3Ul>wTzleu#TIe!%`yg;HV>6pXc$U0J_mlC@lh!&HV?Ubv{VM3X`&P!7Hv7xO z-=y}*H@-9gA~-=&YEH&Y3JOH~MS7k-(PI$%aXzY@sq_yF{_yF1R4dPR?ex4)FG$@V z7g9(TD^!TEMzPH9CI^;6${-;Z7RfhPP$JV?Y93thBpP6MBTVlWw58z!=ZZCgm_o4K zsWD%pL)EH|>ryCH>Os8Pi7nJ|eA3pR8bkwVAThgaJp|CEgsnBNKQ6X9h{Y8?P=!|f z0QNH(c?OCZJY~Gj|6VAM9n(vJtrfxC1quoyPudHqG*~_{O}n|nX46;R$o$XT3-c2n zW!F}z|A;RL?=l*=8#8dplF4t}HXySjTPSbuB=b#=->`-y?N&-}5k`eNLTN=DJN0XleChi&ZTK=)nnIP23$6+JI**kJ&3L;INW;G-YOyFq$o6bdThH}fk%swoQk4GgFC zvYr&5{P(2LDLzHryx6(qkp55_BR92q?{K7WkIj7Ej+5_iO6J`P{HViqip)QWxcsrl zK8$58z@90cd$d?!>i%nmAn`9FkI(zWaHNoHVX$uAT02uCOx*8+q*+Gty&V!}D{3SG zzrlatRYuNWe=c(gj$Z`^?1h={9x^F;QR{6=kqTFKZwTe__5RQuUho^h1zfn^5YXPg zpP7ClZ(ZRQ?6{zjT2zkUwUn;S-qM~>rM&gFesO<3f!6%s#nvhEYdGakf{1ywZeGy9 z_a!5)wdZO3;{gK}96zF447~EZwektjR|Yc?x0$EB9XONsv`19fcq=2BcyV1Vt;FKn z?4{;SU}InsSnl&S0u{O8>!1LqO3-{C&Uqu~9*{MgUv}W_z)i|F`Z>+XUH`m3(RRqLcl)pcd1N@f*Wp7HQ{~-G96y&HV^&GWYW7yuZJ3@ztp5D#cISF;7tWdm`2Ha-^{G&da}; zYTx-1%x%h+PAJhX%*KJMLHbidJ*LRnx0Fw(sln>lz&>Wi`&O8jeGK7{j6d z!NI!lDVuT4rtyc}C(<%u<86nddZsE~z)tlr8bj3cv(hyAI#{pug%Y{*;3dJkW>G1`qPhn3VW_ap6r#`DfHQ1#Q%BUk}PEL z12al>gl|_jR3Hhq#KsS9i!xi4w*w&tTy)PI=}w{`#F##UnNsU=JA^TyGy}CoTxR2# z9#IIbaw<+Ue9;xffX8`PcyrP+1L1%uowJ|F+x4>QClLr&z9-jh)X>PWeQzuoilRJ` z?QLz(U=y`yoY9@!Whv*7WHZa+$wj<4sBLbF`DhpN<6PNYIT0gIsJNS7SD4pg*5!G- zz`h66UC{{I>xND89=s|fc@4U}Z58U^KTobDwab6R!P$DK`4gvev}Tg%2H9@1Q2YiT zx@5c)NHEL&?y8r&|IEZa9%uLBwXdD@?EWnhM?n)j(>7{$Oa*k*MStOSv`Sn4@Z4k2 zg4w=?Gh=1`b8X+`2jl^q)r31*A^nrq2%%Oj7RYIT{p1H!a?SoI#hRTn6dvvvd2~XQ zk@A4C;7mOoW@)-89k|rW$v4&eksG%_9p7%$4=34OU$1`0y~OJyRFjtIfO|-NkSECN zBLYEHRscONJHnv2Re|-d;mN)-Om@~rR>QOk+p4K-a>3#d8wVR$5x}j(GzCueApT$RLzG=kgWO?DIe20KW*VSi3SF$f8~W#B`5aHM#HbI-I*~2Qgkm(Yaqkl^Llo@s;Tuy(wBUp*es~Yt=;H^Sd!;&e<FU1#dG$D^F+p30X*UVYBpf1(U*9m#J5L2uvO>{alB*ruTnE2ykn5W4R-%K zM!BL(=LTL43PLl&_mAp3L_Aoug5qgJX>6J`+dis%X2JQQVdI0RWk8kW9=n>frVAeW z0z4E?Xg5ZnCHCR=abJ;XCFHu0$2@V45F}r;$UDHA=}1~la#Motvj%!wwbdqMKnF+44DMw&qTkv5(I1TgmZcE82m-GH;Q+mRv* zaEZWGISfT2*g%9BhFV!1 z&u`~3qIUFl+2@M<3zvwsd4xp0Oe)~zT~=#!UQ?tthhBe8X`D{nE_c-_Zd40Ln3BGb zA@yZ4XOH7XAatLGOq*eyLsH|rflE&C0&TkR{W#fjEXodwV4$cjH)<)(1_R-OznZfs9heB)_APBvapnk4--}67!l4EO zzc@M!{YYKW5rha`RAoQG23?5^GVMF+F<8g*5^*yuqz!%t{u5Pa>4ea-G!v0P-hGdi znznr$GNcu4CN-Y)>4%fH&EE8b(eRh6cpYU ztkf?_C$!(MMJ1y63HN3o1E9U*L`R5tD(SM2OHr(v4Odjc6Q^^UF6hm7(3y>Jh{)P7 zzp`Moa(4)n>!c>J{N1fGCR5bjyIvKpKMllmQJ#$v&CB+>Hy#uk8DA@x(I9*KMf?63 z3~#2?t%gAAM?PeZRDPUD9ozKz9&V9;wWR|80vhIt8G*&~;plSH&93Dj5_x9l0F>Jd z@*+X~of|ndP*UjYMLV`=$FzJ4MXS!15I@GciIucr6=KFNH;3sL|ATY9|7vGld~aH1 z2}f1y4+!)Gu5;_^0CC$UN8WJT15e4h=&(ge#=l>dUWP`*5{Z0kyIkuH`*^f!cb1xRToFoWe~2DODt- zJO|Eeq_gAlVPHD&;I%|@Ot~+CDBmj8(GHbJlw580+IE7HI^`PLH`!)KR!_0S>a%G; zdWbR6g_jvD9)8J|%4dW}oUvv7_@FotYi9gn-a>xRtFo#Uo!cxc&kOFAK>HVzL z&Iv_AM-Du3O`i1FVvi$Be$hF#uOtBkxI5`5Qg z-O~0K#PY|Ol#oJ`AqwuTe+c@)$>{7H@yHy3|`bCFxnx_c7;^)E~g-0gkKcj>(Vj&a3Y$_I{3 z(big~5B0o&o*Zsz-ZaS@3nsHqjJ$dqp=)=4#CzG99AiqNYW{aUTt-629G9+xZPp&z zy!Q?GWnK%98Yo&MR?jT0hqH1SLh&3ib`t}UV1_B2adN_TGU8K$zFhOzLOeEeq?3f^ z8+#hFC`$XrDsfs8oovIHx)hg7Y_Wk2X&Qh6OLHXSd*E=qDZY=V%6)An%|bF!OWSNj zH(?jxQb(rcRHdsOuAFYejww!TfNjz>wmQG-8yK~NNW^MXfqA^vSjD#;uUn1xe zrs#*>-hW}hoij<=sNp_G_(<%*cM{(rmzQyz-MNO|@}^ud46V4b1X{IY1>((z z*H(9;5faNdKYA%?&6czWn(I!ZFQYCE)@nI#M2PF`pt?bsdX!un-L23Fxn~RZ`4>+n z<=uaHWvD_j+SVb*rm`Yyxp;~s8S;4Z^$^;>NpC81Y|~*>vnt1XV8N6pY6*6-Q4Q1{l@&ljoGd*r9tkoo(6U&-DX(0hriRtIpjhc-s zJP8xdRpox+udORwoIGERPh9yXw=zb35ESz3?v*!2s}tmn-_Tt!uvTuy_y5QgJ-pxy ziPUB_x)zGQ8ilh&v&a`&yh_FwTL52cZ1|dSt)`ldOvD|2ZTld55J|w@r)aJ0oA9fT zW88UX*oyy1s8j0%?LlWY(2)7|6^_=hnPVZ&0-B)9nBAvGX!dN#c|T`-F|{w?t=ex} zwA?N9+~Pg=A}D@gy+o_}FHqYt~Pcyn)@ToC&9AB}F4T@@cxnLz`E=st%1#8lYA zgtLvhjZxjdOhxTs$GXbEiMlP1wKa<@SsW}zGZhI-6<++b+OGIvHh|O5qrh2iBp{+e zs3U=WJbsraG6g34lRdXQr?wPO;&hWYGHn5_hNRUsF`bUak#~C3>}ZZU&~F!K+wtC2 z&fB3&e^wNgumwpBFVSu}(8PS8;s)fo>d?r`mb$ZR@8{xak%v!X726L+KHTGfBmLBF zet6#ibYzYrX$4vtRvD`k0X?0J^|>D8Ui|n>?EtXi9+d$OBh8XNbgiqMCl<4FRthn+ z?L-wvWctJz?gzsd^-}bV(LKZl%+o4J1MfFx0oG1^xUKr38q>n zLV5XDrRZOmT=f7;N-S*B18=UO<1+nG|28{to8ya?~OKS0=%5{ zQ3RR`zsj0hM$sf<9HdQ3I^ii>Y6(?px!n&II~pC6Ik2q*n@M&*3K5B3+WLy&9gUeA zg>O9fU@^$1G2A)rhHa;9Y5Ygv4FIx?f$=1|^->W_qw{hD6v`?*ooiP;qW{6G3RJlx ze6El9=&$aF$X%OR!C3|k1qa!vgmrVm+s-UTunudp`M49X{UQL%qy>C(#9$nQ!o2urR5PlCpV3*p1W9X-K~HAw2ZqJ+@YM?3#S1 zJZ59!0|GK^;EB{AfPv(RuxVcWpgHRX;6i{G*Fp2!mID#8JjxKqmf>YGiAB=8m->JA z6Iqp<(!tFmnJrGt`HqoQ2O$ln`{0VmufA= zG1Bclkr%!gjn^{W9;sN~KB#Ro=2w2%Ftq+p=&ki&x9s1IXRi2r``lltO7zU<+$;P2PF7^ zK{72HF2)1x!@L6nJ?~rh;I2XLA;k-l6BC{V%45yC8(Jz|Je9A_=0Ur&sB@_t9U!C9 zl|zWD!^DqWbzr@2-Q3TuI@S+qv?2xy<~Q+izza+WU21y%V7%ZCnX+ zneq(wT(D8Qm*e2PqJ8hXyuP$gl6Tgq>$rBKAqk`Vodg-^0%Jn(f~TSyvj6kudWlla z@(j|%+{PoeVto`_p5`70v|didZ}>nO4O?N5t<~4wgsF82*`L$L8d&ZzYa8qb#DFq1 z)s-As>$-3IGGX83;tZPCEkcu=0%^^YeDfn~Y9;oCEd)^_%kCv>k%{CeUf=e^VY!cr zhja+{;k!6Wl-p1zlMwgCduErJJCiI0A?f`|Br%msL)IHgWjq~-`Fe5sL^XMMIvgRj zptPHfO0EsBJcE2TGfD7A`kp;o6YzHSExhaHTYoDj%QoI`zTy4vGU--+N%rgNrT#7R z<(5aA9=@vVYt3;UuogDfk{YlgxgWkyu_jxGyn4s6z&e5n25qCje)@NYjht$vqLZTR%lZt#-Id`w%yY8+RWAXt*f6T{S1O#wC_A zUw3pz$pn5S-0=We(_gFNmVi@tSJy6X0vpcRE5C7*jp7_2bi!EmwBOnKQihHM5P+Hwl`6fj7ZTzq zc_HOKa<5Y0&mqzU4Q*6w@?F);%x7-Ya*rk<6+e3ur#emj;0(tQLTcjS3DU3S?Hl-B zo+S4XfmTjrJ)|t<)2-uv%+OYnSZP*l!SaXI#{hrX^5(M28;Ha(Ok$*r*zCt2gOVzt z!mdlFz8CZlU#hQWnBM3Hri|s6)`fgLBLc!W8XP)I>Oug(#dm0xoz#vJY?XszfKU9> zr)c;v6wi2XVTN<(ePsRX{7Cp0)%MNJqoPLEd#lw0?@g90q(NH6#2TLXF<>{uJ_g5T zbQSPleH!%)w6^(vHo2Aeu{o&ksG^lwCr>n&>BILQGCSrOnU+SB1e691odr8s5-~V_ zR*VbVJ;e-FKJH;5!|G4GyKRZPpZ@y>C8+WOCR|MOVzo_jgW+aIyVnkW)gcW*73}HP z3%4}~uyns&ep&t3CDEo2*Tz0Ig-F)DCe>Wn2%E@6{C>xnVO{-?Fo&Zc#BSIyfG9w! zlfbeeCJ?HL9Vj`hj^m((A?`M7E}j$0mhO_1?vQUnUuEp9d*kyC?Iu60j}*^cHtlLv z9;sMK@9Z=*`H;G56?)YfG^)G?mr%JA_whOrI^5glrM4kA(tJIFHQas$itj8yG(bsS z#ZH`S@1Pm;EzsL}3rfMfa$S(qlj|=bR8behcKvM3Dty&Ti$Hc{ZMiaUOmy!zA6S+J z=5Yutqzy+NvSyN`7g6;Mz~w*hguUx*KosLiLaV1B5)+{?ZCgBbxFoigBnFv8_*-WK zNz9AVIq%=GxY^X!;Y!aie7<7$2qB%!a<^_vOC(DmZUdK(3C_3H)s9vnZec5;ip+{X zGjjWVL&FG8okkG1rgM=!&Z;51k_?i{vC+RaJL+?yHIg=2dcO{aU$4)ke@%X46n^wl zd~Gsd<119d=&h_{&fWJ4b8G*1gcNF!4mCJ<4isfpx_b|_kgK|q<4y^E7M`>P|&rmoN&_R z(q8Y*!kO{sD)$Xby3v=Aq>??8Bvp(DM^`QU5V>;{nZ zgL(3lp+E4>8Aa%7*R-C`ey7DP`)AWKt)nj@EY}vrtn5^JdGgI{!#G?xJ>QCXnYB^m z9(rd>KQ3WxQ#4>ppSk^Km?xnHDZO|vO?da9+}rXFzXoS7)DrMC@1AsnELHpl+~1fC znR#CY{4|i7Sl6S37u?FAkj$D`yH@!jRoQ{lmldLs@-A!O<^ThT|bV~ik z7H=Zi(g{m}&nq4@8>&F{;9*6O4o~bSq|Ul(50!!iOW?i%oI<3D7}{Ky&W^=t;kPV! zA|ShQ4Ib#uDkr&&FH%#oQ_aHZAM|v@Fuc8WPt9CkK{1_fhJz~q%u738`Q|z7S#NiL zs}dZ_tu$J17Xi{Cb0ouQp!Q_g9aaJ)dkf}hEpav2oH#IapSF|O8Wfw@-Q*gK+>4F= zyzqr%Tm)rz@nj$yx=%uZ%G;)QtwXrIO2h!|l0vXsyQaqwkdY~1mOBl`k6N zIea)Id8)MhFx#MbDKm#ki5Nmw4h({PGhyifTb?JX2v#wZn@YwI<2&ZggCPRJ6fUuK z4}KIbq@N~Q?a@en+=_aCm*%|p+S2H0u6^WdY81e%?Rx$$q$G-7lYxfD+ubg^9aJ7M1A#R#&)C@ zE{?TsbCY|liB!ZkcJOQuN~IO!P^{UoxOeQGw;zAEkiu%7g(?f(CeCOLJkkdz{iR(v zZx8P{{|YMOZ$aO&G;V9+32L3^sSpZf$sqt8f!eUXZD z+CGDGV9zBXfLumnLmWWOki~HZ+*fAj#4G7%7<)ad#iWp_z+jQf_5Td({bR8o`xkZ@ zx?G6FguhwH4pY^SEitwl-LG)l`ATPi2U8uDW9n?v=Q5?)>gqk@?{iKdTko2u_Gk7) zP=r}6#TB^*2$G_M@Es^&GA;KntlF_-bsR}st_VQ8i4I%LFp<(JN{nzD!KM5KhWL|R=D3PhC^OW-eJiy zXc@TL`@^zLtw4oKv@qu!gy3fGt?o>}lOiIVdXsrD)+vMO@$I zI>)DLQvv6iQdiHh#nVhhTcmFeuZtaFUs?Hl&3UHw9+7<;Z*b2*s6!$#>aEeYX<>>L z^74G7zqoJcq3X;ak)ty?{`p09BP6l)`jypIURtJ$T}9TySS`V|BJ1(?0zrVl@&ZvL zDDQ&)BY|1KR;9t&%`FGpjM6@{XB|#G1BAqJriB2$Nk}pC@*!azQ9$agp>rb*NIGKd zT8Fjtb(YhFFj7O~7)R$TukZBVe@@S_j$cGY6*5*i3jYw3pKdpuE!RPqT#2Uk85L^j7hv-GPAc!BJl}D7c!34CiI&Mwufk?9x zq{Rj|86sVx9ZPsu$*~D3K_t}ng(H_u7h5#!bgxx64%W$kS~ow0F+Yv0C5k~i!5~3w zMuM}hPMz7XhXxovdoeS>!I^M$$?ir7TO7uwy5vF@`!EuIn4(^W%O6Jk(i7m@O-*fN z(*{z5bM6`Z#%8n`S_nf`#||}C4>#+o;qr~`o7GF?27lPEa6a1w7)`id#kh>ml#Lx& z^8)ySM)L#HQ~Sm?TN@W5*dU)EMQGO{co9=j3W$3oNF7+n>OP*N4%K$!RJ{Fg9Xu|$ zdOoJxq#%j*7pCBbyT}3*TGBriRsJCrss=l1zCGR-wRV!xdm~MW$ z!zafA7@+pat=0C3t7reiG41>>+2YCjim1s>d66Y%*tNA9RR?<}^4K^}`qiv>3n)Wcr-Xg|dDtS~HUA->YS7{b+b$S@fmU*|-0h zhE=8pGR1PF zAX~6xYv6AyY_<*eY3nfv)m4w$uhneM2GDW#^7sfSSx68%K0-cK$U~5Auau({rV6tE zvH6(|^mh+9dxl+D;E9gvtLtk{9b&IV-45Z*^S+>1ZaR>91846X-LaEAZphmO!aIQ> zh{({1C+{#ryyP5XW%s10Y-8FQ7HLRfs^v?_vyZp$H+@wOCj-@Q2`0H?UZKNgVw+v* z9_wNz9bF4safM|`Qx3nuy&Wx$r`7{J`3!W39F0JesFZf#Zu#H^@gro`WigjdrJb(( z^s}8=@tuUd9JQLk6`s~lp5jQsv@4;rq=zVkyO!N3_|&|r^v!%QAawrvV(dtPC|HVx z#dZYix(@^bkRFNnebDdDnFiF-(>KsAATN|-ci9Zw-SpK*+RIC74M0<>Yg!bFEysp; zHD0XrIntM+)@7ko-Pjj;(kaU;UcCeBWOnRrbvKP$vQp;yyTh(GNBeSe%Wj zo?6Slh33YYwbkEiYaP~|YnLOGK(`a?A{o*wSpuHWPDh|NX?As67h8_1VTVLf>=1i- z;yA0Jhd|8Uw(aS{_a5S#1v$I8(n=5NOni`t*NRr9nH}9O#BDHk5_PM!X?XqCL+N!P zRpqHC{ssUxFJMNCn2cbie&~mN0iw*HNGyTVg2uu5R3WsVBBP1lq&ss6@#NbQLO31Z z9}z7Bc8BC7@vUc&HQkc8KH0HtfJ#K+oys7X3riFB}AY4)C2V zJ@l@qjNgn%S9zLt%->)|HCZFSQz0tqiSJ3QnUZeT*I13bXHzeasvGtH$~WycHEh}P z0J~dwze$|X<;YGV+*g(4Lv%Emz z>&WY>fxArDn`xpk@&fmFrrO8`sSz`;e_WUdrDEG*xDq4Jd!Ak|&OUvfp8%^DUp*0Z zO{T45r46QIZ|@5vmF<3JRrPU9%t^s3t8*B=L1)c3O-&oi7%P)MYK3*Vix_9EyxSx9 zqMP5Cd9|w)3mXftqnOB^0kza ze`}+7BU8iQFUoHEhTzrMsc2LBg%z`VPoJh5$u7NS=Ud!6At|p@jZ$34r#&4{gb$s{TJLeC^=}zHYm!oPkR#V=K4XBAN z;$26s1vUAcU2XIMoKqOE=gu}2c@0OTCrwo5k7ie9R+;7156RjOnLh3LdPC`ts<@z) zuyMCz=*cR}$$;O!{t};hbhEszjhV9D7cOu5TzSEq6M+A-!ypfTGujt+bMJfM*`0Te zl|He*ZVjJO^Mi3GXAfvt8|@N5s~@=TI@~zMX)d=e%3pJ|we{%9`B9hE=bAsGF{(W= z)l_o7IFh3J@4ExHWGx+4?>#xC3=7k?KW;Q&bR@yaf5G^U%^lwhOc?=%NZsgbX)XC3 zFG63Rj|sIqmQ;__x=<<-)g&}>zgo90L7W`2^Ql?G+kX0!P;LI)+l8y6;rEY1ODSr4F2p_>^O4m zBmc3NE@r>%vAYGA;#B?X4!6!9x-$OYR>f=I<2$(YK6RtJAC3EwR|Ii?Qjag#T=zZi zc)KpR>I`2@ZAPZiLH`o8@qyd-{SWc4m{_$P<*#bw%Idc~2^2B(hV+w;w$b{sdc>ft977 zGCKTn{B%^$cY%xsPvW!PcMHDBsNTA#baID1Aey1_?=zq!--Si@MoSB&GG+8W4!&(q zpu%^3nDb;lFrf?g`3j22T)uud{Pj9uv#GdVRgmlQ>L*Ea`ijG-lcs)n{rUy!!|V|J z=OrhRBl?#vG^KP~3DeK3WvVFlh_v+^Dfip#3hgUZ6zMtTCX>c65_n?SBO>6hSxV2j zc|=vi@F*;nYGZ7+?^M4v{?Y997oSp1e1&1`ugsU9m|xSssrp4SYQ1Vn)yQjE^X6vx zQ=}35jql6fAJp3ML?f2E1P-W#$V&(r3wX^%Md~I8DYp0OOCIGrb;oK{AWy;I?)S9K z{u6l$Ol8`E*O%*V)ReQ7UPYeVa)ONhpf4O(kh)$UZTQrKoI0ct^~;kYvlAZN@s1 zn5>f#vq-YeOj&M>d4JF6_xmr8M~^%Ao_o(Zuk(C87ubD_;g4G1H5be0%e4%XZ69QyVO)}vC}&FYx{slP9l6zNe`P7=+U>ng!9=X;eXC|w|_C3BsL;|>B* z6t}a3ya$ER1{}@#CPtSZQ5r+s4GKWyS0@i1u}i`Uz#`sb&1$dckEWip%7xAkQX1YI zFE4|V+=u^d5YTFE4~M#q%XBylrwhkk4Zn@;`*B~PZ-?c+A8}It?~U;7cKFwuHv}N? zuy|>X+fUjf7(?#>%Fx92XMN#Oum6K#JHx%$0V2NZVRt@z5Zdx}2akh&S`N~4!>R4h zz06&%ET%pP*iA=oRriH9&)GS>m|n^a8Mb#XKLk7j8|rcxJ_St|U7E3)lTD?rV=m4Y z=9(L#E9Rdytsl*Rj$>pyb6MJYh)3@cD_Ix|8bBRo^ z1ShfL0KnkUJwX$`Irq3|OhdH#2S|aHv?=!TKw?kyi8?1$auwr$4W0d*MNm8o_cmpK zhN386kBxeQuJtT^J1>va-YSYd;rknx!L~2UnM)0jcDw8R;b3+`i_+Wq^`i?RIg-!i zTi>~!q=SQU{(-yvbv~Y_#g`ry?Ec>wK6j*20QT#4fE)R>22cC6+nSZ8__=Py5PYMY z>_=BxFN|M*+wy^HSRNJlFHYqWx#`rq<0~(tcS3{rmX?+Zd6iECH06h*X27*tL2bdA zBLJwN$HQsuz*Zs3o0>$ds$806Nda;e5Yr>&AgaxX7T2@En{{`I=-$L#D=8oUg+zQs zsE-Afwf_qhbROugeWqdsuKQF8jXzWNtDlu;aydElk>Lottd?lhvhFhWnL3j*)6|5g zEkvU2dl41{)_*Wll&?x9=tQYFH@-%vsIc@!B%z#ID z+v&=Lrk(Gc&)4#J%C>6S9j=+*xs%^4K?3^=dR9i|HJz#0_fZ*}F6aBeMbp52AgxX^ zxV_2`Ps!~1E07m_E7MK(+0WgkL~Xqb0f|`qPfxSY>C{b?ankt#(JdlgKDKf3av*3q z_&+jIzHr}}xEA8A;NKgxP`5mm`zwxyF)DaRWB9Gn`zk#XXJ~wR;Fnpz0x&(9LIt)Y z#bEHS@ExGnn`VFpF`I1e!ZmXO<^x_))7nvHZp4dU-_(vRtxC!Cl%RcG5l{7(yskFz z(jJ*#*qDl0&k0L;2Xx0-Je%EH!Jv9N1wP`tWN*;CCJ01ZH%~>=OrRK<1Z zTqCRSoiCQ0_axv70(b3(X4~m_5A-Pt!pv+Jy3U&1WUOWqezp^IZ;TUmthj zo|&Fq1gqH2r#KZBAz85JE~DO`_%GjgxJ9=Nqbx$9O5nXf!0wv`2VQsP!``BWh;m{K z-i#d(C)ih`{N=u3T>(b<5D^=BYu!1*Zs2+7!Mas)l7NOh3e|z59Hg%z5bZ63BsV>W z_#%MtNKXU;yuN>1yRZbN8SyE+mhpH+N7ntChgWuIM0Q#TkR4KYOzUJ$)p@ZtmHyc( zxski>!!)b}w@4B6qCWIIL~22I05NkDL@T5{a(1nwH1m#kvaGu~^njkG-?;mB?=e#v zT=G+_xh*f6(?d^vm#sUWzq96RnU21NJw|^CWjPq~7`wEz_6XrUK-14CJ#yIkeDU&} zLV14ug-LkHal6{Q%HF-4s9KL~I}5`}xC(fG`@qPTF;qyPP1oK?tgBqIhCuuK99M`! zsO#aY$bkuQ16YvOoBEcxZulaV=Z_G>$X{B{T5zG= zYmo?j{i`X&=I7*mc9?UZ)JbpZyb)hoN+7lg*2y2-0KTl(8j!7R+6lhqs{pc;ZuA$j z)N9CvO%}yXTl0M1l3(LavVZqB$K2mL6}!yW&Nv5__a3&MdUb2a@8$K)hF@jG*CC5DQg?^aj)rsUX#r?Ai>9UD z9KJMl&5P@@hyY8KQS=1BxWYRbGPvO`hD7w9=pN;PZ0=_Qe4(@wN;=0)OEQ3u`?2lP z65KAQj&+Q=No-%BC~SD<*N@3RudB5U3{;tN2sbAm?g3cE8raa{`oVj?_#e!dlMH%z z*1=$pqm04lT?3QLAe(QD&dMWkJxei7Lns3)ju zf3j4JL3!la5x&Vg9Punyr+Bf3X~mPdoAX6Jhm>2q(3Jf!RKm$B{%URY2)VkrI_flq z!kev*|A7WQrWh16mt1Ad-|Mutz6Eyh4~*>u9|-Rk%uCt~UkiiAH|=por$_J-k*u0` zz*MNmK434@F-4HVS)YY6nOi>X0u=X7>wDzOH}gRfURGnFeiniHc81d~$L$~3T?x%n zemH4r6M1Fw#rFdn<+ZIDVGNrYvQD`_Msw;(xlY&;qnvyakxJY{_#f=ZwIM)AidQ&&xF~>mEaX>6>l?3sn30gYK_ZHTKDbCFB3a z7vz6bgoT>lej0aWhqbVbspNU)t7mP%aM?>lyXQ1cKEZyn@sr|@XQ${p&2G%9K5s)2 zXTz6Fz}$7*dV=x-0rafI#lFqUeD_*NYg#G^ATu1~0h|WK)3_!I!7}JhAwIdoZNA&Y zNaK&|Gj=Zod(b^5C;HiUYsr#Z38URTk8hAaR#mtB+{h?7=+}(&^IgtHoUN=+smz$y zo{Oqz*_g2Q4vogD_xq+z7YoE(Hp2<+7f=`#41nz>g4fPN*Z!Iw4M}T_adVFXH{sKU8I-fTbg|7U$EWp;DFo9iEcA>;mb^{6+)Ps zo9FR6Au3M{s9{w&3ID-%3smrWP&PB|$<)3vye(U$dFQaX2QWZW^YRdM0emf%zJJ=J z#i2|^;-u1wwyl}U-_XAPqXV&uCe537g;aG|ASp`(sq>JQU_ud5CV?@QF=kGQf_iNu;15O+p(g zg}6IfA8!N9`VnZTgy(k=N-Rd>kExFO!FPfR&2xMr2+fBUYf6f#g#a|#ZI}Rw)85dw@Cig1DS@SkY_`H zTk+5O;q$daw%B76zg;zsTHgrP%Zcx0QqgLV#c!2bt43{!jVO7HK zVtJgk7o#*_>(tD4kj6CmJgprr@^dvT4A3_#T?qIvpM#w~U%#F;WOL1v@ZPIj)cEr& zcNw&7aLQk7B;%!LZ@lMwX+dbe0vyqu7D7~kiaXV1xT_$o zRf9|mQ4_n?&_d=pKaW)FgW`sU?2Z(+HhlbNSGt251P)_6EVpvWcj1uMGAQ469O3?e zOSkB58vat3gsP@n!v!*6Cc0{MscChhcZQ}(|03x(XLOL{Y51!WlUS2SV zg`@>1|2Av$snbC>i#=cMH@HxccrtEiY76kkR|EWW=DrrIAf1P*?P&qlSQkX(TtKUi z!;dq7sKzZ8Ncw}tz)3LRsSnw5WdZq@>qa3+@vV6X7l>M6&5Ngyghm7h9LjvvWx2(V zI4k8+4&1~gTjoSVjVU^ArSaIxPwvuM84%k1R%cSx3JG6l`OMXYLR$UK3>*9c{y`SOook*4sz2~t5)2$faP@u&323%m zT`OVXGIwUJ^o_ac)CZ8`Fi83VMS*d;4{jL4zX(|?^dNQ%zLRSZeCAAbfE> zo-bE^S2v2dbf~jSAi>Kjd5xoXx-!$Y)k=V$QJy&8E7AIpdJOa+vw&iN_Johx3<9ML zu)A}Vf(~0R&K3H~6RT5`m}qH$w^PoXZygL_C_@F5P8KnqZxOtvQW|N)`Uqucb*8EF z-Q=4xTkA^$usdouW-{NFM(nQ)b(pX!d_R<@pknXjYhz-V@zgP5@;{gkCvw8>evNyH ztKInZ@#TWb%!j|dX;1i(O*fE6uHl; z;Z9)^mk|T7k{xsE$Ko%JncKbX44ffzoj`MD_7Ry`$*3oh!5-HOwt=N2Zsi(~A;XmiKn+1LO~^n!(f82na!$vPB)G$1?cXH; zHbE{#Ief@QMMe>%-SLND3$N-~N&}a--})z77O%bag6s{SK&>6&GU8fvw{lr1AxO`1 z>vc4U1&Hs;KS--&$8su{HF^6-`8TJj$_umv&XrMrB&~E|V|32@J5^j4c)MOIIzq{_ zxmqfs9GI+{X?%h9Vv=+yue>$ab)~4ZE~9R8z4gV_W={DkiB^reyr z*g#ZqPg3BUyM#UF?m9m;&2{G+cG%O51=GPF5tq!i@$DX6DvJ2A$J$$?(xh^xQy^Ib z1~C$Ey;VuR2_7CF0quX|n|}~$-P{Y&T%ni$8>?8X4&!m1!^8Z;!^d=@54q#Q2EM73 z_M{kHWct6$!1qV>$>dc%5biEmhGaNx|B8}VPB z-^#vw<`5N0*k%MgD+p&W?2`dlLqc z*M5UxH-%Kz;54%LR&cjKV(Tro5~;1V*eccOR%!tk$bbc`rk@;B2D;FEL_Jo0`by61 zIi7pYofJX|_5IyBiODZn@+anbw&COPeI>&$G9!XAZR{Oq9qkS_HDQ+1T~R$jSJes> zdk@}DcM0&0^yU0oB6ujgA+%GXQBWy2Lm)N?-gp_5%hh7-C96lDgjARSFsx%FqC{?f zY_82_D?G)L^zrV3KJH?;{E>s-Pr83DKhV2d*E#8U*~6!Q2+&a!fA6$FY>St>b{Lui zHHj2orl1>DUEJ=V1R1WMffzhOr$7cuoK6Wo4LL-clT}^+(jww9NaaC;l)c|ENNt{c zQQ`M<#gOmp)kEuN^^RA1tt#*pwAe;50%<~f4*_%%fdI_hgH;KGgxUo=xmJ~I@YUct zuYCaPK!Um6>rP%JyT!$n)LK3tJn;<^f&J%Iuffs}?!;+P%)H2_&FCS)rN{2S)w6FEnv&$;do9KpQ zH$O(7b0C>Yb?f&L? zQu5S*-slq{;oX9BDCPh;h9T1;w5b$5L{M+J$tvaS0H0YF#Pce{@8fPwwvHC1a2}Zp zz4pYof(R-LwGJ&h-YlxpFFRl6!^m?(v@O%EK*gfv5+DrGl6mr?@yX_A;=jJ!Bb0Bc z@jTsFD7Lo}q44NJt4(K)|5e$H$ObJ19nXphkGp-2O)gKN5Z^8Kit9qD^AbUW&jz+P zK$VIRC$wJ{7!ca6%Ly2A3QB>x_?nxsHo^0GvI-xkwdHH&cF@t?j1;8CSo8t6aol>( z)c#nX=HLANtjO!NOQveb0i8R3X|nT97?9!gS~-){Kmou)yD90I;0uxK4hNPD;2e8f zYC>z;rHwd_TBC9eW2Xb2hSLozRY@ie@e$ydd5-7i&OPRuQr?=`N=?dwi$ZB_rtoAe zbGQP5*J9rpZt)U%91>Y6{i}(wNaZW1?CrS@rfFNuBQNyC`#-RX6O;wE;SA;b$`w`K zH<$y`n}>X`AMANlg3qd=6JoLb!A_gDqX6&#Eou`{#np-0ZN%Jk)7W38b@JK@J81`x zY5Le1QwCpnDYWJ-4u$zse2-9+{f>+`kFTJ^n${PoNd#s!nroXDOW>YXi(C`hA`_TI zbuFj{eCu5R%PCla!yv{59xAoM+?k}A!?0}SrMxYqrFa#4xY2P1r@6%B79E~Q=eeI; z;^UQ+u%RK^nZYII$gNRSaT;`twrIV%LqN+Hhvaym^RKgc3D>}cFAj4Ry43fN76Wa# z4q1$^1#(!ux&$U4hEUbVTHL}b=CbL4{p@j|?-VJ%Q+`Ukv7UGT!x;ZEw!l`jHJ^pj z0t)rg*;+7I1i@!&-#PeFIjcmoUBwd6?kHL_O*h_YhRg?3{D1-4apF^?9R4c!ui!A) zu7?DAmUhdQ%kOZu0?`>P*P%UH^P`=$+Xy(fZLGWV?$q#3!uNPWNnM87@?NKg&7G#< zqWlxUh`?dbxF=>kMhS6akJjvr!PO|BE91+#up0O(x!mxz2LVY$t__tQ&;=C!D1Y=L^%Go& z$4I$rd~IIkk{WAM)g$?ayWT6Oc}W@)|&0s)XY1ZHWU;?oPHegsZ zEP_E4?u44TiEDmb>qXg{o2T)f^$>wYc&Kc&$YCMk)b~M|#q@FhDQ@u-bDL>1kp2m6 z@4LzaMipl0oxfZc9oSJ`&L2F&HZ~;W#rjW2+25U5M(hC0UV##!9kkZIQ@`b|rO=Lt z5M{s~xAhDu35hX{I-8rzQ+OiNI*eGa`eFU%q{s)inghgfrz35FI(TDQ*oCAEzeIS!fSriJ{9INb|Qju@>SVdbr(O`N}; zb8GzT5CExm0QDZQoP$>(7Qxmj{CO)IuT?omUq5I&NGfQ!G0Sb@g7#d!xi*X<-J+AmN^~D;L>*pTszJ;J(dGs zHh9e%y1A*%*R%}xW^O7OpjDv(w=1=yq(gZ7vGged@aP@$n$+tFEccZbi_&n&V$Ydd zuu@Q#-2S?*dRK#HIMb(-P|e`)O%&|vehY|V-1`ctR>eG(Zbq#_7hDAwzs7+qN}#Y# z+cCTbn8<67dDyI0)VG{M~qr@8$hMppk|g&H&t|wbb=e*EVJv5pEgsYX}Hc-XL$qtSYN_Q zY*MVN>0qZytBU7vsM^s*ozWNXP4tX|hKqI|iQJv3b+p2W(9#qZ5UCYu&~*G&2)5x% z`iyg=hXGc3Y8{<5dy{7>kCGtm|0IUb7v=>E&%TEuFW-`K8UWELA?>|#f)Fy-Ux6=Q zyatYwaW@4NqN+enFhV*AW%}@hD8$;V0v^26Q;93miFKizWI)c-ti(>Tcn^;Lu4O1h z#q0?%Hkc2iP}W`ISUXx=cA^fkJjsKJ?3O-&=sp>~{}z!Lt$+V~?-nB=R7-RF$@?M} zR;Sv{y`XPk!99<if#$@(47pDA9&D#colft(TI_f-&onhn z-znKURHZzkDAMii8Y%8Y(U-y;_o~Tx(r4$or8^t+$zz$R1mM%w9RL{<1iRNaj|&){ zVvrsn^u>|Erv+(s|I90agxFf$YNk{h9)d!BLXzU)NoMuKwPJS2b;n@@q7JU^3f+>D z#%xHISN@>&-m{L>!0|0a}z|I3gc%ppt7_oYmFP9+@?SB28e-;Sk z^nW3hxa&`&74LE}832#f#5A5|*c!C7IIAx!Bq;dP(&VXPxF_GrE3wn1?W~0xJJ1%%3FebEP2{(aC zag7E_%v%h)8KnUL2~x`Z{agi#R02T_Wcq0_rBZ6s)X-3dea*02k84!_7f%IUqeQK& zzOJc#al`G(F&Jim%s0<-KG>4bkDv2ggNhXv=Z1b1!=E0PIDYr@SW89T#Grp(<|lje zmh$D{pwUQr^lnan>AE!=4lE1IPy)H=;sU-2cqf_BZU3tg?xZ~q>o7yh`jTXa>PipW zjh(hDam62jTD^gv38pEc@lHBrxI15`HQ}Ilob9@98Sxz$8&nKj3LsgnWUh@Udn;LR z1m{MPfwEn=j2`$nr)xdi$kZV*l%vKs`ADnvaBA~BCiq(4Fk-F&oJBlKfg7slnF`nI zHY^84J1@lJ{qYXfEm}^3-E*6GLc8`dnMp*~PUZ5_)*fzUk__6}=s5D8T8Biml(_{@ zg_YKgRt4~a)?@R7@2}yuwFm(Z{P_(*D+Xx8lTtJ;ec*+?#A2l$DUaiA!{1}-bM9q7 z69A5J`(6U`-)J~^_S4`G0Oe1Q@H)#(Xf z0{%ZZQzeum$`|8KC31&>CSoPhF1W3M!z75%&%B1B8CSsu zK95==Sw&*81m+=i9B~=KMi%rNR!kj&`j}FZ9usqa-1OWrQ<_|dlu(f8>gw@h zZ0MvNYbmnRFsCd5U6W@p*`@W@3EZIwWXsB?z#(G?!EUWh$LMx}BC&(<0g*^j$I&|J zVMT9#DUcMo@|ETMb2O4Na9W>I{aRc-JbZT0+-(}M3$(1+4!{+Q9-VtAp1F0D@(rVG z(L90S{prkAvZ{T5v-HNic87wSrZ*1FZ__6K}`L#>_q8DaDCdW7vhz zFGKddL9Hv}YfWQw9tx2j&Dbe=uoZpsUQQG?q^>T;O#W}?h^nfv>hBimUaDGb`+6Y` zYQHnEZ5o#PPdn`Qd5|7r^5b^n$K8;KM4RT1SH~S--0w2?cXQoJc2op)YVC`8Fd+ID zxo#e1eF@j@=*!NyaMGPtUqSn|SQjueXjW?YE??asgeeV8J+~3MH zuJOC&m2LK&uhK%@L)ZOLyO7+(uh;1BO z?bf`sMQ-jt>Fpvtgl(pKP6VBJx@{pjPP9FMQS0<`zoV$PzvAq1!;=+5-{!BL8ekSA zC-nbMWi`-60L)cPLHh)oGrkzA`kdF-c0*2c>$`MwO#72d_jNs#deuX+ibg9Lb#)Pci8C=yDvuo>w25fEQa9;Q+hsEQc3ay%m0(J= zQ*3gm=CtCn)=F-%_pYS?=X+pWBWWmutDT`EZ+pSZFQx1+aK}tajlV{ z;8*G`r6(wsRHe3kT1o@w7m{zRn=@l12YWq1#HIOV|0Fxog$2+0g`zycJyai`T-kQc z>0_v{Pu{=zyJjr{lb=Pei_1BL_S9d;?PEp_Su3><5Vj3OY_k+GK`!L=Wd5znH-%ZM zMG2Pg8jB3aiQpw4w5c+g`EB{QZZj<7Gb4=r_Vt1QUFkCXM`LN(ST%CCB5Lc16|P6? zRWbqD6@^KlS2Qx6@%l0=f6ken-#Yu zny=9vgx9}YPMfsdOdZ|VZeiV@(Qf=nQzm@-DNXU!9X5*X-&NwU&Q>N=$CG7>XGjkhZbAMB*goPDaMfR{Ko5`wb(5iT#dVkli z2eZFU>e9BIvKAWo@n=~3*@J1#8_&#AUN<2s?5!=o$J6o~+f}{bOCg7{hyR0BZh*`R zt0un&zElsj_@-!bkfcg}M7qhmjY$4UW2R(qzffxaRulv;{sB{53GDg30jIv+xE~q$ zmOx2u*!Ee{YMa)|9PkpZbXqYmR@%2Mc{(;@M9N(`HX^M@J)bxXcaOO7%_&aGSUC7s zFwI19pU>XP3hG9EZtJOcr;vHNoHSoF_3z*?f6LmKBZ#;xAZ!t4|ASR9R<{VQ=%Th$ z|Ee2Lt8vX%HhB4g`Nr%QsrJ?y?^IU@bn{NGK_WQ2L7XnYHGoKojB8_0g)0Blp$t(b#-GS44CGisK0>&@Z+LCBw~ zyoJh-vIzP|$QUNutNzgfH=RGJ$7nSUI=?czu(B1rQfLBW28jq24=alN-4p#{HEcY@ z4M7fQKUy&Y}l`iwFJ8u7ZW^KQ1nq;*L zwe%__trq_AT>p5RhRze%WcoK)y~RiEk!K9{%}oO#;2;9uG)beY`Rq@y+5NNdJ8XT1YiVm}$O9`JLN zQ(qF`_iZ)kNBL!jy?5njQ$Ii7mUV|HwTBwFf}ct1eN5M@+5aaw9cPhf(mNn62D+7$ z%W*#6R<$%hmTR)KDfRvh)mpBfxG?6iI24J>nhf(H=;T({*cEQ#5kBFh>`7#t!+!J$nUeJ8 zT`<*}qa~kx_GM}s3-4)RRXx4bR{{i-7pmRHk3Va|%UFgSzl}ZZak2k!zDVuehnPEA z+>XHkfA#C$80j~bd(v$eNp~hY51y`uzwpt5@y9iFP3GcYnxcv`wiV2eusV2@H|8)Z!eo&ctntQ~aC+;Dn7tBX zlLd;UpLZ)C8GRuast;)YgGtLTWAAwcJb$_G;D(y&; z%?h%&|EhZPLLAN~TlI7C(Q2!gw+c(|D?So02;6qzN<&O*4h8)1#{{-xjQSE$_S%6dLmk-D$y*ydy;{S`=G#iDF+Cc=&l)?jsQt;?Be1Fy!g7~nXUyD`gfQDq z3EyV!2{I$Jb-Qb_%Zd;Ww7Yxj4wdr`(Zg)q-nXtC@H<;pJHK(goaO=*)`tzx5XZIG zG`F%)H_<{+E~{tpB{%Urq{mEC!ck_~A|SK0z|ZseSb3-eaP~2Eeq>msIfbC{&po)y zDY{F)`mCm=v0?a4>gPjG2Ta6j#=y35Ghp1veyhTOJVEJXjy)Gy@?$%QS~8=&rjIU= z5T@np3H!e4lXrLD5U6K#NiaV$1k#gmo56m*x@wwJ`Vd7i=kLUWfHJjpp*Y~DV$6h{ z#VJk4*$3B(d)x1lIDK;Fifa9+@H3dmk8MGdwmwQ0;NbtV?&{mT?=$^xT7NWF_AR%{ zdQ5TbbsC#IYz}bbOOTcXL2|G$KHq zZ2{denu)QgQkS1V z&?zF204PnI1>XX)nC8UgI4lOUqR^f2y*evN0jf}1H}V9OR*APADX*3A?d;0&AZ74Q z|LIPeCJ2pNmxB(@($74AlU?WL=apKdv_y0lZ5*P^k(qDNwLOcK017PJif!3V28>T1 zi!;-R#Uk$t{^6|`#gJ|>9T!efwol_zsI|R=w=GII}neQfQe0p1k>%{y@%|2ew4bL{0>1o_X;WqYv4n1l~D{(G6@b{I6 zRW5z4nnCq*`#iu)c1?D~p7YTDUq?P{#ec&BTi<|+B|iZ@B1Zyb*bHQ&oTt&IVBBzm zPdN&Y30Tf!0gQ)^73{jJ?6cUAHZ#X_Y!u&S6vw~IZ&)g51{uC*!KsO*4CoU=7P<_>lQO+ z+|ZfYb6EfKNsrYkXkqgjc%*G)03y`8q^=U45){bZtqSL%Otwm69YO}8vW%YaJ-8W{ zdGvOQ&dQ9+^f;3Qz ze|Tr6foUIAAi7kJM?>Af>QOSuC?2Wm=OQ?`^)Klt#f+IqdtK>?&9xe%}z;-w(T^# zFQo`1IcBiRbkBFC@PDQ%kfL(+60S^Wp7yjNO z?3-GAmATExvuyKc`8q>zW1*Pec$0=(5qnN&|FzkDUJO0>LAT+U8CP`XqtcI*aSatK z!)MXAf({EyXHrz4@EgmU7*RC&+s`^*g>uegDJeKo-u5%_b*yeh7 z^Mp^|&|F0>x?h6_;OzqN4QqlIbrRg|>+CUtGQh7H<40+oL}l~vf?vw(NqiS3M+TR{ z%I0$?+4HYIEGw zP6zC|e%Ht}^H0?b7TAN=~pE%W)0y>BMi}38zYwS zkba^E7OK>y6(-W3e75SU`-3Y*cj|wJg*n&QzH#+fU_|cjdq1eT+~8b45fC~!2k{p+ z9R;8MgVj)%8n|hfA?ZyAzCjIC%q3nK8r_TmvH3!4IHF>O)DCscT6sI^#_;uhBx^CK7siJLzHPg8hLeN#!~Z#p`o~H`Wf*X zB}Z`+&&KtS9Fv7`?x59WuOQaDs-Y!fUJ+zjac3g!K-eQrUwGf4Mzlf2bjV6;ejoM% zrgUm~!tMQf1ii1kVm;dVlIlT1Y)3H{7%9b0a?anS$_kE0Nv7>1Uts7ft;8Pi&Tk zDobIg#j-lz`N^zo`;FFg`%U5cNYDG)X3j%pb^Y3ogP~HjDr#PKtwWqgd8=zLAFSC~jW78-_gxuU zKDMfZWOnL3MyzZ$`)%4h?Z*TM1n#}pWMQx9^Qf&&Nb~K^MX!n=dl*$IxarxeLssD- ze@{(svo;aBPYLRZPra6$T$}Yf!25Q7NriLS3O|7MGu_oKyl5!} zQw4PNvukExCPd@V6i@N3G?M6D@(#Y)^j0*rTU|Haj)wPQ1ISg{&lDRs7vW8LT@KB5 zA+^S)81^-oH&w$0BN_H}ISZE>8){QImr424C-u~4j;N6o`|f#PV0U8KW_`3+}cr1*wsiBC|q>-(4WdXy=O z`;3s})r7ET;YTxJ%e@1l!mlJI68k71^Jv@ru1kgDaHdL(+T(qjGWI5Icq%dPvpwce z;Y1KtzdSrjW;EJaINiCrX52$_ZMZs&Gi*oQy_G|_lNL*^T5nGikERl9(qgb6-V)9Y z?Ro6a*JJj1_;ls(s~?`_`8+m2$@vZB6erb1MY@0VID-Z>@88)ud0#GV71HU}a)p=N zdj6X6I0A|PHIz*RUqRZ00sN^tpk&?T5}t%E%o#ZB`Nls0mYOc9N1oC&#M>AB!GT6` z=KCw>Nb-Y4jp?V?Q&>@2ry^he$ohFFedb3VITU&CJ@<6IU=n%C@^4j~)l3_`Gsd#h z(Yv}Wz8L}HV@OwpvWzvi+uSmt4F3rVU0bEKyuTo^Rk)<}CSrAbb@*y%QS3RlD@1Cf zadG6KiE*vBn{ZvhXF?TWv3XOHub;+(FBWj!+KD^x!nA@bBee`M`ghwBD9J^h=L(Qx zTu--hE2WrSspx0xqY5mVAfnr7onrZ|gwNXlEbU7W-nhw14gEbzd|n&-n^`{)^uWIW z7TTsw5&h?6q9^i3>8o^?cWpWy&$?rcg{O}s|IAO{Cw${*N}Jrk_p067V3N75u(pZz zosD@0j`pGOR_!Afg8c3IFYNTxT#Izqah+8+oq(T}A$ZUr`vzaT40&%} z=U?4w#LIEtN{9hcHiKnsF2Os)ehR!)Xc@SIPQ&T;-ko_`k5=K*o;W?*(6lz>p2VdH zL}Kkkugkf|cIFA}r3z%vWAPootesx%`FOf3uuoSl!BW%c-oH0r2*a}#_jzezf6SV6 zWMq7e{mc|M`vMDrJrntSEjh1o^6Rva@D^LdGoeD-_wuXv7yOSNJ?`j`oz;5|?dRrp z9aH`7#g8@TnxV-s&iG1{Ta-h(Kv&QKoU50FcpPThk_9gbl>5`@R7Oooe;%hD{Wv^- zA1^C6lIfQ#5rL8!x5EPGQ;i|MNolS}lucFY_xlLH*L)tb3%N@#TITunt2o(1?)ME{4c}-pixEGa*LhF`mhnwhvLLT< z{_^>431b@O>y%w4Dh?9qCO!9CRAY~~+8}N0oiPDJpLLqiR%J~ajF1<%%Kec2eiaO@ z=-#L?xyF0=2^Vpd_>WBN#Pf{iFp+&X1HZZSkgI1Gr8f^ocSjH@5?*UJAj@L>(Ge07 zS1qN=cm4Q*rvhzcFQ1bALSGSkU zjNZF9B-w9NlfzyY5|(E>hls{)AU&~hOB`1{lpWaeSiL``T3X68;hYTsQo!SA0= z6Ps5?Jy~&!x^iuHVb*I~p!p7#vi4Olx#d*7t^i}t@JG{nX#ry zS=x4ii{(z}#4Bfa6a4xlqurm!>^yn?^MA1BjF<;KLJj>-@BBRS`-hLX6#PI6`Ec97 z@bfsEW5N7=&b13y;x47w95x7*U$MJzvL$qM(!=0)^GD;-?z&Mwzk@ZC9!pWC8?7ia zB+$|x0(C4ArMeO@9^L^27U0wwW!6KI+)6e#DaKi^1##`k)8wZ{p1ZkHi6OZJvGH*X zZAu!gVhvuT+Kwu&PlEntbJ}B9!c+fM9h9xDntf!STj?i%Bn3Dcy0Ltg)VR4lM4@N{ zNXr^Z1jge&iT-?@X~GV_65XM?R{6!AeKEa$I^}D`aGzia((5AM9Pi1j;sW2Su!#K3 zNX)zIboX;}H&Xt>LOO%&B^5O8isV215qI*!j}Y9vebNF62_uR5S@{U~`Ykpy z&BzJF-Pv8Hl~2p@Dq1P#;nQj;dz!(ZZ)j590kk?UyIX;-Q(q8>QQMlzE}Eoc97?E> zB}tm(5yY~8bOKK@z5psXGltizbUpO?jo*f6(QDte<3l}aKQl|mZHwpSgUqE=2X*?3 zM!vRuu-p5&tY5Zd*FrT~B#`MPl+ml$_T5^T`6?qe`DVfnBOwfv_4t-#(0RHD&r66S z(HV2!nDRYuChU7|c+0Dd7bNwHjfNUG3;nR_8fOe9B&+1!=u$K-Qpa?uvJX|Q09bG* zqT9*hp@?{NwNFR0R6Ik%fT%d1j~v147W)C8SxtrL<72h0VrNI{8VwLCege%g;dN7= z#1J#R?Y?3@%GdTM(2v~CoT=KpF6d@dGnS~_b$iHR^EzIE+e0D4?oMe{@e5`kni<3wd+t9_DOvcl9cOGJ^6pkx8oLksV;cFd?x&p(Pb5aq)G>0g7lRy55?K<>>7Fhz*rwAf43rwleJiRE`d=jI3Q2vXlvt~`rag!wSn z(Rp!r2@8zzut4h51SEt4Rp{qL&yh{tg=mvp`xdYrT?AWcWfEBy@6C+FutL-KHgoG{ zAOBm$lY53G0lRb#bUtL_;~%w|LSB}$ApY!A551TZq8k1tFqoACKBi4J#>#4^i|P;6 zn=j&fnM+!)ew*|teh>bduI=qw?VMt>LTY`59b4u&m}ys}V%03Zl`Gg{{j(QliY8jA z;!xG*3BdqEl_b%-X~9QB8r)8{RNM4hjOjUY2T=xRbf%SiJkyJ{a2Id_H^K1CJzVyjx%>^RYm%*1l+q=ulG1i`?Y$~2WuL7tH;V^G(Vrd<$hT34OJM_(j#*!JkxYH)Am$H}dlmHflTyRPL$7}C zVhT*!2QIz-KaS2auF3v?`x_gKk_Ly2&`psJm5|m;U~&;6A&mke(%mpXutp65FBqYe zfPf-nv_m8Y3eqt~xZ$L`<9DC``}N}49>6%``-$UtA0Tg(AgLeSeux&)ZEq(dK|Cz1 zAW*S#DU+|WMS(T!iL4P~qlL*p+C(2DDPojkp1JTdWZ?=Wqt171Io9F230Y>}cCh&4 z$B&~`?oHN_!ENic($@;qxLzb$_c>zGj$xq0xm84(KK1ZQ)xX7E0xU34V8X8?lwU`h zA{UpPFGS;&AZzIEw0zCpu8uq_pi)p1?ncMh@bETRyQ zAR}5)g)=;SThoh{Q0$Rz4rL0{FudWG64hGh1@-AIXV=v&jKD>>&gsC^K#YyfV%fr? zM75sB5N8>D66j%@OFN3mkbHqXYQ&yTSrFqwmH_BEWC#qq0Z1RN)2ef(7As3?{p%~J ze9==rXFf5j8R+Y+t2cc59FOD_yz7^4Cpu+>9nX)3Q59 zG#jXXzTgcQpHk@Vql_lWwR1L1|LfHt;(DJ9esvO;84ktn!fI~kzxiB|7;Y1iSDa=# zZT11wqvqWKgKn|h+}2->4VLq&BM@4r+LAqDH=lf8cct!Hj|Z*QxVe>i625v)mGu5w zq1`_i4uqXwJFoa=t^usFfB}>z9R1T#Ka56&NB{fpwX7G&{5Dchm;T)Bme4eanx>~d zea*aQ;38K4D>ChJlyk+oV!`Q_M%c(4-I<<7WV!yY3xo58ZogsAy@spIL}&b(Fev!` zw>^*krM;%wj6scc&!CX69h1cJ_xLLKqzrj#Y?f*@woG63_8A>ye~C)o_iv8ZN1N$F zm7Li^A0~mACi+RBOOau({;2@ApJs~Z^Zv8!g71Rn@UA|8^$>QX7;jISIZtP#7zj}moMG7+q{H%M!SzikEr=PZ21l(lb%6ehgam;A29!II28ILY- z7aUx9Uq>v{r`D833Nfx0hay8~T?Uon1M!LQzf71yK4zUX`c)J-H9LjX9Ml8-AR)a? zg7W7iK5~w;{PZ1?MHWVZ+P_R=3e%c(yJ0ATI7;DS(rqw41EW+&pTjZ*C{gt0E3id=h`?wZDrp0g*f)+H)+cH`oJ69 zGR6A(D7EQ^EI7IC4-LNtPT*sCkfs=zkYvv%eLv&r&nKtU*be&67Gd1D*Vw~bCzrAE!qna3=z{*o|1xu+ZNrHFM(7 zrC5GV@#1A$?q_G0o{GT-t4{*wt2n;jx-nko#C=fzyURG%aOlQogi(b@mi5NO64TYQ zQQwPqy8W~t+dGRHBFi+w&tc<1%Xm&)M+y7<2ri%l6(7M{2TleaY+>@W5}t9x!!u~g z+w<{yk+J;C<=D&KQ_VKM!*?o&t7w%#uxX^{%#XwK-<>|WuVm8{rfBWrME93%=R9l& zR-J%|u_DqL%R#IEZ|?J@Me_rI8qqzhM*n7X+4GB=oZ6gu6yweDS6)AN*PqJ=b1PWA zecigZm+GrUT)B8GITbTb{2z#z_qBahNypQ{w0-b^eV@jCf^t;8i9O?geY*F$_G zS@nf!{IA%DHj|5`dphSz-#;Wej3?ddpS8sVy!FBe*3(_n>%5UrhA+rHUrp4bbKe=G z>(=h9z4#4_{bax4-yf|<>VIW!EJL=HmI~AeIIcFMMz)5Bj5`n4&Yaa4pLx2KxzJ;$ zhW7+dGrs!d@z1Y6|N353<< zDHu(DjyICKYqxq+k1#V>oQ!hvI2hgVoiA7w+$ie)3TeA`U;^~A(g%6-lmYgG^>3;G z5x0aAme8@^buGB;XZe#0Nf}i(2G{Ngt6uPV=N^=6kge%nQ=~W@K*y=y!-3Rv&# z4OJX@2@+>&K7nA;71f&qv9O`C4!`^jKWr41vd9^{Ym{|T?l{;|6qIdxIfz1iGveYp z(;6J1(fPL}+ajMBDK58I@M(V~ulTGNeavkKC@~!dRtnB1t({yJZx;;^HT~`=WX%3Q zkW=I4zn@+bPH*2E*QUT;$uDe*{r54?VmU&)C9A1E^Mj4kDjP`!V~20Ola zVo5mYp7WiQM2|-~6)o{BwF%c96wy*&0Dg7kys2#G^Iod(rBvQ(6I|WaGD!f zDLR$}TH5O|uqf{WK=*u6p`!-;UrX@jakn<>hISD!PY`+vGy#uO=dGGYX7%bfLtorj z{yw^^rO;7-;mYfGi=jd{&97StS*ZwZeyE`*SOE=fX>5C$Q=Lzxa^;N99v6#dGZgiB+;2H*oz)NvERRP*mA!r z>imI!#X)+F5t}i^Gy6<9_x`bA`s?sN3&pd~`P^SwNb4)(mzuWmB`jqoL>UjQT#qu5 z;=I-RV?p;?`tUz^{xds`eN!WqA=CGRu~(foeD^zQF2qdCZrqQh1fFpqA8v?P0?nYC zuUM2KFphQSp1js>OMG58%idlEP)i60*7MDB1|1jVpL=^28We}QwCgYjaTxnJox42y z%sa}OCI8b${kS!Hg*+Aownk8%=98V@uMITI^*(C`b@oMlA5-qq-GBYM%()7zc7 zs-&3L&W>_hw6#vCCtc6imkH%Z>0p=j?-cO=@Zfi{prC*>Cae;|4D=NN8u(S1WJs8# zM%(~IRv8Vq%6xk8VGNrmR9HT2mixyn8E4;TqqY9Nx%plsmozY~mx?44-Kko#)iqR^ z)uzt?OF%ugy;Wz!Fcu)s9EpDiMm7bt@(Gm(``?;MN?Yd(cmQzK^Y7fRO$$A3?Z55+ zJ6abF`3-v&Jj-FXbmUDp1MGJ%e%YCQY9kVxzceNNfiF1a0S-V}#)&}bti_1zPR)U8 z$KJr`b&An(pQotF_V4cJJBzyAd?-wG!}?q}>#bT7bv0d$U@ zzl*nA59a4z_+6_*pf}P%lEUrCLeyM_)4kNm+jEj9LaBR^8`<9hH+annzqQSQ$fiuk z&3$Z((!A4iV4~mR|AG5;8`s88sFl8)yTL*BM!ysIAc>nh?ENF(`yIr>2OQ0?rmU{z zV8Zn5mpgI7(-vGJve$4dii&~bl3K6;MfM~K&T5OT?hwV2^D0I7OY0^8LuF@u`hv za$}kd_jCbISm^Cd(BW z``7G*2spM!XtsF6JhNn;n1H+39Y+% C**%TOmWSO%R27WSfnya7!D5|2U8of=-$ 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 literal 0 HcmV?d00001 diff --git a/third_party/zeroclaw/docs/assets/zeroclaw-trans.png b/third_party/zeroclaw/docs/assets/zeroclaw-trans.png new file mode 100644 index 0000000000000000000000000000000000000000..a76068f234edf705f67563e60884ab42d7f72798 GIT binary patch literal 2156411 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

B4Y)F&Lb88@q$mV%iX)^) z)YX51&8b~JXZBknKn!J&EYKt)rXO|oMxkdC=ujUvel`|puLWk>C!?FQmVN@L86JOs zSGoQc!%4(#F#CF+4$rh}-r6kK_9VfX?1&=fpa;|x#?>{0O;F*wN^XgcdOOh{N(dsK z8`J>lPZ8i;FK6@4dZ?q7Zig$JoVzgN4iKt~06X^+ z+X1j!vTin>G+66b+sWFC&F>)z>)l-kS{;xVTjqCicFDlVTORO)^H%_RNQ~BB*-m+x zO71cn7>UyhA<;e)Z`k-q{gF#1<7Q9-Yo1!@Q%ngND^74Ib~8AIjyw%p`XBJ8EfaYG zn3{yYeS?jxM;c^K0htI^%4BI6>oj1L$Z)W$DyjbDEN_C`WB=C5hOj0jIhNpPP--}kAfS%>=3Lv4*7j}4GnxDjNI%!*dtv+$uRq6N z?gD5&(h}3IJKnPa(dUrlSjU4+YU+kh=q~)Wxa7G%k4^!WsIe5Pxde$4b({(CR2%d} zC3()Z3)(C(L5`&DS3)2^*Yo=PKM+jY>{aU%9KiW^wu#+2I{kVYgLDCP39JB_ibHab zp0gUt3Z6N$fpL!2~^c6ks3URKDdYg>h1Z=Z$Y?#|36`V2fV| zr0niqVM3 zg4g3-wM9WjrUy}e?u)n6$0LEEmm91#V;`Dwk`X@h&!uPiXKY_z{Hs6G=U9BMuvf)c z#+h6CH$7HCMItv^a=et%4{LS&j80})dhI=7H#OrK_y6Mi=ERI;EifhVABTpa?fWkX z`E8Vpv#T@m^jiRe8U;x(s)O{X0z$sl&bW^S?iW_nF21Gf62CNA={8+I~)J9{>5g zj;HJ;?0~J}8HfwsTO+I4TuP^>&B#{#-?-`L+-GL7vE6Y^+_eP%$?zx85kK<@6ida~ zxunwC|LcA7#T;(#l=S&QGN$`9`#}d^z#%12s?Bx;Xn#qBd~v~;e1J$7DTO@5kt!@F z4u9kz@3rw7Jl)~I77n91g!PPu`Sn#8F;amBB6m^lxTjnqfJ8=B0a`2z;s9ngcCx}4 z@0F}Qn|JjqJ?FCqQbw=TI!*%ylzf|su+b_q7r7i)&hCi_uL3QaXW5Jd2SNb3F6q3F z=d9~2dmH&-&VyA1N2#+~c0K>+jHI7|E?Igh;DzH-IgotU9xt-QtgCS%vh*I;6e(+x z3_FRGx11fn;S+4WgVR0Y0}#V`_}#CARpI1tnh#(sGslrga2fsYN8*eLa)WQ<`ETb~ zmk*>LfUz9%(HUg~lao@Gg0M{R2 z(hqTH6c{HOXXg&-&L6dOrS*9ojWUTr;`7HPDJiL#%cA$_Q$$GLjxMJSB_l#tO z5O8zvN_^w!?}8J_XUrWR7qDc6)L@^iun72_txFt!r^`Jd1n5_V%uQ1;pUKYv2A)o< z(u(pXU4iSp_A>dWf@lsBPWjP_k|~g zFl;^}3aNpt2${x)`~LN)&QH@XwvkTPa~PLLmS_G{dH^w@h+_|Gf!J+kiXS*1zpUDl zns}jpd~c@?3X$P{(#SN#Y3vE$-{({kflEW+n(!c~mGArcF?+`!s4byUIde}&Xo-c2 zYlIwKXIaW*kW9GHQzlf>$Aqz}YLg3o-p00{{mk9(qYZj12LLc?Wz_87jb!y6vRxf9 zCn$H3bHMn?GiS#!I>_~5OF%p`IuFe%B?yRTzbo0f^x07z?IfJG|Lv#s%tHyJ0Lf>S zFD6(nr0wHR6G4U73_$(841F<^ZJsuOts~7Juy)lAv)Jw?D)>D7`xXq&1<>iUVLa%K zuirqV@i}#E(T)X^AXq^1E+hsIgzMjni>28-KiKcG^jixO-)L`^eaA>IV3CDv6Y8 z?!$LqRbWVED~gY-XfzZCbc_hhd6?yDXV)&aKBW}pOa%);Mmh>ZeBI1zUpIJ*Q;e^h z+wbBsv`UlR?fJubG9jNWcr|}VYcaSLoQ1Q0pR;SU$5HZ{W&OE|2UiYcd69% zw?w|z&3%)Y^tYl3#RonlJVrsWDv~dM0@Dk%#T-rjDX8nDbQXJkVp3GA@;R(eYaqOB z*IJ|VXTZ4Sp&k1a!l-WVpd}n(e;@`G{4reA;eIOb$Dz1K3JeEks4%!*zXf7PT4lh8 zWv&GAi+J||SlLSVWBz;D*!=wsLTo+!IljQHThFb_k}5CweJ}vn8e+aK0Y<+!IQ;zn zV4P0iVZeWhfCNc${eV%v5C!Aj=kdiTJHRCbhENsm;!zI&7c^lTN-H70RvM!pgMVz= zGp^#305Pc83_y%>44^H!>n=xiEZ4W8@RLp1m}`M4KuX&06Z2=+U?L1&2w7SCvg&pSn#6$HnL^R#^YKn^(&^xABI$}YPiA#W+&EV?ix zoR6XY08v1$zx)&6I&(B+x#u4Ex>-e^9Y`$J&Y-xQ;hpjv<{p#+>>+n6`wY@>VBaBg zY}g`=J7g+`&AgJ-vll*!m@4k_n4GvEx%S@;TG@+SPY9%CU@^pxBP6ApePwTB_)naT zt;uG0L+0fChS5AIoP7UM1WL%^qv>6 zF_1ZRo#bS!W6n5%GZ|F%1r>I?$@MdiAzny2jfn>n8@n2I)d|22}%-)Mebmu-~FnGUg)=4}F03;R>! z^|AdkoN(6MJp`(rT}yB(@Yb|9k~HlKx$=EL=hQ5VkYTy(Hv~= zK}nRW*gw@K3Hxejwdc3@H>xrbBsueDdvGWx2w@q_ulg;7+C-1Q36TviEF1iR?~r|F zFjdYg2OqROzQ>riCoZ24K2cI$Hx$h+z7f10I zhk&hLfO|&uS12K(ie!!FHYhzC3^C4bYD*-fS-)yhUrH|l>OQ?TT+j?MTdeuPTN>0< zxy;ENM)@;ju(5Hwk86cz&*K1SQ)abU?#Vr~Jv`}01P~a=%vVWtT#~vgvg+CTbdSSz z_7!3Kl4bGNPA;8Q+LYu;DnBV>{LZ?mf*fEUPz>0dr!P``ecMTZ(_H#Cs6VhT33h@D zAW$b+@z?FclCbr!&f*BK?!?Pdo))}{U2EyoQ8&JM=z~+(nfKzfRRe0&Nb7C?{hc8g zsQDxwLp?VHn<4=3S1Gx)Z-wmr1B33<3;!<2Y4FKsO?(3W2>wgzwCwDSDG>}Ver~1> z_?4oLlUqALvYZK4C~hukw~4>h+So3cyi@#F?B6BzU5@yu32afmFL`|iya91h61}d9 z;67y@T(MVbWcVA5JJVwV?ZvXWtwK<-^@XD}?cNmUDMeB5&B5t!qOM|KZu}uB7{2ZZ zzzgmJIh2P~DUyVpgKCeVO9V8#FxPru0QXjIG~FAJ<$C6SJu;@;O;o7`mkk&VFt#IQ z(JZ190Gtb=gi+qiOY8K{2cZIgkLq{mL|SAlQoqQ%SIN?54k7-^#gnM@?A$7|55s-p+p?s)MeqN+d#L*&la|g-90LU$j7y%{xe_HsiR-bHc*Ke zQdNwcI0gxHFuggr?AX~uex8Gb+Mw3^b5J6iwafcD%Y>A?e9+G$-H|kB+2ti0@_TVK zIXeV^QZC_L(^0uv+8l7Prjlw>oou$6-}awpA*wHX31$cZiNWo0F+WEn}bi) zHO?#8MQX?L=0F?&%dQ-cd9xDbDwp(ZAty&+Id**$FLh_vOdm{ifevi{~m+T7CYx}1@ zN^ZS2FrN)-mjLWRvg(Ftn{ga$H8ROQkAt5@6DB3kLq-$-Iw4pmUUN2pbYnIjvNYAJ zqVZvks($Q!0O}yximyl!22C=tY3W&0Md`wGgJ1D3@6q<1$f&AsXZzrb;1R;Y&Abo( zQ4qP_A4!psR^1W<{8NnDVuR=Uubi!;OJrpv?wp&+dt{Y>Ne^u%`&?Gl=ciEj;VX9i z&qYB0ZQ|YMrhQ^9-0yiWv(8e#D@!nDr-|t?G$CLy1 z>CCNPKiu_`W2*8fT!6Xz3Ah~ZSVC&`1_8eP27bPLhaOpFT?@?uz41Y0aw9wlDLb6C z#q@ZJ@06FC2h8$rzl|udY!>pH5QKU@+4SZtH@x=emi6c@`ZK`}#s1qK*bdocAIf_C zc`m8(^K`lIR7l&G#MK7Eke0&kSt(XGxRrxB$#<#VlJu_1Xc|8~qcmA-RIH;RhfMeD>fcl(c%El%nxbM@@ z&{m_h%QJnyCvk{+?QT9gM8^epgYEw$LGpfE>JsH>-=KQf_XC>v8_m;{hTM2EJu<3k zrHi4AqBdA7lX1>4rZfcMlxqI;>Xt`I?o9J0Su$5Gxq*3za#_t$KmSa|J&Jwlp1@5t zqn*<$!&lLurn$7S^Tz7qusfYc@m<1iUr^6Fvvf(=S#gJX@WR{w@v;vKJ#`U3Id_~TbfUvfHr#4uw2jWA; zIHEyy!IRaij5S($x&WrB0~BZP=(4rrI&zoZw6vcY@bT;&NsV9QFcXB9$QBm|Uj;s@ z3))3J?77VB(NB9b-v-bCoH>Wd$_z|;G5|UIE+z5jhICS`iw#e{=k!2$q@KrpDcl6m zwhlDG<*tC!`st3XyS*=d0i$G1`rNuI+YG;SHBC~^F4Ib$D^gB51F^M+1Rw{3CEzm| z4XJql*``xzjMSCeiXkZ)eNC;LRrG8~sY784VqoK9JVx{Lr?t5#1u!M({@O)0^FG6Z zp@6578}9&EWB_!OGVDW8#Zmn**2AY7w*wC7H{!CQ(!5CBG)tXcf}j*hWy(#|0oR0L zos3Y}djpp2>$e_sBpMd=W*?o&vXfuiH*VPUCp)FUjFHKTWK|<|7XTyY9LsA^Fk!Ca zWK9N?VEF+F9wR7%5dwAABEd>aOal4TV9sP~z3wOKh+A5*_Z~!EBP$G|o|*W=QDm9P ztj=rC+4S-V@!??B9ek(LTZ2Pkc4)K6{mT7C5)_Tdegm*I8k+sx*wg;yyw8?rU7DEr z(Zd-Ud$B)BKlO4jJI`BEsW-c^;A?UZLTuaCyyIXi?pCX~(%z#4P}$RD^vM{`R}2^b~~8|L~F@#^8~_CY1c;o=cOZ3+T*?wa<|=ufq4 z8_dY#Yqo*uRFi1L-WNnTcH1@@+fR~C_?Wk3AGWq!d;W)jEksx*`E2iYUe!Ipm34ifNy%4xn##jZZ_olB2e!kL^ASBrUM^K;A11GZbSzwaN*{gO4jAJ!HdG23;q{en4;m{WQhGB=1Ki-Z4fLNPL*G_GGJSzI78<=u z&o-Cz&Ls$JP-1gq|#zf8MzHP#ClG$IsN|T@^?^mT^JnLV-*wC`FvnZ__$^k+cDe6zM3bLJ_*Asa9 zLtF$s+lLQ{jMy+Okw0}~VkbIz+u{EuHg1@N(|08Tls}|EJhr%gBwKtMCZawMxE3+?k8H@+=HhgUg`d*Ys{>HU%*2wefr8!h?^{w-C(k+y z3g#_mrUy1&WG+&B^#L)q@hyf7t&_@4UABLVtJXsq-~&uwxsJO5Xrwk2d7-h{D0PIE z$@$>=U>*C6pa0&@7Kb;rj$)(+3{S@=Xo9b zbD;RenbC9bn9YSJc&AJ#%0V4H9s|>l=BIt;)I6T;%mZIGc01=7*jNAPjIAX&bY@E- z9x^~fDMGf#!ENfK^GrDJ8R=I#ulINOyUHcz{1{U_3x>_o))Efh%^#T1-Lr>t(jfDcqZWyK3~s7s!+ z9L~5)jAF^RVb`HYq^s?^(%S3>r{H?M$!-y**4>D}E(qjFP zJgproz>n6jJLBZcVkBpN4L{8!6{cDT7Rlb}x{j-GJSQO2_U8pCneVeP+_5@ZRHP6q zjYB+L+ngr0Y2hDEC5>ik;+*Fa2jg}3az^K{H(bq}S=ZP50aLFHH7K=b1D|%+_9KHN zXYkBgPqGgIiV)qNU+m{gw&1N-Pd_MhLTHrc{OPpi>6NinA=qe4hn`Lz%TWR0V|7rehd0_r26y!hOAYe8)Fo{sjdz48DI0@cZH1161`K~3newO zH!+=(0XHf83+YTY=hV^LWU}=y5@&)X1v41DnI!i8-+&mbbCmlzyg#-65O~W+LDHVJ zXJ^SPFB-l}4u+ooLEwiFyl&wq$o?Z;QWV?(@qFHE%Y2+T59h3+A@3Oy`QSt1_e+59 z!V}S7;8g3;Z`B(qt*N5Ed_1yrCp*MG+QF*y>Z$+Z!0iP5LQ*ij$7PSPE%t-qalU<5 zoULtq;Za6>J*Svm9{+hh(&%pj0%EYFJ8H3Yj+<{;6@aQ`Bs9(@xaq~=S>pHeY=u0r z;vFrPT(W*{rqJb8F+#|^x#L@2BSB(OAk(Az9c6M=5=8s&8m6G#?{I_Tlz(9Yy_&|0 zx-MLAZyzEjdpHj>J4SZ&lT~g!Ix=c6?5mo8a^rP&t!O8V=Y{0f02 zjjCJ!$~|Tpx%+=P!iw!hX3)b_$ zKc`5tcLW03NlCH&8^b~n&#R2U)zspI@4bZ&$If}L-OSi_x^hs0lyYcq{h> zp`30|C?%VtlMF`~&6FSbv_CRI<12s>C9ASPE}(dOSs;WdK!>BYEn!hIEWvZnRmz;n z3MEKz_R6WA%dAHdZR+T82lWS$PS@qNiV_1dLLP?_Fp~OuSnP9GCinRO{IZwJf>$!1 z{03*tznh?sJG(M9Kpc&ndfIEcay9)|x(@l|23!rE%XeUlq6Niq9VCaN1S5>=)MaPw z$1Q(M+>A))hq1GMmb&U9Zev5joj`1TEM=KArHwqCMAHqe~UU8K#To0_Z(Dw1)X z`%cM>hm=mXz<4IX;bqg`k$!Wq?!IgD`o6q8XBv?G2?fwQtAyz3mHNMvk#gx?TR7Fg zQ|Mb?*{Io*q?7j&N;|f!_^uzO|PzueHznkbU<0KCDansdWCnkmip4|JrP|e#iD@16bDiMik}p zg^6kp$*3R+>fWEHAkac|vxK9_*U9=PyK@-bhjqF3gZrjh5H_^hc3+iHv1B;06_qAd z72-wo4HyU#-1%`90mMSE4VkHcyY!`DGas+FXQFdIdHJpNIJRL&Q^nk-|8Xw~RK}mSeJE{^vRg>jCr|E*16}t ziw5O^@ykh&8gguEyUM?rXW#az8DZ$aEqx-gUv4@}-GhBgq$h&pA0+qV5p}O1Amr~J zkvDm><{5eW?q1cLO;(t+W$ID;d``)Jut=-CC0lL z_>sx{_d|HC&$bNO&oyUzpcU_s@&nts5c0F@lO$ez#IOh%KkX7zVj<$JRrJj*7fve4 zj%KzoqNX4akiu)0tB1OzTqTYGJZilicY|F-6Nw%+~5 z)H&$LyUQb#rd~a?98N8L-e((mJeL(M0^-wUKyivD&&JYG}VK_yAc3NkC0NhWlSb_~D`!$d}xli6xulH-_ z{zE3{rRfh{yoWPsLrO4ojDhAvkokayd9A%Yx!9(>9Vb4(J%9?TZ5!DcZ|6( zcuQXrXTw_C^p82x0s2F8NZYOWe2&JT#6kFDY)loI??}s zOdes^nm3i!0e6kkR@m<&XV#0d96o=sSTbP&z$Low#<2Liwnq1iUK-6fyKs2Uq9%Nt zZGh;hHdFs{4pqH9Q}&i|@8+e!jL-y(&z71=Bit3gLp--6QM*1bnd#p9Igmsx%9~_T zAY*y*9-CirktthJWNi#Q-Kg2m?+jbcX>)SZ7%-VpfaqjBr5$${Hx!0WcFf%Zxz05t zN{}3&*tU7~8sIenB|vh!8M0od+a%uqJj?Ze`TW5>wgboPv&Pw`5Hpf8YhLVyYv>Ki zQ@vy#=B8blt8Id=3G9Zu>sv+ozzCpSLNX|aJ&tbxW z*D-_sCii~tgW>#1uLf#6r;hIQ26{i_6py6xXu$5DYr`efJovBRh1@Af_k-=tpLx^p zhceNB2=Wi44B-=FXl;r@)C9zz&1Q2|MykgO03By2bxbrm_{q3a+s{L}K*|nmKShAC zg>_aKOsVy-ezOv7VgBy>|qG?QC&m-_oO62OSh= z`{XS0j~e&VIj=Msl z#BuH&d4kfk{xzvA`3fPD4x!{1v*{QI5q!N%Ol;uwO&m;n&iv8-p6@rRwQ~uL_ya3c;@-Un zr$&E&CjC5yT+-ihQ^NH#ko7>2*rVc1{Z-Q=!6mWZtZ!=e6D;Rm$6n985cFA-OK=Zz zf|4I@<@_TfHNz*4FahWJ3W!x`}=1bxrH@HTW3HJV3 z_A_jF55%!(_N>Hbe$>UvC>f%HF#c@Kb3E|~|EYXEL~J@wZi7MDE=|^(!_-GiNGR;+ zEYba(+4uC+7nji`Bv>3cbliLyU$R8k8vw5_ptTD2FcqQ}1K#=|W1(8Bm-zzov6zL~ zAMqvqKUUO>HXrbr)h!%@RQGo#%$}5P?D1bi1}TTE()0soV`;rFrYjx-&@f^rY$>Dp zcDs)+?Qu|6*h)+36JXA#Zd!_*`ZUZu8#?POGRlqYl5#f4!k2+=x)5sw*s!CWjw8PT zf$Ozl$H*~B4$hZx7fhrqL$m?Zt?dp-(O`rhJLh2fy3gzR$Y$Q}`kfD%bQXw_n0Day zP`~3(b`V@Sd(6L7nkF62fB+hG1IzK=*9Pf7vt{ui1m;DQ;AsK9&GhVtygsUYHfzec z2{XLeAzgChJn~LgKN$c4002ouK~%hYr2i%s%;HYv^l1NlyZBa&oWY&_wk>b1;}u>1 zYnk{tb;sOrmJ5)I@Al7C8eK`N*={?mQ`BLpkj%r(b~zY5bKmiVNb@tfwy}JU(>LQB zJArZHB-pzfN@2jHteeK%l&>*J6JhD>6{Iez4TlkWNW zhH>^_ru3ephhXu{tEO&o8(op+&S<~_Xa#VhU2xzSFdx$_SZ>WN8K~YY((ta+_=_kC z#$_6IcSg!ihfYU2=d8X*Oom)@F!`#${17xVd(7g>UhKNwULvDZkbMRZrw@%G-AGGfuW;IT zqTn!N-0-I5ARvb(Aj-srr02nzx6;(jj6Zd_J~-E&w$^?{HC2Ekk8ZL(%ZSxTYM+wH z6oL&OU)zMKdw$bgHEt*wZUH&qyf|U8%kuhdsL78Len_x;Gg%s_>C?&Kp(Inb(?2MvP4sgta(=1b0c$AHnlx z#w&e<=;wnKtXxhxo0!#p@x6Q3&TNTc8hJQ&@ZI(MWz^+pn{kfU`avQdlbbp6cYLVP z=Dh8uo8JIxMA!XCdP?W7_4gb-sl^%J1baP6UNub>oh62@v$N1A z%+=AKJo~)Y|8C$2**8gG)a&dwO{7Dd`ushr`U9)u|6bb%O`d`Rh;bbVwxD zb~pCD&MS=_PG7eGmdgp6YC^I0bBwVz9P>r>AA2n4HI}ql$t|EAN=k&;FJ4>!ovi2B%gX;2=FS zk-X!Z;GG2Tg)bN;MEFKL-QFvFV$R`t&-VK1)0#iqKfQ8^Z3`s>rO{j7VXWjy57_s! zPM>#+uWI%znbG0ShtcNT8;Iv@U&CwWn-Cqtt7R|q0T{@fy5kz( zg6Xm&WBYqFzvCcoi(~wCJ$zIVjN;TIXHvtgrBTn@1dCFL9&5&r8IyXIdhbZL9-;y_ zcd$9?Z|=HPla z44Tqp~JaIV>|I&=hmor#~5^HNwD2g;fIt}0gq@Y+u?$NbMu-T*Fe z0Lf({ES$y$@$;1=dO!XBJ}c=S{Ns{IB|S6)tb4W{C?Brm1<0u@4VxZ-bT6)-|3-iW z%g<$MRVW@hihyK+0A7zY>x@l4+)-})e%@R8yZ}O(I9Zac7SIT%c22l_pNSPC*8Sh@ z2{7_A(ikvjBP5AN&WusV?QwWMV{fuZrJFfAE`v$UySFvvAXavS-0;3}hXH)fuJZ3> zLALqGU@O2)e)Y3~sF$*?jm!Px&s}><-RT-|8*5|3IG5{eom~(4WoL38{w1Wqo+2B* zN6zT?>x{Drw058xVoylLMSw;YR|DLJ1ev!!5My1&uF?CT>}+BaP;=21?>_+Dg>Q2=F&^o{b^)`GMm0ciRzP87qLBKvLpxVrT+jD z=})PB72UKm0mOkUqliQg0q(0^43MUswWEk@$(~CB2*5AzWk87nj5j1zIziVqS1dF1 z?R)S5YBqDIfG~goHYHiHnq&mLmQ%+H5d5K~xEW!^b5~#gCvCIEiiEW*1{M+~PJY%F z)_ozF9DtCV{R^ctl%Fjs9&8LItL5GV$#iJV_psVm8mcl-Nbd~_E;dN@p{X5VbRw;! zXTh57@;+5atG{w*{qh<(wl{$+%6#@a-~?-LD}h9L{m(C%ASq+wFt$q8U7uiiiJ{Z# zKB(yMeS^BDVoftqfCR!bCb%ol1W8bYH%QccWPEp$={cea@J|GX_7&%$v?L@o_MvoE z0eC9%@!EF}8*pNe8{b_%$3=gYI@v>QNna*ZbVpLmv()F=iz0^e{WB>IiKApZHf~@v z0~~j2w{P`*i(1XA?(;Z zc|T?YpT;K;aB?<7AlaRGBa*=vKHv#vX&R$ex%!^~lV!61=KF^UHA-o4{n1y%&)w_$ zdhO28U2hU7LkjyCHj;e^Ed_9~_N=du0_5*X@oUL)ki4J&W$F#azq!v_3K0K!WVN8Q z?h0kPIx8vqZwn@dc!3t4P7f4X!d$K_molswIXfTw3dv2KsNg9sCig-&XbJDer&vYm{k;w1A>U=6mx)BzPDQx9p^Uf)tov)+`PABuW6f6lH@ye$33jx-3wAg1FfnD;a$mY+-CH&^Q+e zl=k>2&NZ2bk*XrW^NBDE%DNpG@(>6WGNBf@c}+Qv0p4X0nz2eDGluN0XSZ64T2E~g zl4MDG9B@B8WHUDJAc0D=#q+zQK%`*FVr{p9!}^iA`%ku`7OHt|SkIMdpDo%j7(KA` z+ZjjH7+y6+9Y1Sv4?N=N&P~o8NFaS`y{eBc3|x z&Fl7<6?`ye_z$5t@b%65%$_AFM4EOKVgl%D-=WQrRPLd>W~2jc&TjrG0I|=4Gvw3U zrO-h0a7N7oS3RzEJ(!f|tP^}__%`oa7Mh^MHaTAyH*`Ld_1oz1>>Txd)|b6tRMwme zaANObBO+(M#$O+U%l&CLi#nU-45tj4_)2NSlREa;voPw-NYmErXt%-EY{Q+g)BRUC zp$RzV`gfd&0c4l6KDBzrR{tg2)ZQPOss+G+4eeYAtlhmBZ&$NZ5*jxC&0MSiA@*-x zsh@K2jpLQZV4|e$LY-hbr>K)LNCw33RyDVrlUn%Eiq75J;UPN9jT0@HodHGW%YP=&~T6@ptBy$?)AR$dae= zE7&6x68*;h#!&L^wFi!c@EArXuo~Zz1Ob_K8az5z)R1?jq(9v)og~*A@A(PpKlWiu zG5Go_a=78h+4GrRyKyu$S#{>LrkGOY^K{KIdnicTUQ-syWiKv~ z;xgKyEbq^X<0M459rKm#!qJdYSRDYCXQXL;j)k)wzuV2 zNrM)-Sq#KaIO{=KL`Y;aW0jQuk8z zyQN|WOygflVv+|)-HBo+d@eFAXyyM*rtoC8x&fxG+AHa&|JH-@;i~`cLNea@8P#Q8 zYNX2i#W>HX29VfdD^ zSU%%AAkKC<%(Nwgxh_RvksU7>a{I=J7aV$ODGl0~wUZ%H~=E}oHZ-;w|Uz--rX*f@CyhayWcfI8N$s5Qe_gsCsZ ziFvKuFw9Qp_m=t`WVEA45B&%ODh#-u$741U)UQ||cLt}KgJAhTGV+{{4(O53Ax@$& z+UF-^Y3Dj~Q8N_KP(|N^lIl-Kmb8@~)x)^II?Cv%2q)JUQ<9KL4zU!W&N5$@rCK9d zRd?U{tkl|XXKLL$J1U*yn(Y%{1DMq40@8rlBUN8DMh7gEbUNAoWJ7h=2jd@*Fm?2s zhk82hlL$nb^9nmG-gP*4k6!hb;KV89mSF@>>W#G|Le?P8J^(5!n@o`sgr!V|{kP+( zo5iR0dDh7QrjS`1NRUx`~11q+~-HE!(R{0{!({X&S)I>Yq2`3KMnY_03v|*6{;A00_3dcc;B4Kna!f; z)TbXsuS;{b`@Z+qqVk<3G7zUW_zWrV#6RiJwyXzoy&G>oHi2ZOkMs?m_MYoLPbh%g$HK=ZL+f9(?<@8%YBv9K zn+Tuj+w5&d8Jl|(7ACFEdGwOt*&1w-q*%;f3lJy1&YsTC9Wo>SxIX160Q-JiQdlz4 zJXupDVcXk9w$G;>cm0mPr%&s75B{8bY|163$*}9_t#RYxirkb4t%&ssABUIoBT;Le~D=Hd{{M1!1&m5KANf)7QnH)hc>I z*rW0LlEg^8fa)!uBzt@^TGGJGbY{&b0EI*%xbjFrh~0CKJG7r9t1E7=3+eXWfka9c z51f`Hj!>+||GP&!7pXlwif@mq@XqR&;!S1$p=5PWoeu( z-=#}AELktg1Cu4E*0!-uBGE1&5iGai&-P@!}naXvvpU|2Q%-KJL+@nMC17>`o6HrF;=#A z{zC_kWT6_zUNHiE{D*9 z$O6}1MD2Pc;B}x`%CBeLGv@J7zxI>tv(nCN3DCcZUZASJ{h$cVRfjF5#InbP|{eLZmeCSJT4fo(nph&*dPaO$X*d4EH z9oA_=>9UiF(M*pp%|nf?I8+A11&iL3QBYz(Ve@^{7UWM+YZz-)2|TmHAYiUv6^6Gx zf@)4F<1h6qJ+I4alpB|5C18FMycIR@x%;z$a>@0;cUs7~qh(Um#Cpw|~E_W;u3?V~3d3Vv>BxuF3g{>P0`oy}RW04X&1E&mzBaRJbWpebjx znmcr}@spD~+NMLR7UO;*Ufi=2yQH}pMeWbxgM0gMe{4mFMaX7?tW;V)T@F4aeJ2)> zL)TiB;1#{f>~;re&sA;!lsa~jdzGFBHhI{phYX=a-vzH@i#wBEE7>0img1eWSdoA` z0IaP~J*WsZ3HGEZ2eU~CYz&Y6ee008a2NI+?K_Uz=WyCn~ zhqnS*S1i|eu`jEkOZUQCGud^g@ zFpECHaEJ%b83&A(l^b`;0XS_5o`wtzhO4wZQY8P|XNdEsV^SvwK4TW0kmx1GlVDnV zHKjFatgW(NzV7TBce~304Z*)lgvtcK`ZD~H#8d^}+_Qz?`<<{`iXsxcq!pAibjiF!te+ z?4`)Mo1={_gbcRtn!Pjg-u>uF0H_Z!=!I%(utV2|SSaj_eLIa<#&fFlX%;_mz)I;|Pkkm?yp+~Gevcu( zYGY=T>9^r)Pl!bS^G@HjNHDH@SC@wG_{!4za95MvjxvE|-y{1u+gsAG_S-gLu2|7Y z2FXD^XTmGQ0Rv+tF>p2^UV7`$uy-lytE7k=y}W0Jlg0bbl9Zc)n3!$jfA?H+;;o5W zA|3tuT)%Sg5ApBpldtbU`iwgJ6R*}N#8NFC&YbapDH~NERx_>-hLix2jJ^~j{19kd z=N9|EM&i_t_sY*DdaQuaku!-a$Bz@%%0`lzKJ5<4f?;!v;jnEc2iwo2^T5i4^@jNX z5Eiq`6}DRb-pH20!v-3^8p*Jxy(;}$eZoZmrt~VoU=>Ugm+7qWfHp&HKX%a&J zBSYt%KCZZO@Z_*f1XF@&$fZF$ly> zIWNpoJYt;yEN`Jo;I2M%zuzq60RSc|LNMTT>t>@1BJEMFBsb?GhG($$X>>-K>IN=T zI!~I8T=0{-;aB2(7e;zP68BrFjI?oU2%0po@p<}4&W$=a_y5W*0{vylVlCG)VdLYt zXKR;za#HhY$K(#)N%_r5oel!G=GpQnHR0_-B6kboxyAohu`S8p2WX%VB>C=VJMMYzajCB+&Gt)JnPi z`@SEsg8tlFn!x`fTW;H;_5V>~*d{|-o>9G&xs})19rcAgT(%kUSkY14%~I`V9MAo_YXo=ScHH z9N6C_5fUu%4$^67%=QnuT5u#Ssx|w#9x^h$zApSkED9qB|b+==X2ZfN69|BPIUHs zi6n3Ws05kG=(z`tbhGeQ?G$H7?UJN4s?7a}&+rvL*!b9wU>W+ikXYzp3|&Z!e9lK@ z13RL6GWIT8j6x8fdA?*j<#cudB&yOZvjaNkV!h9{jBb6uMxPq>sPghtvw!~vA1nTk zcm5liO%J~2C0+|CoktzfwxArgSmI`jcRnr9o`>T2|;mDmv~niJmdJAO(}} z?P+4K%4}Ktoz+L@v4X*U3i5(^hbCc>=bn!}DTPEft^wPO<0J27g0v*_=3*BGOYsw< z`-Yvku>CId4se`QOA_z+_GwCmAYl5&YH1~Cw=r98Jg9-It-4^lmne0TsX_;NeGWY= zf`_^gU|_M5%+BFwZ9EJDOcSg(iPhrM*>lciu#wl}Y&oXK7LP9N=(D!Admyc%#(v4eVQYjn4tymag?3f^G?$_FddnME|U!BQ@`cR@^69pjvR~81UTf9 zyIz@KQ_fIsxAhu5d)~PKWeHCsi99%~)HcqJ(Sd6LkeFDpv2=?CXY)?_CFJ{CZeSM! z3~Q4he*iEs-p)?9>X6f_u=ar9=PY4@=YT0Mw%#BlbHIx+RGdLs+UBM=$+SdPYI&fg zScOL1PPXo-p-9*$ZBVlAtk?M{Ck7{&InO>C51En5&GLnN&Vu!1H&l{NK$S0H^cn$q zDw7$v5eNIIk)ER-6C~Rl1pu=I&riBanX^v%Kt4oBB9d`Z(nBIXwk{*Cmq->OX5107N%V|ovMjDS%Gy&;*cp5O3QmJZBr~!n`d+QyK>UQvz$ySda`^f1!nJ3$)8IKWs z1D-z_<@b2>pZ{SN@`6?D;0z6Y3}AXehe;jGJoi&8Yg7^7@N5C5Lm=GL%`U)_n_(uy z8<1RWP!Xrv9YtE0`eYB1^UipxVE?RMalVsn{{|H=z}t>)gLi`N1ZQq$_U<{KqNktc z_FqX!8DLq$J!57vv)n%7voP@j`}b$<{-~B@jEY9%=YPtwamN)o*L=Uq^^ZqNSM#1S zkv++_gwV6EZSMat?l6JmJo1DE@PW-1Q5g5_h`Rb8BvW59(~6Iu^uBtYgY2IG{&3cq z)Zu^%rBTfGe1cQ#iYC4U2`KMF{AoK&Mn{mwu_Iltp0RZgv3<&@Z`BHepUe3iN{0@1 zxon@bt z#{iqGTuDla+z0}KqxMYg=;p}zV-Mc-h4N&jUbnU9ZTn8Fdk;b5^L5V8_A6QYQ>uMu zcJ+Vm&-0ucundVHUCfazVpOU-zL4jM-`iRD1-5xCsV|!FjBZvM#7ZK;wjf=>C-?b3 z7d!c1m&_La8-R}egVh5Z_uAfF~6E`L4B=#8|ZzJJtkzb~&y$&)bcqTv>oZ8d zCQ|0$HvDT2y|3u2c`4Dre^$|(N240gcnXFnC6}Osh$EQkno;yq* zGQfwCF-^zq^kJB?!&*?MpB~Pi{R=w-)|`20&WC$`kX{!?f?W-nl2VT14%kkX4Nlg# zMh{xYezJcEgs03d%EZ%Kk)xA~o5=c}Ee8m|kP`6E?nAPB)p10g`|MgW=3vVJ)bdyV z`J>!lN))6mT?x}tCCiw9A2JT$6FcBQ#4KchV{7zusm_bk-#?#vv2*}kK%&1xUI!H> zqBHOGYpJbBSpO8?DxcNSk=~TzaF>xEYN!FFKC^2$cbO(K`#z16OAmknV0D`J&2B zcviizF@Uf5pPwUr9Sp9>7QE8bze+uQ#O&R}REYn6enP$`plZ>`2>bYx0ma{tl#|Kd zlo14|cDXM8kM($tNsEV!T;_Otq7A`YGD^j*uhILC;+QR|^t}ysR;08tFe&PNd0lxmVVRpQnfRGQ-Hqyd}6u8D} z3Qi2N{6bX_HCapwF_JRx-q{#zLk!dK`6Jtj%I}i^sHn zX6<}b151A6e@>DnQ>tG}Zy@KapYpkQbfSb9vc-Y`Z7CyiQ%>o?m_9||v*#pfbKhGj z6jz9$>mxW-sz(rfcbzXG7+)T$T?F9A354Ol&rkm;tf=)o`wS=0c0`k3u!9G5?cY1& zJh+|;pU+>`sz9ek%4k>i+qg!yn;eP3Zv85lfxs5K>rZZ$>R72ZD4J86zdvFTBj`)wcs*Qw_o5yOp>tHj z=)q^CKZ2wwh`L9^n7@ZL=}w8A-^{SX0pwewuq7crB?#u%8T#IL1_QSn^raNUfpcOZ zU%Ye_N->wAq+_#1x)1TDmRrOD$KL?siyUUn^wQiI@vGzQ_{3|i5P)fY;dhEllSk8pZ8CU zo28U7{XI@edVOwwr7Z+_yLXE-eXTvgE74qxiCUurHhR*`%54U9GQx7b=AT9H1iV^H~Fw`1!4f|LB3EzQQ%D|r%bX! zzKk?9t6*#UEJ7lj7qaPso!(mhW{g>aNuq@`?}hxWoYK-*T5-*_oep4rD3PK&o1!pNi2uuJ0xj%>__DI(6$xpE@|EkQTm% zB6{^9gK#ME&Rm8ZX3oO_BuL5l9Gc`26z{Jcq?n~6nCdyYweGb5w2tL65C8p^*CtJL zj%qJO5t!$>{2aJ4fQKqImlq`MK?$%eG9{ZIc{YP11vq4VE@5Mznm-|=KGePD)g$rb z&s<{i!{MegwlV{8Gx9Y@bN=KW22wrFBwi9NpIJ*XZ05o{qYI-2c#K&n8yP^FK~Bgd z2a6R(8}L-e0Z8h9=lonRw&Ra@usEH~ChbX(kU>RvkxWQB1uvk*P>HNoy7^kr03)0C zt>s;n27jkv*pq5PY{Qj%zA;3$lO#H707F zH={^h#_^27N;2$WgC}>8QiL$xag(`BI|>KD6PciJj;T+_JuOHc0p76@JwuipM3%dZ z$9(;w0)|Use(~J*bcP*gIKj+jecpfl&2ETfHvQT`-AqL}2w5_&@^z(2X_#c@9wNlk z8qR&cc{ejuIvy2u9B8=gVU$_&8h_4=2XlE&Gep4>kQ~0(=SxsIx#cMdn9TV;_vZ^@ z<=#AwdQNG*J{SOp!EP%3BC4qKCkxmH4|XL(W5E#X1~J9?S4$IBR1^{fDDE>*mf54G zONE4~%8;q{IU9?7g3aw0(5cba`pwK~mk5YTw)J}K?=grbqp(3muu71h_tz+KF2O15 zU)Tz8M&$>`YOd+h@5dQmpG3AM4R%9lKG=_trv*`8s9PY~^DsvSSe|xaBj|=rYf`eVXEX1E zL|IFI^dm^8*gsu~c{$kr$)tP_BtH#2eaGCzzt#7QZpm&khm8sZMOb4~P@85t%&tYZ zG(X!f?$_*UTt8xBBfT(^&794;`oApQpGp6Xxh~^413y7b1g9jub;=EU^%rx_Il||L zL@&7%%q0U@JjUm}GX!RS3u*Mc3E1(1h5cwPrq+xyHDwbiNwly()t!=grQzt7`?WL$ zNdp=F4Xho^y>7Y)(H~XTs5JfFGXqKUZh`>pHjZUR?Su(LQ@<{Os2(S~Pz1ydqz}$J z2?C|kyMI4}%_akH3+cV8+*N$?C;!J9_x%X71Wb*k~IRD^}ka{cu4f zb}p0F2Yf|xBbYX&FH~@>1p;aMd=Y>v7%rEuZ5c8E#}mUKCh|#(1GFT!!(0=3t(Sg4 z`3?KUIZ^iZ`phDkQ$RHdOGGM|KG-d+ZZ>7D z9%J{b;!k<{=OL`O~SmDJX> z-HcD_Z2c7hKVID>d-kkqLaQ(c8Iz`mXANXP6M>>!50_`@OfeukkjonoD;2y* zX8#i3pJapXOzzZ|dPN_A zTCa_QCx~>b_ooaV3+Bvj)k3*imW# z2Ea5TYZss6=4O8~VJp2oF7xQxGL|=493|`PdpIikE)d*~EX`IW!e2SI-uRLJj5y?t zo?xuA?~*)rGJ&Zt%BZUbh;OqzY+b88iDObF{V2?R6lt!REC_(u5^N22FkPvVJzK&& zK0OGbv?Tofd%Wh1icYxiIN`9t5k#_WCRzUgG|G_tytX-TePpaCoxuOwXPTfLHHviX z?BwS$EsvJ^tVjsrn@TRTt5QPa&9>|Mr;{4MlBk))Oy6g9;N-@<`i&iQPz-m*{WMBq zwAy6d&a=4iV1v|QUf_etu*a-R_Mbc|5Rcl|*l=>eZx5HUpADYr8mS8&1cGgD@&L_DX zCHo#9M(N$bCi@K1d~3oVL0*RNlI`Xv>R6J#Qyw7us;Sa^&h@oT?E92$NfqT`3%e}^ zXRY%!I$+8Wq1ZQ6@atq<9?__sj01Z5bFLvj{eRX+N7h_THlLtKa|1i$_u-y5#L{`6hw9NEzn>&fR1d0B>(5Cb;fIOY60~|hAx86^UL>zk0At<>%r!k?FqC#A zuX2_IVe9wlHvx4+JsA)9zLJbq;9V`5A63~TvGp2D`S)b)L<^Xr z1Xjvzg8<0EN%Rs1%h|;5LY4}-f{n&mFn{JA)&f;*C&C{9Wnw_;<|j|2$Rcxffqmid zQw|VZ2=-30Ms9v2fC`&;L@=0erq{u4jRZ|l614Syz9%jPN4A~@po!BF#@5QcQWORC zruMBDM5GL1C1!l=%E!lS|2nID*OAi4z;kJ_=6uRYQwzz`R8C8Y+e0_qDQ9FWHAUMO z;MSL43|6d($Hn>8Pw?3d$}7OTRQ1!Vw$wgOjC19B@Pc72vMFxTbDcyHB-)auNm~Z_ z+1bvr`8|>zmk(U9=Y5YOs@=fz5qkJNqll;@lTqj&OJ;`ZF!~Q-L2;%?^=~shpM_*N zOU39QvW%RwmPc2`Tpyf+Nq}TxY*cgGN5${3;F0<~&KU6v>)j7XZlnv4aLoVL7|fFh zB|rCQ=4H81S+L(?|1`t%w&py#l2U)hfAD=CkB3ham+euIf1<_QY&fvL9v!?iVLxDD zKF{y<=+h=TW-joYWZLd^`GTyOYiB}?7N5Tvdcpn^;`sc;fM3Vlu~RE!HzA_;-Fwop zd(~SzskOC%Nw$;De2njVN>!BL58_8sMh+T-mISFVAp~fa6GB(@r((rgcSn6M6~v=SL;=dgZNIs^k(T603Bs=J zlJo+I`hz_YMJxAD?Q>wd&Z~OQ%|2A5|Ni~?)F@dcKTB@DI?P4qv*SZ$-=%q#F@LdL zn-Qr>e?sueqcjXO5j>Z8>^AP`^ab&PyUzqZ0Gs}Z7#qUbz?(zLHLlHE2`MW3fM4It z%K}cG16yT<0zXmlDcDcQflKS-YpX)fu3;_CnD8G4sn6PvWZ2gZ$5XS>n{m{^c2^9X z&*w4zd!8JU!{-t77T{DRJ-@|Io7soJh_bLWeqa5zbdnzcQn4Qa=LrmRc-p0+9G3NS zrKTaSXsTHRw{mHrau#M4A0~JjlW>+?E_`S*zPV#r(f!^J{U6}HWovB9K!B)6^N+JF z&+`cibH*n7e9LzlQcAl9QX`YzO>JHK^KrDBtfKGBfqd^tLczq@%qJ-&kwLaBK6lN2 z?WleZwtP-dJ#e4>FAfA!HX_X`VKtC+x}{Hf?QX_p|BV(PqOqq#wsb;hc<13y+rFADv`z6t_2u$1#$EcB2G^E%gIlVOyTeMvJK_dJNx_s>`^b5J^5b%F!qE4?hanW3}Mginldq4V|>0q9A9Yn6Okn#z;zIsqDG40r6-CR0Y{!qw5a-w^2ZXP?J8Y(s^NCswknzvCIe{y;-cxdrsFvoJgd^u6>H*H=xH(ejpMHvQeSnFR45pO1 z=;y%+Fx0U_n{c>h76*izKD5ew@Pb8hG zVf4rw*9wM=7=4HU49T*#RSv4L59uiE`&Ua6X`dx`AotYZ+mdD}^Vg$hnBxFRcZq!W zh2eVc^Iu>%5HBa~0x+=m{&{pAV19;~ zN=ur5OZB`o_Ve%d=if(y901Hs0K?g)G9#RqYO@RhKqG@5XLx9;cbcGlw318Ma{cA+ z0oQ<#2ILvsvPRkKk%pkcYc)+|Gy&H}w;KoU4^6S54_tHDUW-w6z_dno%%FT|NZ1K57h=~#3&w83b--l>r_QD?STVS6nz^U>_JlFlR zgW@K?C47PgANF{^B=@4(f3VG}BR6?E^fM_E8Dxk*L533;0537x7W?XtvJGxJ@>_lJ z6CH=WWL5M+NT>c%ngr|fIVZ$ZHdtQcdc7Z-qN!Rf0lYRfTh6m5A@Mvvy<{g#_Nh-x zb6ha7{MVQCr?!8JQp?oblj(0|otO<&w)5#Uoe_8=LHdL}C<+m=hcZstxD|3bw5=pd4e-@eTuql))oSA@;m!5;GEpK z{rv%>K+%n)F7;1f!&zd;_7VRif)X4=&Hqk$23?+$Kvg@yw+kI6%i58h}} zn=pBG+g5B~5EAIYw#~k40$M|Vs~?|(o zYwz)=-w*fHcq&;9Y5LVX?xEu#o1f{@P#$O{ir>k!^lW}Tej~8Fz7Z2EDn!p)Jy>3}ry?j>;rYNRJ!2CJSUOUkL zVif%6XKkYj5#Kd?w{vE_xub$yfbdPi$p=7~?q7 zHZzU2i343gfWuv^Ju3ZvUbtoTFe;r4X_mXW?9X2Il_TlS+X8>YJSo_ZfU?DqSNaFJI$pkq2!DT=yFB;l81AafVmbu6A zl=RO-!9aE0Iu7K2+0R`(ZiMqIO84KxBP64Aq?A5vYWkFAnlP}%cWShCq1n&9 zfAJnkOvp~R#-MTmAmqv09~c99kz1((&>d+l%&C26`^?tcrRP)E;@7&Q(l6jQ5U`qh z`OzJ(#qUN{F`tRYMvFctoDT)aBv7AH_7#L5A~Uk=9|GKc4;`%sz}BSxl=C@OrTjCkf7ydHtQu^_!O1{RC?f&CSvx(= zp5{D2wrJ6$T?ze`q zySoqV^71n*#nux)ksbSj7Op3_AygT1WP_UXuh)AUJVU+KLv$LgW%)ghVS>BRL3 zK%QVsg?}$$zgf?zr4^h_B)Q-~(7tj$zTlv&i@@R(LG;1T61kcjE_&k#OptRZ14zZ+ zn*7+r^C1gVXCHVKc$c*%%l@Zg`qQXiVo&U`oN3Rx zZejud7yBI|J2)_C&1=HX9ei#9*Lkm*mVOWu?A-nfN{br%59eh}CNH_d9opt!xh^c1 zYu*_brdx$>E5HvMx#NFkefiQ}#dF4X%)MXnJ;jut4j^BtI_oo|ARom9W?Ku~qTa-Y z8xv+WyrjpCIun-=R&ftnN&dvI2}0e5icD20qMLptKb}##peKme_ehU zPGv9NB`9M@G?2xgz1=cEhzn1~DNXA@U3_PW z8~aG#&$m$Xecmk?$HBAg2j}S2OMiv1;(Lgj1y`ODgYn&CACq=y>lQxh7yLp?bSym*@pgmTp%H$0`~reW-@J?!ABUwI%_~vHRXy1sAm;=XK8^@h|({d7tw7 zs0J*FFRhN%v8jJ+-)nsvJ|KRS7~}tJ_GD%06Jv@ogWYE|tt}qRUvgy5X4p}jz8_L_ z(|g+;V;z9shcSjY3s}2u=hrZ+%WfrjI5|6`)4zSWWb2>u*dzN@Sah7TV|7e^=lxhC zvgs$%j~b=1Q1ZY{;8@?HDjcE|@<97{CTNR`DsOD1r572DJYKTMrRz*S4n6h8r=P7K z6OHPeI1bDAFiI)p3eR$Igx6~!9h9~np8s*X z#yurEn+D+GKqC!4^=|EL9PCl)eWZGi>fAhcP(gug26nYzt#1hr*FPf>k}F@E=ijyO z$9eMS%Vcv(mAXE_oCAWBUA5FR-GoF8tKOJmBD1;v?wFzyWjIEA?zW6-g# zSN0+E`ps)ebRc{s^DHGJ=x0ssdx!?qHvM|EX`?_oqw^=#?<{!QOa)M)CmD%akOEz! zbl(qbi(Gix`>UT&Z5^^L1eeU2j1MW^lSC&OXY6bnaP(%@XCY4d@3{V47~WanXEjAZ zAWFB#45ZEDJG}`ABvQoUz7sX{2`G{u1?kLcRWa9Ddlq+G>f!zHtyc{}R`txCIPjky z13V=P!Qyx4L`MSIj4%Jyvud}a8>D685}5;q2oX3#NTH9s2KF^p04!#ykUR-k)7xOS zkARf-cQWGTY`d=zKO0||;Hz$_+Yi#=HcdU7q>}W>;Pc#x835al&h?dbNiy-Ab<$`T zY?5H?EM-K{iK>8XYCdE$hf#S!^n3(!TIwu=)uY9hKd&aqoP4U!R`4k(N@=KBBmn&H z7_gE0)2Nm%pulL8%}*6$=xjHe{f*r|yQ&FZtm+|!zsV!3=Z0w^$4cJyjoMMM<}>Fi z?MRVM@L>;UaQ4om?teH7)wA91qeK`bsS`g~St9t%mddj5{wvm^_B~+%mJr~nIM;Ja zwFUwD*pHrL!q-Rij^#_q-Kk-uE&Gc?Fl4g*y!YLH(zd4KBPJ4TNor4VSoiF;=yF2p zPc0?0U*od3qBlo>rV8+xAsyagiW8Ww-`=1SC#l<5&d-}WJ!<`xGtAoe(W(XRn8Q{Y z!L~aBd!HPiy8&g9&HqD*8T=VStgxAKK(DzztK;wbwGWV02qDI*rT!?MH$me6pnV6W z2fSxUnm$9Bz`OY0q%^_#*<6N}@W~n1+&^P2(?>}7GCy1TSb0rd!grR?NE~zI-g(2M z43DgS@y|HKkas}_JjcmCDymZa7KCdE>G-|{P~|mp+qY5a{IeHVpUhI2*J6l!5-5SU zv5N&|+#)7gC+5!2+aQj2*eb}9G(RnIaC~59lBF;>LZQyH=YkP5>*&F-`uXf399RR( z^1D26IxF`{@WTPnD8YWl5czBDl;#;deVf%uL$ZJL9wglFPZ{?j9G{)>%}@YemMPfm zWtDE@C!C~Gs!;3)4)_NcJknD?STMMs1e9XW;-CxS;CKqd{N%m`>uGa<9o)8yOPBTY zGso(WT8*)LsSgwfuwodi0}zHQZ^jF*E6+GeL&1encF;o z(sPm}kbyN|@eo9Y;cMP69MG~%Gmvn#hJPfUCmdk;%mUE2SY||ra5ITr<&OHY`T#G< zp87ef(zwKAKmxyJpB%)O8^0HI`fAnZvx>FrdifsW1TszZ(cOJ~r!Of)cE~liec4zb zy#wc*MXeJK+qu&i;wS8leWs{yD*)R&K4%BV__9a4G{XmsbW3o2Uk<^4^SuEETKn4s zyD-`qHiI0h`oU z*Qj13)A*Ck8Ymw8kX;$-ey;+ivF#7N5Mm1!pBzgtt;9&j?^5bXQx9p5(`y_ONdUyr zk=}R76sw;2J+*xi-N85PwgZL0K9GeknWv-fUVu>4NE&drsx!R+uu_G)ser; zs1^ialJ)kxI0!6(i4>nzn+VWJpMcWTV*<8f_wyNyK#EdLN9WKT2l6)6s6- z;)1$u{fZ9O2CyzoD@BQ5{DeZXB=uu5G(`OfWm?duN$sQTS1{wlpFc}_zm#KSt>SHB zGqz7uJ)5j}3Oh8;9-o3}0k7FM+h?x)`{81?uHM{FG zQv?R_cID50eax}v2mcNhYcaY^YroHruzWLr`p^DN?vH12Dr4q~K;o3=s5iYSY{mT{ z$<_I_^8Vy5PqNbW2^?-vk&NS~WwP>^8|0+l)rcnGxxTU2!Mh=5Me{vr@c2n!wEn=i z1WD|T$9fyDj~@42VP8&<{(=X}nbxek$n<)iJCF(6WD@P(x3}WYdB+g;_}<1|onB9% z^dSm~ULXzX+TB zceTGCCFDDf4``L>`#gp3^n#g85ZIpNrP+Vmn|Be7p2`@*R=v`{kMaDOkPwgtWGt?I z^39sDUG%GyEG1^Y&0fbnE*{^2G~*4Hs}^{dBuQ!Sf9(F=2Z_=ZFr`L}II_8_xn;68 z{F-(NqBd5;Q92_C@pJxBaI^1&4_%<-p$|Y;>zT9jy8W}rXj}8fNiGu!hvcV3^M_bF^gy35pbFXElKnwMQ%2SNr>)S3?c?l+A*H zPhp7uAV13Bk#PYV{*Trvq|t=C>5d}*7~zQ0n1T-U+uSKK@+z`QQiy;wSS!U~a^R~Z zeb%p}%x8Vb>=ceR`&dI~OPu>d+H?U@`GuSMA%? zb%XNArT2K-=C6N28B=B$KMlA;+H8RR&Dz9@&S7Al&Tr(Yyo=Wkz=(F(Un2yCHwp1k1Nz z^Aj|b5)ONrio4+&{nKLHq#cc&AtWMTNo84m0f>rV?T=t|HX}6HHrM7CYp3S33ii88 z9$5r9RjX&18GqNgx79rN*B?dT++;9jKR=|S$<^02qtvWNNnkmopXHV7B|Wr-41Ifl zz^_{O+y4HSz`P1q-R}+LM{0SbXZp6KT#n4pmll3W? zc%w#lJJFMQY%zD5b7?8~A7?;UF=;ke-Pm`|r9&sL-<{t)N`_P-*qdjG>X?|Una91> zf)1-ZhL9{<8-BaIMEk+lBo+^Io z5ENir$lmrT{Z8raqu=ROY`C`u1ob8|8Urf{f+{@)RBqJwkRd98vCclQ-+$K(>=7)H zWRwJ^D~Pm152N93_~hL>*rF7~B}~$xoGVSk0LxR?uZvz6=hk35(0C=(7NPHhr5j)7 z-L=|L0&`)IgRA}T1!DC14AQDYUx4w6+R?(VgUpREPHbXGp`5W$!RggfbnpjH@~)CI zhOcI8_#F_``f01wo^5U{GSepDB%MM2{7Ejdev8|{?;(+QI!*oL+VzGs=p~*OuC%D5 z50W-cB0uFjKcjgaTwgVq?_+hTAL;2=tw_0V0Q}VGuOVx8DuK^op5qPl+`4t*9&fk5 zX%h4~`hPX_YPdv%`G7`okrTuH0VBL*xCyPSj5y?Y-bS9z^#T(l1~KcRCBS{%v!8#O zc0xreKPN<8h!B(QUSFSJ<0WIUceC$NNIE9<-tI;9mitTaw9Y}{_v>ylx6;w z5b&r+91Z?&pQwVLe9zWDmG|96693viLIgjMhf#v{)})Shf(x7Nd*!BxQ>8;6inosK zZqs=1fnaLssMXK24GZ0?fyCt05?iHz{txm81ZFsRXHt+u(E>7gnB;XR(DHr%2|Ys2hy~rDk19gAUy+bR}3}Q_{$0kQj3iLV>1HjiuH!ADkX z)CPbj;EfvXWXO|&Fo->y*`GT4>2@@IN}7IX&RBaewy{<<-R^n662JfusPXy%?3Ju? zmDG>wP`6fO(Yut+{1u|2OOIO(0|o$LdAn28z!aZ93xK_6CXg&m2lNnZE8tqSU{fJX zhU}4CYxKZz49?hfk^rJ|m*#I)4R61v+jZO`8`42>oAo)W&HPjqgjE(UK~zuV?#{Hdt7FZ*mpGsV$ViP2ZS ztE*OdeoB*KQ?)Pe?#>*29@Hkb;Yp15aWLzT_p`kF?`tg$QcrDQRh-7CIvi~JJY*c8 z{W#~YoE%WjG!p;K%tu-Q3GvinHndQ=)GDBYAqIkagFLc+>mP=(fb(fe$Gq@55yktw z%{V}h{}>SLc?bdPx$6sYM`4>z#l9njmo~AHo({fhwHam;6wZr>kVmi*0rr%X?rvFdwQ4i{jE_!d^iy7~y*R-Riuw%YIY5uE^O?-!>WC#;y zP{@?yT{{gf?LF)cY;TPLUSstr_41jqo0AedX}j^yqdI?j8&d9h)qiF|>R%^jiPXt1 zH_!ZPUgO2a=cLTckf&oVxJE6A3ZTf!GgTf(vT zTbyCAUZuP*#7>e{1@4tfzyGtfXX()2sW()D>Sq^jblqDa6&y|`8&j~x6EkR9n9B&%|;{WxRP0Kwlm zyFY#(6a-ti@+`PY)0sK}S0l-t@XyW(9``gDU-0t~>`v{mc{cNFz#KJ3J!^X;30Yn; z9Dw69s)sH^N=Aju{YdqD^z1p1K?}k9O^sOk>p#ZRw+H8{f<6= z^}sy&^vjtc%g~QerM?Y^9>z%N!8v==_5#mSx$=JRO7qCGK%@w6&SoI)yTyTK5xD`E zj5wA+Ho?tNNSpbrF(l9#o%!LsbFO9qorw)dn6W_<8I7J{V#X&6&^})(Da|f39x=`8 zjz0G-GEebOj^qJksP&u&w(~?NNC-99d*1oQ8t?y{6@9yZQ^ex=vaS~o@h4YNCe z^AjKC8~TK3lBVgXtRf5CmY$84U>vpOp5ZxV`8?_j%UM`w3dm0Mzp8p*=(WJij_qh3YW+529H-5l-a*N)!Orzk zytCK(EoZ7v-##zhuWm>4fQ&I=L!-b2JOozC+3Z(a&zHWa0ZjOs9qes6I5#11?N5&)Kk}ay`#8G3DOiYm@0xzjWXj1T2fk%YbE-6t zvtXhGWC2~Jj0;j=w1iY9)towHBkc#Pq^BN^Eu<~JBk%ZB>5qF>kPk}~SE1tQi{nV4 z*OcmKVk6K!N;G5Cqw`?PHB!iwwddvW#404{vOm*YY*N86C}+;sFZda>y_4=~@SU$a zYB!)C%<4W=$KxC4-1AwrXXKH#B=NT!BqM}Kr)xs2Do0BKOYl4m|tTJ8Ne@j zrG)NU()0YD&8F_2VTVP)b|gBzbHO$dVt=G_ZBtaTX%1Kl;dOEM24qXv72B1%MrjHH}34uJ{hG)r^>VpwZ^l1M6HeT!|Se-$#52ERmyZr6FY7ywl`0qSNul{wc2u5{C zIT!aW2`>}~Rt%1?2hBLit&gDGp>HBjGnzh-YFTSRm{J}PTvt&Z3f!OMg!nz*k0z0) z36W;<=Pb&%e`viPk;fT4C3#{^2!E{K*SZ_ab-M5!*;+a4T3y|pagCEt-)HosqNK221fWA?HPW>mFx znf2iIUf%VPJ$-5oOU1LL5zo}_ISCi3d`uH-DZs1v{Ymz`Hj7&Xp-Mh`v}!>Igs!jD zky4+kljd~*poeE^|89cnH1Tp>?7o1V){y}*fXa2z597Fsiy){C24dI~U5tG?wZ+Z=pPd#r1cPW^f9t3FyKB~Q z?!u|~om+sqzut3hBHay+nlhE)9-jpcFQb1fgPe5$dA~nMc}stX2`!VrT1}0lAX4q* zJKke6&^#|}w`q>lNwS`ssWybq+-HSIVLt_cH9-FJUF^{x()=s&hsWoopYzl0i4ZV* zGZlS{EO(6u$LdCoC4C633AppqnoN9OWd4c7rHm%B@F@;I=Zde4SKky`arOrim(0X8 z_3NBt0Ad0UzgWQVS+JwRJ|=LD-)ctC@)iX-*PkFv4$}(HM$^vf8gyJA!cURkiB*DSe*o21t^G0e__Px+jptHOPAO z==?;V5NtnoBvXzy@U8T6h+N;q!$Q6U?gX=Q2LEcg`>C@H5Qm@FkhE|&-~5Gg(S04j zUy(#B&p(t8lrkx2^JoyE_7@N5^Ig@$9a$#!fFwgyM+D<@+T@LJAS5P+{T$A^zt1DB zTLUp2vMRxQ-S;CHnhjWn#FYKm;4@B2S(=&a@k^Qws-EMCPC5_~GA7t&#+sdAQ#`wL z6SpR3at^Tz%^mxV`rrI6xL>G1$l#wEH^6&z$@%%%=N9to*l+9}Hf9vZgAdK9L~%c= z+*hWCq%M9;+HCo{Rulrg4%0qdoj^V@msNH{KZ!J%?IHNf?*|jjzta5nT+O&_?ttT( zbq81Yf&btWYrzwDg6TuWzjQHz{n(4xI zRjT*h=?{Nv%(M!uo{$$V;R)6_J^Ev1qBhO>WB{$7yOUTWfX;st`!wZhNfHTL+PNYy z88a7ytWlW5$mY>bji^uZ2o-0_5JS{eOA&_lHs~zY^VP!$%sVM$J_qaKW{~eKX_^-m zg9G|NoIGwy4v(zPZ!eHmKOXENFctB}>2@4Z|NK9`kZgANP1m58bdKsxJ^tXVeYG+J z*|m$XkjESMsPs3|?;i)HkxW?{9wsky%KJJ+7t|=~$jFI<1~Q{E9pnASC#zwnjPsj% zTmv4PQ2hNEPIQeWZZxV0Ym!>P)=?DB0S0vfm_l=~pa+No&>8?+7F}uR#AkW5Ul=j{ zhiR>S-s5@{K;i*ppYx9_f_m)WCIn6`*$30;C*X9|WffpPXo(Ey$2 zi39Ox2;+2&3iiT8Nup{!b$cKLl<0ZjQe@(0URlony7xs_ zGUDITpeRYa-+%MyIRr0WZ^7X_!u}B1O#!p^;}! zVt&r9DEy_jF3)1%1JYarD;ap6x*3T>fSf?3v&A@#5g<&cGh%bzdwxcdlS_7OR+`*; z`ARy-_I70Dx1R{r69FSmB`|fyb%Q4$CfN#tok?awBA|7K?+s|+PYS2<(xYG*?aybN zX&$oxi?>I?kU4bIKnG>nk3UKEe&z&2h=iH$$chyw7(n5GeI)MW=#P?-T5t>GD?gX! z57mnl2ENOFNb>g@G`xy?Y?$z#*FOt3+eSTr*g!j*_B*NKmGplkd8!eB43gm|>0j=d z%L@VjTn$5}$6z*~dl2(4urB>TF{9u(-=9_4>5?-K&*UB?uihy4LP(UHnKRl#A`7Wq zqk13B^Ipz?4ETD$iQl%Tc+UzR>C^G?l~2p1V6*#Ci(L4ba)9zSd`%Z>!3VkVS)g?4 z-oYe^?K2*wp7H!i9da1ITZcOqUN;L7b0XGYF7mN|mR=GZnS4~i2ow8zH1%3dmxKg< z9dj>Sq5TTL&l3#rci;&e4qs!a$4fRsc@ zN&X#$Txr)|b@%vH>G$AVP+DfbHw&zDk~!C^R-GXTiI?-wpDV#hk#LxV)JtUbuGb^Y zyZeK2@jDh|w^?|dVcZLZCpShPi!aQOxi3gV)9_Ya2(Z6|YmE~uo7uJ9+>9(I$|V3- zHMH@NM)f=dw6U!O=`|Pt`;Bg{7+7}KESN6#dRWKfjB-yoki?Fs$!4|HbH!JiW6+O(#!8NOD|1!is_DdFQHHsB8YE1w?k((=uh}p!_-)Q}y z58}md(W5{1+x{Trc1Rz+3CaFYHHf8(G_98KfxP~tUBCWQ)+1L^ZKk|58F zA7;;-O@VP*D)qcm?p?4%_UO~M!=y#LQ<9*GQJo-hGI{7(5JKK(FAXV;mFh7z*ogo= zN+aB&oWpCtIoxIg)ImLWpKH*%rJjRbyF5Md-Ly%rvi}^)Q!_Gto>$Ks za>RE!_|IzXSwiz^?N80dDZl@ZQsZ%0G-GH28-l(*ZX7eI?G4zn1@fUzGY*jz6CVCE zvf(@9_sGpDo(iP5MSEde+~|+7MlmKMvrB!{NcC^m{#2on*E*$}@i-EV9G-e$QT>^2 z&M^8FjZH)#i2qvt_kp?IY^WFboX8zLrVYice#e2h>ny$VVRNR_DAA3d;sv(vsH3fb!$5hVA%hA?D%l>dOmgL`4ArABxsUu^PBOe&nGaCEO4{r zRdUgpEbxV!9db11|Qq;6DVv_;Nj{R(U^en?<^@&ywgZ}08~J$zZ!YfeP(xC za{zxdyLJM&Il=sCZgP?n0%%unR>c6rXDFk?E&wgpaXlyfj(pb1zPmd(PU&Q96Ze;E z_vqjx27t&~w$kg@&rlBPeH;kNpQF=A`0D7dgrOR_Bbc4WHck^jw{`nY5M&p2B!TO* z#uvb%u@gIy#ns2D=T7UM`A{gCE|;14^SK-2(E-qOWPnX( zp+v@l_0d%!fH9TKN5<*|7|%O-gLQO0P3Ae-7dxxDUtwnt5i(+?u(&fX4HH`)y_2;c z2$mUD|0(&OH&G8Zp!-kB?7OsptcN1=oLxJO>|fGE>Ho*ozivyC+)*jFE$>VR}iF7|CcjYvx92 z`J>o>CA%q?D@CE?1azDSKT1;iHZ;#(IjG<*2PNAk#@7t^5ud%}Mpkz42VfTbnU$mb{6Nsu=ys6^k|G;-2A=ai zgKsDB7Vkf!IhKqD zMT23{yl1CFR9}q}g!(}|PLUwCN2~aTq_-j^Z#OCtDZN|z`uEbX(h7=N z+?q4clt~+IMP2%pW`4>|eCy()21R$CCFKuT7&lkkvpT3EM*vixM-(C%6>f6taRb76 zOEi*XOkc0c`73a%1RgOFpyLG0srFH>(t7>4sqEKgQPZz;WbL&${8yd zA6cmoXcUlw9agfqZ+6_yaZV~r2r^VsGQ=v)M|!?`vp6LV439^*`OixF16MLSDR{14 zCSJw6G{N|x=D*h1NoLh^2;C|AhuIP@21}m0bT{j%l@OjNP`Ri+mLEIfW5&01zyr0; z&!0k&S273UhBis(@sr zLChW=KZ|P}yAopi{ynJ+uk+)GeTYXtB^gY&u;I%- z3d~q*3S#`s?Eu=!y(-QrrGd#BeFc|p`xvF!j60(jKegW&fLZ@p`lHMp*I`ewuS$0RBLc1j>$PCqWnO3P<0NQMvWKV~ z@Xy^$iaF8@8JOd>cC-gsjm=Atf0RaL*!oS!d(uFxiAiFE>1R$@Z2YNhC;|k9auI7| zA7q<94?)_NgcWD1_QI+%^i4;KCO8Um=Mflo{(o zYTQ^a--mzf9z7)7VvuG;6Tn(^Z*{WgSc=|@>i6rBMYXX-wFJou#oKF;@5Ur4?mmnQ{XaDR)>^%%QM*eOhV7NCXzlV1r64%=djz|TBk}2*(aFw0|DLF|m zC!1K~qu%qJ#^U^YaPhtXy?~MooE&i5k|7yjn~d+@=dV3$29F?7Fs)y=m0l6-Dr6ji zKe*ylu+3x4g?~&O+=n=6QYvXe(+Pw7#(zT-<+d8`oN`}=WAZyC5JZk!wlF7Cd&VU% z;H>oFsXfr8I?ulW7R)SoA=6l4RLH;)O zE^AgxzGPj8l7LempR_Z2XuP=0a)LDw=$WJYjLu~N&ZsEk@JPAZ!}gX}h%$kZ#=-1U zWwx@U=Xqe@Ww4R8goP-6E*qNcvXsyDWxA*I>7n)~&va<7N)@j4ZIZ;(J^ullIw(r_~n_4;OipBj@>81>X=Tjw9 zP%mH-fh}ZNYW6?;>^L2|pPMXv*57sFxtsu{ss&BS9QYI7AnArUJ3hCUY->JfC2M@{ z2JTyD7?8w2Y|sYa3!4{bxorF0_1YP&7?u%1TiZxCfkotIQUb+RB&&J8A-j@>dS33{ z63bpWr2IoH5;Jz8RU1o<4749m#HhFh%1mH+Ut;pONA-LR7VM(*u>LYxw!_g_E_IK&S*A zGRSeHtEa4tI|P{N1`v*-V$(us$Tls?lV?WX$_P499)!<0rkh=YQzoq|4aK}ahxI%4 zD1{)k_UinQ?6X1onPU>&9R*dIw=2Jm8@6k>=O@Nf&r{s@vr^{x$5DYx&JP*D^WlTi zfbrC`_+d19^w_@WLn)zc(5`Efxk7@zgafwMb`?Fw;f#Z8oCCs+=lQ%M8%+AB8~57HTY@?cnOz6Dhrpq$*Ehbl-~QchA$E|`wkb`yR1z=a6$Br@**;2AIWHBz zhAn+Fo%DXt5I0lDzAC-_q@X=N|411Wkvz1_HU&jln++bCY*mJaWnJCObnfU-H#xyKj`m@;);&KLK8{QX^r zj688|qqu;;icJvss02P+!0*Jk$+B8+I`c6BV8?IEQ37A*-i>4O^XK2RwKuRLrTkoLw&Ptken^Rc4NvQ%qjY2Z`HtN9dUI)JN@)oJSh?jo zIL9nMMF2%JI1#Yf3$VS;f&3mG-P*24lc)J$H;->VQt;5m(NOl7*5>| z!$vX<=$fE1OlE2WlTFc->iGcX?7;W=M>t00v^oujf^+L7l?Dg8K{98{S$A(%WID>T9lzV* zu;1q_s5&y}3()o~K4|xD@A~V$7jYrbWVEa?7aXt)oHUwA2c^;D{1Z7hX z^5Xy-S-oL-kJ6B@h1@k)5%1hRbTQW6J!zD_1kJi0`vUrk!S}qkhlH5a7isB{(|{ zYC}lRWZvtM=7zs{8S4Wm!f6L6#5g*b8DxmYCv#df+~+#-eUbL(d6PNVfbGj!1-_0O zKGwd!_cxgvRqMhU%q^bZPWGu$Z}1QJ=~kUqe~UGKGae^oLVlM0P2UGU&p(>jhlSXB zN#i@LuWesZBPbcP1mLdItf98tnK1QOL38b_&viM}%s+3?t`JAIr{D7AmtL}s&*ABE z%Zy8gz$Q+cGZ2LY2`?Wr|7I(7sqEDm-T^RICKYoB&jh2sK1|7GXcWbq-yt>ES2GU* z3H}3laiWLOU>hxU-<&#%F~=jb3b+%yP}C47)B&tY)a7$`a~huVG@VCBI#+iNb|pCC zkhw^~{-dJjgp{Cs>|=B_`Y39qPD8+iIAyZ&PoeB;y~MT$gunM2V3}YzK*d>M`}mo$ zk_~YB$TCh59Jyf^qxJA1Z)OxsbP}d{{kuvZg5_fU;$n>{Os=PF=^>B~an$mZnj(O+ zTGJpkGS3~y3h@zi6#M^FNLecpEmJ>a%pWVQ23(<1%Kp;)RG*5F3?B(e!QT(10m-sDDy&h%xmz#rS8fAKNlAks#o_?}$s!A$^6D zkhH~F4O!drIK6w$o}(n%toHFeY)MKFkb71--gWeGnp&A*?~`Dg?WBt5xC@dVS8DuI ztjSPbM*@Kjx0U+2<6EkU54|;30kLmg?e%F&t;z&Y^+9pvIG|J!rs>orh|i!`_D@5S z2Ng_8{^lLo8Z1x~8$r-Hto<#Wr;*tQf0m{%NwINUa^>?oo{%+HYX?qWuTui!gm3W! z)vrXnN*T{6&90k+_8_-Va&t01W|Z(zNJ1*8CNe}ni6VllXEXu0uej!8S^>O-kX`bvB5TF zbR_(fdave${MB)tl6{Vze z#$b3aoyof6xFm=q4acjkCY}1@d(b!8FzGWiEwT-$=kxDe%FL-v#s$Yp?NNm_6^vYr zqr9m1k1Cm8L3~*=TRYADY}9E2CQE{-GRriAe;lOB%fGssFr8KCKwnjC~ zI|tTTmz-4c_(0V98cp#WLHTRO~0fZ|jguKvgm*3aA3bOv^nYX8TFS36->t z^Uwe>Mlf>g`LShhO_T4Jvk>(LXeyn$-cR(0wsU;fb=DAuhcgphCw#+mP1zZ^>BjDG~G=oFo%=pHW@NrUEPj z<~Fl4QhGE@0&~6VyheAWi9A<7N?!;)26;o)MSo=oF^`QZ@3b&`WRJLHmEJabMK+w{ zr^e8o;I+<}cnVxA|33M1l|(zs;?M23Y@hsR%AaA=ChDcy>UM0eZEXm2iM|-I$n|D! zw`LLlSPyc{^RA=)kU`etAC#Vt?_9FLx&NQ*j4~PE9+MgMl>P6F`=WHKKF&DDu8Tlr z@Y^o=aZiL~uKo8Pfmr-56)8G+LSqG9f=eUAT`Qf^>1P|-nyjYmjm9=rE=9O$s8{LQ z4tg1sSCAVIo!X#`^winCxBr$#kNUW|ltX+pAHn%bjB38-O@V)zP6E(UQ1t}`An%Jjcn9|W#-@oFIAyL3*4e`+QVlkV| zr0tS(YwVSzf*8LgF&(2uE|cx!zemy)Of(J+q%mPV^{DF4zrE$#q5)onG(6au!^J1S zW1~!rl+I`JOhi!u$6^lb1A|rTB+OzaxWQ1K7|NFzQkA9mgT2r+B?lzuPifLcS$eZD05+FFBm+=h z_kz9US-l93*#6X`J_VqO%As8DK^pELNodA49>|b+T92$+plg)@2*g+FFH`7Y|MKWL zJ}s8BQ@6+|s^>{;4uA#R1LSwaol0j~dJ13*u-Hiq1LIBsOdJ{D(GvJk)kjCY#zV*J z9|EUJmbE2gUf#D5Iw3!jNi6xMQT z69r$=Y^-rptCjI{xxrzjTlbBP0xZa2JjcyYXLe&(f@zTNjC%mglr8ju{dS1lWNy-X z#qVIU(15YXdN)MEtj)61%=)S?85mg+@F1S+Of=L zWO%K?J_?y0wV^fzZnl%@3C1yiMuN{s7flxTT5ze5^j^)qYhT`xPGkc(GrG3SR!4Bl zpEPO;Xz(*Dnb-)-v4L#T(G6*yzUV~4mMrPintJH9XE_Z_MJJc=?S()XIu(4)rvX8Zu|E%1=- zO+!O1$)E2-4VzUpK>*fx&O_#xn{-UVQVFX^R)6_UxPOlu+c{Hs>d+bqrQ1`hx;(p( zq+B{aCu=(T)I;-lf{PPE9g+lP+wPq<+tUl+v7(eRLK60&<7*>~rVy@tvd38OZg^e#h4& zhyB`{-@s!MD4jzxXL7jME7$}bNVT8L7ESInWHjq&r=yG<++WV<=hza>sD@F8tWx8% ziu+lN4-FYF;qOc8I~rY`^U?Hu8xzLn*M$r)>DI&;5xsWoL)F&Dx1{MWKEu6yT>eAW zyQ8Xr^k9Na;g{TSpEnv}p2k*>6PR7W+ATB3k1l0uPTG9!e->XDi%c~{nQe*d=&{cY z{%C3RRWW_5X%=_--LHZC)4d>izpK}tpr53pq7>|4hPD$giC%OsiFeT=N)yBp9;t-cA_zi+g1TlGBZn^6ZpL1~+;>2zTjvS)~&bJUr}dB zUp39;Ywd*zhnK_;w$GPta&;t6t?($=H~zWUe>X<{%;6rJ0FGkxOzErZ@uB!*Pq#`r zZmG_nep2Gh0gu~25`rmm(RoQpKWVI!+}$Sh7?>@bQUFPjXnEXVoQ z*>NJyWRfYbddUGJG_%UW`D5?g=`T?y;0+5zoM~c+baR!? z6YxXuU0Z=_U_wBV{mHE3$c<7%XZFu)rsESY>aw;eUP&{Nz4NSqhx2o09Q1pQQ*-zB zghS_JYwdo{`__+Qz<26{T>(UciMNnK zekKEKlJUllKlUZTU)I-;4O2@X^&nI3GQne2#4O+}h`kylW)O=B@LM(rBkAe`MljdN{T8#Sbmm(2nBU!H9A(aYx}{H*QZ_$razgi#$tLLL`+YP< zVgI&H&mNsWCfbqL%L$U-&j~P2Q2wZq`x}S`1K>+E*hdY-LNc7q87Y9xTbJE{-v9~kt3mR( z$t78kWE_2!xLlE96YI?TbOw$gUPU(G#73k`yw`H=YyP+F%QGsj%VTxV^L}rFA49j- zHiY0zACFBqG`GK6sy|z%VsKv@ylF-v!)t=`0W`k%Pv_`CGCv`o$7JtG<4D#1!r}=0 z?BH|iNk;nw7utgH3tKlY`^g<^SjiIBn<1|^=&V1F`%`RU!)vxaB$*+-yF)C>Eq9$8m$g$!p<2I z*zUy_d;Thf*hu^AfLt(PeORX#!TE2_#g9>T%Cq}bP$?ak1>DgFq8sSXpl*2o=y3i7 zUVRF+tNea-vv>ZS*FNYkGRglqn=q+s<$-k+l`H47@s#Q-rJc~1nsOYowogfLim-+J zeLW_JH^~F(H?o~Lhv2ltxJ%L(>_HStSPCiX-6ZgmkU+t4TPC8$w#&hC=j8f#`Xzen z(d%>Npv3Wk*KK>Y)IeP`7J)!VI$PdmpX{H%C7xk4vFA2Q4u(^wOk$y{cTB3fU9$2O z!8-}P3TgXWHW0sPdzgtj3BW_X9La%YJ-Tw^+wEiBFUcHY(!Fl*Q8VBW{$1E`Mtx=y zkCOympDoo}GB)dAzcfnr{Hq#IC-Za9tMuS^Twf0fV<(E@fJ1Uyb*#KzT*DrfM$-=H zX%U32x6;A;6@@@BN$z3JneRm3w_ZQZ`gCLody>FPBSHK$b}9k!3?nN!f0|L>yNTQP zj|bc}*k9j`jK?jFPPe}2Z26mRlQkdie3PhwqyTF=7xkuil_bO3`KzPS7krxD2|I#( zoB%5t_(dh7nxB4Ee%|IT8g5`aPu7d`z?~d9{z|=v?dZS!J5XE>aK{n+&An;K=^fAnH--z5r4LnKkv!gj7CLnz4gvW4-X!mIq6EvmZDF<$KM0 zR)QYZ@la%$-UR+o3@iWZgz8bBYv+9PV`e0iZ7zamN*&)UQDsjIlbyY0BoH#j0L28W zl8KUJe9~!ko&AU`s+9rGw3yjGyl2Rxok1+A^lTGj16g~EL$FuIw03Zh= zzt7^$r@15KQ%Opey>dRi4wa$OkU=3mMwVv|iV6p)tmpA_7*CRkId-1gvAObAT7`u{ z9AK(sgTq-W0%^@St7Q|U?VV9p!n7cZc)!%O`w#N(I3{Hzq8;^SmktJa%Nl&%U8BU_ z)T?r^Z3sFBrY@-mA#%LQ3;ZX{erAo&f|F&%6aeV=c{{=i1N8%V6!tU0O}wKvcq-P* zcM1@61D<%3FvB%k@VKDI>vC~c>3A#xlu>QX*_@{1@^WF_DZTH`XO`)coeUQtVzFz~2^Gf&Q{O^3;%$`t<;2gfO3d8#b z1flzPw!-#w1PGb|WT1kYvh#&7=x8cyoE@8#68XLCf0}hOkf~#d`iLe%X%D?%Y8Gtz zC+kz|T1hNjevBmyv?D?~^&nc6w(1u~;Tt?*_U<6D#+Q0Zit7W?tfU zezF;rpSj#C+sZ*r!{K}Th(ta*t~oD94bsQ8%O)zxnCZ~e(fd;UQO5Wx;YdZB<#j6V zq|ekl!DP;x)$ntFrT%a-?f2bJXV^1>+ywK7&k-}%=Y#)dLPOFB@&8p;M_MWGmpJ#T zkK5T!e2|8~(bD(QLvz)~1T&ew^fsDvOv)oqY<%ho35nmkRXU%~?x#uIkS%<7X#*AL zasOqMm=Aqm>OkVObUuELNm-~UeJ~kND;+yvwbH9r@tXRZ9t0xBa}TPtIR)-|9H1!4 zg20Yi`xw<=#eXRH%s~Gf&imw3oQ1Z1uzGUwDSmzNO-ecd{u%M?!+O>8=%Y((k(XSl z?NMR7G9nnAN77g6E#!bg@BT+oButUqIJwiqMzwP4oc;9_Kfzx}_?e^U6ZL1x-r~U_ z!zFxPbgw9@QVW!`{9_d){AZmF7z5N(^({>5@J)h*wQ|c?#J`Ydd4E5jk|{2)+OAY} zdC!yxB|z-$fub7JXOPS}qop_V8@oxM=YC)Wy+87%tzi%L;+;k<-DHlzn8Ges0yb&p zYhvVOAf$G%Zku;B{awN)&4t}l2fbcOBB#_hz0fS-erohj=iK_a+@$ZTqHO85iSLJu zcXN)c(rhaMun3d#Mt!B&o1R_6Ow|c#q)vdJwrQ0vM0=Yv(br+__e!kt%J{R6 z^ro3h6TV4*4J!+jq$g`y{zcATe9Ssd@IQleNFORu>JN!3eL1o z1H5Y4$0##TTUk=Oahmf{oj?DsG|V}SIdG;y4(e()8BVfD&m6iagMGM9M@S;**zYEQ zcA)1tIPnOM)En9;Y8i5%?)V^`PXdB48<@3vXh3H2!I-jCpK-$~0u={}ehyVS2H3HT z%nFC;wPT8dcYsrRJi-M7jUVs^q?wD3$F7yfaD6|=v(oiS%cYVY$d8*$gjA1NDUSm* zn`>j6eh8R#nEp6PRWb>%%E^jsExmS4L!=CWm@W5_bWl*T-%5R;ugR2j#yV=mXEduNwh!nP{SIq7{bX3oG{7$ zkn_`-bFyc_5d1Th6R-V9KpziHK*0g?**^gjrKlo$oOK9;|JU>fKz~UN5}!1@;T!;z zM@s}doRGud-HZt=I1Zu?7%%dU)STsEX!v|Fz!!0Lfb6KSmHPJ`*9IEY&;kT;4ND)GPAN z135ag&yRc4=F-AXsMDGofI7+)lH#H{n;7Hq)hJo`()=^d2ngx&*e{yrNiaL>U$RfG zAJ%614}PKnH?BD+;NZ@s<9|U$9|FZU!N48B4lhYtm-R4Eche->x^#uJ)o0Jkfkr)V zm-Wi?J`nK@z6i*U9TWS>v*RlF!?r>>~t;8?#9|k0tCgQp&vI!#68GahvufIq!m?DYE8| ztNacBY{>1}j8*1Pd{_f9U~6^GA1g#}xmN*!?98JleT=Gi@&v3SlNaJ7pdx!J<+*zzUIAP<1^hr^GpTCbl#ic17 z`oec5k;+}#df&m8|fv19kP@i~dEnWhgIc)putfFC*dHS^Uig(ovEZ5f-DZD~fw@8L6R zr0)!b#FuP!b2l6yb{B~OM;mU7H24`22bq9&cHJaTv%u*ifVZXhK&$I5AFw)aAfM;8 zKOLeZ>vG@5mPgW;aD5VQF{vd!PyjiN?%X$Npn6L)uI1c6IBU~H3ysZ zNSS^SdvJ%~e0+|BYj1gKi^n(zQh9YwI3j`(&E;ie7bB)|VTmVYK#Is5%&DD#X0a2(!m0&e~JXNFox zIwtd-dMH;YSKF7}lL@Q~>K^f`zt8QeL$T&~d*P{s^RzRa|#+Sxi!}lk!dQLLil_yj^ zWDVtJgWJ-h%C&R08rm^;6(`Q+kjnwi^JXJj0UrLA=RCW22Vhfw5lQ~cPX$0H=tZre zOoO0HC|h0B%{w6hyeYC7ZVhfAOYrtt07SM#rFo?1Lf+Kd{o+wssy=*1#UMuE15lF4 zDtiAqr8pHw?JRkij$~pCqP2EI<#$jIk|m61@ah^c2f9b%`J}36@13)i044r@I_E9d zWY&pFTIXDIMQa5fdDl_FF9@q68Z$PQ4eXK+f1{GV0WtRu*2=exI>oY zO=l>QvYE)wlKbiHY<~%oqX@ACknd7C$m@f25m?=?RM1+4q5OO@1jh~SINh&g%RYnk{L8M*`2@^&alwXontGylNa^fTX0z>9d@2 zz#mRc-+b3_Zd>P;`VplS5B*tu<}c?(HPop71i6yF17TKl=f?MhC?AD1BiQeRT6VDC z+xRC*Zs({wX($S)Db8)^oJr=6jKpB}&NxfV9X5a!U>iR+mAJ)cplW^j3;5|KOn^E3 zuHW;6Kewgl2Kw%gl-cYD8!)N+el5UezfOSeS?8|P>9YfHOPw!4UHUBea`PgCottqM zjk>-%a$r7J^Emr)o{yjFxIt{PMzL8lqt8hx6rZhwE|a~h&2RD?WV`TXnW*FKIRvx* z_v*(ZVB0E`c?xjW^@-(Fj z`~5|B2cqiWo#_7*EOSflACO~rJ|e`!gpSA50;JPqw<<1x+i(clI|00C21iLFdtT+9 z2io<05{kGt)Pq-EJ6E8J?SD(EOV$t&ExiB>*&F7%poxNu!v!B&gZ8QQ5<(<+@mnl zDi~MQIwu>hNc0GVNiqMrl0lkO+zcDoSqJKV0iiAlV!Jf;=yTjW!M-JCgXgI?7%pX_ zaQfw@6VFo~*AT`QXV^!88Nc8C*zlbk6r_|VVD3p~-W|ll%07M8F`6Y!oq00&z^d~S z8I?gc2RYehPDk?`H{vNj<7W;Bn@sd6J#+zg;-8T@OGX^KFh@$PtM|fLnMWUa8SOCn z`$PR)J^J8tohc#P_v-%jfo&iD%;Ze6@v~VY2c;jJJt6LMkhRzyroPSq4(A?lz-MF% zg5QBP&0YW&j0~KD+C4jGi4Ftd()om-QaA%i$NRJ2=kr|J{sK}Iho9rZ_QJ0hxg%Ji8EzGwlvlP!c9fW>k!9xRGUSTW+lwen2>OW z3x}|P$DO0EQX0X2=-HtAA*gWqft`Xg4qoY}0ApzebG1!3o05}|VLP9E{C+_lZ&ou7 zi~SWq0q6Kkpylw6rMr^@0D&}#3nQL>2Un4fL%H8pl^}Vlc1@ObAT?$4TD9` zCQtSvj-LQEfal)LOoS=-|F>%637mx)PtdwewaCIr4p55mgN@UV^OeZHi~v>5i}<@E ziSNEI(JU(oBGNM$B7*~gA^x}XHT-gfh)Zk(Rz(oe>|c?gxmEhyp{Ww!_waqkWV3rz z0I-bmmJD|$#YSdyl)B0X`x0w%IghcMmH^t8e>i8wO$^wd?djsXatf6TcF&n48xbrg z-+8oSnhIMyC|7FMlng=F%%hXik@ETaJdc}kRRY3-@0mnJQWvAs>_2vP`zdzjP; z8WQ<)c)&Mm@_87Ow4aMxJ>FsWi#Upm{dqEphSEqft|2X}$CA={6$z`Rs`J{{DzHo@ z8Tk92oWDm(V?8?rpUp={^KlUKAu|_(KKRMx*O8KkPsGc;8}6Z)FthMYUf(XcEbj7t z=MCna6%?54a3^1~*m)7&CpL-3x*9i77XDXYk)vcJk0QmkyGByZdu9BilL9SEn8h=C zY+mj%i1z1rj;gQf`QzRqBrgQ^b&yP;7!tPRfc$8&(K#PYrF`eu7IQy?JrcC&o_!WC zaV_!U2e0@3=nWV{o)(!{6JoY=uLKPe)~C)H`eU0lt6a$0kps6M+c_lM1~Oc0|00>k zZnnS+p7Vb0E8^E^?QO^Q(u8iLEuk5S^|jr*iC<)Uj5o1;O<;e%s&NBD#V2)97Y?pa zd(Fnrm_wKNsP4~mQd&~+-<;=+B~B*a;|?MF{otB19`Rf9{kK8Gk#$70n8k=G#(T6dP#}>$Ufw2h`Qm ze2zAORJYaj=*-pVs`^p7-H(Q06!!ae`#yu_%=~_*OW$&jmSQ^9Ovc4}Pevi3YRMvX z&b;xnOVFRi2X6z=yQLP@kDB`a3z6F>a26ksoJhZ%qNGHSAQQDK{xhnI!GAR)FKbBB zNAV*EHpk;QE!`t*dzb0@|nk*u%3zv7;7#!@2ZG!L447(N^Upab5M_kgfi%!UfV0KpF5 zWXZFHNR%L62Z|=LPlfBx@2bf57rg}vQ19-(&FDF=TQUXZhC%?K%rkc;J|sxa&#O{6 z1aWCvSnRhOU}=FPJ8Y-@MCro$mZVRK4mw`TeZN{CyBBG^u6?9u8riSc^`zDhu$E?h z8(r;3)T)EBC64_GmgyZ(b$9<s&&57JT|}y`tqySDH-3v*1q>j zQWazV23@{1qkBg?Q&w+wMO8Y}`lqc%Nzg21T-}i_vbyTcY){4L*|}et1$;}MdBae z;`IzDT4IVQU|8=EM@^rGc)J=p4O>D0z?e6K3&@Kv=&{VU4@E;W$Sf~_H%?#J9~TFF zdeob322aZYgziy2R^^2#F4n{HzhffH2_qlY&qi8gV**RrTig%Aa*}AYJJ}RG)LgdJ*qG6%6VZ08g<-EF??wDyb3($ z^T+p%f3rsr*{C&^jCYeaoBOkP)?`}b{mIUTs1CtKpAPPTx6*6vAZpS3+Q4^IHHshV zgRy)B*zAwf?8X`d&1tgs<;JEjPR=eX==*sH^nZvs+o9M6XRSSImUBd{^mK0%Sj*!9 zs$+7-rR{fv&nC#MZf&{SP`+R;hr6Er^4q$t4FM>&ePo+GPfG-uSUE~8+}N@D+Sg`% zaqmMdeh4Bf=JMJ8Z@2BE$sqg`EXt_g-eO|{_-znan){9(RL>Iib4T;D2i@*|@4(WZ zS@^%6qf>Wrj<=&AWUMF@J&bO$%%k`DRMKz?+GK%LoI&rCd+XRA`AqcwyzO3U842Q} zR_=D>Rh+5L`7I81ni4kOrA-`3jx{^yao3J}0PZ$Pn{kIE00glnx9VGoKVO|5N!8Ln zhjG~>xjC5VM_}-I$KM?#FawyS{=q#J;sccin9Ah=NzaW`;K>FvESu|dWW_R|N%7AH z9xhpB!qC_cX7W&-fB8?>csvGm6`=hPz~pk!=Jk~f$8k^(b&eb?KMRoJECPCB{s%N} znxNtrFfJw#>XeooDQ7-Eas!l=@d*yEv@GxbUx3}O)XgKe$_M*!yDCim!=GWG&d4?2 z5@~ylGU7z8RD;%3D-SnlwVe4^L;;=9J6rdpvh=awN zD)Q8G^c?2cs-=1q0>QsUR_S>C-RRB)fDPTyKO$a^HRJFPAWS;DKSCkWDkPc7aKAt= z(<<}4g>=xM?ZC2;=|2Lj0aj6QL~dh(ymN9Vd=HKYDgww=3UOpIKrg@t02i$No*%M)t=3aE zEPBY!akD!hppcjYj;0?~UGDh@5fj0=gJp}Mt>k-*w$)Ld^^nRalL5e@$oa4XKg45&|aBB-C(y zXUE^IX$YWHNDN1T?&VM$_{>P#8Mr*=@RBjtkm*X9#$3w$3VC{n?D#GdVf}?zC54}n zw?!~we~sL{dA0(KVvEzf6(t{wx4W-KUcAJ!&y8^*+op@(h32@s17_?=+T>*EQ#*x8Fl=Kqylf82EXZX&0bNikx7^&##n`^jqd>{Z^Qb;!bClPcY z+EXSl^r8qO;PVQetX^_l=g|*Z+CB?WxsX0r6ofg%JEA)G=D1Ow6&qVQ!tYq7y*^fG zneeeGm$CA}WJvS}UV*FjxQCzHlK@Tl&xbvFeMXd2**^zec8spo&ROzZs`S}_yeD)p z3Cq2X^u740mg=|xq##YYgMpY8 z|I^^tXpIK4fRs1;&uN)n+Z~;Qv+xA$_%-8~@q6K?{7)Aje)sf+EJ^=^V1XJ`4f7J( z(zpa5ctHFf_-aO)FTclm&|Q^Y!yW=$2ASX`54i6D`3- z)7{7noe&xOL=6eAtG;Lbf=^y6e1gtszWK8kM*vtrr@v?(t5vvXq9j3N&3pZmHff%+ zwZ(xWDfq9WJp>woCz(7bPyK)?nj*BAzJq?5=gS@R#@s%yJP?$-8x7*L z%NIywAo5&TTn7R_wQgxVvm7SICZo(Ona7dqP>U#?is40qHj)TvhfH<)45Vt)jRh-E zg8;yeV7hf4ch=qx^$AFYGp=NN&3c0umR0>L3m=DgOd1?n@;8@VJq8!&ly18YJkmUV z;5|JYygJlW2j~Ko2^Vc0{;O?i&;*3<>H*6jMZ zd?GcDwRgmgxmr~pzTYmWPWD@yne-LRKfHC|yq?#x0g;Dy+$cHalZIfQlCV z^a;Z}&P-Y7tM7MIPhm$e&T#~iWt}5+y<=r2Mw@H^tK*<78uNOy1$M@FovPy(IPVT5 zynqV=QW2DqvG9E0)X76+Ou&LcYX5>=#dflUo?xqQYvt;$2}DB2JG*v|qfq|*>7&+F zaDzIq8CkwC_A|R`R+!CC)>+#6x}UU!&B_lUvGunj^?ZG1=?g*<(d%5j z4O;CyAyUY^_lzEqh4Ne3S#$0N&=^WFpcu~4Y1=lr2hg$;c&#Frxe3^0;#>i`#~7=qL5}l1 zPZY1U#i-C4FsDIBMPPjHx17-v*17YR0?@1 zO{J7zVL$(i0*^KFcY<(gwjMZ!{8miuVY`?*65pJxc= zXHPN-j6SKYK1$H$pZnS#mz=rhY|RDxZiZHJh8gm;QMlEmE`i7g3{>@yiS z;`+yry8rR-^k}pF*Ir3wA2K~}31f|)|9al!?Q!z5M%54{8qpwV8^n6#Z2R*D*}06% zZ<;IXA00`zOYRBu5(qWYx4$}1>E79UAELnf@&(&9(^goE4es-W97)cuOBx4U@cN`v zQ8<3pLsGT0r5!5AA$PmNdg{XO{+n1~LIQSgdr9S4$6frRfJ+8Hu~$k^?u_FVh@KEl z-qnoc8#OpClBt0`AMkfxvWmOfwyRAnUb&0s?4F9G$V2R)87unav*^U(zx{{QF{C0y zN`Nuy=cBr_46;X^Ag`>Ujy&$*&7etSl;?Q!{=}f*`~vKffl6KQ6M$DX$T-47ouV6@ z4g_X85zCJBB>NSx={d+L^kxH6XIMv@iFAO*26EveFFzwS zL3YKFb%5JhXSC(s$JxLl@OD5@kS(JsMjOtXX>LUl?)Hm)xrNc5If%~J@WfSeR7mWO~(X4IWVnGHbk4b(1}>{ zuy(~hdvD)T1<|vDj8B)l1Q(LpU03$!NQauo+5Mo01AsZte`=U`P%8m+BSUSYm;k4F zEYIKC_WJ1P@=lQe`Ae$?`FAb&EB`Bi7GTiY}C2i1Vpz`x)01AbfAKp#w)*ngtGWjzrd-j?wpROeQflzKz2&~x9Xw4~H6rqm$~ev)aq21qx$wL0`8Wsvp;Z-*QTAthHft}xlwsOX^B6(`()#tAy)kne6~V5 zBp(`YZ5#Y-KjY$Ooq#zJ7HAtX7eD}?^p}bu&zSwKXPZHz1f%9ZCc}of*)}stcS=X@su9Y8!gftJZ^d0d4d%vV=TKplM?;-{veyP{D zWyEfQ72YOz4L>#1vNO70uzBv#jm`J{>vrNm0vkp7AQwh3K zM@q+e41P(LwtdS<&TFHcS(KKm#n~W~D9gN#dYc>+@;bppk1$%N7CdAu*x|Vp#y%My zn)vLT*tpq~{VFm#a+5x}?7?-VAFcdSFv1wo=P8WQ(Pzq%-1EFl`xIGlH?fEed(KzV zA8p)BZDTHuN1=Z7JYIL#IG-0Fl%z@x9^W$r>Iqyb*>e9(Sa@ey>?NObUT3d&A0|OR z?;GS$nm6zw_^kjs)e90d>T_r+3?M?^`jm+uoznBr<-a7Il$nsxA)h;Q3;>vGc`7yV z(vBs3q`D?p0!)GoDr+P^L$dXwqx11dtWV*jB}MM&atzmcJ(DYCpqYsU3B*^LsNbf8 zhv@~P&%}dEC+J;eir)2OJj|I^>!Tk|!RJQvf(zbl?M(n{1w5EIJ92D6VC*0s`>{dX>o^TYY{v}h za8{c+#~3G)%Eyi5IriF`^e7#6#1DX{xitO#hx?oF^BA~6t{4ef6J(p6mzIG)T7q(c zhhD`h8R54g;UtfVPYs8UU7Kym2{yyR&7w2^{ApYl5O22i_TKbSXMp1 z(tRu?K<=JW=5aqEC5hgnQ7E~gt`z|UnRyqeiYUn%P*k;M9gGpR(9xW00ye(w-Cgc8 zHna1)*s+X~?E?5YcsS$cs3A&R{KI;jmlSV&r>7!(loW;}&FLkgt@N4KKO|L|F7^3y z+3v?*>Pa9%30b?b)q@=LJdX@z%A=cDfHW7iBFyV|^Z{YMlZhVijU+{$FY!J)FRoaB z&SRG}#~lIk>-J@kLS)usg9_5u@Z!aP&jDUGDb?!$J{&&WuHQgvWG-S=m z_=kVO@8xV{dZ&K=ULk%cVLSB(`M;iYAimt8Jx%9q=i|GKL$KRwP4H#>g}`4h?&kd( z#gLyX-#^nRW9n6A{Md(zWR9~q+e}RgdFmi4$MdT6(aiTH6u8SeRtme@yvbcp3@knu zd;2YYp5vrnNWTd|Z2Q@LlakZiza`x^=otwr+NDI^J=g^tZ|pW@&{8mzJJ~PctxGMo z&(RZ-fS(uHS5F{7r8+NBy3KWs5KMj%h-;Gtv(Fcsy@`tu1M_tN`OG^Z;J=54jw9)+ zDOH>CGuNFr(_bM!F7HLj>(KKiDotht4ZRM0wjJ1am(Jrdmo%;HCEKmg(6|Y)G;#g@ zJ3fEM;({hki1?iEeVI4VH}vZzvx329zD`P|G&}ZpJPD#HNgCGKuVOz}-_oVYbQENt?0=v@r@fIW(W$pRC`uyvE>KtC?{A5Vn&1e~s%tZ}@n_&FH3>OW< z(kN*vC0~y+7OyO;(S3{mfMn{Y>l%FZ9}e+v%+3eJt}<#D_=(`PI3Uj z*og!?Ym6MAJq>fo%Wh_1C2$VZO4Rr!P&#n{wabzq(oR%LlZT8w6v3~X<~V@%`lsRI z*pbHG1M;fgpwU6VK|YwOtAfcY07M)!61-UQHR>i;&Yu(S_+}Tves3^uM{$JFE(4{b z^14P1F$9lF)*z|{fBsW|GUu#SXY`yuzBrYR@Wc88-cnen@!_H7(CPt?jd@4lX;l|i zTk!N7_a2lSV@CYA#xS5&lIQB;sLr9r-4BOjk}qCq1KdijaUFplP?LWcfvqBpAN7ZlbDr+;Shk)p?;W^WdB8Q3_`Lk z)shMRAtYc|x)8KGBc3OE8{kbi02}iA-^k07eYrSV2Rk*4rh)}dsepR(SiEv?V0F99 zN*{sfAXR4ctx`HT?|kSP)`Q$fS-q}~2qZ&PQv-z%}WHb27}-(27q9QvFBY!sU3>z^eqE1DbXJJP3OnYR3) zeYnWLiR^*^LrvR(myl~zHVUA*j8psxbbMgyN79ds{~7hYIraEw4i!GDm8N33ufw%> zFrj*^ppukqvNLmsv-zs&N(+M(ax;~$fmt+>7f6R44FC7=SWS{x8vWh z3MMdSI8jg?*QlOdI};BB(QxYc`AQ~@T5dd>yRcYqa>kH8 z!7!trw#C{SS2{^D5Tu-odDQ1F(Xuv9(ohC5(p!os&LG64-=p606{7rY z7#MqTg2gb}2f|FsAR7D?cL|Jv>ymWCQQFQ1Z*rfFE7Ok!V&$jtpG!&!WU=+e*CFlj z-zEH;Z9x3}!EQ(Sa%S``Pp^^&$WF{q38+alb?YwJ?)NTCmb>%f&hV$+e%1`>JZBr+ zIVd23h)wAG+Oy{DHnw}KwIcnJ3z{8!=u%jE-sS|*a;QGMwFGwWM4rQ7bFGyT@U zTUEy%w;*rq3sVNCc4919a@*@>pWUbIN-ncVADXgcyV=FJT#o{cPG3U*&Ud7`CNi$d zDRWN9O~$>2;^j+#?ZarnpnabC^Gm|P{?xA6 zbyI3HQU0Us0}tpfiFW-Zd)8>xgw%b0&M;Z|(R*jlU6o&auoKG;&QH-Kv7AVlbwsm` zv#q!-J~xC~@7>#`S)BDd9tW+?4kXqEhYX1Y5=*|n+~Y$j1zgDawC?vUD+`h27~1da z^{ZDM5H%xl(XswiCE3-#GOK z_EpNfZq2+I?`h5FgApK~$R!nQwCThnbeMMc0LF8UUY6OLlo{#C@)nYZ#<4J)L78)F zRX`*h&&uHo>kP-^%X_4`4nS{}{>-Q!YLf2RfUSA#r)e_8dl!LPo!)Hh(PvrDCxE98 z>WfxAe`Hv%m4TlC4YCT~^55Bjk?+lX>!>8i_}i9|wLj81f4pDC!J2yIdP+?jpaYqH z;rQ&YORK0LxV2+UfcB7W!1s<+=aoc$>JJ$@94E5AE-Md8WGZ3%#o?Y$8gIHs!OmIM z-|rB)WRw!FNfhq#s6w`sUTHkfUi1?<7!6LHM+-f1@_?cbP7$DzZvE$c>>PNO)EJxi zL4H`acnlIETu>@}Ln2N-K*@joZj~BKZO<2owdF*<*qpXT$5w@D6k6 z2iaV`;4+QZM`SxBmC{cj*>^XIx_mwYaWd}c3}TM~FX{i(cwxV8f}UOiw~!Ai&ktGA z6L}*b3}6%{+QDJNzhVm^0nW+@jX>O)_)%v23One!dJ0c+bml6`U-jso3qU@vEE1{c z(}1V}j0|BZK&SZmuF+}l|CUZf$_nX)N!<6!`r9NJT&0Pi_u)~|>}eWbBG!AE5Wh$f z)h+l3*yT!%n)?sX(;FCcG6~~`n!@I6dzebbi|^cZ*N^@4@AE-(tNf@V2}KyeXYl0qB<0ID`Wrg)vC`1HqV2vD(TL( zzl_9vz+DsnWMJsBD7|E!g#YlfrNN*v!;v5UdTg?!jHZ>I<@2OjUu2hp-zoxUg22(} zoIg6U>f%qAeYwB@YR0@t>BD5gS*y-E$MkpV;KiND>~|*)SgVus{Qm57K9DegmU@#7 zQOUi@13x_YlXW6NacW1@ohTn5B7N9v%f7PUMS$64@l!H-%l%Uvyt?PjD(kYAC;#-| zw`WNJjhtjE>Z*%m-#@oZc-r7~fbu-{2%=~aNAc7QAhcQ2IP z-jLLiw6*sBndY5*msz7BP$Of1uI+-_2Vgv>U25s82LG@JoN4zFy(R(jeh?6IAn!A& z`g z^nw7My(YUB=*;;xvExN;++G2K%D=DL{Yx3vJAokgft@1QZwEP!!shBKK% zfMKvFiTZrSknjK67~9CeO!8TYWxhxH1YBcm(==xwDKgVH@ISTd8^fgLqQbeqU1)t^ zLIivgwrI!3@qAhQI#PEelCCQgK-* zLmzp(#yfZ3%swfJ5nXS~!0T}q`pl2?9spN*$oxi1UYjA;sm-7~WG04y)7glR>*@-I z<9+}m)%i&6tU>{@j~=FE;c$u2w-I5wcZ>H^YJv=w&U17&lsmk?-g9__WA^-Hv%75F zScM>oewMWk`#h~Z&5leBJTl>eKYJd^Q6S?IqHM7Byvm)YAJjSgI?}lXjiU|t2koOD z|IskcCFi=5=YWWre(&U)X~`YZo~vBZjN_@}EZrLo%x99anLQkk*eXl?0}h&VbFp!xa_;s2 zI?FigfUk-yK(FE86u-c| z$`bXQ-%Jl6A&&p}s`OAxnFh2z2ezVjiBRF&yM9z`Lo>3x2c-BC$k^X2vY%lr+g53x zy$lu~9o>v!Ji!RHLC|)bC}+fTS&Ykv9yTUl5)^An^@tJ?DNSIQq=+9F=}4b?)UXe6 z@zRTZ>IqpM3u*ss#Ya?tIkO+6{{s%us~V`0#zkl*0x+iM1C;Oy*aV0VpHCPd%gP3N zG{}$f{5jahlP3SHkCifK--qWvmel?^rpX>`fBN1S=egu_M*}Jfw;U(z-#l^)p|kd% zBau}ifQ1Z*ovZpGgR}{yw=@)wp6{xtsb)(msyLjiEjlrm2pthroVS4{jm*3pXYIK0 zUkK9NU2ZPj>jz)w```SJ&-}jYW^8jCu}SBnQN+I91HdWFFkLgD+`#b!3Awds{$)EH6u1{}053$3DtTQA661Z=FIW`6lnKx*ZP86=Wc`I?opRZkki9Jb0II{-;IYljh0!* z^!O3$ko~N=t2z*9qxukcU#&)=dx?cYy^)g0G**rOOGex3O*e{7FwSYV(y+XrR+oAG zQgT_D^k7G+GtxKsNpjD>_~aQKk|ypcuuB6rZSa5g=g>T~IZ^igOB#e{z>yn1QrdV- z(kGEnNh)Rv5{bQuGP7Qcw}Q6uy-E}M+?^z?Lb4SllSz8`%6hGRrh19{`t$GqNqy7A zE-5w8X_(?HlsiazLu>?Z9eprmI^6J+1Yo$<_^9vi&p9O|Q`6f|xp^C}36!2sJ?f6S&pJZNjM zwgzw=;DIzKrQwt%pJA2VL!gnwrCa}>=P~p86u`}yI%j1eMELV_3_u>RCfWlpNge(9 zcig9A?<;MmzZ02fVJMt`0^+J-`>lsV1;M6|!qhz!j+oG%-K=Q$gwEHLDq zEh8nr(Efa%mB9YT0j{Y3LAq&z%Xe`BnC1n3d`9aH&Yv+M<-7f0*veg~$;gu?QPc+< z31!}F0Ab5gLf7Ta-t9Pm1ckO4$NPAwohJ_5CMX!K&BiOw+xps!@qIADubvYby4G1# zoGZzcSqJ+!tE!gtZGE={s5xIe+`Iu^iRNl{ZT@O^sxv49EZS`X0^0#cck6i`-M;>r z^FSz!%LQ7JE_HWtFhSwh+4eXUh}&d#woWeZJdvN1>6}Y8Az9@B4FiEAPX=&3UT*`s zjOLTb3=!OKZw6||OO^zF9(jU8YyCz`CJu_lZWGFH9|N9uoY89j+h=duy`oNI3&a?v}dnzWZJCG5Mm%3FW(DRfTQLC77<+p}90J z)B>IO*eer_=^c?I-(g=3{Jn0r5oxMsB$Iwbk_n5y$Zq+LX56j=^AoRTfG*dn+gRE@ zsH{{dwf;$fH27C(gYm5UqoeN`WwfuR_MN9o=TnDO)H3Y!3_j~Ol;K99SuYz8S_8i+omvjlZ^L4}qZRpO>c}$(?U` zzVcAFClY*_u$UP=QI!=00D;yr#~E!n)JU(7ItoeTD!Kz6^QxtH(GnqZ^!c0(WD3$c zfA2tuG79k?88$u z?{f4}k8K*gO;N+h`VQpO8_(PteJXtdv?OBn(WGa|^FS*4 zyaeY?qcVF^U%eO5M8#=0EG4;AO-a}U`^HvsBd3*7;pwdqKQO^JUD`H8qpf?N*j9*f z(Y?KU^nADr?a!aSG^VtFo9}&t#yl8=&K>*b{z^L3_Fpi@IBEUhXS*OC{Yd_N9jX7> zn*S|ds+R6-ZvwS{{wvOkUVrZR!@ei-_KXndYyb6SV$j7Vd)(q|gF20N3e3cA>T8SL zG!iC0>;CHLquVIl1R>H)D^TfNKik#lbjTBuu$+~yOd@ELF5g!2*tR``+#k{>g!r^h zA6@)$slh1(Xs8z4%b)_XyszUvD8=k!x5F9#+4uX#KjZUj{6zAOv-E}ZNZ?(R4sK72 z;E886U&yp7>3*dnniPZjS}xC~Ibj$WpOXvj_GkAvNttN^(|+y)A>Jewbqgg4e*LuL znD3XQu^;nDOm-9N{*U9g5DwLv^xWg_16^p+i%MsrK&o(d#Ju2~fBm2TWpH&dhBfMW z05Fz!g(Yo;X`N-1w~<-=Yb8_XfVm=JA=8;eg-0Vu^>`G5XM?_sS%u+!00^>CvwS%6 z{i46@5=b#iA>GRmwIAci= z^y7#d*pcxyRsjI?(l{qS_>7osCP{iSSGRC6N6u_NS8n1AJznLR|NC{AO##bCM+CjJ}4W!M*cd}RP)emDH63PB<7*?;S;wYmGnIS!gqQ9 z55$40*>n0tK-$=#J*q#Y`i`d3u*ktyL=F$3Wt~4B6$LS2Y+z#KW_`&nMadxmqUNkD z(OwG!csTd6L-&@ij_{}9Vd*^VkpN5t)b3pF+Ws_7ddu-SU+JTOXRAVfU7yYJxM9gl zUU?k|iY4j%p{A1zOmRk%S*hZv!91S#_svkI2f-`(^K%D?`E!&zo6J=8ss;jhoZw+%KvqP# zY~wm%@8x*TEs72|rg1%F>OXJC9_9ItroLY9@&aD~-JMGu6VNC1chnT&nb}S~U7oOa8RNd z?FcJ0t$l|wID-bElru3u0GE_a;FuvO;%y@F{g`DC-4w)M&l+>4&?DwrWbABaaMn?b#t%AoF>IkF#Q_blg)0 z>1b-U_0wE*d#_-hi{?BPf5T*(R>tT`uhiZO1d^y;gGcT(f0F5W+^dCNFtOjG!e9Qu ze-b|jmjLuWbEpj~zIWD-d0mPzP~I40=tuKhJ^gXdoAO${Wm|OPLCHy2&+|R+&q*G8 z3<2|C&-CLjq6ymoAHSE3eahMryv6UHW4!qx=*?aZrKchxP)A;O_UA+eM{_inEhaHD zt6cMMEPYQ4*ejjU+~BH_{*<aGHI`!TY|E_;F zHY}zpbI2p>wN0_z4?DPt1evHU?r&~HP@8CKHfMGcLhG6Unq*|L0|NvmoAs6>{JaeYL7QK_+nil%IwCm#iF9 zB;8pzg#@{fkq#d2wcpT8D(H5fJt8pAavfxK)O>tb8^27?`tPh+Pb2G>&ex@RGmS)> z_Y1?@R@3cLo_ zGQwoxRj3_4R@hX0D2WagYKb!bMauH$nE3W*m8;gCTGLRTY_x+4jh0 zCaF`!@!3(QNuHf+vXIoK-BF!KT|>}wAR~kU0M?{qwF z07c2D)Sd~y-$Pvqb!yI1kl9IFSveD)x%LYd@fyjxpCue@Se+3to2hw_1crHKAL3$; z+=ag%^^@vxuUmq>iUQ%%4d*;4InDx&Q+Z=E{>5jMr1N1PWdMIf%^`POe?F@&n7HKQ zLyY#`i4&GUWa(8vrd0@tJ^-HGp=&)+Gx}U~OeX?fATOZqMJd*$T`|4ZfSe4S`kx0_=PO zGy-G>rxaOWXCEYhQRPz+ry`ECO9brurzJlX_+Hy zyVqMn=-}@z;EFn?C+Et0MBii%E+7N@resCrCWu}alL7M_W-vEImCs(XP#S5@b+4BY zMu+auoc~M!kmSsPwCg5%2#As!(n%W(H}8|6#CHvVnKL}jw$)dv&$#5`AVHSLdfrPg zTmiGSq)EM7ME1jBN#VaI20-GnZq z4DAPMn-e{hY{ggi64BzPgL^}MG{K`43ARm9k0oe{g3*Zz+w|x&H;~8P>I6*H+8-@( zVO#Ya>e8#U@^@ihANxm-qe~#WZC!Qf4P&$7XPemWgQDyt1IxRYQP|Y8<8MnpI4i-g ze~`~;cMv_=vXdhj?3#4&+px zUT{!$k)2T{E*P&BN#}VJClI|gUKgHt_cFTl8|uY)KW3> zPihit;K{*0({y;t2zp`EzMstocOv9F{^{+-lRJ-HS|2v+eIk4tY{HH^jQx=mqA2RB z^I%2Z{+ae2!3HS{t&wg@wBpM}nWfht%^%&HCC|n^t=RywFqBhg4t66<6;ZO#}>w;A}-oU8u! zd&pwP@j*?^et#jXgu-jUU1Q(f(h}?M1R>TZ%C#BkUP?UZ(L*5bvJtO)Z+QVHxJRS= zVk6;aHBxVf1`{+Y?{f!nqAuWEhLE4zddEG25x85^UQ<&5RzNmq-L?Fqx3OibnTRov zx5gh}nTj8u$PCy!-_@@1UO&A!{5F^reD~t8-oi!ulmytm8~&r&|24sgsgtKJ_?4S} z5w;b5Nw?JS`z8-k`Ud32Rs>TB+t_*<&FQ!#Y*jwTREfGH@J}RkfwB&!dxC+5(slEC+F(E>2WtR7W9FN|Du93}H#<+K4v> zzou=dJDK%dR5=4X`F#vOzAzHvj8U*tFM|yMMxTQrNx+1R?j)!^E9py$dHAfi{n2q< z_@k|#eF!kq7^ptZoCffxo~fRPi%_rZebQ9M&KJy~1m5e69sQ~csTe=&27@p{&j;V^ zwca{63Qy`&8;=XQV;uvL$oh*`xyxJ!)M%W6mz>RLjCr~H{2b|d+ymgS?y9pT9A>w* z4SSq%8P-D7#(4ctmF6kE^XWZ0aB%8wC^P^Qk0LY@`p8VPbo6LyJ6S4Srjzk-Z9nHT zr4_&92A`JYYh)#ko#&zS!)M`n1L$)3ilwstLxVS(L*7>Xp@|h)CCnx)q3@tc6Rab1 zsYl4uD{W}XVCY8@bdZH?CS7CDxxtGa$oWe1@tKW}G!Smj@dhlGD94eUEIkH$r(2#J z5n#`Ipu9l0Og-=++l-a_JewojOPvdz^DqInZxGifHl|+2^M{pIpci&1<8ub$!;01p z>5efjXDtS&1gP&Z;ntho&Rz>;)i;l2c02x~0zU5>WDUXk*tr}<0i|smluU>TfbYso zhs}Iz)1+^J5MP>%NJ=RbWSNAZtu+hm_HD zo8iYFgrrE%9vBKU+&Q)cSz0xHtGn+_NW1llzP$J`;>x2ioRq)9H(rb z29VG^t9uVPTax_^c(gB(1NTP8jDNUuZU4yDsSTntr@A45lKGvi5hQNwD-poYd5|}k zc0vWdI2p187#R`k5s^#r`uQK*QfK&mFHhNCI{Wsh&({V&<{_*$^@mSg^-#Zk%1sT& z{y>7@s>k;Wz-EQtn_V=qJ?qDeH}E|n3G)|9ExrTr^s4#GFS2%$i3h6(IU`k)AY^~O zGX#elI60M(rmk~%f60opwQIGc!IX(xeucw)^gK>{v}X6~JRj9106vwp{+2?_;}Nu? zoN!Al>cuZFQEUL405xj1AgH25Go>x9QaulToc-2WwZIbj{P{U~A?^EmQoul-zkeT0 z;(aLa#r`JipOOxr%_KrJVy~pCj}g}y)Q~T+<8#h`4`f!yx%#^emyYyEf8-7mlBXb~ zw~vWtGU)h~Gxlx%XXCG(vJ_R3k`xH^tG)j|hS`%WMTn-@h&8hc9I^DebozKoflB9# zUp*l|=Uunh5y+8-2s6h9X(K<7uWCG#|I>Be^GAlZb3ars*~b{xe6Qazp@o0;D&LFY z!tU-w8}873=i zL%?Cbm8k`~MH*iR+bkqkt^14f{)q-lqnF07abp2hHM-`2Qx{-BXI6FL0HQ z<|zFKoS@L!E;<6Jh7t!+l3VP3@vKwwQ~^J$ahm%COp-N~GRWMgUv;P7`-0;#R(xXL z1`<-`?|))jyiaM?Z;u)Bqrmf*1SN@uAHrUO#QQ?#{M�m*0nZtjR=*1$iE4r&tQ5 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

pl+n#OpGg!L>u%1d#uyoi=u6to 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∇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

41Qn1C9ZBYN8`G>_uSr~aq#Sj z*wUmjZhI;!SOYbJK9D4OyD8o~w)UpCMt{(9Z(VGD^8Pxe@kY`t2qqyvVUSmIwNbO= zv-&7?N-xrHd%Hu(uR~+r;KG@K2V)=?A~;LWm=GYs z%0Ma``#Y){%X`g&eWd>^)E_&Npm89lrLbcqCPwE>hbdQ!C#>V`iJ8_QJt0Y(Tr4^ zQi2c9KGxB!28O-~ee>&0H^XLY)z9JzFw;==b%HOb&8k_L4+wTdO#@MB4TCH^(-;eG zZn_^}3;X$*4*Ctw17~N|1}5iE35qy;b7I_Gy0@{2s9^WYdiQNS#~fcpMGp?nL@cK} zmLtz19oHul9Q$f5baXJ=^T zg!P%8Ou&`%n0Q_*ZEv{LSHqunBz4S$78HlUqUX;R#bDG zU?2i3LA+JoYO4$#8?Zr0Nl#biPWHn$lbw5_eHc1cLLx8GK@tlXd4 zOG%#@u8JS01nyi&8L%w3!Dc`x6KFE9ak0h4!Ap*oNERpXodgO>LK!45Dh^-~2tlHf zAvi7$FzD&T0l0^RHi`%f6a>Y;Ye-i|%I6N}XC7>H{t#-u`=(psyVrrRud}-UwpxE> zR_CX{clfEXj4<%UL+=VgT7u+ra=YD7c|77>e#>OSLg-e=*df08?5Us5j) z&JEK&K8U)}C69&fj?zQJZB^Y^Vf_-J_c25KqFNN_Gt6b>Wls|B;$5AV1H4n4ZKmD# zZWcvo@b?a?6$TLAoW-FqMa7|Xg!=f*_$((o!EBi~cwEK&mqE48n3;q_8cxc>WL+DA zm5Zb4qF=0!T-33(9i;f;2mAVL30Zrv*4<$*=y{jEZ=>w0`z6iYdYew*seq36VcE0d zymhCi8L6hPWb}p8hD(oE;(H=Gk}syIe)B(l&HLl+gxXEXl-l(e*`z4ULa?b|SLMI5 zapBuwYOl|_u-aehZQ>TJAUuIUsp9o_igCDH*sggntE+c$tpAkvO1NoHtm*gR=`q`C za}S!zOQ$Lj?CQj}0<$~V?jYJ`;*84dI1%EMt(4F(^Z*oFz>o)XHso8$t^`m_51p7A&>r1}Z!%^FUDa@nd^MwPl|_vM z1sQa#RBO=9$$triL7TW-F0N& z68LK=RKcDYL!Yojjt|mQA9*dc2s-{MX2yuddCfG_ty~o2dAK^8=wCYJE6JMuN|c4; z-glw?d&~A@k5f+n(eJ$74uh$@nzD9EAtJMS41wh~ubso|5z(KQpD`YT?abY8NTe|S z?gUHIWnQOE;~UWfmAf0mw#&;|7CHF2nM#IOZNvTR93i?q?q_MO%N3LQH)En_01M(C znIxV-NQvEf@;qDG2xy(j@iT7!YE20>#+1C=r)as}^}7>ljT=GfD+Jhazue|8w#y+h=i;pCLVLPX{&2&>@6L$Y(6v9B2HAR}Ol)+5g^xgMVzt|Z3f_ofUIht%!J)`=%FMK-l znn0}1`Hf*AI`L~#iTHYXmS8Np-?Vn0+7KN3*Hf0CE_nJ~NaYJ6M&;*ip{A?6Z_{-+ znncrPqoV8XZ=HQ_F4Ry7u{SV!VO~0tsMW)?^>&tvf9nwsOiOPIu`wYS0se zPqFuK(RdYl?+u+i`ueJ<&z4LlVfl5pg-MjvWLy!!MtW9TlZmjiCT2~+*tc@F4VVbqU!WI&M|#gr29?xo7hL$ zDPXg%3+zss%`U9qF#ZKD=XZEtNa9nZQ`FT;+&PzI&2 ze)B2@z}%A;sKZ|qkFh5K8QtRL7fe61_~` NvqNNMPiQZ2i|pAbaK-Z~omrsQyW1 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 Q|GE3lCG%gLyK4LY1NdpOVE_OC literal 0 HcmV?d00001 diff --git a/third_party/zeroclaw/docs/assets/zeroclaw-comparison.jpeg b/third_party/zeroclaw/docs/assets/zeroclaw-comparison.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b76a09479be5ef9c347e25f1db6aecd8a349919d GIT binary patch literal 1637969 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%0AWOS$e@ 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