diff --git a/.github/workflows/translate-zh-cn.yml b/.github/workflows/translate-zh-cn.yml new file mode 100644 index 000000000..1d9cca601 --- /dev/null +++ b/.github/workflows/translate-zh-cn.yml @@ -0,0 +1,157 @@ +name: Translate zh-CN + +on: + push: + branches: + - main + paths-ignore: + - docs/zh-CN/** + - docs/.i18n/zh-CN.tm.jsonl + schedule: + - cron: "17 * * * *" + workflow_dispatch: + +permissions: + contents: write + +concurrency: + group: translate-zh-cn + cancel-in-progress: false + +jobs: + translate-zh-cn: + runs-on: ubuntu-latest + steps: + - name: Checkout publish repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Read source metadata + id: meta + run: | + node - <<'NODE' + const fs = require("node:fs"); + const path = ".openclaw-sync/source.json"; + const data = JSON.parse(fs.readFileSync(path, "utf8")); + if (!data.repository || !data.sha) { + throw new Error(`invalid source metadata in ${path}`); + } + fs.appendFileSync(process.env.GITHUB_OUTPUT, `repository=${data.repository}\n`); + fs.appendFileSync(process.env.GITHUB_OUTPUT, `sha=${data.sha}\n`); + NODE + + - name: Checkout source repo + uses: actions/checkout@v4 + with: + repository: ${{ steps.meta.outputs.repository }} + ref: ${{ steps.meta.outputs.sha }} + path: source + fetch-depth: 1 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: "1.23" + + - name: Prune stale zh-CN pages + run: | + python - <<'PY' + from pathlib import Path + root = Path("docs") + zh_root = root / "zh-CN" + if not zh_root.exists(): + raise SystemExit(0) + for path in sorted(zh_root.rglob("*"), reverse=True): + if path.is_dir(): + if not any(path.iterdir()): + path.rmdir() + continue + rel = path.relative_to(zh_root) + source = root / rel + if not source.exists(): + path.unlink() + for path in sorted(zh_root.rglob("*"), reverse=True): + if path.is_dir() and not any(path.iterdir()): + path.rmdir() + PY + + - name: Build docs file list + run: | + python - <<'PY' + from pathlib import Path + files = [] + for path in Path("docs").rglob("*"): + if not path.is_file(): + continue + if path.suffix.lower() not in {".md", ".mdx"}: + continue + rel = path.as_posix() + if rel.startswith("docs/zh-CN/"): + continue + if rel.startswith("docs/ja-JP/"): + continue + if rel.startswith("docs/.generated/"): + continue + files.append(str(path.resolve())) + Path(".openclaw-sync").mkdir(exist_ok=True) + Path(".openclaw-sync/docs-i18n-files.txt").write_text("\n".join(files) + "\n") + PY + + - name: Translate changed docs into zh-CN + env: + OPENAI_API_KEY: ${{ secrets.OPENCLAW_DOCS_I18N_OPENAI_API_KEY }} + OPENCLAW_DOCS_I18N_PROVIDER: openai + OPENCLAW_DOCS_I18N_MODEL: gpt-5.4 + OPENCLAW_DOCS_I18N_PROMPT_TIMEOUT: 10m + run: | + if [ ! -s .openclaw-sync/docs-i18n-files.txt ]; then + echo "No docs files found." + exit 0 + fi + + mapfile -t DOC_FILES < .openclaw-sync/docs-i18n-files.txt + attempt=1 + max_attempts=5 + while [ "$attempt" -le "$max_attempts" ]; do + echo "docs-i18n attempt $attempt/$max_attempts" + if ( + cd source/scripts/docs-i18n + go run . \ + --docs "$GITHUB_WORKSPACE/docs" \ + --lang zh-CN \ + --src en \ + --mode doc \ + --thinking low \ + --parallel 8 \ + "${DOC_FILES[@]}" + ); then + exit 0 + fi + + if [ "$attempt" -eq "$max_attempts" ]; then + echo "docs-i18n failed after $max_attempts attempts" + exit 1 + fi + + attempt=$((attempt + 1)) + sleep 5 + done + + - name: Commit zh-CN refresh + run: | + if git diff --quiet -- docs/zh-CN docs/.i18n/zh-CN.tm.jsonl; then + echo "No zh-CN translation changes." + exit 0 + fi + + git config user.name "openclaw-docs-i18n[bot]" + git config user.email "openclaw-docs-i18n[bot]@users.noreply.github.com" + git add docs/zh-CN docs/.i18n/zh-CN.tm.jsonl + git commit -m "chore(i18n): refresh zh-CN translations" + git push origin HEAD:main diff --git a/.openclaw-sync/source.json b/.openclaw-sync/source.json new file mode 100644 index 000000000..be17d65eb --- /dev/null +++ b/.openclaw-sync/source.json @@ -0,0 +1,5 @@ +{ + "repository": "openclaw/openclaw", + "sha": "ef5f47bd3925851cacf7257a47a669cc3dc6b2cb", + "syncedAt": "2026-04-05T08:09:14.965Z" +} diff --git a/docs/.generated/README.md b/docs/.generated/README.md new file mode 100644 index 000000000..ff97d11a0 --- /dev/null +++ b/docs/.generated/README.md @@ -0,0 +1,21 @@ +# Generated Docs Artifacts + +SHA-256 hash files are the tracked drift-detection artifacts. The full JSON +baselines are generated locally (gitignored) for inspection only. + +**Tracked (committed to git):** + +- `config-baseline.sha256` — hashes of config baseline JSON artifacts. +- `plugin-sdk-api-baseline.sha256` — hashes of Plugin SDK API baseline artifacts. + +**Local only (gitignored):** + +- `config-baseline.json`, `config-baseline.core.json`, `config-baseline.channel.json`, `config-baseline.plugin.json` +- `plugin-sdk-api-baseline.json`, `plugin-sdk-api-baseline.jsonl` + +Do not edit any of these files by hand. + +- Regenerate config baseline: `pnpm config:docs:gen` +- Validate config baseline: `pnpm config:docs:check` +- Regenerate Plugin SDK API baseline: `pnpm plugin-sdk:api:gen` +- Validate Plugin SDK API baseline: `pnpm plugin-sdk:api:check` diff --git a/docs/.generated/config-baseline.sha256 b/docs/.generated/config-baseline.sha256 new file mode 100644 index 000000000..fa1313310 --- /dev/null +++ b/docs/.generated/config-baseline.sha256 @@ -0,0 +1,4 @@ +4c880eb1ce03486f47aa21f49317ad15fc8d92bb720d70205743b72e45cf5fa3 config-baseline.json +03ff4a3e314f17dd8851aed3653269294bc62412bee05a6804dce840bd3d7551 config-baseline.core.json +73b57f395a2ad983f1660112d0b2b998342f1ddbe3089b440d7f73d0665de739 config-baseline.channel.json +17fd37605bf6cb087932ec2ebcfa9dd22e669fa6b8b93081ab2deac9d24821c5 config-baseline.plugin.json diff --git a/docs/.generated/plugin-sdk-api-baseline.sha256 b/docs/.generated/plugin-sdk-api-baseline.sha256 new file mode 100644 index 000000000..2441c80d0 --- /dev/null +++ b/docs/.generated/plugin-sdk-api-baseline.sha256 @@ -0,0 +1,2 @@ +884e6fd12b7a8086a11f547e15201f46dea0f2dc46735fad055d4f1b96d5fb82 plugin-sdk-api-baseline.json +100f6b29793abf858f94cb8c292afc0dc56573f4e264d27496a96e17f8de4c1e plugin-sdk-api-baseline.jsonl diff --git a/docs/.i18n/README.md b/docs/.i18n/README.md new file mode 100644 index 000000000..0d2f4ffb2 --- /dev/null +++ b/docs/.i18n/README.md @@ -0,0 +1,34 @@ +# OpenClaw docs i18n assets + +This folder stores translation config plus generated zh-CN artifacts for the publish repo. + +English docs are mirrored from the source repo (`openclaw/openclaw`). zh-CN pages and zh-CN translation memory are generated here. + +## Files + +- `glossary..json` — preferred term mappings (used in prompt guidance). +- `.tm.jsonl` — translation memory (cache) keyed by workflow + model + text hash. + +## Glossary format + +`glossary..json` is an array of entries: + +```json +{ + "source": "troubleshooting", + "target": "故障排除", + "ignore_case": true, + "whole_word": false +} +``` + +Fields: + +- `source`: English (or source) phrase to prefer. +- `target`: preferred translation output. + +## Notes + +- Glossary entries are passed to the model as **prompt guidance** (no deterministic rewrites). +- The translation memory is updated by `scripts/docs-i18n`. +- Source metadata for each sync lives under `.openclaw-sync/source.json`. diff --git a/docs/.i18n/glossary.ja-JP.json b/docs/.i18n/glossary.ja-JP.json new file mode 100644 index 000000000..f7c59a187 --- /dev/null +++ b/docs/.i18n/glossary.ja-JP.json @@ -0,0 +1,14 @@ +[ + { "source": "OpenClaw", "target": "OpenClaw" }, + { "source": "Gateway", "target": "Gateway" }, + { "source": "Pi", "target": "Pi" }, + { "source": "Skills", "target": "Skills" }, + { "source": "local loopback", "target": "local loopback" }, + { "source": "Tailscale", "target": "Tailscale" }, + { "source": "Getting Started", "target": "はじめに" }, + { "source": "Getting started", "target": "はじめに" }, + { "source": "Quick start", "target": "クイックスタート" }, + { "source": "Quick Start", "target": "クイックスタート" }, + { "source": "Onboarding", "target": "オンボーディング" }, + { "source": "wizard", "target": "ウィザード" } +] diff --git a/docs/.i18n/glossary.zh-CN.json b/docs/.i18n/glossary.zh-CN.json new file mode 100644 index 000000000..c5e1681d3 --- /dev/null +++ b/docs/.i18n/glossary.zh-CN.json @@ -0,0 +1,358 @@ +[ + { + "source": "OpenClaw", + "target": "OpenClaw" + }, + { + "source": "Gateway", + "target": "Gateway 网关" + }, + { + "source": "Pi", + "target": "Pi" + }, + { + "source": "Skills", + "target": "Skills" + }, + { + "source": "Skills config", + "target": "Skills 配置" + }, + { + "source": "Skills Config", + "target": "Skills 配置" + }, + { + "source": "local loopback", + "target": "local loopback" + }, + { + "source": "Tailscale", + "target": "Tailscale" + }, + { + "source": "Getting Started", + "target": "入门指南" + }, + { + "source": "Getting started", + "target": "入门指南" + }, + { + "source": "Quick start", + "target": "快速开始" + }, + { + "source": "Quick Start", + "target": "快速开始" + }, + { + "source": "Chutes", + "target": "Chutes" + }, + { + "source": "Qwen", + "target": "Qwen" + }, + { + "source": "Feishu", + "target": "Feishu" + }, + { + "source": "Mattermost", + "target": "Mattermost" + }, + { + "source": "BytePlus (International)", + "target": "BytePlus(国际版)" + }, + { + "source": "Anthropic (API + Claude CLI)", + "target": "Anthropic(API + Claude CLI)" + }, + { + "source": "Moonshot AI", + "target": "Moonshot AI" + }, + { + "source": "Additional bundled variants", + "target": "其他内置变体" + }, + { + "source": "Diffs", + "target": "Diffs" + }, + { + "source": "Capability Cookbook", + "target": "能力扩展手册" + }, + { + "source": "Setup Wizard Reference", + "target": "设置向导参考" + }, + { + "source": "CLI Setup Reference", + "target": "CLI 设置参考" + }, + { + "source": "Setup Wizard (CLI)", + "target": "设置向导(CLI)" + }, + { + "source": "Docs directory", + "target": "文档目录" + }, + { + "source": "Credits", + "target": "致谢" + }, + { + "source": "Features", + "target": "功能" + }, + { + "source": "DMs", + "target": "私信" + }, + { + "source": "DM", + "target": "私信" + }, + { + "source": "sandbox", + "target": "沙箱" + }, + { + "source": "Sandbox", + "target": "沙箱" + }, + { + "source": "sandboxing", + "target": "沙箱隔离" + }, + { + "source": "Sandboxing", + "target": "沙箱隔离" + }, + { + "source": "sandboxed", + "target": "沙箱隔离" + }, + { + "source": "Sandboxed", + "target": "沙箱隔离" + }, + { + "source": "Sandboxing note", + "target": "沙箱注意事项" + }, + { + "source": "Companion apps", + "target": "配套应用" + }, + { + "source": "expected keys", + "target": "预期键名" + }, + { + "source": "block streaming", + "target": "分块流式传输" + }, + { + "source": "Block streaming", + "target": "分块流式传输" + }, + { + "source": "Discovery + transports", + "target": "设备发现 + 传输协议" + }, + { + "source": "Discovery", + "target": "设备发现" + }, + { + "source": "Network model", + "target": "网络模型" + }, + { + "source": "Bridge protocol (legacy nodes, historical)", + "target": "Bridge protocol(旧版节点,历史参考)" + }, + { + "source": "Doctor", + "target": "Doctor" + }, + { + "source": "Polls", + "target": "投票" + }, + { + "source": "QQ Bot", + "target": "QQ Bot" + }, + { + "source": "Release Policy", + "target": "发布策略" + }, + { + "source": "Release policy", + "target": "发布策略" + }, + { + "source": "for full details", + "target": "了解详情" + }, + { + "source": "First 60 seconds", + "target": "最初的六十秒" + }, + { + "source": "Auth: where it lives (important)", + "target": "凭证:存储位置(重要)" + }, + { + "source": "agent", + "target": "智能体" + }, + { + "source": "channel", + "target": "渠道" + }, + { + "source": "session", + "target": "会话" + }, + { + "source": "provider", + "target": "提供商" + }, + { + "source": "model", + "target": "模型" + }, + { + "source": "tool", + "target": "工具" + }, + { + "source": "CLI", + "target": "CLI" + }, + { + "source": "/cli/gateway", + "target": "/cli/gateway" + }, + { + "source": "/gateway#multiple-gateways-same-host", + "target": "/gateway#multiple-gateways-same-host" + }, + { + "source": "install sanity", + "target": "安装完整性检查" + }, + { + "source": "get unstuck", + "target": "解决问题" + }, + { + "source": "troubleshooting", + "target": "故障排除" + }, + { + "source": "FAQ", + "target": "常见问题" + }, + { + "source": "Ollama Web Search", + "target": "Ollama Web 搜索" + }, + { + "source": "onboarding", + "target": "新手引导" + }, + { + "source": "Onboarding", + "target": "新手引导" + }, + { + "source": "wizard", + "target": "向导" + }, + { + "source": "environment variables", + "target": "环境变量" + }, + { + "source": "environment variable", + "target": "环境变量" + }, + { + "source": "env vars", + "target": "环境变量" + }, + { + "source": "env var", + "target": "环境变量" + }, + { + "source": "Plugin SDK", + "target": "插件 SDK" + }, + { + "source": "Plugin SDK Overview", + "target": "插件 SDK 概览" + }, + { + "source": "SDK Overview", + "target": "SDK 概览" + }, + { + "source": "Plugin Entry Points", + "target": "插件入口点" + }, + { + "source": "Entry Points", + "target": "入口点" + }, + { + "source": "Plugin Runtime", + "target": "插件运行时" + }, + { + "source": "Runtime", + "target": "运行时" + }, + { + "source": "Plugin Setup", + "target": "插件设置" + }, + { + "source": "Setup", + "target": "设置" + }, + { + "source": "Channel Plugin SDK", + "target": "渠道插件 SDK" + }, + { + "source": "Channel Plugins", + "target": "渠道插件" + }, + { + "source": "Provider Plugin SDK", + "target": "提供商插件 SDK" + }, + { + "source": "Provider Plugins", + "target": "提供商插件" + }, + { + "source": "Plugin SDK Testing", + "target": "插件 SDK 测试" + }, + { + "source": "Testing", + "target": "测试" + } +] diff --git a/docs/.i18n/ja-JP.tm.jsonl b/docs/.i18n/ja-JP.tm.jsonl new file mode 100644 index 000000000..e69de29bb diff --git a/docs/.i18n/zh-CN.tm.jsonl b/docs/.i18n/zh-CN.tm.jsonl new file mode 100644 index 000000000..24076e5a0 --- /dev/null +++ b/docs/.i18n/zh-CN.tm.jsonl @@ -0,0 +1,1329 @@ +{"cache_key":"001616450ecb371df73ba42e487328ded133e15d365d7ddc15d47eaf467d2e6c","segment_id":"index.md:468886872909c70d","source_path":"index.md","text_hash":"468886872909c70d3bfb4836ec60a6485f4cbbd0f8a0acedbacb9b477f01a251","text":"Workspace templates","translated":"工作区模板","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:17Z"} +{"cache_key":"0090cc37997fe8660527538473feb7d0e0535dfb0015e52d13f2e7ad09bbe185","segment_id":"start/getting-started.md:edeb36e62e1bf30e","source_path":"start/getting-started.md","text_hash":"edeb36e62e1bf30e192bc1951ed9c3f6c65f7d300f926c071c245671dfb5855c","text":"If you’re hacking on OpenClaw itself, run from source:","translated":"如果您正在开发 OpenClaw 本身,请从源码运行:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:45Z"} +{"cache_key":"00ee1ece05b05ab7b12cfe673000c037bb2037fe93a069a71ec2368184e83944","segment_id":"index.md:45e6d69dbe995a36","source_path":"index.md","text_hash":"45e6d69dbe995a36f7bc20755eff4eb4d2afaaedbcac4668ab62540c57219f32","text":"macOS app","translated":"macOS 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:06Z"} +{"cache_key":"00eeb87b1774979860c4b016d48e416ab9157539c41f5f3f0c58c1deb8f075c9","segment_id":"environment.md:frontmatter:read_when:2","source_path":"environment.md:frontmatter:read_when:2","text_hash":"822b3d74ce16c1be19059fad4ca5bf7ae9327f58fa1ff4e75e78d5afa75c038f","text":"You are documenting provider auth or deployment environments","translated":"你正在记录提供商认证或部署环境的相关文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:51Z"} +{"cache_key":"01063749652c55481b7da485911a80de3049ded0257874b376efbc55a14293a7","segment_id":"start/wizard.md:037b8f564390e097","source_path":"start/wizard.md","text_hash":"037b8f564390e09742421c621a1f785d2ee5338d0c680c76f7a9b991518e909d","text":" and optional ","translated":" 和可选的 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:48Z"} +{"cache_key":"01814fd9d09399c075081056c6fa2befa388c67ba4f8745122804fd044fd82d6","segment_id":"start/getting-started.md:d1564fd156e28160","source_path":"start/getting-started.md","text_hash":"d1564fd156e28160c83922ad7a18428ce2c966e790f477e740d1d9f6cadd51e9","text":"WhatsApp (QR login)","translated":"WhatsApp(二维码登录)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:08Z"} +{"cache_key":"01b87576d7ade6b91ca28935f65c167c2f4fb5d1b6bfd1189fd416b229500af4","segment_id":"start/getting-started.md:7421b911bc203f6f","source_path":"start/getting-started.md","text_hash":"7421b911bc203f6fe3c677d752379f23dc314719d39d18179406da675f58d039","text":"Scan via WhatsApp → Settings → Linked Devices.","translated":"通过 WhatsApp → 设置 → 已关联设备 进行扫描。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:10Z"} +{"cache_key":"01d8d8ec84ad8f4c74e29e254e56c02f7d75005160c27d99e9ce183767e16c55","segment_id":"index.md:6b8ebac7903757ce","source_path":"index.md","text_hash":"6b8ebac7903757ce7399cc729651a27e459903c24c64aa94827b20d8a2a411d2","text":"For Tailnet access, run ","translated":"如需 Tailnet 访问,请运行 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:08Z"} +{"cache_key":"024efbb5ac15e07c191effa78c0b23bf173c8af6725e988743ea055e9a4e8c3b","segment_id":"index.md:f9b8279bc46e847b","source_path":"index.md","text_hash":"f9b8279bc46e847bfcc47b8701fd5c5dc27baa304d5add8278a7f97925c3ec13","text":"Mattermost (plugin)","translated":"Mattermost(插件)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:40Z"} +{"cache_key":"02d1e10492e8721462f16e39467b94ad3197e4eb76f6d671a09b4246d5b4d27b","segment_id":"start/getting-started.md:7ac362063b9f2046","source_path":"start/getting-started.md","text_hash":"7ac362063b9f204602f38f9f1ec9cf047f03e0d7b83896571c9df6d31ad41e9c","text":"Nodes","translated":"节点","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:28Z"} +{"cache_key":"02f39c075115bee6bdb015a49436f2b2a56365b87558fdd7aff7b17cb83bff6c","segment_id":"environment.md:frontmatter:summary","source_path":"environment.md:frontmatter:summary","text_hash":"78351223e7068721146d2de022fdf440c2866b2ee02fbbb50bf64369b999820b","text":"Where OpenClaw loads environment variables and the precedence order","translated":"OpenClaw 加载环境变量的位置及优先级顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:12Z"} +{"cache_key":"02f4067265058ed8929f3772d87e1c5dc0af8422b8e7b513b7db155108a422c3","segment_id":"start/wizard.md:961eb43699731759","source_path":"start/wizard.md","text_hash":"961eb43699731759fd0d04f177bb24f09971bddd41426702276e761269d0a5b9","text":" does ","translated":" 会 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:48Z"} +{"cache_key":"034b5fd57fbe77f6aabf0b737f4d387868eef9ac32fcc372692191887cb16759","segment_id":"environment.md:ab5aec4424cf678d","source_path":"environment.md","text_hash":"ab5aec4424cf678dcfb1ad3d2c2929c1e0b2b1ff61b82b961ada48ad033367b4","text":" (dotenv default; does not override).","translated":" (dotenv 默认行为;不覆盖已有值)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:07Z"} +{"cache_key":"0361ba41cec2736ce451f58e657735b2d4811f0c3af53356ee56277f825899a3","segment_id":"index.md:7e2735e5df8f4e9f","source_path":"index.md","text_hash":"7e2735e5df8f4e9f006d10e079fe8045612aa662b02a9d1948081d1173798dec","text":"MIT — Free as a lobster in the ocean 🦞","translated":"MIT —— 像海洋中的龙虾一样自由 🦞","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:55:01Z"} +{"cache_key":"039c1b4477a6425d1ad785665fa3ad0b9236c514cd807422215eeb4dc76d4378","segment_id":"start/getting-started.md:e3209251e20896ec","source_path":"start/getting-started.md","text_hash":"e3209251e20896ecc60fa4da2817639f317fbb576288a9fc52d11e5030ecc44a","text":"Windows (WSL2)","translated":"Windows (WSL2)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:44Z"} +{"cache_key":"0457a19cd3a82171f6cdb92d82d5a0f6358da4c1220d42d5b0575bde871e7f91","segment_id":"environment.md:e234227b0e001687","source_path":"environment.md","text_hash":"e234227b0e001687821541fac3af38fc6be293ec6e13910c6826b9afc8ca33be","text":" syntax:","translated":" 语法:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:13:00Z"} +{"cache_key":"045fb6f3989827561e347dfa56a164069bf8b7afaa50d2d02c20ad264495d351","segment_id":"index.md:e9f63c8876aec738","source_path":"index.md","text_hash":"e9f63c8876aec7381ffb5a68efb39f50525f9fc4e732857488561516d47f5654","text":" — Uses Baileys for WhatsApp Web protocol","translated":" — 使用 Baileys 实现 WhatsApp Web 协议","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:31Z"} +{"cache_key":"046c83b658b7dd8bce829f07bd09dcee3413753ab72cf95d638925aa163d3486","segment_id":"start/getting-started.md:f4117324994aaad1","source_path":"start/getting-started.md","text_hash":"f4117324994aaad1d3413064ade8f2037e43ab2fac0b385d731ff154925ec3b3","text":"Windows (PowerShell):","translated":"Windows (PowerShell):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:51Z"} +{"cache_key":"04d48cfdb6b444cb4691ea55a5deb23df20694659ae1bc5e082e242e749f5e3c","segment_id":"help/index.md:bfc5930cc2660330","source_path":"help/index.md","text_hash":"bfc5930cc2660330260afd407e98d86adaec0af48dd72b88dc33ef8e9066e2c9","text":"Install sanity (Node/npm/PATH):","translated":"安装完整性检查(Node/npm/PATH):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:38Z"} +{"cache_key":"05405710e256b2e1031234be855a7c11cf1505c627df14884d655fa42a1568a7","segment_id":"index.md:f0a7f9d068cb7a14","source_path":"index.md","text_hash":"f0a7f9d068cb7a146d0bb89b3703688d690ed0b92734b78bcdb909aace617dbf","text":"WhatsApp group messages","translated":"WhatsApp 群组消息","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:45Z"} +{"cache_key":"064dcdb5051313b748c0b775ec69683149e1861d84fa47a74c68ddd8086bdebc","segment_id":"index.md:81a1c0449ea684aa","source_path":"index.md","text_hash":"81a1c0449ea684aadad54a7f8575061ddc5bfa713b6ca3eb8a0228843d2a3ea1","text":"Nodes (iOS/Android)","translated":"节点(iOS/Android)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:57Z"} +{"cache_key":"0687549a28e71ec1e17b261001a9e818e27784ce3286b7d21e856e37c07915a6","segment_id":"start/getting-started.md:bad5d156dc5e0cd3","source_path":"start/getting-started.md","text_hash":"bad5d156dc5e0cd39db3a90645cd150e846743103f3acfa5182ad5a003a172dc","text":"0) Prereqs","translated":"0)前提条件","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:23Z"} +{"cache_key":"06c13f0dfc6cd5fa142e329fd2cfb2538e19e33de83c4b9d366542f0d03cdf08","segment_id":"index.md:c3af076f92c5ed8d","source_path":"index.md","text_hash":"c3af076f92c5ed8dcb0d0b0d36dd120bc31b68264efea96cf8019ca19f1c13a3","text":"Troubleshooting","translated":"故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:14Z"} +{"cache_key":"06dfb5ef154c29e0961021acb7bcdb34a790d58d9f6f7a59165e7a423ef0f2df","segment_id":"start/wizard.md:0be68bd5c21e5e4d","source_path":"start/wizard.md","text_hash":"0be68bd5c21e5e4de598fc71e32c131ce8c742976a344ac4d9973ef08942eacb","text":"Workspace default (or existing workspace)","translated":"默认工作区(或现有工作区)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:47Z"} +{"cache_key":"071b444d331ae100d5b17caba7748f4d01e9e829b6951ac8b8903bfdb7c00349","segment_id":"environment.md:frontmatter:read_when:2","source_path":"environment.md:frontmatter:read_when:2","text_hash":"822b3d74ce16c1be19059fad4ca5bf7ae9327f58fa1ff4e75e78d5afa75c038f","text":"You are documenting provider auth or deployment environments","translated":"您正在记录 提供商 的认证或部署环境","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:06Z"} +{"cache_key":"074a96a2803f1b7e25df2097aa35c976d3c4bf3355dcb878991d99ceb398cae6","segment_id":"start/wizard.md:2b39d5818b91d602","source_path":"start/wizard.md","text_hash":"2b39d5818b91d602d9aeaaaf38d7de37f9e89553f3edcdf114ae2f43cc8ca399","text":"Full workspace layout + backup guide: ","translated":"完整工作区布局 + 备份指南: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:49Z"} +{"cache_key":"078dae6e59f75f6c474a6f696cdc942ab423be6fcd1bf1bd4b589a665766de76","segment_id":"index.md:310cc8cec6b20a30","source_path":"index.md","text_hash":"310cc8cec6b20a3003ffab12f5aade078a0e7a7d6a27ff166d62ab4c3a1ee23d","text":"If you ","translated":"如果您 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:52Z"} +{"cache_key":"07e0c1ac79c7958e1152f210f5fa32881aab6766711be06e94d0a324e62f4ea3","segment_id":"environment.md:e234227b0e001687","source_path":"environment.md","text_hash":"e234227b0e001687821541fac3af38fc6be293ec6e13910c6826b9afc8ca33be","text":" syntax:","translated":" 语法:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:34Z"} +{"cache_key":"083df0fcf5941871ec509cf41a264e951eb0dea21cf3572cde4180a766ac43c8","segment_id":"index.md:3c064c83b8d244fe","source_path":"index.md","text_hash":"3c064c83b8d244fef61e5fd8ce5f070b857a3578a71745e61eea02892788c020","text":" — Anthropic (Claude Pro/Max) + OpenAI (ChatGPT/Codex) via OAuth","translated":" — Anthropic(Claude Pro/Max)+ OpenAI(ChatGPT/Codex)通过 OAuth","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:54Z"} +{"cache_key":"086e200198761d02e2a28bec15b1df356262d9643c0fa8baded9caedae854526","segment_id":"environment.md:46ab081177a452aa","source_path":"environment.md","text_hash":"46ab081177a452aa62354b581730f4675cb03e58cde8282071da30cabe18fb2e","text":"Optional login-shell import","translated":"可选的登录 shell 导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:11Z"} +{"cache_key":"086eabdd4e052418c6234dccf807220465b0eaaef349b91be635a3128a71857a","segment_id":"index.md:9182ff69cf35cb47","source_path":"index.md","text_hash":"9182ff69cf35cb477c02452600d23b52a49db7bd7c9833a9a8bc1dcd90c25812","text":"Node ≥ 22","translated":"Node ≥ 22","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:10Z"} +{"cache_key":"08a071c1e71388ad18ffca39565a37edb304794146d2f7ea1e2bac93493f89d6","segment_id":"start/wizard.md:903ea1cf1f2831b3","source_path":"start/wizard.md","text_hash":"903ea1cf1f2831b3e836aff6e23c7d261a83381614361e65df16ade48e84b26c","text":" (API keys + OAuth).","translated":" (API 密钥 + OAuth)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:34Z"} +{"cache_key":"08b4ff7a8e04409d740ca4090c8d83bc3b05d7084bce4b83fa4c91b930eb7161","segment_id":"environment.md:62d66b8c36a6c9aa","source_path":"environment.md","text_hash":"62d66b8c36a6c9aa7134c8f9fe5912435cb0b3bfce3172712646a187954e7040","text":"See [Configuration: Env var substitution](/gateway/configuration#env-var-substitution-in-config) for full details.","translated":"详见 [配置:环境变量替换](/gateway/configuration#env-var-substitution-in-config)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:58Z"} +{"cache_key":"08f97e3d7baa10a515db441b79273f697f85c83da040cdf821f9e725243112f2","segment_id":"environment.md:f6b2ffe1d0d5f521","source_path":"environment.md","text_hash":"f6b2ffe1d0d5f521b76cabc67d6e96da2b1170eef8086d530558e9906a7f092d","text":"Models overview","translated":"模型概览","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:17:17Z"} +{"cache_key":"090f33f5db1fde14d7fc04aaa9febae674e9e6ed0d04ce8f1813dac53ccae3a2","segment_id":"start/wizard.md:ab4386608f0ebc6e","source_path":"start/wizard.md","text_hash":"ab4386608f0ebc6e151eab042c6de71d09863aab6dcb2551665e34210e4a4439","text":"What you’ll set:","translated":"您需要设置的内容:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:15Z"} +{"cache_key":"09824fcf1352f54ff162268163b8670ead0660d4e0a45d1f236b5b3ef938a56b","segment_id":"index.md:86e2bbbc305c31aa","source_path":"index.md","text_hash":"86e2bbbc305c31aa988751196a1e207da68801a48798c48b90485c11578443a0","text":"Providers and UX:","translated":"提供商 和用户体验:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:39Z"} +{"cache_key":"0a2b53b4943a0ba87fb991fef20f822df6c2fd0584f88d394de35b081daac564","segment_id":"environment.md:668e5590b5bb9990","source_path":"environment.md","text_hash":"668e5590b5bb9990eeb25bf657f7d17281a4c613ee4442036787cd4b2efd22bb","text":"If the config file is missing entirely, step 4 is skipped; shell import still runs if enabled.","translated":"如果配置文件完全缺失,则跳过第 4 步;如果已启用,shell 导入仍会运行。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:00Z"} +{"cache_key":"0a3f3c5b73fe0ebee73b07c3c4f4067a75ecf6a9ff30b8b77bf67227b125fee2","segment_id":"index.md:042c75df73389c8a","source_path":"index.md","text_hash":"042c75df73389c8a7c0871d2a451bd20431d24e908e2c192827a54022df95005","text":"Nacho Iacovino","translated":"Nacho Iacovino","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:50Z"} +{"cache_key":"0a4eb623efd2d7af50da4f933f490fa1b7addfe2619ab721d9fcd4f2a2302e6a","segment_id":"help/index.md:b79cac926e0b2e34","source_path":"help/index.md","text_hash":"b79cac926e0b2e347e72cc91d5174037c9e17ae7733fd7bdb570f71b10cd7bfc","text":"Help","translated":"帮助","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:29Z"} +{"cache_key":"0a4eb82ad59541cc64eceae3ce7e41ee4739d9a7c742146611fa96b11bdd272d","segment_id":"environment.md:frontmatter:read_when:2","source_path":"environment.md:frontmatter:read_when:2","text_hash":"822b3d74ce16c1be19059fad4ca5bf7ae9327f58fa1ff4e75e78d5afa75c038f","text":"You are documenting provider auth or deployment environments","translated":"你正在编写提供商认证或部署环境的文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:21:53Z"} +{"cache_key":"0a7b709303c429dd14ac8df8ef88c398cdf45a678f7beeacf08413bd16d2fc3d","segment_id":"index.md:e9f63c8876aec738","source_path":"index.md","text_hash":"e9f63c8876aec7381ffb5a68efb39f50525f9fc4e732857488561516d47f5654","text":" — Uses Baileys for WhatsApp Web protocol","translated":" — 使用 Baileys 实现 WhatsApp Web 协议","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:52Z"} +{"cache_key":"0aa65de003f8c68c46bc14dc4d66d04efaf025ddd6a1a3cdec1b51ecbe3ecc8a","segment_id":"start/getting-started.md:317f690133d02b19","source_path":"start/getting-started.md","text_hash":"317f690133d02b1969bfcbf6d76a7c0e6efa2b0839e8510227135359a535a5c0","text":"In a new terminal, send a test message:","translated":"在新终端中,发送一条测试消息:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:59Z"} +{"cache_key":"0aaaa653a1bad3c2f1d6bbf34819ea4ae8700ea5d6c593937aa6812051809168","segment_id":"environment.md:453c14128fbfb5f6","source_path":"environment.md","text_hash":"453c14128fbfb5f6757511557132a1dbb3bcbf243267630bfec49db8518c7780","text":"Env var substitution in config","translated":"配置中的 环境变量 替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:16Z"} +{"cache_key":"0b149311bd258e33ab5e06f16483d6b14bfb23bbf8137339bc4cf8d29e2d3d5c","segment_id":"environment.md:453c14128fbfb5f6","source_path":"environment.md","text_hash":"453c14128fbfb5f6757511557132a1dbb3bcbf243267630bfec49db8518c7780","text":"Env var substitution in config","translated":"配置中的环境变量替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:54Z"} +{"cache_key":"0b68a76b412628864a90e4b194a0db6bcc593e8700ee9228d04b45427a95c7af","segment_id":"environment.md:cf3f9ba035da9f09","source_path":"environment.md","text_hash":"cf3f9ba035da9f09202ba669adca3109148811ef31d484cc2efa1ff50a1621b1","text":" (what the Gateway process already has from the parent shell/daemon).","translated":" (Gateway 进程从父 shell/守护进程继承的已有环境变量)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:23Z"} +{"cache_key":"0bab5344d37eb10f7f0a1105ba4cf723e069867a7f745d016657752c1dc0c21a","segment_id":"environment.md:5105555b1be5f84b","source_path":"environment.md","text_hash":"5105555b1be5f84b47576d6ea432675cef742e63fa52f7b254ef2aa4c90e7cca","text":" (applied only if","translated":" (仅在","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:04Z"} +{"cache_key":"0bbc0779389fa7b103e39fff721c2df8f37e36a72350175e61b8334f79dd6555","segment_id":"index.md:0b7e778664921066","source_path":"index.md","text_hash":"0b7e77866492106632e98e7718a8e1e89e8cb0ee3f44c1572dfd9e54845023de","text":"/concepts/streaming","translated":"/concepts/streaming","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:06Z"} +{"cache_key":"0bda3d8fa9978471f16800fbab17622f054477505f8a680d6165e924184818eb","segment_id":"index.md:3fc5f55ea5862824","source_path":"index.md","text_hash":"3fc5f55ea5862824fc266d26cd39fb5da22cc56670c11905d5743adac10bc9ef","text":"Mattermost Bot (plugin)","translated":"Mattermost 机器人(插件)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:46Z"} +{"cache_key":"0bfc8cf7aac6d36a53bc389ddf8a828f323fa60964b005f84cb8aa00f8ab38e9","segment_id":"environment.md:aac7246f5e97142c","source_path":"environment.md","text_hash":"aac7246f5e97142c3f257b7d8b84976f10c29e1b89804bb9d3eb7c43cc03cb8e","text":"Environment variables","translated":"环境变量","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:19Z"} +{"cache_key":"0c1c52efad88743449d31ff51deb8a6275b8c13b9ceea60011208ad696fc3e8e","segment_id":"environment.md:61115f6649792387","source_path":"environment.md","text_hash":"61115f664979238731a390e84433a818965b7eaf1d38fa5b4b1507c33ef28c91","text":"Precedence (highest → lowest)","translated":"优先级(从高到低)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:57Z"} +{"cache_key":"0c828040f85df6effef7a39f7d06d9158493bcfd8c0981f5d6d2c5002f06181e","segment_id":"index.md:3c8aa7ad1cfe03c1","source_path":"index.md","text_hash":"3c8aa7ad1cfe03c1cb68d48f0c155903ca49f14c9b5626059d279bffc98a8f4e","text":": connect to the Gateway WebSocket (LAN/tailnet/SSH as needed); legacy TCP bridge is deprecated/removed.","translated":":通过 WebSocket 连接到 Gateway(根据需要使用局域网/Tailnet/SSH);旧版 TCP 桥接已弃用/移除。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:04Z"} +{"cache_key":"0cbb0b48efe1edd1ee9cf73b486ba3c4ecd0b316ed8355432c734a6ae2ff9828","segment_id":"index.md:a42f01be614f75f1","source_path":"index.md","text_hash":"a42f01be614f75f16278b390094dc43923f0b1b7d8e3209b3f43e356f42ed982","text":"), a single long-running process that owns channel connections and the WebSocket control plane.","translated":"进行,它是一个长期运行的单进程,负责管理渠道连接和 WebSocket 控制面。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:37Z"} +{"cache_key":"0cbb380393c622f57aedb33e0d64521926af5db0134afe3dbd8a1b24aaa3eac1","segment_id":"help/index.md:8ddb7fc8a87904de","source_path":"help/index.md","text_hash":"8ddb7fc8a87904dedc2afc16400fbe4e78582b302e01c30b1319c8a465d04684","text":"Troubleshooting:","translated":"故障排除:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:36Z"} +{"cache_key":"0cc5aed5ba117c3d267480c23a673d693068648c5bfffaacfdc33f4650533f2a","segment_id":"index.md:10bf8b343a32f7dc","source_path":"index.md","text_hash":"10bf8b343a32f7dc01276fc8ae5cf8082e1b39c61c12d0de8ec9b596e115c981","text":"WebChat","translated":"网页聊天","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:32Z"} +{"cache_key":"0d1e17e509bbc4aa27b446bec9af66b9246950ea0dfb619dd35f21534c317143","segment_id":"index.md:b5ccaf9b1449291c","source_path":"index.md","text_hash":"b5ccaf9b1449291c92f855b8318aeb2880a9aa1a75272d17f55cf646071b3eae","text":"Gmail hooks (Pub/Sub)","translated":"Gmail 钩子(Pub/Sub)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:09Z"} +{"cache_key":"0dad422eb096806e226c53202949206185916bda859e38301da854b681b25963","segment_id":"environment.md:frontmatter:read_when:1","source_path":"environment.md:frontmatter:read_when:1","text_hash":"a3a2d99a99de98220c8e0296d6f4e4b2a34024916bd2379d1b3b9179c8fae46f","text":"You are debugging missing API keys in the Gateway","translated":"你正在调试 Gateway 中缺失的 API 密钥","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:10Z"} +{"cache_key":"0dae07beb7b056f37a0ca939d95614b19e7c66b60741530d3b8697cc4a7bdbb7","segment_id":"index.md:bbf8779fd9010043","source_path":"index.md","text_hash":"bbf8779fd9010043ac23a2f89ba34901f3a1f58296539c3177d51a9040ea209d","text":") — Blogwatcher skill","translated":")— Blogwatcher 技能","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:53Z"} +{"cache_key":"0df8549623b0d7f6737342296a4696b34206e074d5a552cb6f37d6c439e85b79","segment_id":"environment.md:f15f5f9f4ef4d668","source_path":"environment.md","text_hash":"f15f5f9f4ef4d6688876c894f8eba251ed1db6eaf2209084028d43c9e76a8ba1","text":" (aka ","translated":" (即 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:41Z"} +{"cache_key":"0e01c4c62bbe121aee9533c17fd055ee1538caf46007bb0938ee7d361ae5d52b","segment_id":"environment.md:45ca56d179d4788c","source_path":"environment.md","text_hash":"45ca56d179d4788c55ba9f7653b376d62e7faa738e92259e3d4f6f5c1b554f28","text":"Related","translated":"相关内容","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:37Z"} +{"cache_key":"0e375d889ea9a49f6c0e03a2e49ea5a681ffd031303237117f0dfdf54fb917e8","segment_id":"start/wizard.md:abf42990b17ccc52","source_path":"start/wizard.md","text_hash":"abf42990b17ccc52870da0c8026ddafa221bc57d87d755a64d74fcd408395435","text":"Full reset (also removes workspace)","translated":"完全重置(同时移除工作区)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:43Z"} +{"cache_key":"0ed1d8cb8838fead312d097caca4f56b5c69e0486833919892e2fc368b933b15","segment_id":"help/index.md:6201111b83a0cb5b","source_path":"help/index.md","text_hash":"6201111b83a0cb5b0922cb37cc442b9a40e24e3b1ce100a4bb204f4c63fd2ac0","text":" and ","translated":" 和 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:30Z"} +{"cache_key":"0ef13ceaf849a114db93b4137cdc043c8ba6ba5d2b1cf2ddea7779850d137e5c","segment_id":"index.md:81023dcc765309dd","source_path":"index.md","text_hash":"81023dcc765309dd05af7638f927fd7faa070c58abe7cad33c378aa02db9baa2","text":" (token is required for non-loopback binds).","translated":" (非回环绑定时必须提供令牌)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:55Z"} +{"cache_key":"0ef99bf8be4557b02f6fc6a43848b16ec9656f205332bd687cbcc0c8b8fce99d","segment_id":"start/getting-started.md:c4b2896a2081395e","source_path":"start/getting-started.md","text_hash":"c4b2896a2081395e282313d6683f07c81e3339ef8b9d2b5a299ea5b626a0998f","text":").","translated":")。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:57Z"} +{"cache_key":"0f0645e14c15177b60a1a2e14a18e220e0ad397f483ad8a0cad68ea3d5a3bc44","segment_id":"start/wizard.md:4a85827ad80e8635","source_path":"start/wizard.md","text_hash":"4a85827ad80e8635fb4a2b41a3fce1d0f23ba1eb27db0aa84113a7b0ca415d42","text":"Synthetic","translated":"Synthetic","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:05Z"} +{"cache_key":"0f51ea5ec00d63f74853135fc04c205c09a3b3fd519a80fb8a83bf504ed6d041","segment_id":"index.md:032f5589cfa2b449","source_path":"index.md","text_hash":"032f5589cfa2b44973fe96c42e17dcc2692281413a05b16f48ff0f958f7f7ade","text":"Discord Bot","translated":"Discord 机器人","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:41Z"} +{"cache_key":"0f5a75040351402afe8493774c6b74576b064ee93723b03a03a345c5e6dcb986","segment_id":"environment.md:b4736422e64c0a36","source_path":"environment.md","text_hash":"b4736422e64c0a369663d1b2d386f1b8f4b31b8936b588e4a54453c61a24e0fd","text":"Process environment","translated":"进程环境","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:03Z"} +{"cache_key":"0f5fbe9d6968fcf81b97b0938d0191012b2512171268e21a0252476981018364","segment_id":"index.md:fdef9f917ee2f72f","source_path":"index.md","text_hash":"fdef9f917ee2f72fbd5c08b709272d28a2ae7ad8787c7d3b973063f0ebeeff7a","text":" to update the gateway service entrypoint.","translated":" 以更新 Gateway 服务入口点。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:15Z"} +{"cache_key":"0fc566f2207136599a99330b18f7b5a871db5129d3b99079d06a612b73acf825","segment_id":"index.md:268ebcd6be28e8d8","source_path":"index.md","text_hash":"268ebcd6be28e8d853ace3a6e28f269fbda1343b53e3f0de97ea3d5bf1a0e33e","text":"Clawd","translated":"Clawd","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:42Z"} +{"cache_key":"0fe42f35cd75dae1544040ac532880db182effb28cb15f90f3e180965d450f3c","segment_id":"start/wizard.md:ba5ec51d07a4ac0e","source_path":"start/wizard.md","text_hash":"ba5ec51d07a4ac0e951608704431d59a02b21a4e951acc10505a8dc407c501ee","text":")","translated":")","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:20Z"} +{"cache_key":"10424bff17e00e154be3be8a5c6595baabbbdbf533eb28142124ba7d3fe2f265","segment_id":"environment.md:582967534d0f909d","source_path":"environment.md","text_hash":"582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf","text":" in ","translated":" 在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:45Z"} +{"cache_key":"105a552d339b5cc747f8939f6c1b54d6f7d6c411a850f38980a0fb1be67195e0","segment_id":"index.md:95cae5ed127bd44d","source_path":"index.md","text_hash":"95cae5ed127bd44dcc30345a1925d77f333284b43a6f97832f149a63dc38e0e0","text":"The wizard now generates a gateway token by default (even for loopback).","translated":"向导现在默认会生成一个 Gateway 令牌(即使在回环模式下也是如此)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:52Z"} +{"cache_key":"10920f79a810b1b47492e9ed0d361ef42a495b2f73a494ec40eb09e75c35bb96","segment_id":"index.md:95cae5ed127bd44d","source_path":"index.md","text_hash":"95cae5ed127bd44dcc30345a1925d77f333284b43a6f97832f149a63dc38e0e0","text":"The wizard now generates a gateway token by default (even for loopback).","translated":"向导 现在默认会生成一个网关令牌(即使是回环连接也是如此)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:43Z"} +{"cache_key":"10a05f1dce0af95edaca2aefc99dda7d1315b6b1d57e2b3021652fe20af68eb7","segment_id":"index.md:cf9f12b2c24ada73","source_path":"index.md","text_hash":"cf9f12b2c24ada73bb0474c0251333f65e6d5d50e56e605bdb264ff32ad0a588","text":"Config lives at ","translated":"配置文件位于 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:29Z"} +{"cache_key":"10a57e9dff1afe6e19b169eebc46fb2bc623dc74996f695c059c259a5d01b11f","segment_id":"environment.md:e234227b0e001687","source_path":"environment.md","text_hash":"e234227b0e001687821541fac3af38fc6be293ec6e13910c6826b9afc8ca33be","text":" syntax:","translated":" 语法:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:26Z"} +{"cache_key":"10ad8d1314a510acc92dd184df9be180aea8c032323637e317be12bff654aefa","segment_id":"start/wizard.md:7398946ba352a7c8","source_path":"start/wizard.md","text_hash":"7398946ba352a7c8b21e60b2474d1ba7190707d9a04a6904103217e177f67482","text":"Summary + next steps, including iOS/Android/macOS apps for extra features.","translated":"摘要 + 后续步骤,包括 iOS/Android/macOS 应用以获取额外功能。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:01Z"} +{"cache_key":"111e143c2961901491d16f639ad9d9bf0203700f41ad61862f0c0e09548d85ca","segment_id":"index.md:42bb365211decccb","source_path":"index.md","text_hash":"42bb365211decccb3509f3bf8c4dfcb5ae05fe36dfdedb000cbf44e59e420dc9","text":" — Local imsg CLI integration (macOS)","translated":" — 本地 imsg CLI 集成(macOS)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:53Z"} +{"cache_key":"11951539669d912b24dac16f9ed27e1de0a950a3baa481474a65de0ca85fbe7b","segment_id":"start/wizard.md:ec2d0a7d20f3b660","source_path":"start/wizard.md","text_hash":"ec2d0a7d20f3b6602a6593e0abef2337e84ba728ca8f6fef2534dc1e9dbfe06b","text":"Remote mode configures a local client to connect to a Gateway elsewhere.","translated":"远程模式配置本地客户端以连接到其他位置的 Gateway。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:13Z"} +{"cache_key":"11a42ddb57b9c1ba4022984efe25b463da52e7b9c5d7ec3a925d7a6d0e5a6c39","segment_id":"index.md:cdb4ee2aea69cc6a","source_path":"index.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":".","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:19Z"} +{"cache_key":"11a6809809867ab84f2a66da213f7894876530602a0743b37fc93e614c7ccbfe","segment_id":"help/index.md:71095a6d42f5d9c2","source_path":"help/index.md","text_hash":"71095a6d42f5d9c2464a8e3f231fc53636d4ce0f9356b645d245874162ec07e2","text":"Gateway troubleshooting","translated":"Gateway 故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:44Z"} +{"cache_key":"1226fe0b47712f49a01581113142855bc5ae36e3289353b5d592ece5191b0159","segment_id":"start/wizard.md:c90e6f2be18d7e02","source_path":"start/wizard.md","text_hash":"c90e6f2be18d7e02413e18d4174fe7d855c9753005652614556204123b37c96e","text":": browser flow; paste the ","translated":":浏览器流程;粘贴 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:18Z"} +{"cache_key":"1249a5c279b0761418bca0826571d62b0526075a0c91018c35002331e3c6d6b5","segment_id":"environment.md:aac7246f5e97142c","source_path":"environment.md","text_hash":"aac7246f5e97142c3f257b7d8b84976f10c29e1b89804bb9d3eb7c43cc03cb8e","text":"Environment variables","translated":"环境变量","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:14Z"} +{"cache_key":"124e4ad52161941e1842f43e4f5d0c12d573babaf3f319ec7d5db46ba8ee7e84","segment_id":"index.md:0b60fe04b3c5c3c7","source_path":"index.md","text_hash":"0b60fe04b3c5c3c76371b6eca8b19c8e09a0e54c9010711ff87e782d87d2190b","text":"Android app","translated":"Android 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:57Z"} +{"cache_key":"135f65a9b168054bcbe82dd61f4309c2dda482ef1e442ec7eec710c8f597b97c","segment_id":"start/getting-started.md:d2da561767068503","source_path":"start/getting-started.md","text_hash":"d2da56176706850367dee94ffc2a1daf962c84f7a9cbf61aa379ddc33bcbaf95","text":"If you want the deeper reference pages, jump to: ","translated":"如果您需要更详细的参考页面,请跳转至: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:05Z"} +{"cache_key":"1370cc167f786bd13af7db472a718a3029e35e284c8a6878d5d0945490b59eec","segment_id":"start/getting-started.md:66354a1d3225edbf","source_path":"start/getting-started.md","text_hash":"66354a1d3225edbf01146504d06aaea1242dcf50424054c3001fc6fa2ddece0f","text":"Remote access","translated":"远程访问","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:31Z"} +{"cache_key":"13e78cfc5d44bb03f1de8ea274175eb17591ea86da3a5b78f04e97df1a74ff65","segment_id":"index.md:329f3c913c0a1636","source_path":"index.md","text_hash":"329f3c913c0a16363949eb8ee7eb0cda7e81137a3851108019f33e5d18b57d8f","text":"Switching between npm and git installs later is easy: install the other flavor and run ","translated":"之后在 npm 安装和 git 安装之间切换很简单:安装另一种方式并运行 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:13Z"} +{"cache_key":"147fcf3acfee0fe1de6932eed18455765effec1024bb00db4f6a2dd367cd9c23","segment_id":"index.md:1016b5bdce94a848","source_path":"index.md","text_hash":"1016b5bdce94a8484312c123416c1a18c29fab915ba2512155df3a82ee097f8f","text":"If the Gateway is running on the same computer, that link opens the browser Control UI\nimmediately. If it fails, start the Gateway first: ","translated":"如果 Gateway 运行在同一台计算机上,该链接会立即打开浏览器控制界面。如果打开失败,请先启动 Gateway: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:25Z"} +{"cache_key":"1490f7c2fc1c4e0b651ef5d269a8acd623cb90b51d6b9814688a95ee8fed4772","segment_id":"index.md:9bd86b0bbc71de88","source_path":"index.md","text_hash":"9bd86b0bbc71de88337aa8ca00f0365c1333c43613b77aaa46394c431cb9afd8","text":"Maxim Vovshin","translated":"Maxim Vovshin","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:14Z"} +{"cache_key":"14f523713d1f9204bc80126a5fa7111149e72734cc1c958f6faf344ea347304b","segment_id":"index.md:c6e91f3b51641b1c","source_path":"index.md","text_hash":"c6e91f3b51641b1c43d297281ee782b40d9b3a0bdd7afc144ba86ba329d5f95f","text":"OpenClaw = CLAW + TARDIS","translated":"OpenClaw = CLAW + TARDIS","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:38Z"} +{"cache_key":"152ce96ff0d29caf9f3ce55d6a7aca272b4e335f580058a7790cc56b2470233c","segment_id":"index.md:a7a19d4f14d001a5","source_path":"index.md","text_hash":"a7a19d4f14d001a56c27f68a13ff267859a407c7a9ab457c0945693c9067dd1c","text":"Configuration (optional)","translated":"配置(可选)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:48Z"} +{"cache_key":"15ffd6a61896c7467d982847033889cbf92f11c42fa93b5f9a46b754780c41e4","segment_id":"start/wizard.md:c18a76f788d27ead","source_path":"start/wizard.md","text_hash":"c18a76f788d27eade089c5e57a4d8d0e64b0e69278ff24b71eb267d915d23646","text":"Model/auth (OpenAI Code (Codex) subscription OAuth, Anthropic API key (recommended) or setup-token (paste), plus MiniMax/GLM/Moonshot/AI Gateway options)","translated":"模型/认证(OpenAI Code (Codex) 订阅 OAuth、Anthropic API 密钥(推荐)或 setup-token(粘贴),以及 MiniMax/GLM/Moonshot/AI Gateway 选项)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:18Z"} +{"cache_key":"1609cb1df4c75a8648918d074322a56d17486584efc5dece6e10c3cbd4e37b7e","segment_id":"environment.md:d4a67341570f4656","source_path":"environment.md","text_hash":"d4a67341570f4656784c5f8fe1bfb48a738ace57b52544977431d50e2b718099","text":"FAQ: env vars and .env loading","translated":"常见问题:环境变量和 `.env` 加载","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:17:14Z"} +{"cache_key":"161305a0fe253398ae3cff640449ed26bc7a2f3c52cb3ae71ea8d861cbcce0a0","segment_id":"start/wizard.md:bb1460932d15b59c","source_path":"start/wizard.md","text_hash":"bb1460932d15b59cba3f47b5c93a8d1768a6ba842cd4aa3eba8d2e2540fc0f19","text":"Channel allowlists (Slack/Discord/Matrix/Microsoft Teams) when you opt in during the prompts (names resolve to IDs when possible).","translated":"渠道允许名单(Slack/Discord/Matrix/Microsoft Teams),在提示期间选择启用时生效(名称会尽可能解析为 ID)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:42Z"} +{"cache_key":"163bd5cf4e32a3b93891c0acaa17dcbec319fbab2e097d0d8785997528586f02","segment_id":"index.md:d08cec54f66c140c","source_path":"index.md","text_hash":"d08cec54f66c140c655a1631f6d629927c7c38b9c8bfa91c875df9bd3ad3c559","text":"OpenClaw assistant setup","translated":"OpenClaw 助手设置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:39Z"} +{"cache_key":"1699b5d6dd8bd25127b31c4c1dde1c32c99d4d73e8928d3d4240cc4ca7a90948","segment_id":"index.md:872887e563e75957","source_path":"index.md","text_hash":"872887e563e75957ffc20b021332504f2ddd0a8f3964cb93070863bfaf13cdad","text":"Example:","translated":"示例:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:44Z"} +{"cache_key":"16df9d8c10cc2590ebcc2313fee468c319259a1c038fcf19a9844754a1c6d0cf","segment_id":"index.md:88d90e2eef3374ce","source_path":"index.md","text_hash":"88d90e2eef3374ce1a7b5e7fbd3b1159364b26a8ceb2493d6e546d4444b03cda","text":"Tailscale","translated":"Tailscale","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:28Z"} +{"cache_key":"170ac65dcb50a9c53c485160f6dac256ff7cd0a52f42110be2e831d8b8dfe2d8","segment_id":"index.md:6638cf2301d3109d","source_path":"index.md","text_hash":"6638cf2301d3109da66a44ee3506fbd35b29773fa4ca33ff35eb838c21609e19","text":"Features (high level)","translated":"功能(概览)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:46Z"} +{"cache_key":"177341748b72b186e14110d0c9976e378a203d89a6c13e049a92f3cdc3d750a5","segment_id":"index.md:872887e563e75957","source_path":"index.md","text_hash":"872887e563e75957ffc20b021332504f2ddd0a8f3964cb93070863bfaf13cdad","text":"Example:","translated":"示例:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:39Z"} +{"cache_key":"17bdf88db004d77259d1facc1c15dbb8745e59196159394aa7b079e5791cb188","segment_id":"index.md:cda454f61dfcac70","source_path":"index.md","text_hash":"cda454f61dfcac7007a9edc538f9f58cf38caa0652e253975979308162bccc53","text":"Gateway configuration","translated":"Gateway 配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:15Z"} +{"cache_key":"17e73f0432c41ef1e25bcb39e40a7fb845787238a577b53ddf27793a5397ec20","segment_id":"start/getting-started.md:185d41cd3982a2b1","source_path":"start/getting-started.md","text_hash":"185d41cd3982a2b1d9355a331c5270ca3bf6e8467b35dea265d2e3a279d05dea","text":" to the gateway host.","translated":" 到 Gateway 主机上。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:42Z"} +{"cache_key":"180848ab1dfb40b43095571666d7e635cec82592dd7b0ea3f406819694db95bd","segment_id":"index.md:1df4f2299f0d9cc4","source_path":"index.md","text_hash":"1df4f2299f0d9cc466fa05abeb2831e76e9f89583228174ffcd9af415fd869fe","text":"Send a test message (requires a running Gateway):","translated":"发送测试消息(需要 Gateway 正在运行):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:25Z"} +{"cache_key":"1851994b49e6bccd9901d48dea770f2271a4b0adf71a11555a7d49ea7433ab55","segment_id":"index.md:0d517afa83f91ec3","source_path":"index.md","text_hash":"0d517afa83f91ec33ee74f756c400a43b11ad2824719e518f8ca791659679ef4","text":"Web surfaces (Control UI)","translated":"Web 界面(控制界面)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:33Z"} +{"cache_key":"185a0aac0aa7e81682f9016aa8d0e4f95f86005abb5a52840876dc9b23129893","segment_id":"help/index.md:156597e2632411d1","source_path":"help/index.md","text_hash":"156597e2632411d1d5f634db15004072607ba45072a4e17dfa51790a37b6781f","text":"Gateway issues:","translated":"Gateway 问题:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:26Z"} +{"cache_key":"18869b3a6b51f154fdcbb622d54f07c567e9438608cf998f54e590550797ed35","segment_id":"index.md:9f4d843a5d04e23b","source_path":"index.md","text_hash":"9f4d843a5d04e23b22eb79b3bfa0fbad70ede435ddb5d047e7d77e830efa6019","text":" — Bot token + WebSocket events","translated":" — Bot 令牌 + WebSocket 事件","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:13Z"} +{"cache_key":"18bd8d592ca11411d1c02c1a70123dc798352f581db4c9ce297c5ebb04841fa3","segment_id":"index.md:03279877bfe1de07","source_path":"index.md","text_hash":"03279877bfe1de0766393b51e69853dec7e95c287ef887d65d91c8bbe84ff9ff","text":"WebChat + macOS app","translated":"网页聊天 + macOS 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:30Z"} +{"cache_key":"190c49164ee5535fac803e9c0f057588d634e056d2c4fc072a0ca26e01ddc391","segment_id":"index.md:7d8b3819c6a9fb72","source_path":"index.md","text_hash":"7d8b3819c6a9fb726f40c191f606079b473f6f72d4080c13bf3b99063a736187","text":"Ops and safety:","translated":"运维和安全:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:19Z"} +{"cache_key":"19207e4ed0ae44f965f33707377a0217c1765cf57b09c0268ee36c10fb108dd9","segment_id":"index.md:c6e91f3b51641b1c","source_path":"index.md","text_hash":"c6e91f3b51641b1c43d297281ee782b40d9b3a0bdd7afc144ba86ba329d5f95f","text":"OpenClaw = CLAW + TARDIS","translated":"OpenClaw = CLAW + TARDIS","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:18Z"} +{"cache_key":"194e63ecfe45556973c28ccafc39f814f42d2478037734ce44eee72f6fc6fc66","segment_id":"index.md:856302569e24c4d6","source_path":"index.md","text_hash":"856302569e24c4d64997e2ec5c37729f852bcccf333ba1e2f71e189c9d172e6d","text":": SSH tunnel or tailnet/VPN; see ","translated":":SSH 隧道或 Tailnet/VPN;请参阅 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:21Z"} +{"cache_key":"196942db05e9e40cbdf74a89cdd1be042430343a64ac2185009414f0d092af66","segment_id":"environment.md:cda454f61dfcac70","source_path":"environment.md","text_hash":"cda454f61dfcac7007a9edc538f9f58cf38caa0652e253975979308162bccc53","text":"Gateway configuration","translated":"Gateway 配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:13:11Z"} +{"cache_key":"19c0ced45bb35a1d8801864910a9f7bc2c460229fdd97366f546255feeb1db0e","segment_id":"index.md:8816c52bc5877a2b","source_path":"index.md","text_hash":"8816c52bc5877a2b24e3a2f4ae7313d29cf4eba0ca568a36f2d00616cfe721d0","text":"Wizard","translated":"向导","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:12Z"} +{"cache_key":"19ca5db3b9a34663414fc437ede7163609ae09cf0a0873367e8a83c8c8dc9c1c","segment_id":"index.md:e64d6b29b9d90bba","source_path":"index.md","text_hash":"e64d6b29b9d90bba92ffe2539dc295a75c553684fed0350ee56bfd0aead01662","text":"Multiple gateways","translated":"多 Gateway 部署","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:45Z"} +{"cache_key":"19d8897086c397efdc874615a9503b47cb856584fc885631b1dac100e0bbf69e","segment_id":"start/wizard.md:c3f0c8edf2a35cb6","source_path":"start/wizard.md","text_hash":"c3f0c8edf2a35cb67c00b0fe92273695465fb1a1faa99a54b08a42c116cfc532","text":"Typical fields in ","translated":"中的典型字段 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:26Z"} +{"cache_key":"1ace42dd9735ec65580e321be5ec1b6956327ceb79da49867d3031743de01599","segment_id":"index.md:7ac362063b9f2046","source_path":"index.md","text_hash":"7ac362063b9f204602f38f9f1ec9cf047f03e0d7b83896571c9df6d31ad41e9c","text":"Nodes","translated":"节点","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:50Z"} +{"cache_key":"1add3ec58637e35e15f8ecce92a3064278889ebc567d4b15e12d7f73d43f829d","segment_id":"environment.md:cea23dd4b87e8b00","source_path":"environment.md","text_hash":"cea23dd4b87e8b00d19fb9ccaaef93e97353c7353e2070f3baf05aeb3995dff4","text":" expected","translated":" 预期","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:44Z"} +{"cache_key":"1aefff77e0f0e3d5d9204ec8bba8bc39215a10dc4242638faf2a000db1b7f6c4","segment_id":"index.md:032f5589cfa2b449","source_path":"index.md","text_hash":"032f5589cfa2b44973fe96c42e17dcc2692281413a05b16f48ff0f958f7f7ade","text":"Discord Bot","translated":"Discord 机器人","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:40Z"} +{"cache_key":"1b03b1a606f8d851e3a9744ceedc51773da3a8df1e44cea04e77f4cdcc482f4f","segment_id":"help/index.md:b79cac926e0b2e34","source_path":"help/index.md","text_hash":"b79cac926e0b2e347e72cc91d5174037c9e17ae7733fd7bdb570f71b10cd7bfc","text":"Help","translated":"帮助","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:07Z"} +{"cache_key":"1b0d0b676f8ad6e3cca80b5ba0962cfca425d38aba4dfdae950f4c645cc4648c","segment_id":"environment.md:c2d7247c8acb83a5","source_path":"environment.md","text_hash":"c2d7247c8acb83a5a020458fa836c2445922b51513dbdbf154ab5f7656cb04e9","text":"; does not override).","translated":";不会覆盖)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:46Z"} +{"cache_key":"1b30ed7712ade7f794a6fdc40334ac098d59fa26a77cb4dbee831ba2078a2575","segment_id":"environment.md:ab5aec4424cf678d","source_path":"environment.md","text_hash":"ab5aec4424cf678dcfb1ad3d2c2929c1e0b2b1ff61b82b961ada48ad033367b4","text":" (dotenv default; does not override).","translated":" (dotenv 默认行为;不会覆盖)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:34Z"} +{"cache_key":"1b46380759682daee5913f29666ad424b3e1b23a87ee5b8169484b9c4e4cce3f","segment_id":"index.md:7af023c43013b9a5","source_path":"index.md","text_hash":"7af023c43013b9a53fbff7dd4b5821588bba3319308878229740489152c43f6d","text":"Docs","translated":"文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:10Z"} +{"cache_key":"1b9c39af551716b27cb347a69279ef46cfe3c1fb503688b09287759b10390831","segment_id":"start/wizard.md:e86be3a8fc32914b","source_path":"start/wizard.md","text_hash":"e86be3a8fc32914baac6ea18f1b36fb282ea9648829cec3bba6434bdc6d78b9c","text":" before continuing.","translated":" 后再继续。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:22Z"} +{"cache_key":"1c12007db13e2183cd1fe644bbe1a01094186d612f9d4c719986819020e971df","segment_id":"start/getting-started.md:e2235b75234648f0","source_path":"start/getting-started.md","text_hash":"e2235b75234648f0959f35fae53aa627c01be06907b8596d69b01ae9187e1574","text":"Sandboxing note: ","translated":"沙箱注意事项: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:15Z"} +{"cache_key":"1c4b67e17a4caf039722cea2dd696a8a7cdef2168d6518aaf603d3aeb69b9366","segment_id":"index.md:e47cdb55779aa06a","source_path":"index.md","text_hash":"e47cdb55779aa06a74ae994c998061bd9b7327f5f171c141caf2cf9f626bfe4b","text":"Peter Steinberger","translated":"Peter Steinberger","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:17Z"} +{"cache_key":"1c540694a0b8ce10fc354bd7f41b387f1d72d1759ffecbf35976cdf744305f0e","segment_id":"index.md:cec2be6f871d276b","source_path":"index.md","text_hash":"cec2be6f871d276b45d13e3010c788f01b03ae2f1caca3264bbf759afacace46","text":"Telegram Bot","translated":"Telegram 机器人","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:34Z"} +{"cache_key":"1c7aa162de30cece8f7d315f71cdc949464409fa4af6d15a34fe9e1355c65a07","segment_id":"index.md:0b60fe04b3c5c3c7","source_path":"index.md","text_hash":"0b60fe04b3c5c3c76371b6eca8b19c8e09a0e54c9010711ff87e782d87d2190b","text":"Android app","translated":"Android 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:11Z"} +{"cache_key":"1c913763f7d014418cc6c1099fe8225a377347cffba038df43b8b36ddefb8667","segment_id":"start/wizard.md:053bc65874ad6098","source_path":"start/wizard.md","text_hash":"053bc65874ad6098e58c41c57b378a2f36b0220e5e0b46722245e6c2f796818c","text":"Discord","translated":"Discord","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:32Z"} +{"cache_key":"1cb210590e688dccd03dac9806c6ca974a62f36eb66841174c22bc2a92ba246b","segment_id":"index.md:1016b5bdce94a848","source_path":"index.md","text_hash":"1016b5bdce94a8484312c123416c1a18c29fab915ba2512155df3a82ee097f8f","text":"If the Gateway is running on the same computer, that link opens the browser Control UI\nimmediately. If it fails, start the Gateway first: ","translated":"如果 Gateway 运行在同一台计算机上,该链接会立即打开浏览器控制界面。如果打开失败,请先启动 Gateway: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:00Z"} +{"cache_key":"1d79cadd479cb04568bc708432327edae80a4fd8ef388f88810aa943956e4c47","segment_id":"start/wizard.md:c8fa121316f27858","source_path":"start/wizard.md","text_hash":"c8fa121316f2785846379bef81073a1f3dd68979bd249b3953d671935e11de39","text":" on any machine, then paste the token (you can name it; blank = default).","translated":" 在任意机器上执行,然后粘贴令牌(可以命名;留空 = 默认)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:07Z"} +{"cache_key":"1db946531e000c45cc98cc20862f674ef6c61986d0ea1d47dfb1904d14218107","segment_id":"environment.md:e234227b0e001687","source_path":"environment.md","text_hash":"e234227b0e001687821541fac3af38fc6be293ec6e13910c6826b9afc8ca33be","text":" syntax:","translated":" 语法:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:20Z"} +{"cache_key":"1dec0d82356f133d86b7f5230d326009390aef97750e2e02a9f559c81af566c0","segment_id":"start/wizard.md:da4f7ea58d963b1a","source_path":"start/wizard.md","text_hash":"da4f7ea58d963b1a302b76b8fa5570190106c673b9cf2975468b8caea5e27384","text":"Notes:","translated":"注意事项:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:26Z"} +{"cache_key":"1e12a98dc0766a832c97dea693a841b86ec63df3e8303fb054a918e2b17ca0af","segment_id":"index.md:1df4f2299f0d9cc4","source_path":"index.md","text_hash":"1df4f2299f0d9cc466fa05abeb2831e76e9f89583228174ffcd9af415fd869fe","text":"Send a test message (requires a running Gateway):","translated":"发送测试消息(需要正在运行的 Gateway):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:45Z"} +{"cache_key":"1e12f10bc3ce3c2de7f740928fb2eb076893bf23694f69adc314d8496c436182","segment_id":"environment.md:frontmatter:summary","source_path":"environment.md:frontmatter:summary","text_hash":"78351223e7068721146d2de022fdf440c2866b2ee02fbbb50bf64369b999820b","text":"Where OpenClaw loads environment variables and the precedence order","translated":"其中 OpenClaw 加载 环境变量 及优先级顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:10Z"} +{"cache_key":"1e290e5653bf89ffd9643bbb215d3b2ce8f30b26d3468a5b584482ea567fb499","segment_id":"index.md:075a4a45c3999f34","source_path":"index.md","text_hash":"075a4a45c3999f340be8487cd7c0dd2ed77ced931054d75e95e5e24d5539b45b","text":" — Pi (RPC mode) with tool streaming","translated":" — Pi(RPC 模式),支持工具流式传输","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:59Z"} +{"cache_key":"1e95353aafa09b6593d0a72b4957849c4bd481c529d0cd0c2c92a989b3be6314","segment_id":"index.md:cf9f12b2c24ada73","source_path":"index.md","text_hash":"cf9f12b2c24ada73bb0474c0251333f65e6d5d50e56e605bdb264ff32ad0a588","text":"Config lives at ","translated":"配置文件位于 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:50Z"} +{"cache_key":"1ecffd089b9e7ce60ff3c650b35056b17b3818bed3a6b56aad92c8aa31d7ef0a","segment_id":"index.md:723784fa2b6a0876","source_path":"index.md","text_hash":"723784fa2b6a0876540a92223ee1019f24603499d335d6d82afbc520ef5b5d57","text":") — Creator, lobster whisperer","translated":")— 创始人,龙虾低语者","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:57Z"} +{"cache_key":"1ee9e09b79b65f176e6502ee06df46982743679fd7dab8489796507a560b9061","segment_id":"start/wizard.md:dd6d876548037ec7","source_path":"start/wizard.md","text_hash":"dd6d876548037ec722252b45795206575e7040eba1ca076cf1732a4a903cadba","text":"recommended","translated":"推荐的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:01Z"} +{"cache_key":"1f29b910c7c6522a295107b45bd56440780ea346e1080c11e5151d3ba113afca","segment_id":"environment.md:1fe7fd13379f249a","source_path":"environment.md","text_hash":"1fe7fd13379f249a1e554dc904ad7b921693805367609bcddba21f0e7777f4c6","text":" keys:","translated":" 密钥:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:46Z"} +{"cache_key":"1f36183a47c67ccafde914a43347afd754eafbb2963a3d0ad3d3942258443cdf","segment_id":"index.md:d00eca1bae674280","source_path":"index.md","text_hash":"d00eca1bae6742803906ab42a831e8b5396d15b6573ea13c139ec31631208ec1","text":"Getting Started","translated":"快速入门","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:04Z"} +{"cache_key":"1f429111895ed6cef256514a66a9adb27ec53f3d69a546a6a18c80495cacd604","segment_id":"start/getting-started.md:c65465f9a818c020","source_path":"start/getting-started.md","text_hash":"c65465f9a818c02008a391292f0086b37aa7e8fe7355aca80967b20a8b692e0b","text":"Dashboard (local loopback): ","translated":"仪表盘(本地回环): ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:53Z"} +{"cache_key":"1fb0683c4f7488278cb9251e361610c911ef766dd126666b7fc10f6f73a0c8b7","segment_id":"index.md:79a482cf546c23b0","source_path":"index.md","text_hash":"79a482cf546c23b04cd48a33d4ca8411f62e5b7dc8c3a8f30165e28e747f263a","text":"iMessage","translated":"iMessage","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:54Z"} +{"cache_key":"1ff7a3f0c5d86df89523e2dad0861b2ace45830858dd2ca1c4e778747334ffc0","segment_id":"start/wizard.md:ac12572a8df977e5","source_path":"start/wizard.md","text_hash":"ac12572a8df977e5ea70c8b1a24c2a84b1ecd1935e2ef9fe4c38c5849d4755f8","text":" if present.","translated":" (如果存在)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:59Z"} +{"cache_key":"2034fd5a1e8f055e05fbbdfae0533751d7f0d1c2c0f3d2808c9eeb4da918e89a","segment_id":"environment.md:907940a35852447a","source_path":"environment.md","text_hash":"907940a35852447aad5f21c5a180d993ff31cfd5807b1352ed0c24eabe183465","text":"never override existing values","translated":"永远不覆盖已有的值","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:56Z"} +{"cache_key":"204727bc1fb1c07814caf037d6fa475e7981c7b57ed1367943361cb5d56815bb","segment_id":"index.md:185beb968bd1a81d","source_path":"index.md","text_hash":"185beb968bd1a81d07ebcf82376642f7b29f1b5594b21fe9edee714efbdcaa44","text":"✈️ ","translated":"✈️ ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:33Z"} +{"cache_key":"20af820e30f9d07e1b6dce3866df5f8dff2be94881a44767228a1f6b9aa5d1bf","segment_id":"index.md:274162b77e02a189","source_path":"index.md","text_hash":"274162b77e02a1898044ea787db109077a2969634f007221c29b53c2e159b0cc","text":". Plugins add Mattermost (Bot API + WebSocket) and more.\nOpenClaw also powers the OpenClaw assistant.","translated":"。插件还支持 Mattermost(Bot API + WebSocket)等更多平台。\nOpenClaw 还为 OpenClaw 助手提供支持。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:37Z"} +{"cache_key":"20afa1e6ed4b34b77d13becaaffdcb038b92351654672578634c6f3761b82d38","segment_id":"help/index.md:6201111b83a0cb5b","source_path":"help/index.md","text_hash":"6201111b83a0cb5b0922cb37cc442b9a40e24e3b1ce100a4bb204f4c63fd2ac0","text":" and ","translated":" 和 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:52Z"} +{"cache_key":"2187914f759dffd9a960e25b4de5d07c68b9cf635f2d86e0497c90a80ec9fa57","segment_id":"environment.md:e234227b0e001687","source_path":"environment.md","text_hash":"e234227b0e001687821541fac3af38fc6be293ec6e13910c6826b9afc8ca33be","text":" syntax:","translated":" 语法:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:47:03Z"} +{"cache_key":"2194495894bf0f98ef0af4a8658521377e555a9fc6b7b1c7bfd99e305d7f023f","segment_id":"start/wizard.md:649cfa2f76a80b42","source_path":"start/wizard.md","text_hash":"649cfa2f76a80b42e1821c89edd348794689409dcdf619dcd10624fb577c676b","text":"not recommended","translated":"不推荐","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:35Z"} +{"cache_key":"21c3bf5b2b4eac5e8703e4e98cf9179524d16013e1324921b87acaa0cf085d2f","segment_id":"index.md:4b4051e77af8844f","source_path":"index.md","text_hash":"4b4051e77af8844fcf86a298214527e7840938258f99bfe97b900bbc0d8d2f4b","text":"The dashboard is the browser Control UI for chat, config, nodes, sessions, and more.\nLocal default: http://127.0.0.1:18789/\nRemote access: ","translated":"仪表板是用于聊天、配置、节点、会话 等功能的浏览器控制界面。\n本地默认地址:http://127.0.0.1:18789/\n远程访问: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:07Z"} +{"cache_key":"21d5f361e852fbe5b69697313f954689d7f44d285c1d9039ba360a8907a1b7b8","segment_id":"environment.md:453c14128fbfb5f6","source_path":"environment.md","text_hash":"453c14128fbfb5f6757511557132a1dbb3bcbf243267630bfec49db8518c7780","text":"Env var substitution in config","translated":"配置中的环境变量替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:29Z"} +{"cache_key":"21e1ac9646c9b4ec91d366e85957a04c5b7f0c41c95e653c43925dd01c080501","segment_id":"index.md:4b4051e77af8844f","source_path":"index.md","text_hash":"4b4051e77af8844fcf86a298214527e7840938258f99bfe97b900bbc0d8d2f4b","text":"The dashboard is the browser Control UI for chat, config, nodes, sessions, and more.\nLocal default: http://127.0.0.1:18789/\nRemote access: ","translated":"仪表盘是用于聊天、配置、节点、会话等功能的浏览器控制界面。\n本地默认地址:http://127.0.0.1:18789/\n远程访问: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:23Z"} +{"cache_key":"2208e96b11a53d5948e802dc055895cfdd8ee5ecbaca057c64038b30e25e1403","segment_id":"start/wizard.md:65d655d45a507243","source_path":"start/wizard.md","text_hash":"65d655d45a50724332fee040cd2c6a000778db0e122459fc48047206e699900a","text":"(or pass ","translated":"(或传入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:15Z"} +{"cache_key":"221e7c2c0fe8b9bb39aa23d66ead440852512864ee62242cc3d9290dbd135860","segment_id":"index.md:9bd86b0bbc71de88","source_path":"index.md","text_hash":"9bd86b0bbc71de88337aa8ca00f0365c1333c43613b77aaa46394c431cb9afd8","text":"Maxim Vovshin","translated":"Maxim Vovshin","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:49Z"} +{"cache_key":"2220f5ebb94a086ce480f01165b1993d04e470d58154e2aa482056a2eecbb1f1","segment_id":"help/index.md:3c33340bd23b8db8","source_path":"help/index.md","text_hash":"3c33340bd23b8db89f18fe7d05a954738c0dd5ba9623cf6bdb7bb5d1a3729cfc","text":"FAQ (concepts)","translated":"常见问题(概念)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:59Z"} +{"cache_key":"2229ff2bff7c65fc1a4cd5515373b1b3319f43a26222f43787452e985cf5e4bb","segment_id":"index.md:11d28de5b79e3973","source_path":"index.md","text_hash":"11d28de5b79e3973f6a3e44d08725cdd5852e3e65e2ff188f6708ae9ce776afc","text":"Docs hubs (all pages linked)","translated":"文档中心(所有页面链接)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:49Z"} +{"cache_key":"22baac03ae69320ee9635f7e23e85e926ed40c441e97357b30b48e271e88770f","segment_id":"index.md:013e11a23ec9833f","source_path":"index.md","text_hash":"013e11a23ec9833f907b2ead492b0949015e25d10ba92461669609aee559335d","text":"Start here:","translated":"从这里开始:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:47Z"} +{"cache_key":"22bfdd3e9e4f7a5447edf31592e38d663a8907afca5f46061f314b924280a94b","segment_id":"index.md:d53b75d922286041","source_path":"index.md","text_hash":"d53b75d9222860417f783b0829023b450905d982011d35f0e71de8eed93d90fc","text":"New install from zero:","translated":"从零开始全新安装:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:41Z"} +{"cache_key":"22c7a06691f087acabe4321804edbb000eaf7520b16060ac2879f19252b639e3","segment_id":"index.md:31365ab9453d6a1e","source_path":"index.md","text_hash":"31365ab9453d6a1ec03731622803d3b44f345b6afad08040d7f3e97290c77913","text":"do nothing","translated":"不做任何操作","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:33Z"} +{"cache_key":"22d40e91dde10d2912781df931ab0fac2802d5b81e63fdd93bdb7856c8c43976","segment_id":"environment.md:7175517a370b5cd2","source_path":"environment.md","text_hash":"7175517a370b5cd2e664e3fd29c4ea9db5ce17058eb9772fe090a5485e49dad6","text":" or ","translated":" 或 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:00Z"} +{"cache_key":"23004dacbc322d02e170261429793a8b23569f398c4f21352a030b42543cdef9","segment_id":"index.md:6b65292dc52408c1","source_path":"index.md","text_hash":"6b65292dc52408c15bb07aa90735e215262df697d1a7bd2d907c9d1ff294ed5e","text":"If you don’t have a global install yet, run the onboarding step via ","translated":"如果您还没有全局安装,请通过以下方式运行 上手引导 步骤 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:37Z"} +{"cache_key":"231f5f501e89f219692ad075c657cf5933b0f1f238599ce9c071676a24e755f6","segment_id":"index.md:45e6d69dbe995a36","source_path":"index.md","text_hash":"45e6d69dbe995a36f7bc20755eff4eb4d2afaaedbcac4668ab62540c57219f32","text":"macOS app","translated":"macOS 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:53Z"} +{"cache_key":"232f62d57ad6e5a82f4409553ea36a2922ef2c0d515cf24d030edd4c81c89e9f","segment_id":"help/index.md:8ddb7fc8a87904de","source_path":"help/index.md","text_hash":"8ddb7fc8a87904dedc2afc16400fbe4e78582b302e01c30b1319c8a465d04684","text":"Troubleshooting:","translated":"故障排除:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:10Z"} +{"cache_key":"2406d5725ab83e6898a33bba0fc2cd62ee455bd54fbe32831a88379d5e02d86f","segment_id":"index.md:c0aa8fcb6528510a","source_path":"index.md","text_hash":"c0aa8fcb6528510aea46361e8c871d88340063926a8dfdd4ba849b6190dec713","text":": it is the only process allowed to own the WhatsApp Web session. If you need a rescue bot or strict isolation, run multiple gateways with isolated profiles and ports; see ","translated":":它是唯一允许持有 WhatsApp Web 会话的进程。如果需要备用机器人或严格隔离,可使用独立配置文件和端口运行多个 Gateway;请参阅 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:43Z"} +{"cache_key":"241e91bd0b62e35fb2ec88322ec08e734dda812d53f7abab56928ef184075551","segment_id":"environment.md:6db0742daaf9f191","source_path":"environment.md","text_hash":"6db0742daaf9f191ab7816d2c9d317b1ea1693453a8c63b95af8b01477e0f5bb","text":" runs your login shell and imports only ","translated":" 运行你的登录 shell 并仅导入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:39Z"} +{"cache_key":"2464c2f32b20d6e91fc9b63900ca12b81b1cb3fd185ad50d14ba4335d4e1b7a5","segment_id":"index.md:6e0f6eca4ff17d33","source_path":"index.md","text_hash":"6e0f6eca4ff17d3377c1c3e8e1f73457553ad3b9cfcd5e4f2b94cfb1028b6234","text":"iOS app","translated":"iOS 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:55Z"} +{"cache_key":"24f4ed3c397e27f4a1d99dd6920c49327133c009ca1c9c5ba236d54ae50831f3","segment_id":"start/getting-started.md:8b31087991db3d3d","source_path":"start/getting-started.md","text_hash":"8b31087991db3d3d41b72b3dc31587adf140ea2bc46913b195c773810711388f","text":"and chat in the browser, or open ","translated":"然后在浏览器中聊天,或打开 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:35Z"} +{"cache_key":"24fe1d1819e7b7ad223dda1b2a6ce1ec91a1954bf95f40a7dcdbba28129b3930","segment_id":"environment.md:582967534d0f909d","source_path":"environment.md","text_hash":"582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf","text":" in ","translated":" 在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:02Z"} +{"cache_key":"250eb34b1c8653641bb56ae814e663c3ddeaf7caa912b2b75e321788d4e7e9da","segment_id":"start/getting-started.md:053bc65874ad6098","source_path":"start/getting-started.md","text_hash":"053bc65874ad6098e58c41c57b378a2f36b0220e5e0b46722245e6c2f796818c","text":"Discord","translated":"Discord","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:26Z"} +{"cache_key":"250ebfe2db8b434d37c37a532f532102c1e6f30cfaa1c295af3c4fbe13ffc1ba","segment_id":"help/index.md:cad44fbae951d379","source_path":"help/index.md","text_hash":"cad44fbae951d3791565b0cee788c01c3bd10e0176167acb691b8dba0f7895f8","text":"Gateway logging","translated":"Gateway 日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:26Z"} +{"cache_key":"25861831dad7a8862f567594c9bc4b59c68dc56776ba50ff9d7295c536b23664","segment_id":"help/index.md:6cb77499abdccd9a","source_path":"help/index.md","text_hash":"6cb77499abdccd9a2dbb7c93a4d31eed01613dda06302933057970df9ecdeb54","text":"Logs:","translated":"日志:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:31Z"} +{"cache_key":"25cc8403b5816b888911443d2917b330bc530b2e338f51b2a7422b2a78b7870d","segment_id":"index.md:e64d6b29b9d90bba","source_path":"index.md","text_hash":"e64d6b29b9d90bba92ffe2539dc295a75c553684fed0350ee56bfd0aead01662","text":"Multiple gateways","translated":"多网关","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:36Z"} +{"cache_key":"25e8d037a4a0fb8c548da95825983c8a0af432d3220c14dd9908bbc344acbb2b","segment_id":"index.md:45808d75bf8911fa","source_path":"index.md","text_hash":"45808d75bf8911fa21637f9dd3f0dace1877748211976b5d61fcc5c15db594d0","text":"Webhooks","translated":"Webhooks","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:08Z"} +{"cache_key":"26087df3db46ce7741b72a3511fc552773df03f7de93d20d9d6c1aaf74ada2f0","segment_id":"environment.md:6f59001999ef7b71","source_path":"environment.md","text_hash":"6f59001999ef7b7128bab80d2034c419f3034497e05f69fbdf67f7b655cdc173","text":"Configuration: Env var substitution","translated":"配置:环境变量替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:40Z"} +{"cache_key":"2609a5fb897b0d40ef4bdfd04a26758f1b19819e28a2db1074ca89dd348c1834","segment_id":"environment.md:32ebb1abcc1c601c","source_path":"environment.md","text_hash":"32ebb1abcc1c601ceb9c4e3c4faba0caa5b85bb98c4f1e6612c40faa528a91c9","text":" (","translated":" (","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:00Z"} +{"cache_key":"2628c353f974405b473f8058fe5c80b4039449f51806dee3ced22ced458507c3","segment_id":"environment.md:frontmatter:read_when:0","source_path":"environment.md:frontmatter:read_when:0","text_hash":"90fc0487bff88009979cff1061c1a882df8c3b1baa9c43538331d9d5dab15479","text":"You need to know which env vars are loaded, and in what order","translated":"你需要了解加载了哪些环境变量,以及它们的加载顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:07Z"} +{"cache_key":"2641fa57e655e2907092885b0b24665c212df5b58bb36fa826f14180e4ec67f3","segment_id":"index.md:99260acc29f71e4b","source_path":"index.md","text_hash":"99260acc29f71e4baeb36805a1fdbd2c17254b57c8e5a9cba29ee56518832397","text":" — Route provider accounts/peers to isolated agents (workspace + per-agent sessions)","translated":" — 将提供商账户/对等方路由到隔离的智能体(工作区 + 每智能体会话)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:12Z"} +{"cache_key":"26b05211cad1c3dae78e2e4aa1f9ed7abf9cb852044cd4f872c60d9017025c93","segment_id":"start/wizard.md:27914f11fd0ce999","source_path":"start/wizard.md","text_hash":"27914f11fd0ce99942e1903fecd5ac607d0dbc22ae97969a3819e223a32265aa","text":"Workspace location + bootstrap files","translated":"工作区位置 + 引导文件","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:21Z"} +{"cache_key":"272018c637ad26ec5622a5e164be99ef742f22f1cc1f14d3af9256471c3dbe98","segment_id":"index.md:acdd1e734125f341","source_path":"index.md","text_hash":"acdd1e734125f341604c0efbabdcc4c4b0597e8f6235d66c2445edd1812838c1","text":"Telegram","translated":"Telegram","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:13Z"} +{"cache_key":"2751e36b231341babf0dc82fbe5863659467382c8bf049600dd6042b26310190","segment_id":"index.md:42071940eb773f4d","source_path":"index.md","text_hash":"42071940eb773f4dcb7111f0626b4a7a823fc44098e143ff425db8a03528609d","text":" — because every space lobster needs a time-and-space machine.","translated":" — 因为每只太空龙虾都需要一台时空机器。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:41Z"} +{"cache_key":"278578406409f5c240b49ce02dbb5bf926ca1b0ed2c7ffaa4fe2fe66ae017223","segment_id":"start/getting-started.md:623b2b8c94dc9c42","source_path":"start/getting-started.md","text_hash":"623b2b8c94dc9c4272eef1ee15c7f60ac3a2525fa9e80235380c46f41ed38748","text":"4) Pair + connect your first chat surface","translated":"4)配对 + 连接您的第一个聊天界面","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:07Z"} +{"cache_key":"27a004245e98dcbaa5e48cc369f6f2aa4bcdcf81bb6da9f4b59f6a9c0aa4d950","segment_id":"index.md:42071940eb773f4d","source_path":"index.md","text_hash":"42071940eb773f4dcb7111f0626b4a7a823fc44098e143ff425db8a03528609d","text":" — because every space lobster needs a time-and-space machine.","translated":" —— 因为每只太空龙虾都需要一台时空机器。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:07Z"} +{"cache_key":"27a06da04c255a5ecf19b5022dd6180357807d50162a5698cd21d3eb78388ef3","segment_id":"environment.md:cda454f61dfcac70","source_path":"environment.md","text_hash":"cda454f61dfcac7007a9edc538f9f58cf38caa0652e253975979308162bccc53","text":"Gateway configuration","translated":"Gateway 配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:39Z"} +{"cache_key":"27d042d7c4de0149b07caa1eef12a5a6b13bad2607338e471254e32ea17ac4fe","segment_id":"index.md:6d6577cb1c128ac1","source_path":"index.md","text_hash":"6d6577cb1c128ac18a286d3c352755d1a265b1e3a03eded8885532c3f36e32ed","text":"Mario Zechner","translated":"Mario Zechner","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:25Z"} +{"cache_key":"27e979437c543d1b0d913e200ae97874a872dbe3fb1ae1e0ea7d6eb6ebbe334e","segment_id":"index.md:98a670e2fb754896","source_path":"index.md","text_hash":"98a670e2fb7548964e8b78b90fef47f679580423427bfd15e5869aca9681d0dd","text":"\"We're all just playing with our own prompts.\"","translated":"\"我们都只是在玩弄自己的提示词。\"","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:10Z"} +{"cache_key":"28006596cdda45f4da3d43d4aca5bf66c459d4553682e2dd295c7e256c0a7dc6","segment_id":"start/wizard.md:8999c63d838a1729","source_path":"start/wizard.md","text_hash":"8999c63d838a1729c88f4334c6fd73d735c69659f7e08989bd9d4bd0cc644748","text":" Node (recommended; required for WhatsApp/Telegram). Bun is ","translated":" Node(推荐;WhatsApp/Telegram 需要)。Bun ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:33Z"} +{"cache_key":"2816a7fdcd6be1cbfa2991a8e2e2a7547e4d6c8c24cea4a8cd4bd797e593002b","segment_id":"help/index.md:d3ef01b4a9c99103","source_path":"help/index.md","text_hash":"d3ef01b4a9c9910364c9b26b2499c8787a0461d2d24ab80376fff736a288b34c","text":"Logging","translated":"日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:48Z"} +{"cache_key":"28d24c047d26e2c1e65fd0bbb5ff062aa4ac050cf6a9d74ff349d775635b6ebd","segment_id":"index.md:aaa095329e21d86e","source_path":"index.md","text_hash":"aaa095329e21d86e24e8bec91bc001f7983d73a7a04c75646c0256448dac30ef","text":" — The space lobster who demanded a better name","translated":" —— 那只要求更好名字的太空龙虾","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:36Z"} +{"cache_key":"28e8ae5018d34b717de70ce7f23982de74c146a1f056b26e5e4ae8104534414e","segment_id":"index.md:6201111b83a0cb5b","source_path":"index.md","text_hash":"6201111b83a0cb5b0922cb37cc442b9a40e24e3b1ce100a4bb204f4c63fd2ac0","text":" and ","translated":" 和 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:26Z"} +{"cache_key":"28ef1da9761f650da74d92d311e4340eb104aa4bfe79c0770be44869d3d4388b","segment_id":"help/index.md:156597e2632411d1","source_path":"help/index.md","text_hash":"156597e2632411d1d5f634db15004072607ba45072a4e17dfa51790a37b6781f","text":"Gateway issues:","translated":"Gateway 问题:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:41Z"} +{"cache_key":"2915e64d137473ff7b41748d6e775157eeff0e1392db33707e68c51e7d2b3e4a","segment_id":"environment.md:6f59001999ef7b71","source_path":"environment.md","text_hash":"6f59001999ef7b7128bab80d2034c419f3034497e05f69fbdf67f7b655cdc173","text":"Configuration: Env var substitution","translated":"配置:环境变量替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:30Z"} +{"cache_key":"29a2f85f24db686837fe914b9726eff6a76c743da516c02abf9e7b37b6e7a822","segment_id":"index.md:76d6f9c532961885","source_path":"index.md","text_hash":"76d6f9c5329618856f133dc695e78f085545ae05fae74228fb1135cba7009fca","text":") — Pi creator, security pen-tester","translated":")— Pi 创始人,安全渗透测试员","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:04Z"} +{"cache_key":"29ad5ac78c867238eeea5d895c4831ef7fd4b4da6897dbbebfa2442fe9b4a55e","segment_id":"index.md:e3209251e20896ec","source_path":"index.md","text_hash":"e3209251e20896ecc60fa4da2817639f317fbb576288a9fc52d11e5030ecc44a","text":"Windows (WSL2)","translated":"Windows (WSL2)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:59Z"} +{"cache_key":"2a0917591bc5d0651e00107b3f0240ec8ef7f815194af495b214e011d1572e63","segment_id":"environment.md:cf0923bd0c80e86a","source_path":"environment.md","text_hash":"cf0923bd0c80e86a7aa644d04aa412cbd7baa3273153c40c625ceca9e012bde8","text":" runs your login shell and imports only **missing** expected keys:","translated":" 运行你的登录 shell 并仅导入**缺失的**预期键:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:51Z"} +{"cache_key":"2a125978841a8b745660c2fe10733f5a7ec04f35d6edccb62a3a6099827c9f31","segment_id":"help/index.md:frontmatter:summary","source_path":"help/index.md:frontmatter:summary","text_hash":"aece82a2d540ab1a9a21c7b038127cae6e9db2149491564bb1856b6f8999f205","text":"Help hub: common fixes, install sanity, and where to look when something breaks","translated":"帮助中心:常见修复方法、安装完整性检查,以及出现问题时的排查指南","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:09Z"} +{"cache_key":"2a272e89ec32a98ddfab85e3261d797830491c81beea1bc76f02a2f10056444a","segment_id":"environment.md:aac7246f5e97142c","source_path":"environment.md","text_hash":"aac7246f5e97142c3f257b7d8b84976f10c29e1b89804bb9d3eb7c43cc03cb8e","text":"Environment variables","translated":"环境变量","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:20Z"} +{"cache_key":"2a5de10a869ddf9795eb574cdf1669853adf68de0aa9b586340f9f98b19a2c1b","segment_id":"index.md:723fad6d27da9393","source_path":"index.md","text_hash":"723fad6d27da939353c65417bbaf646b65903b316eb4456297ff4a1c20811e8d","text":": HTTP file server on ","translated":":HTTP 文件服务器运行在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:08Z"} +{"cache_key":"2a9244cf7264d7f417232bd9f92f966b46aa99b5cace7e6461e0b2d3a79e18fc","segment_id":"start/wizard.md:4646ca09dd863969","source_path":"start/wizard.md","text_hash":"4646ca09dd86396938b77d769471ccf591fb10f1e70b87c8e119921585c68647","text":"Anthropic API key (recommended)","translated":"Anthropic API 密钥(推荐)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:46Z"} +{"cache_key":"2a9bdab2f771b41c294a531f1d6df2023e4b67ee480cca4539599f2a60055a81","segment_id":"index.md:8fdfb6437318756c","source_path":"index.md","text_hash":"8fdfb6437318756c950bf2261538f06236e36040986891fa7b43452b987fb9f3","text":" — an AI, probably high on tokens","translated":" —— 一个可能被令牌冲昏头脑的 AI","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:13Z"} +{"cache_key":"2ac5a1447db5ab39cf2aa397324373ad9f62dc6a5dc80ce471170fb19c6f63e3","segment_id":"environment.md:f15f5f9f4ef4d668","source_path":"environment.md","text_hash":"f15f5f9f4ef4d6688876c894f8eba251ed1db6eaf2209084028d43c9e76a8ba1","text":" (aka ","translated":" (又称 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:52Z"} +{"cache_key":"2b3277f22f598b1a6f7a3131d92633b96fe7b09bfc6833b4283733bbb5e47a19","segment_id":"index.md:8f6fb4eb7f42c0e2","source_path":"index.md","text_hash":"8f6fb4eb7f42c0e245e29e63f5b82cc3ba19852681d1ed9aed291f59cf75ec0e","text":"Security","translated":"安全","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:12Z"} +{"cache_key":"2b5833fa7ce9898da69d1e64fc5c3a5eba6bb67c371a2b611ff4558aecdd62ca","segment_id":"environment.md:aac7246f5e97142c","source_path":"environment.md","text_hash":"aac7246f5e97142c3f257b7d8b84976f10c29e1b89804bb9d3eb7c43cc03cb8e","text":"Environment variables","translated":"环境变量","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:08Z"} +{"cache_key":"2baecfd26ff47bc7814b55f6a2cdeeb462776c8057428fe9125b6157e0185296","segment_id":"index.md:e1b33cfa2a781bde","source_path":"index.md","text_hash":"e1b33cfa2a781bde9ef6c1d08bf95993c62f780a6664f5c5b92e3d3633e1fcf8","text":" (@nachoiacovino, ","translated":" (@nachoiacovino, ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:27Z"} +{"cache_key":"2c1cb1cef6155b763b2262ef37c863de566330d14bf74280615cb6e549e58049","segment_id":"environment.md:32ebb1abcc1c601c","source_path":"environment.md","text_hash":"32ebb1abcc1c601ceb9c4e3c4faba0caa5b85bb98c4f1e6612c40faa528a91c9","text":" (","translated":" (","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:52Z"} +{"cache_key":"2c3188ffa72715b1d59025704a94f302614ca289ab2320901d5025dbba20e295","segment_id":"index.md:bf084dc7b82e1e62","source_path":"index.md","text_hash":"bf084dc7b82e1e62c63727b13451d1eba2269860e27db290d2d5908d7ade0529","text":" — Pairs as a node and exposes Canvas + Chat + Camera","translated":" —— 作为节点配对并暴露 Canvas + 聊天 + 相机","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:17Z"} +{"cache_key":"2c32c166aa68ab2e4ad5a305268b0b4fa3715c00d5c8711954f57c56bce5bf2f","segment_id":"index.md:7af023c43013b9a5","source_path":"index.md","text_hash":"7af023c43013b9a53fbff7dd4b5821588bba3319308878229740489152c43f6d","text":"Docs","translated":"文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:42Z"} +{"cache_key":"2c4fad6883c7306600d4b8017b42f71a49a9ef90d3f7c903931dcc1a42d6a629","segment_id":"start/getting-started.md:130fc173d131a8a8","source_path":"start/getting-started.md","text_hash":"130fc173d131a8a8e647eff6d934160e7ffc33c8a488d296f4952e43669efece","text":"Remote access (SSH tunnel / Tailscale Serve): ","translated":"远程访问(SSH 隧道 / Tailscale Serve): ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:30Z"} +{"cache_key":"2c8498d9a65196b921db3277f57a9f7a4d54f247bf632149a7e6f6d7852e3f8a","segment_id":"index.md:80fc402133201fbe","source_path":"index.md","text_hash":"80fc402133201fbe0e4e9962a9570e741856aa8b0c033f1a20a9bcb06c68e809","text":"Discovery","translated":"发现","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:43Z"} +{"cache_key":"2ca15829b0103ac379ae5ff09f282509d35a9e1dc45bbf196c72de71b74bb544","segment_id":"start/wizard.md:1d7b0a62c6b0c807","source_path":"start/wizard.md","text_hash":"1d7b0a62c6b0c8074693534632fba1f2651e07a43d627d9b033133f7be0a1e13","text":"Moonshot example:","translated":"Moonshot 示例:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:28Z"} +{"cache_key":"2cd61dfffeb36096d91b4e57fb246bbcee08cc8578906f516e40f38a3f0fd07b","segment_id":"start/getting-started.md:552d8f1e99b582e6","source_path":"start/getting-started.md","text_hash":"552d8f1e99b582e60aca716254ccebd754c93d319a7c4459e4d741e23ebf5e81","text":"Gateway token","translated":"Gateway 令牌","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:23Z"} +{"cache_key":"2ce482e209f5de8ec61a9b3c7a287df2841a981d3764b77fdcf48af2a7b85703","segment_id":"help/index.md:24669ff48290c187","source_path":"help/index.md","text_hash":"24669ff48290c1875d8067bbd241e8a55444839747bffb8ab99f3a34ef248436","text":"Doctor","translated":"诊断工具","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:58Z"} +{"cache_key":"2d0888805bfed46ef5b60cd62356c0e806d41c0b9121d293e637f9c246793517","segment_id":"start/wizard.md:f5f5d467d48ef0f0","source_path":"start/wizard.md","text_hash":"f5f5d467d48ef0f0285b3b241da9c210af806de0b975ef0d1c8caa8e43f02aca","text":" to route inbound messages (the wizard can do this).","translated":" 以路由入站消息(向导可以执行此操作)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:03Z"} +{"cache_key":"2d2da52fe8692965c9fb95b555b3aa3e2a2a66b0d5dda886a051d52f1a0ef1e3","segment_id":"index.md:c4b2896a2081395e","source_path":"index.md","text_hash":"c4b2896a2081395e282313d6683f07c81e3339ef8b9d2b5a299ea5b626a0998f","text":").","translated":")。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:09Z"} +{"cache_key":"2d3da03d164952a8c60693fdd97d8be29700340d6eaee19967b24342510d499a","segment_id":"index.md:83f4fc80f6b452f7","source_path":"index.md","text_hash":"83f4fc80f6b452f7cdf426f6b87f08346d7a2d9c74a0fb62815dce2bfddacf63","text":" — A space lobster, probably","translated":" —— 大概是一只太空龙虾说的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:27Z"} +{"cache_key":"2d48b01c4769947be3c3683c4a8f28dd565d2db1936464b4c5d5731a12d79c60","segment_id":"index.md:30f035b33a6c35d5","source_path":"index.md","text_hash":"30f035b33a6c35d51e09f9241c61061355c872f2fb9a82822cd2f5f443fd4ad4","text":"Group Chat Support","translated":"群聊支持","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:41Z"} +{"cache_key":"2d797dc8210ef143472d22214940192b0a9192ba2fbb7c937caed61f06927d9b","segment_id":"index.md:74f99190ef66a7d5","source_path":"index.md","text_hash":"74f99190ef66a7d513049d31bafc76e05f9703f3320bf757fb2693447a48c25b","text":"Linux app","translated":"Linux 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:02Z"} +{"cache_key":"2e074e5ac1705b797a4c77f7b223adcd0ae6a9f96032a837408a8435a639baff","segment_id":"index.md:37ed7c96b16160d4","source_path":"index.md","text_hash":"37ed7c96b16160d491e44676aa09fe625301de9c018ad086e263f59398b8be8a","text":"🎤 ","translated":"🎤 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:53Z"} +{"cache_key":"2e1d0951abfbe4efbae5e5ef595f231d5292c0fcb5b3ee23005ce2b68c1d79ee","segment_id":"help/index.md:0e4ea41f62f3485d","source_path":"help/index.md","text_hash":"0e4ea41f62f3485d38cc0e63e2ccf0b40ee1e32a060b3902767d612fe0823e0e","text":" here:","translated":" 这里:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:32Z"} +{"cache_key":"2e3290e6bc1d3f1822509afccd756cc87e8abd242e0141e0ee64721fdb864f3f","segment_id":"start/getting-started.md:f11e33a27b5b9a1c","source_path":"start/getting-started.md","text_hash":"f11e33a27b5b9a1c3aefd4fc3e37fd3effab8e9378119a2a21d20312adb940a7","text":"CLI onboarding wizard","translated":"CLI 上手引导向导","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:48Z"} +{"cache_key":"2e45b9544e6ff8d717250c9ddcf1e30690e094f474a744dda548b3e297c59cb7","segment_id":"environment.md:8d076464a84995bc","source_path":"environment.md","text_hash":"8d076464a84995bc095e934b0aa1e4419372f27cd71d033571e4dbba201ee5d8","text":"You can reference env vars directly in config string values using ","translated":"你可以在配置的字符串值中直接使用以下方式引用环境变量 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:58Z"} +{"cache_key":"2e681efe18de20b4f07ad32002c6fec86c06e56a12cd30d9c7bdbc9534bb6882","segment_id":"environment.md:frontmatter:summary","source_path":"environment.md:frontmatter:summary","text_hash":"78351223e7068721146d2de022fdf440c2866b2ee02fbbb50bf64369b999820b","text":"Where OpenClaw loads environment variables and the precedence order","translated":"OpenClaw 加载环境变量的位置及优先级顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:44Z"} +{"cache_key":"2ef70367fb9aa09677565cc6176a971e2f70631d568dfe275604a6337f5ab6ad","segment_id":"environment.md:b1d6b91b67c2afa5","source_path":"environment.md","text_hash":"b1d6b91b67c2afa5e322988d9462638d354ddf8a1ef79dba987f815c22b4baee","text":" at ","translated":" 位于 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:32Z"} +{"cache_key":"2f07feeae0f7c7fd42259f8d149e737f19de5e6a5479067a97efdec3042fdd56","segment_id":"start/wizard.md:ca7981b46ecf2c17","source_path":"start/wizard.md","text_hash":"ca7981b46ecf2c1787b6d76d81d9fd7fa0ca95842e2fcc2a452869891a9334d1","text":"Off","translated":"关闭","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:02Z"} +{"cache_key":"2f42896cbef80e422a89e75bb6eff3784602d724b92e704a145d54f389869f2c","segment_id":"start/wizard.md:be297ea5bdb13e65","source_path":"start/wizard.md","text_hash":"be297ea5bdb13e6504ca452403bae1d77358398f376fc59ee9f4e06d566bc3e9","text":" even for loopback so local WS clients must authenticate.","translated":" 即使在回环地址上也使用,以确保本地 WS 客户端必须进行认证。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:03Z"} +{"cache_key":"300af3259f829741d51736865d7bf9f842f81f2138585d92d271370b4fb55164","segment_id":"environment.md:1734069c13c6a5b4","source_path":"environment.md","text_hash":"1734069c13c6a5b4de554e73a650ddce6651688b5771f03df706a836393aea3c","text":" override).","translated":" 覆盖)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:45Z"} +{"cache_key":"30608165f61f3a9ef054a6c564e06dfb89be246127382e61e93c52a93fa2aa9c","segment_id":"start/wizard.md:frontmatter:summary","source_path":"start/wizard.md:frontmatter:summary","text_hash":"37d4cb914a0312f3c0272449b49ff1a5b48ae22e79defb9680df63865bc21ea3","text":"CLI onboarding wizard: guided setup for gateway, workspace, channels, and skills","translated":"CLI 上手引导向导:Gateway、工作区、渠道和技能的引导式设置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:51Z"} +{"cache_key":"30675512d7a61a650d56f0b23e4df35eee0be54824589dfe3cd69ef8055204a3","segment_id":"index.md:66d0f523a379b2de","source_path":"index.md","text_hash":"66d0f523a379b2de6f8d5fba3a817ebc395f7bcaa54cc132ca9dfa665d1e9378","text":"Skills","translated":"技能","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:17Z"} +{"cache_key":"307223a7ef9d756946e976426895e5f1195f544f15a205458dc725b42d4f6ee1","segment_id":"help/index.md:5c94724fa7810fa9","source_path":"help/index.md","text_hash":"5c94724fa7810fa9902e565cf66c5f5a973074f2961fcd3a40bad4ee4aeca5e0","text":"If you want a quick “get unstuck” flow, start here:","translated":"如果你想快速\"解决卡住的问题\",从这里开始:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:27Z"} +{"cache_key":"30a615ba735a73e7d3242363754be6841b011b06bcf0852eb50b1c2fad210ba1","segment_id":"index.md:9c870aa6e5e93270","source_path":"index.md","text_hash":"9c870aa6e5e93270170d5a81277ad3e623afe8d4efd186d3e28f3d2b646d52e6","text":"How it works","translated":"工作原理","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:18Z"} +{"cache_key":"30df5b02209abc9fe6dad8f8edb5d9e1ecc23a3dafd5c4df988491ab87667a35","segment_id":"start/wizard.md:acdd1e734125f341","source_path":"start/wizard.md","text_hash":"acdd1e734125f341604c0efbabdcc4c4b0597e8f6235d66c2445edd1812838c1","text":"Telegram","translated":"Telegram","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:27Z"} +{"cache_key":"314a94405174f8d50e035a204e5843da2f66b97b162a65bf2b933f01abbd59f9","segment_id":"start/wizard.md:e639687221fe4ab0","source_path":"start/wizard.md","text_hash":"e639687221fe4ab0824252705b8c5db6c8ece564b77025b0f6b6a4252abb9f86","text":"Seeds the workspace files needed for the agent bootstrap ritual.","translated":"生成智能体引导启动仪式所需的工作区文件。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:46Z"} +{"cache_key":"314dd665b6543d8aa3e07bfb4411985b9e65d96c9dd2d548df33fb32bd6a7137","segment_id":"start/getting-started.md:5ed525159ebd3715","source_path":"start/getting-started.md","text_hash":"5ed525159ebd371551c1615ae2782e61c74c0ed4149ffd117284ba9523eeda84","text":"1) Install the CLI (recommended)","translated":"1)安装 CLI(推荐)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:46Z"} +{"cache_key":"3160cff1ac3376c86eff02fa191d7effc632679f70ad9d0572805c87e0373938","segment_id":"start/wizard.md:4b57039163eb0a5c","source_path":"start/wizard.md","text_hash":"4b57039163eb0a5c8ee4015d016164636534a01cc8acf14b5ce9d191319954c3","text":" to your config.","translated":" 到您的配置中。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:06Z"} +{"cache_key":"31dec649c828923140b2b30d6a8b2d62591976002370e88c3d3de3ac115cb781","segment_id":"environment.md:45ca56d179d4788c","source_path":"environment.md","text_hash":"45ca56d179d4788c55ba9f7653b376d62e7faa738e92259e3d4f6f5c1b554f28","text":"Related","translated":"相关内容","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:17:10Z"} +{"cache_key":"3243c3ebdcaa9521501483661e48d2fdd966942cb24ea4dcde3d06b713aed8b4","segment_id":"index.md:3c8aa7ad1cfe03c1","source_path":"index.md","text_hash":"3c8aa7ad1cfe03c1cb68d48f0c155903ca49f14c9b5626059d279bffc98a8f4e","text":": connect to the Gateway WebSocket (LAN/tailnet/SSH as needed); legacy TCP bridge is deprecated/removed.","translated":":连接到 Gateway WebSocket(根据需要使用局域网/Tailnet/SSH);旧版 TCP 桥接已弃用/移除。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:52Z"} +{"cache_key":"3251f0f0403513aa1ec086eadd313880a5c01383a210ec45da22d6fa4782490e","segment_id":"index.md:ee8b06871d5e335e","source_path":"index.md","text_hash":"ee8b06871d5e335e6e686f4e2ee9c9e6de5d389ece6636e0b5e654e0d4dd5b7e","text":"Control UI (browser)","translated":"控制界面(浏览器)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:34Z"} +{"cache_key":"3276f34c2339c0658f45d0f009490234b47b5b52b8d90ee1387edff4a69ac8ae","segment_id":"index.md:93c89511a7a5dda3","source_path":"index.md","text_hash":"93c89511a7a5dda3b3f36253d17caee1e31f905813449d475bc6fed1a61f1430","text":"common fixes + troubleshooting","translated":"常见修复 + 故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:56Z"} +{"cache_key":"32a83090da1dc024c2a8cf8f0db8f301764d5bb1a471887273753a86569bd8cf","segment_id":"start/getting-started.md:frontmatter:read_when:1","source_path":"start/getting-started.md:frontmatter:read_when:1","text_hash":"8ffadc75217e7de913dec33459e2fc4726878cf78a1f8f6a6ce9b3b7305efa17","text":"You want the fastest path from install → onboarding → first message","translated":"您希望找到从安装 → 上手引导 → 发送第一条消息的最快路径","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:19Z"} +{"cache_key":"32aaa528f2fdc0ff7d03b917f5957bf4f19d264db511d3a6fcf39564f4c143f1","segment_id":"help/index.md:2adc964c084749b1","source_path":"help/index.md","text_hash":"2adc964c084749b1f2d8aef24030988b667dbda2e38a6a1699556c93e07c1cea","text":"Start here","translated":"从这里开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:38Z"} +{"cache_key":"32f6ccc5f301eef89b0add96d877ba4df42d5d5b8a9cd794abf9f467d5f12d54","segment_id":"help/index.md:8cd501e1124c3047","source_path":"help/index.md","text_hash":"8cd501e1124c30473473c06e536a2d145e2a14a6d7dc1b99028ce818e14442e2","text":"Repairs:","translated":"修复:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:52Z"} +{"cache_key":"3341a2da05aa7a14de4f05127a21a28fff121cd29d0c2dd4fe6bbf663fb59d7d","segment_id":"index.md:66354a1d3225edbf","source_path":"index.md","text_hash":"66354a1d3225edbf01146504d06aaea1242dcf50424054c3001fc6fa2ddece0f","text":"Remote access","translated":"远程访问","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:23Z"} +{"cache_key":"336e0d3df54cefc9b4f845d46763359b00993efe537c84b384ff77a19c5d95e9","segment_id":"start/wizard.md:593b35c1b027b42b","source_path":"start/wizard.md","text_hash":"593b35c1b027b42b1f14fcd3913017dae726062941e8039a72e3af3399f728df","text":"Gateway auth ","translated":"Gateway 认证 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:53Z"} +{"cache_key":"33bc493412fad9ad498a84a301ea34b43f9f34939896f8221f6e095724982543","segment_id":"start/wizard.md:0e3a130e3ae6be30","source_path":"start/wizard.md","text_hash":"0e3a130e3ae6be30792e3eeb94fed964dcceddef27f7e723da02c1d3a3a8df94","text":"Local gateway (loopback)","translated":"本地 Gateway(回环地址)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:45Z"} +{"cache_key":"33e6190920d1a6f91b3914cb673b9488a8bab0364506c16f588e85340bde439c","segment_id":"index.md:63a3abfa879299dd","source_path":"index.md","text_hash":"63a3abfa879299ddcc03558012bfd6075cbd72f7a175b739095bf979700297f7","text":"Multi-instance quickstart (optional):","translated":"多实例快速入门(可选):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:42Z"} +{"cache_key":"34058f497844c4ec778554dcaefe46e1ee1747532d1d13b1d71c9f0ce44c7514","segment_id":"environment.md:d08a8493f686363a","source_path":"environment.md","text_hash":"d08a8493f686363a78b913d45ebfbd87a3768d1c77b70f23b1fdade3c066e481","text":"Shell env import","translated":"Shell 环境导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:18Z"} +{"cache_key":"34086c013763b98b351cdd0b4f0249d6d22e5b03a465b1753e4de88e587c00ab","segment_id":"index.md:36ddb4d3cfcb494f","source_path":"index.md","text_hash":"36ddb4d3cfcb494fb96463d42b35ba923731677cfc9e084af9f25e3f231187d5","text":"💬 ","translated":"💬 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:51Z"} +{"cache_key":"34b531c230116c17ef31fc8a6f8428f6274208c2de206e4cdda99e9a1a9cb042","segment_id":"index.md:8f6fb4eb7f42c0e2","source_path":"index.md","text_hash":"8f6fb4eb7f42c0e245e29e63f5b82cc3ba19852681d1ed9aed291f59cf75ec0e","text":"Security","translated":"安全","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:29Z"} +{"cache_key":"34bfc7d107afffb5c740b7b90a1c6047e44c21fcac52d6b6f4859d91e803c9eb","segment_id":"environment.md:546f47a9170b7f79","source_path":"environment.md","text_hash":"546f47a9170b7f79afe6bb686aecab9c734c8e8a7d2b353d7e507ee932a0c348","text":"Environment variables\n\nOpenClaw pulls environment variables from multiple sources. The rule is ","translated":"环境变量\n\nOpenClaw 从多个来源获取环境变量。规则是 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:53Z"} +{"cache_key":"34e14035ff1a271359d67411ba4926d4dc09453dfd5418ece20924bcbfa96965","segment_id":"environment.md:496aca80e4d8f29f","source_path":"environment.md","text_hash":"496aca80e4d8f29fb8e8cd816c3afb48d3f103970b3a2ee1600c08ca67326dee","text":" block","translated":" 块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:41Z"} +{"cache_key":"34ea3ba7fd58bb28161b7b4359bbcccffec2e9d4dbc54286ca2b0c1730769a8d","segment_id":"environment.md:cdb4ee2aea69cc6a","source_path":"environment.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":".","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:15Z"} +{"cache_key":"35283f721f41d4ee600ccb4bbea1d3385ba23774e7a7790fdd45b6c18600469a","segment_id":"environment.md:d08a8493f686363a","source_path":"environment.md","text_hash":"d08a8493f686363a78b913d45ebfbd87a3768d1c77b70f23b1fdade3c066e481","text":"Shell env import","translated":"Shell 环境导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:49Z"} +{"cache_key":"352defd8fc42d9b060b6cd430d417fc2bd4c12fe53ba446d4a476ad42ccab112","segment_id":"start/wizard.md:0f3a1d92bc3a545d","source_path":"start/wizard.md","text_hash":"0f3a1d92bc3a545d9c34affb3f3116c0cc492f4a1045c05778fc4d4c442b9b96","text":" (plugin): bot token + base URL.","translated":" (插件):机器人令牌 + 基础 URL。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:43Z"} +{"cache_key":"35459952230518c31110b6b5f175abe88b59834c219cab3d71012db683db8121","segment_id":"start/getting-started.md:67b696468610b879","source_path":"start/getting-started.md","text_hash":"67b696468610b879ed7f224dbf6b0861f27e39d20454cb9d7af1ec52d3e5eeaa","text":"Dashboard","translated":"仪表盘","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:39Z"} +{"cache_key":"357d48a4c5e474910bc6ec1bc5ae8587a7e5f0207dd6c9102c7a1442f5696107","segment_id":"environment.md:cf3f9ba035da9f09","source_path":"environment.md","text_hash":"cf3f9ba035da9f09202ba669adca3109148811ef31d484cc2efa1ff50a1621b1","text":" (what the Gateway process already has from the parent shell/daemon).","translated":" (Gateway 进程从父 shell/守护进程中已获取的内容)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:06Z"} +{"cache_key":"364bf5b819ca7701a74bb51b78b68bb812f4e3f3590b3c69afe3efd9b0459c6b","segment_id":"environment.md:d4a67341570f4656","source_path":"environment.md","text_hash":"d4a67341570f4656784c5f8fe1bfb48a738ace57b52544977431d50e2b718099","text":"FAQ: env vars and .env loading","translated":"常见问题:环境变量和 `.env` 加载","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:40Z"} +{"cache_key":"3663f83bba62df5e7cb863e55c86882f54e5d3c7ee21fe4fa3335e3ea53f2d70","segment_id":"index.md:e64d6b29b9d90bba","source_path":"index.md","text_hash":"e64d6b29b9d90bba92ffe2539dc295a75c553684fed0350ee56bfd0aead01662","text":"Multiple gateways","translated":"多网关","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:58Z"} +{"cache_key":"36b17044c786e63bff17024017e7376bbbfab4b3abdcda6216a8ff4155e90b82","segment_id":"index.md:9182ff69cf35cb47","source_path":"index.md","text_hash":"9182ff69cf35cb477c02452600d23b52a49db7bd7c9833a9a8bc1dcd90c25812","text":"Node ≥ 22","translated":"Node ≥ 22","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:57Z"} +{"cache_key":"36ee9ff0bfd7f7a2fed757962b44a70c9130d57288004d2941c4090fe792a044","segment_id":"index.md:30f035b33a6c35d5","source_path":"index.md","text_hash":"30f035b33a6c35d51e09f9241c61061355c872f2fb9a82822cd2f5f443fd4ad4","text":"Group Chat Support","translated":"群聊支持","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:06Z"} +{"cache_key":"36f5535fb346a7e5a8ac7bf97f71b16da9e836aaac6004bc7f2baf2b4f74ee89","segment_id":"start/getting-started.md:f480ffb2979d1888","source_path":"start/getting-started.md","text_hash":"f480ffb2979d188849ef6ddeb7cefe0aec4406a459adc51df4808a3545d7095c","text":" uses ","translated":" 使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:17Z"} +{"cache_key":"3707b96e2e6a68d6b2b2cb1bc408bfdcc00b380bed0febd7847ebf22d0f0a144","segment_id":"start/wizard.md:acd0067e1ce6598b","source_path":"start/wizard.md","text_hash":"acd0067e1ce6598bac4486d7dec30e89e0cb9486eb7a5ab655327f2398d82ee2","text":"Stores it under ","translated":"将其存储在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:01Z"} +{"cache_key":"3720955986bed01c1359c0e548caea0c5440fad4b43365d2fde56fb04a4e0759","segment_id":"start/wizard.md:610b6a1041c9c16b","source_path":"start/wizard.md","text_hash":"610b6a1041c9c16ba409d615ac9fc646e065c13b271889569a0f3cab45fb422b","text":"Signal setup (signal-cli)","translated":"Signal 设置 (signal-cli)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:49Z"} +{"cache_key":"3761d0df7c47bdf9c52491e5e93c6b9b8e7c948074b5925f77582063f787622c","segment_id":"index.md:42bb365211decccb","source_path":"index.md","text_hash":"42bb365211decccb3509f3bf8c4dfcb5ae05fe36dfdedb000cbf44e59e420dc9","text":" — Local imsg CLI integration (macOS)","translated":" —— 本地 imsg CLI 集成(macOS)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:56Z"} +{"cache_key":"3790b7cccef83371cab7a1989734dc2df8216f5cdb52d6e28db0e9e844c5671c","segment_id":"help/index.md:8cd501e1124c3047","source_path":"help/index.md","text_hash":"8cd501e1124c30473473c06e536a2d145e2a14a6d7dc1b99028ce818e14442e2","text":"Repairs:","translated":"修复:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:27Z"} +{"cache_key":"37b110b0b1d718b41a94fb3a9a4f13223dae87e68c5e0f999d287897a386511e","segment_id":"environment.md:cdb4ee2aea69cc6a","source_path":"environment.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":"。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:02Z"} +{"cache_key":"37b7c0541ea6313c43233942e42fd671ee86f3f7a07973e395b38ad0ff8dbc0a","segment_id":"index.md:6b3f22c979b9e6f8","source_path":"index.md","text_hash":"6b3f22c979b9e6f8622031a6b638ec5f730c32de646d013e616078e03f5a6149","text":"iOS node","translated":"iOS 节点","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:55Z"} +{"cache_key":"380da2c38442028181e5e4e1bc68442ff14ff2bcd89177a4c1a3bc96b478155b","segment_id":"index.md:36ddb4d3cfcb494f","source_path":"index.md","text_hash":"36ddb4d3cfcb494fb96463d42b35ba923731677cfc9e084af9f25e3f231187d5","text":"💬 ","translated":"💬 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:49Z"} +{"cache_key":"3861d187be12abb8bb56846e66cdbe56efbfcc8ab9dc5fa49ad7526b34954f7c","segment_id":"help/index.md:729bc562eec2658b","source_path":"help/index.md","text_hash":"729bc562eec2658bd11ffdd522fe5277177dc73e86eaca7baac0b472a4d8f8b2","text":"If you’re looking for conceptual questions (not “something broke”):","translated":"如果你在寻找概念性问题(而非\"出了故障\"):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:47Z"} +{"cache_key":"38b96681367af140e653ee05ec7a261cf0941c0975166b3ac38008c0f1fd218d","segment_id":"help/index.md:71095a6d42f5d9c2","source_path":"help/index.md","text_hash":"71095a6d42f5d9c2464a8e3f231fc53636d4ce0f9356b645d245874162ec07e2","text":"Gateway troubleshooting","translated":"Gateway 故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:19Z"} +{"cache_key":"38ce802888d58badfba21b504c45ae2e126bfa2ff05300da807328abce6bb3ea","segment_id":"environment.md:cf3f9ba035da9f09","source_path":"environment.md","text_hash":"cf3f9ba035da9f09202ba669adca3109148811ef31d484cc2efa1ff50a1621b1","text":" (what the Gateway process already has from the parent shell/daemon).","translated":" (Gateway 进程从父 shell/守护进程中已继承的值)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:02Z"} +{"cache_key":"38e1bd28383c38781623486e59dac26bb496cbacc9e2eda9120b373298a51ff3","segment_id":"index.md:ba5ec51d07a4ac0e","source_path":"index.md","text_hash":"ba5ec51d07a4ac0e951608704431d59a02b21a4e951acc10505a8dc407c501ee","text":")","translated":")","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:11Z"} +{"cache_key":"3916f9bae114afcf8d795dfb5375fa24f3e06a8a118fe2ecbb2915900f6a9f82","segment_id":"index.md:e3209251e20896ec","source_path":"index.md","text_hash":"e3209251e20896ecc60fa4da2817639f317fbb576288a9fc52d11e5030ecc44a","text":"Windows (WSL2)","translated":"Windows (WSL2)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:14Z"} +{"cache_key":"394214a19e461907fb2a1cc918c6f38ae64e4715143377c7a9166d0b985547df","segment_id":"index.md:88d90e2eef3374ce","source_path":"index.md","text_hash":"88d90e2eef3374ce1a7b5e7fbd3b1159364b26a8ceb2493d6e546d4444b03cda","text":"Tailscale","translated":"Tailscale","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:16Z"} +{"cache_key":"3983900aa2122716086238320301d2ccc9ca38cbfbc5fadec4629f48bac4e248","segment_id":"index.md:5928d14b4d45263d","source_path":"index.md","text_hash":"5928d14b4d45263d4964dfd301c84ed2674ca8b4b698c5efeb88fb86076d2bf9","text":"🎮 ","translated":"🎮 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:02Z"} +{"cache_key":"3a153551510fda2c4710a20c9a4cc23057396667a7df9dd6e1abcab82c50b896","segment_id":"environment.md:61115f6649792387","source_path":"environment.md","text_hash":"61115f664979238731a390e84433a818965b7eaf1d38fa5b4b1507c33ef28c91","text":"Precedence (highest → lowest)","translated":"优先级(从高到低)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:04Z"} +{"cache_key":"3a1be3034443bc71b47581e4ea05266f8538eaa0a0fdc3da9bad0ed023893ac7","segment_id":"start/getting-started.md:e93372533f323b2f","source_path":"start/getting-started.md","text_hash":"e93372533f323b2f12783aa3a586135cf421486439c2cdcde47411b78f9839ec","text":"Node ","translated":"Node ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:24Z"} +{"cache_key":"3a3087543c4f5b0648ff7fc2645ae4cf40a2f985a95b29227569f1d421fab438","segment_id":"index.md:19525ac5e5b9c476","source_path":"index.md","text_hash":"19525ac5e5b9c476b36a38c5697063e37e8fe2fae8ef6611f620def69430cf74","text":"Canvas host","translated":"Canvas 主机","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:06Z"} +{"cache_key":"3aa380273cd8edfdd5f5b29a07a527e398f72e5526104fe71ae89a782551ca9e","segment_id":"help/index.md:8ddb7fc8a87904de","source_path":"help/index.md","text_hash":"8ddb7fc8a87904dedc2afc16400fbe4e78582b302e01c30b1319c8a465d04684","text":"Troubleshooting:","translated":"故障排除:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:14Z"} +{"cache_key":"3aa6384989e1547147163565da676d20d7c8194489e7a36036790d562a12ac49","segment_id":"index.md:f3047ab42a6a5bbf","source_path":"index.md","text_hash":"f3047ab42a6a5bbf164106356fa823ecada895064120c4e5a30e1f632741cc5f","text":"Web surfaces","translated":"Web 界面","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:11Z"} +{"cache_key":"3b073a8aca3cde51037eb2b555734543d6c8e5d498f8533174f1eb9496fc894d","segment_id":"environment.md:frontmatter:read_when:1","source_path":"environment.md:frontmatter:read_when:1","text_hash":"a3a2d99a99de98220c8e0296d6f4e4b2a34024916bd2379d1b3b9179c8fae46f","text":"You are debugging missing API keys in the Gateway","translated":"你正在调试 Gateway 中缺失的 API 密钥","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:45Z"} +{"cache_key":"3b0bba02beb661f8e7cf1069121bbd16a281b73b7a5a0c4447beb270d19cfa37","segment_id":"environment.md:b4736422e64c0a36","source_path":"environment.md","text_hash":"b4736422e64c0a369663d1b2d386f1b8f4b31b8936b588e4a54453c61a24e0fd","text":"Process environment","translated":"进程环境","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:20Z"} +{"cache_key":"3b1145589cf333c443556a480ae2d7f03f2014b1e8941d78e2bc2c9c128af7e4","segment_id":"start/wizard.md:c5c46554cb43b7f8","source_path":"start/wizard.md","text_hash":"c5c46554cb43b7f83f3e8fc3be0ad1f0370946ec6e0a19a114d9bab8a127947a","text":"OAuth credentials live in ","translated":"OAuth 凭据存储在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:29Z"} +{"cache_key":"3b357b9dda6a24f40882977ca076c8800b43c2eae6f4cd8cbef8aa0f129fdc06","segment_id":"environment.md:b79606fb3afea5bd","source_path":"environment.md","text_hash":"b79606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910","text":" config","translated":" 配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:59Z"} +{"cache_key":"3b40d9da2852e7fbd97da9ba5dffbd04f5d5c0fc00def960a206e2c94914b245","segment_id":"index.md:8fdfb6437318756c","source_path":"index.md","text_hash":"8fdfb6437318756c950bf2261538f06236e36040986891fa7b43452b987fb9f3","text":" — an AI, probably high on tokens","translated":" — 一个可能被令牌冲昏头脑的 AI","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:47Z"} +{"cache_key":"3b71135c0933181aa6bde7a58dd5a3707209324d5e2168571e948b9b5f2d67e8","segment_id":"index.md:15cd10b29ec14516","source_path":"index.md","text_hash":"15cd10b29ec1451670b80eae4b381e26e84fa8bdb3e8bea90ec943532411b189","text":" (@Hyaxia, ","translated":" (@Hyaxia, ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:44Z"} +{"cache_key":"3b738961b879475be2f5ff57712c2c1bf8bd3060d1cf15dbf5426794d16203b9","segment_id":"start/wizard.md:228b0332ec267772","source_path":"start/wizard.md","text_hash":"228b0332ec267772e57c8b59f1e9e3464839a76a98fc7bf9ba4b9a4509a1d2ff","text":" (defaults) vs ","translated":" (默认设置)与 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:37Z"} +{"cache_key":"3b75f262948cbbb512b4599733ba93e13681e31c930bbdc664ab71e885662b2e","segment_id":"environment.md:77ee4c8d363762a8","source_path":"environment.md","text_hash":"77ee4c8d363762a834617dcf68d6288847eba4544071d9e11e42cf8d08c579d6","text":"Shell env","translated":"Shell 环境","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:34Z"} +{"cache_key":"3b8197284023245c9a413e63d82ca9df26e860990475095d8c3bba3a2ea3cf3c","segment_id":"index.md:2a6b24ad28722034","source_path":"index.md","text_hash":"2a6b24ad287220345e96eb8021fe29d42b0785766c8df658827e7251da2d36dc","text":"Credits","translated":"致谢","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:50Z"} +{"cache_key":"3bb189a0fee15a008f7403303c01b5afa61f2762fbe8f30fb11a0b88c64d50ec","segment_id":"environment.md:668e5590b5bb9990","source_path":"environment.md","text_hash":"668e5590b5bb9990eeb25bf657f7d17281a4c613ee4442036787cd4b2efd22bb","text":"If the config file is missing entirely, step 4 is skipped; shell import still runs if enabled.","translated":"如果配置文件完全缺失,步骤 4 将被跳过;如果已启用,shell 导入仍会运行。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:43Z"} +{"cache_key":"3be0ad5ba6125bd8e82b0ef3fe5ce52ac6e8cc36295f873bb4eeb53295a493d7","segment_id":"environment.md:f6b2ffe1d0d5f521","source_path":"environment.md","text_hash":"f6b2ffe1d0d5f521b76cabc67d6e96da2b1170eef8086d530558e9906a7f092d","text":"Models overview","translated":"模型概览","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:42Z"} +{"cache_key":"3c2f6b5fb86a0b339fef1dce671429b0675d7f6c8e96131c14ae045e330c64ad","segment_id":"index.md:185beb968bd1a81d","source_path":"index.md","text_hash":"185beb968bd1a81d07ebcf82376642f7b29f1b5594b21fe9edee714efbdcaa44","text":"✈️ ","translated":"✈️ ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:55Z"} +{"cache_key":"3c3837312bb9e8d810155bdffa548dbde797f82ff7edf8ac411825656a304c4a","segment_id":"start/wizard.md:6f75d6dfebf55cc4","source_path":"start/wizard.md","text_hash":"6f75d6dfebf55cc4d7cb48ee42a6c6bc47c6bcd606f0dbbc145913b7854d46fd","text":"What it sets:","translated":"它会设置:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:55Z"} +{"cache_key":"3c7d5d086025aacdb08eff6300599c7eb8133d3becbaefcf7fac34ff2d733860","segment_id":"index.md:468886872909c70d","source_path":"index.md","text_hash":"468886872909c70d3bfb4836ec60a6485f4cbbd0f8a0acedbacb9b477f01a251","text":"Workspace templates","translated":"工作区模板","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:46Z"} +{"cache_key":"3c85fd86ca15e8381d7fe82eaffa4dbc27dd63f820415f9a09be673d0847aff8","segment_id":"start/wizard.md:48ced72d53b97892","source_path":"start/wizard.md","text_hash":"48ced72d53b9789268649241dadbca3f8646867df4eef54f7eadac8c1c6cefc0","text":"Reset uses ","translated":"重置使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:24Z"} +{"cache_key":"3ce65ae798c705018325eadd2d993e1a9b4bd37081ac208ecec458bb23cd1ad2","segment_id":"start/wizard.md:bb1547f6c875dff6","source_path":"start/wizard.md","text_hash":"bb1547f6c875dff692cde4cb57350780c86b3129399197067c8b5e0fc5a90df3","text":": no auth configured yet.","translated":":暂不配置认证。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:19Z"} +{"cache_key":"3cf8f452fc7a0bba84fdf6434ebeb287af7b726270c145cf753b4fe8bd082ee2","segment_id":"start/getting-started.md:f2e04e77070557f1","source_path":"start/getting-started.md","text_hash":"f2e04e77070557f154fb52bb7c75bf115d8981374d0dccc6027944b70bc6951b","text":" on the gateway host.\nDocs: ","translated":" (在 Gateway 主机上)。\n文档: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:37Z"} +{"cache_key":"3d1656dbb878ef3bcba5b41e9ed57f4ce9c7f8963181f68a2fe1752a5e2e1c17","segment_id":"index.md:b0d125182029e6c5","source_path":"index.md","text_hash":"b0d125182029e6c500cbcc81011341df77de8fe24d9e80190c32be390c916ec2","text":"🤖 ","translated":"🤖 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:23Z"} +{"cache_key":"3d568ffb6b3b3d75349d653870affc28760361ff6599283374c4c7864f706f2d","segment_id":"index.md:2a6b24ad28722034","source_path":"index.md","text_hash":"2a6b24ad287220345e96eb8021fe29d42b0785766c8df658827e7251da2d36dc","text":"Credits","translated":"致谢","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:27Z"} +{"cache_key":"3d6a0cbc582dcbd551bd16cae84dfe04310466d13179af3d43e3a05493bbe1b4","segment_id":"index.md:10bf8b343a32f7dc","source_path":"index.md","text_hash":"10bf8b343a32f7dc01276fc8ae5cf8082e1b39c61c12d0de8ec9b596e115c981","text":"WebChat","translated":"网页聊天","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:41Z"} +{"cache_key":"3de4148817a3da24501b46c0db8c9432af68e4c926bfbb22af9a5310629c6f3c","segment_id":"index.md:3d8fed7c358b2ccf","source_path":"index.md","text_hash":"3d8fed7c358b2ccf225ee16857a0bb9b950fd414319749e0f6fff58c99fa5f22","text":"Subscription auth","translated":"订阅认证","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:16Z"} +{"cache_key":"3df33562454535183c5399ca80fa7d2817a4a79760aaa5230f128a95d3c78827","segment_id":"environment.md:3fe738a7ee6aaff5","source_path":"environment.md","text_hash":"3fe738a7ee6aaff51f099d9a8314510c99ced6a568eb38c67642cd43bb54eec0","text":" in the current working directory","translated":" 在当前工作目录中","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:32Z"} +{"cache_key":"3df86b9cf5fa329e474cd1383be56b18a77ca9f34aee7679099cf0a67853f799","segment_id":"start/wizard.md:ccc02bfc6371f274","source_path":"start/wizard.md","text_hash":"ccc02bfc6371f2743a3ab2ffd360c100414415a0b4c0f5fe6866820d50a58534","text":"Port, bind, auth mode, tailscale exposure.","translated":"端口、绑定、认证模式、Tailscale 暴露。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:56Z"} +{"cache_key":"3e19ae8f54b98c209753f915d52f542a7891896d7769f2f2e5ff828bfc49a093","segment_id":"start/wizard.md:7cecbbd299f4893d","source_path":"start/wizard.md","text_hash":"7cecbbd299f4893d61d339700773335a412ab1b532b435cd1aa290ab59e6391d","text":"Runtime selection:","translated":"运行时选择:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:30Z"} +{"cache_key":"3e685aee1a7051e665e054c4c774e80e188dc239d3df8193efef4838ae204fa8","segment_id":"environment.md:45ca56d179d4788c","source_path":"environment.md","text_hash":"45ca56d179d4788c55ba9f7653b376d62e7faa738e92259e3d4f6f5c1b554f28","text":"Related","translated":"相关内容","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:36Z"} +{"cache_key":"3e8225ab0a25cbca0c7a00bcb9033a5048108adac44a721f7249845d0925250c","segment_id":"index.md:4eb58187170dc141","source_path":"index.md","text_hash":"4eb58187170dc14198eacb534c8577bef076349c26f2479e1f6a2e31df8eb948","text":" — An AI, probably high on tokens","translated":" —— 一个可能被令牌冲昏头脑的 AI","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:55:04Z"} +{"cache_key":"3ec7dfcb17b352e2f217472e109e171fc287a2ee9197f39225034144554575e9","segment_id":"index.md:1a36bded6916228a","source_path":"index.md","text_hash":"1a36bded6916228a5664c8b2bcdaa5661d342fe3e632aa41453f647a3daa3a61","text":" — Pairs as a node and exposes a Canvas surface","translated":" —— 作为节点配对并暴露 Canvas 界面","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:12Z"} +{"cache_key":"3ecb8e3215b8818241e73a7e7ae26b1e5202a5384c8f99a2a5262d3bf88112e9","segment_id":"start/wizard.md:4fa6e54efd518fc2","source_path":"start/wizard.md","text_hash":"4fa6e54efd518fc2075e98b366621a5236355222198b8eac9efb802d681fcb8b","text":"Moonshot (Kimi K2)","translated":"Moonshot (Kimi K2)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:08Z"} +{"cache_key":"3f05d1942b5a9f6420ad25aea5697d040ea0fbe5470a1eed26a88ce86d2411af","segment_id":"index.md:f0a7f9d068cb7a14","source_path":"index.md","text_hash":"f0a7f9d068cb7a146d0bb89b3703688d690ed0b92734b78bcdb909aace617dbf","text":"WhatsApp group messages","translated":"WhatsApp 群组消息","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:56Z"} +{"cache_key":"3f27b3739c14942d3690e2325aa7381daf6a48d6732f3a116817bcbc3afe9a7e","segment_id":"index.md:36ddb4d3cfcb494f","source_path":"index.md","text_hash":"36ddb4d3cfcb494fb96463d42b35ba923731677cfc9e084af9f25e3f231187d5","text":"💬 ","translated":"💬 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:16Z"} +{"cache_key":"3f7a224f3597d7d8ffcb2fbad1804c6beb71966d8a12feeb601f0607121b1d58","segment_id":"environment.md:cda454f61dfcac70","source_path":"environment.md","text_hash":"cda454f61dfcac7007a9edc538f9f58cf38caa0652e253975979308162bccc53","text":"Gateway configuration","translated":"Gateway 配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:38Z"} +{"cache_key":"4009762bd6b11f2939c149dc1407c26b61e0ce9e64027f643467f2c9166ae069","segment_id":"index.md:ded906ea94d05152","source_path":"index.md","text_hash":"ded906ea94d0515249f0bcab1ba63835b5968c142e9c7ea0cb6925317444d98c","text":"Configuration examples","translated":"配置示例","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:01Z"} +{"cache_key":"4009d09aa8998e8257bb7d745d298f61d59560b852c09e3020f282f5f783755f","segment_id":"environment.md:4ac8551788fee477","source_path":"environment.md","text_hash":"4ac8551788fee477927fdee76e727261e4a655609502f2d6e0f2121b606ed978","text":"Env var substitution in config\n\nYou can reference env vars directly in config string values using ","translated":"配置中的环境变量替换\n\n你可以使用以下方式在配置字符串值中直接引用环境变量 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:58Z"} +{"cache_key":"4009d3c80d649dec28c2565eee518b693691a79c583c891076d67e01740b29f5","segment_id":"index.md:6fa3cbf451b2a1d5","source_path":"index.md","text_hash":"6fa3cbf451b2a1d54159d42c3ea5ab8725b0c8620d831f8c1602676b38ab00e6","text":"Sessions","translated":"会话","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:30Z"} +{"cache_key":"409cb7ef4fb0281a4a1a5cc53af8948139bd4735bddf8b050a93a62498745c6c","segment_id":"start/getting-started.md:0d3a30eb74e2166c","source_path":"start/getting-started.md","text_hash":"0d3a30eb74e2166c1fc51b99b180841f808f384be53fe1392cecb67fdc9363c4","text":" (default ","translated":" (默认 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:19Z"} +{"cache_key":"40e9b8fba7f586d8cd09924e5319af4d3402b2768f2965141866fc0113a5a85a","segment_id":"start/getting-started.md:a930fff865d3a7d8","source_path":"start/getting-started.md","text_hash":"a930fff865d3a7d8c09c82d884ce158733e3cf93f6d43d81c03785aeb15ff970","text":"7) Verify end-to-end","translated":"7)端到端验证","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:55Z"} +{"cache_key":"413b18be7bd7219a7ebe8bf16cc6b2a5151753b15628b92ef08461ee654bd44b","segment_id":"environment.md:6863067eb0a2c749","source_path":"environment.md","text_hash":"6863067eb0a2c7499425c6c189b2c88bac55ca754285a6ab1ef37b75b4cfad4d","text":"See ","translated":"参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:17:03Z"} +{"cache_key":"41768ab6d5c2eeb79122a8d917d38fdc9d8448e4ed992fcb2b7feaa905469dcf","segment_id":"index.md:add4778f9e60899d","source_path":"index.md","text_hash":"add4778f9e60899d7f44218483498c0baf7a0468154bc593a60747ee769c718c","text":"Android node","translated":"Android 节点","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:40Z"} +{"cache_key":"417f7a16c5b26835f5787b2bc94c938dba0e43717380c38007d621ec582c8c21","segment_id":"start/getting-started.md:fc0d3588a29e2b90","source_path":"start/getting-started.md","text_hash":"fc0d3588a29e2b90f3946e210636d98d8ad95cf9e9d615fd975193093d8a17df","text":" (with sane defaults) as quickly as possible.","translated":" (使用合理的默认配置)尽可能快地完成。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:32Z"} +{"cache_key":"418f62c195d775d18091feee2ea101a738425ab091aecd5487195cfedd3ede3f","segment_id":"start/getting-started.md:b8aa19c1dd24f84e","source_path":"start/getting-started.md","text_hash":"b8aa19c1dd24f84eb71288bebd10a4e6007ede5365d9572df511fe428dccb632","text":"macOS menu bar app + voice wake: ","translated":"macOS 菜单栏应用 + 语音唤醒: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:21Z"} +{"cache_key":"41a9cde6dd29d317206f7b9ac006217c8ed29fdfa51d9cdc8b3aa4538ccd4415","segment_id":"start/wizard.md:a2198f472ce2fbee","source_path":"start/wizard.md","text_hash":"a2198f472ce2fbee82a5546090a5dd896b1da3bb678e8963d19eaa03e08ca092","text":"Onboarding","translated":"上手引导","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:49:05Z"} +{"cache_key":"420151a42113aa101a8d753080c801abe7deac20cde27edca350833dba6b9401","segment_id":"index.md:496bcd8a502babde","source_path":"index.md","text_hash":"496bcd8a502babde0470e7105dfed7ba95bbc3193b7c6ba196b3ed0997e84294","text":"Voice notes","translated":"语音消息","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:43Z"} +{"cache_key":"42363d142c5d5a1481ac3bb76aba070baba3e796a68efaac422608091bf9f72f","segment_id":"index.md:bbf8779fd9010043","source_path":"index.md","text_hash":"bbf8779fd9010043ac23a2f89ba34901f3a1f58296539c3177d51a9040ea209d","text":") — Blogwatcher skill","translated":")—— Blogwatcher 技能","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:47Z"} +{"cache_key":"42b861c7e5700483f345ddd4ae743bc47dbd0154e1a83326aae343859604bf6d","segment_id":"start/wizard.md:ecaaafe56fbfdf19","source_path":"start/wizard.md","text_hash":"ecaaafe56fbfdf19c4710b2509350b60bf5bce327e6e621952076da6372df33e","text":"Onboarding Wizard (CLI)","translated":"上手引导向导 (CLI)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:56Z"} +{"cache_key":"42ee1c8c7830b05cc1959ca709737c56bd2f92aff2ccf44de3dc51badc42622f","segment_id":"index.md:32ebb1abcc1c601c","source_path":"index.md","text_hash":"32ebb1abcc1c601ceb9c4e3c4faba0caa5b85bb98c4f1e6612c40faa528a91c9","text":" (","translated":" (","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:15Z"} +{"cache_key":"433cce86c05f0e0152efd90e723b067d686e917fb2054327fbf4ce5c40e30edb","segment_id":"start/wizard.md:13297db73d234731","source_path":"start/wizard.md","text_hash":"13297db73d234731958244575f85555e4aa3ff0aed3b07b5e9d4ea66cb462246","text":" (never ","translated":" (绝不使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:26Z"} +{"cache_key":"434e8917d28683bf448e8aabf49764186bb067e2efe6ff332497cb52f6016ddd","segment_id":"start/getting-started.md:7013af4c42fe4380","source_path":"start/getting-started.md","text_hash":"7013af4c42fe43802a9e8b0affc4f521fcd126160569969fb2ec09e1b7c422b1","text":"Setup","translated":"设置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:10Z"} +{"cache_key":"436e752948ac7b7910f23cae9160a2e4040fb7df0e3c5bfb95398c280e3e3f41","segment_id":"index.md:1a36bded6916228a","source_path":"index.md","text_hash":"1a36bded6916228a5664c8b2bcdaa5661d342fe3e632aa41453f647a3daa3a61","text":" — Pairs as a node and exposes a Canvas surface","translated":" — 作为节点配对并提供 Canvas 界面","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:38Z"} +{"cache_key":"4375f1f048f79fc861b543d3d9c0eedc69b7a772a32d024e3c108d3a9657af00","segment_id":"start/wizard.md:95fcce5e5b146818","source_path":"start/wizard.md","text_hash":"95fcce5e5b146818ba279f6a1ec9b3333532b069ad6e3f709818fb9194198203","text":"Keep / Modify / Reset","translated":"保留 / 修改 / 重置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:07Z"} +{"cache_key":"43cec56f6386efc26fbdda3820971f35c6a6df2c61a3125ef10c41b7a136e622","segment_id":"environment.md:frontmatter:read_when:1","source_path":"environment.md:frontmatter:read_when:1","text_hash":"a3a2d99a99de98220c8e0296d6f4e4b2a34024916bd2379d1b3b9179c8fae46f","text":"You are debugging missing API keys in the Gateway","translated":"你正在调试 Gateway 中缺失的 API 密钥","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:16Z"} +{"cache_key":"444c57554dc319fcc9cbfb96353a6f9c9184b4e1178353c5f92496ac99bf75b7","segment_id":"start/wizard.md:bdd5d35746968e3a","source_path":"start/wizard.md","text_hash":"bdd5d35746968e3ac912679a8a6dcd53117277e63feb28c474e582f2ada39027","text":") for scripts.","translated":")用于脚本。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:54Z"} +{"cache_key":"447176b9f6dcf6f83e411888711e6f57498e9034a0000a9e5e08b8600dfa6dd7","segment_id":"help/index.md:frontmatter:read_when:1","source_path":"help/index.md:frontmatter:read_when:1","text_hash":"857eafc389d179e83e21e46c10527fec40894fe064c63847ba06b946b7d5eb73","text":"Something broke and you want the fastest path to a fix","translated":"出了问题,你想找到最快的修复方法","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:30Z"} +{"cache_key":"45546bd54f25fcf7ebb35e346b789c2b8719664b05396941839eaa13d1181f5b","segment_id":"start/wizard.md:17c51cc78838cf2a","source_path":"start/wizard.md","text_hash":"17c51cc78838cf2af11aab8d6600db56cb50d4956069625db25bed4f15656a76","text":" (bun not recommended).","translated":" (不推荐 bun)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:52Z"} +{"cache_key":"455bca70dc67fd7daf15f2991ae1dde159fbb072397a5222ae919e12c89f6baf","segment_id":"help/index.md:frontmatter:read_when:0","source_path":"help/index.md:frontmatter:read_when:0","text_hash":"ee0615553374970664b58ebd8e5d0ebc9bc8a5f03387671afbfd0096b390aa9b","text":"You’re new and want the “what do I click/run” guide","translated":"你是新手,想要一份\"该点什么/该运行什么\"的操作指南","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:03Z"} +{"cache_key":"46356e773d9a1db34290e9332db52f9febdea4d6a86073399c8e5123a8c85d64","segment_id":"index.md:233cfad76c3aa9dd","source_path":"index.md","text_hash":"233cfad76c3aa9dd5cc0566746af197eac457a88c1e300ae788a8ada7f96b383","text":"From source (development):","translated":"从源码安装(开发):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:35Z"} +{"cache_key":"463a9a24eff5d3e3bd5240375798cafd0b6ddd708cb14e1037df77f591649f17","segment_id":"index.md:96be070791b7d545","source_path":"index.md","text_hash":"96be070791b7d545dc75084e59059d2170eed247350b351db5330fbd947e4be6","text":"👥 ","translated":"👥 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:04Z"} +{"cache_key":"467ace4c6c3c4e0032589ea19c3968e8869d0455ecde033420ea7e300959f288","segment_id":"help/index.md:2adc964c084749b1","source_path":"help/index.md","text_hash":"2adc964c084749b1f2d8aef24030988b667dbda2e38a6a1699556c93e07c1cea","text":"Start here","translated":"从这里开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:37Z"} +{"cache_key":"46bb3d229c815e2177cb4c1493857143b306b58d15abedb7abce66c9c5456f99","segment_id":"start/wizard.md:a9e83abe07e4c277","source_path":"start/wizard.md","text_hash":"a9e83abe07e4c2777f28ac3107308bd9178e7d0449fbf21f2098ebd37f17900e","text":" exposes every step (mode, workspace, gateway, channels, daemon, skills).","translated":" 展示每个步骤(模式、工作区、Gateway、渠道、守护进程、技能)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:09Z"} +{"cache_key":"47add7d7379785e56a63fec4ac7e41913e1c0bb8b25f6e8bb10ccbdae56f993d","segment_id":"start/wizard.md:254bb97b57f12e16","source_path":"start/wizard.md","text_hash":"254bb97b57f12e1608fefc4517de768427b2fd6d2cffbbfcbc09f3c818198d5f","text":"not","translated":"不会","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:39Z"} +{"cache_key":"47b5e5abc15bd0ac60233ab1d3fd967912accfa1934f36be76175302f173c24f","segment_id":"index.md:d53b75d922286041","source_path":"index.md","text_hash":"d53b75d9222860417f783b0829023b450905d982011d35f0e71de8eed93d90fc","text":"New install from zero:","translated":"从零开始全新安装:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:03Z"} +{"cache_key":"47e2cb719ca381b76b3e6b9692535fac0878a4d7dfface5796952396f9dbac0c","segment_id":"environment.md:45ca56d179d4788c","source_path":"environment.md","text_hash":"45ca56d179d4788c55ba9f7653b376d62e7faa738e92259e3d4f6f5c1b554f28","text":"Related","translated":"相关内容","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:49Z"} +{"cache_key":"47eeb5089f41d7da1014dffd88b45418309ad1273076ad53cad090d98d2cab0e","segment_id":"index.md:c7a5e268ddd8545e","source_path":"index.md","text_hash":"c7a5e268ddd8545e5a59a58ef1365189862f802cc7b61d4a3212c70565e2dff1","text":"WhatsApp Integration","translated":"WhatsApp 集成","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:50Z"} +{"cache_key":"48150c58a558cab37782c3ad92d481228e2baf17c9b76c6779b7c0ae19dbc3fa","segment_id":"index.md:e3572f8733529fd3","source_path":"index.md","text_hash":"e3572f8733529fd30a8604d41d624c15f4433df68f40bd092d1ee61f7d8d15e2","text":"Agent bridge","translated":"智能体 桥接","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:00Z"} +{"cache_key":"48483fc19877be4aa74fb6b2db7bb89e26c2c0e369d74946891db59c9fe7e7a6","segment_id":"help/index.md:6201111b83a0cb5b","source_path":"help/index.md","text_hash":"6201111b83a0cb5b0922cb37cc442b9a40e24e3b1ce100a4bb204f4c63fd2ac0","text":" and ","translated":" 和 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:37Z"} +{"cache_key":"4860a152d07b27cce8b414a96db2ae930f930f6c1c92cd682b9138e2a05cd6a5","segment_id":"index.md:a42f01be614f75f1","source_path":"index.md","text_hash":"a42f01be614f75f16278b390094dc43923f0b1b7d8e3209b3f43e356f42ed982","text":"), a single long-running process that owns channel connections and the WebSocket control plane.","translated":"),一个拥有 渠道 连接和 WebSocket 控制平面的单一长期运行进程。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:26Z"} +{"cache_key":"49557226fca3cfad19539dc5025d8556c1fbbc8f281440f95e52b12f86ea9c88","segment_id":"index.md:9bcda844990ec646","source_path":"index.md","text_hash":"9bcda844990ec646b3b6ee63cbdf10f70b0403727dea3b5ab601ca55e3949db9","text":" for node WebViews; see ","translated":" 用于节点 WebView;参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:29Z"} +{"cache_key":"495b27e9a0d8f141e73a810d800212340f9cbde9181f0f2d3fba03b48222976e","segment_id":"start/getting-started.md:b2727b53f573e590","source_path":"start/getting-started.md","text_hash":"b2727b53f573e590241952b2f1c4f4a0654a6c54c5407a1ac4a98c7360808b66","text":"3) Start the Gateway","translated":"3)启动 Gateway","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:47Z"} +{"cache_key":"496b2bcf0dbcf94d1b9bb3678101118c4ea49b1513f09378ba37b8c963882d15","segment_id":"index.md:41ed52921661c7f0","source_path":"index.md","text_hash":"41ed52921661c7f0d68d92511589cc9d7aaeab2b5db49fb27f0be336cbfdb7df","text":"Gateway","translated":"Gateway","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:47Z"} +{"cache_key":"4981d5c52ef98c93d181d87e1c2a1b8f6f862ebdb561c1be294d9137b2bb57b7","segment_id":"environment.md:b4736422e64c0a36","source_path":"environment.md","text_hash":"b4736422e64c0a369663d1b2d386f1b8f4b31b8936b588e4a54453c61a24e0fd","text":"Process environment","translated":"进程环境","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:59Z"} +{"cache_key":"49dba5d103054704ee4f938bc0a88e03d008f4944cb8cbae4a2885436d4740b2","segment_id":"start/wizard.md:c50ee45a8653de1c","source_path":"start/wizard.md","text_hash":"c50ee45a8653de1c4e2b19fb99d694cd339660b20d45c9ad30ee141b6606057e","text":"Gemini example:","translated":"Gemini 示例:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:20Z"} +{"cache_key":"4a98bbd6c4054f0b1a001141baff967905b1b14e1df3098677fc0e4d18ed325e","segment_id":"start/getting-started.md:2a6201c0c58ab546","source_path":"start/getting-started.md","text_hash":"2a6201c0c58ab546acacc4a77ca5dc80df9b0dd17abb7295095a6f17fe009dbe","text":" Brave Search API key for web search. Easiest path:","translated":" Brave Search API 密钥用于网络搜索。最简单的方式:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:31Z"} +{"cache_key":"4af220d89881b4bb625e5c2da4f6f1f1fcf9aa5e03c3d011a1719e95425b74ff","segment_id":"start/getting-started.md:3e86911991b89a88","source_path":"start/getting-started.md","text_hash":"3e86911991b89a88840294cff2374b6c01b6cf699d67a683d93176713ba4ca45","text":"Auth: where it lives (important)","translated":"认证:存储位置(重要)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:28Z"} +{"cache_key":"4bec757cc889c702c6234b140f6cfbd9f5667bc8d4c2ec078d752ca526c9799e","segment_id":"index.md:a42f01be614f75f1","source_path":"index.md","text_hash":"a42f01be614f75f16278b390094dc43923f0b1b7d8e3209b3f43e356f42ed982","text":"), a single long-running process that owns channel connections and the WebSocket control plane.","translated":"),一个拥有 渠道 连接和 WebSocket 控制平面的单一长期运行进程。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:49Z"} +{"cache_key":"4bf4e999ff90d118298d53d27c867bde5d3a64a39602eb35773dcd473ab68055","segment_id":"index.md:eec70d1d47ec5ac0","source_path":"index.md","text_hash":"eec70d1d47ec5ac00f04e59437e7d8b0988984c0cea3dddd81b1a2a10257960b","text":" — DMs + groups via grammY","translated":" — 通过 grammY 支持私信和群组","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:00Z"} +{"cache_key":"4c71126fdff0651fcaa439a12703ba33c43aa85a462fb7e2ad6acee8a8806c39","segment_id":"start/wizard.md:ddbd2d8bfe478133","source_path":"start/wizard.md","text_hash":"ddbd2d8bfe4781330c0adb796efa7fa7dcfb17d1fe9ed4307b023d66d8b8a35b","text":"OpenAI Code (Codex) subscription (OAuth)","translated":"OpenAI Code (Codex) 订阅 (OAuth)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:16Z"} +{"cache_key":"4c7a9d32a1bf7d55704300dc5899e3919b0f6bab738e60b30fc1fd85b58ede3a","segment_id":"start/getting-started.md:6d6dc68f9728c111","source_path":"start/getting-started.md","text_hash":"6d6dc68f9728c11122ce7459d5576d5302c97ec8e74870cb9c77db41f5c6ea0c","text":"Hetzner","translated":"Hetzner","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:41Z"} +{"cache_key":"4c851cab8cf02e3da31b63c083417b0bbd5a3d717405b1b27a0350415de4bd27","segment_id":"index.md:f0b349e90cb60b2f","source_path":"index.md","text_hash":"f0b349e90cb60b2f96222d0be1ff6532185f385f4909a19dd269ea3e9e77a04d","text":" (default); groups are isolated","translated":" (默认);群组是隔离的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:01Z"} +{"cache_key":"4c93f44aa6a225228511440a8cca2a4ace485159eddb0d79727da03e98fefe9a","segment_id":"start/getting-started.md:a39d4188dfd32498","source_path":"start/getting-started.md","text_hash":"a39d4188dfd324984cf06e58ae8585aace52bc88d8a2a1f1e50b6fb1aca38f14","text":") asks the running gateway for a health snapshot.","translated":")向运行中的 Gateway 请求健康快照。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:13Z"} +{"cache_key":"4ccc6938b93e67b302401a1553a3b4331bae277f3b0cfbbd2221b77525949cd4","segment_id":"environment.md:f0442e6e05ccca16","source_path":"environment.md","text_hash":"f0442e6e05ccca160d17de0e7d509891b91b921366b2202b2b5c80435824e140","text":"Two equivalent ways to set inline env vars (both are non-overriding):","translated":"两种等效的内联环境变量设置方式(均为非覆盖模式):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:14Z"} +{"cache_key":"4cd593beb8d08acfb2a74edb256d16cd121e7ebd888e8d0569d819d6342f2d08","segment_id":"index.md:eef0107bb5a4e06b","source_path":"index.md","text_hash":"eef0107bb5a4e06b9de432b9e62bcf1e39ca5dfbbb9cb0cc1c803ca7671c06ab","text":"Gateway runbook","translated":"Gateway 运维手册","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:21Z"} +{"cache_key":"4d021d4ad8d2c4a6fa14ffae3a5273c55c88fa764c804d0ac7eb7877b3fd2e01","segment_id":"help/index.md:d3ef01b4a9c99103","source_path":"help/index.md","text_hash":"d3ef01b4a9c9910364c9b26b2499c8787a0461d2d24ab80376fff736a288b34c","text":"Logging","translated":"日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:50Z"} +{"cache_key":"4d31d3ef5331e6d1f9320391fae45b77e325f6e87ea39857dc34442559cccc01","segment_id":"index.md:0a4a282eda1af348","source_path":"index.md","text_hash":"0a4a282eda1af34874b588bce628b76331fbe907de07b57d39afdedccac2ba14","text":" http://127.0.0.1:18789/ (or http://localhost:18789/)","translated":" http://127.0.0.1:18789/(或 http://localhost:18789/)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:22Z"} +{"cache_key":"4d326b31ff8fc72fd166492afe47b0ae7beb5e3e5bf37baabdd302879d9c1d13","segment_id":"help/index.md:40281c54411735d1","source_path":"help/index.md","text_hash":"40281c54411735d1d2e4ffec7e0efc19ba0503751fa1d7358274b912604d1510","text":" broke”):","translated":" 问题\"):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:03Z"} +{"cache_key":"4daabe9de281d8ebea0b454d9bdc3fdb736a9eb954b51489ad1deb7ed2a4373c","segment_id":"index.md:ceee4f2088b9d5ba","source_path":"index.md","text_hash":"ceee4f2088b9d5ba7d417bac7395003acfbcef576fd4cc1dd3063972f038218a","text":"The name","translated":"名称","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:36Z"} +{"cache_key":"4db63f686185284d522be3518e148ebe548c53eb4626b6f1a02f052a09c301e9","segment_id":"index.md:11d28de5b79e3973","source_path":"index.md","text_hash":"11d28de5b79e3973f6a3e44d08725cdd5852e3e65e2ff188f6708ae9ce776afc","text":"Docs hubs (all pages linked)","translated":"文档中心(所有页面链接)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:15Z"} +{"cache_key":"4dd121c0efe15d606d29bd4960aa7aabaf0e999980bb6270b1088c55c742f415","segment_id":"help/index.md:6cb77499abdccd9a","source_path":"help/index.md","text_hash":"6cb77499abdccd9a2dbb7c93a4d31eed01613dda06302933057970df9ecdeb54","text":"Logs:","translated":"日志:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:26Z"} +{"cache_key":"4de22adc95e4976c28aa9a61533e5641e6fd5b9d045d3767ac21261a2335914c","segment_id":"index.md:9fc31bacba5cb332","source_path":"index.md","text_hash":"9fc31bacba5cb33207804b9e6a8775a3f9521c9a653133fd06e5d14206103e48","text":"Streaming + chunking","translated":"流式传输 + 分块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:34Z"} +{"cache_key":"4e57e45dbeeb2f49d2f090659de7ad8342eedc7be647e92f8c4bc8947b7d85c6","segment_id":"start/getting-started.md:f07ac0638d44dcaa","source_path":"start/getting-started.md","text_hash":"f07ac0638d44dcaa5d24d65ea8205bd487968cdb28c4b8f55a9f35abf86e9b8e","text":"⚠️ ","translated":"⚠️ ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:59Z"} +{"cache_key":"4e7d8b9522fd7341a086f3de5bf4cd653a1d3446e763918236c087c43964aa4f","segment_id":"index.md:c491e0553683a70a","source_path":"index.md","text_hash":"c491e0553683a70a2fb52303f74675d2f7b725814ed70d5167473cb5fbe46450","text":"@steipete","translated":"@steipete","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:31Z"} +{"cache_key":"4e866938d12c4a92f34a54718f3e47f7cdd902f404e3fd33e5f5222e436f9b36","segment_id":"index.md:0d3a30eb74e2166c","source_path":"index.md","text_hash":"0d3a30eb74e2166c1fc51b99b180841f808f384be53fe1392cecb67fdc9363c4","text":" (default ","translated":" (默认 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:59Z"} +{"cache_key":"4ec0b2d188f9f730e3313959319d7b42ee967cdf4f93ad396f47590a16f996d2","segment_id":"start/wizard.md:71375dd64cd1fd1f","source_path":"start/wizard.md","text_hash":"71375dd64cd1fd1fe95d0263198b7d8e200c0705f4f183d7566aaf5e1f00bfc4","text":"Disable auth only if you fully trust every local process.","translated":"仅在您完全信任每个本地进程时才禁用认证。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:06Z"} +{"cache_key":"4f08a9653928ac3ab515e3d4b8ebe742f3dffa74cc24a72a01c96d8fe662140a","segment_id":"start/getting-started.md:e8f6d6288fe468ce","source_path":"start/getting-started.md","text_hash":"e8f6d6288fe468ce32979d08b723300ae13bfaaf0125ad98e9575f34d0135d5d","text":"Goal: go from ","translated":"目标:从 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:23Z"} +{"cache_key":"4f097f10df80b86a3a5591e19d0af1221fb2b938d0357f64ed981c1991f03936","segment_id":"start/wizard.md:f6b7825cb4029a0b","source_path":"start/wizard.md","text_hash":"f6b7825cb4029a0b60d38151752906e4dd2cee98bc62075b9b92745e71b0f3ec","text":" CLI path + DB access.","translated":" CLI 路径 + 数据库访问。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:59Z"} +{"cache_key":"4f238e68dde5c2b45bd0c18fb2483c798be3e0fa8d46bf9c1b7b14b5531d21a3","segment_id":"index.md:c4b2896a2081395e","source_path":"index.md","text_hash":"c4b2896a2081395e282313d6683f07c81e3339ef8b9d2b5a299ea5b626a0998f","text":").","translated":")。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:17Z"} +{"cache_key":"4ff9ae69dc48d779b5eab2d7fd9f54be2f2f31d6a7decf258f13342320f148b3","segment_id":"index.md:fb87b8dba88b3edc","source_path":"index.md","text_hash":"fb87b8dba88b3edced028edfe2efa5f884ab2639c1b26efa290ccd0469454d25","text":"Slash commands","translated":"斜杠命令","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:03Z"} +{"cache_key":"503ffef24b84433cfe5c8d4d7593a419616f5f14136cdb38d5cf1cd06b4a9a0e","segment_id":"index.md:0d517afa83f91ec3","source_path":"index.md","text_hash":"0d517afa83f91ec33ee74f756c400a43b11ad2824719e518f8ca791659679ef4","text":"Web surfaces (Control UI)","translated":"Web 界面(控制界面)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:59Z"} +{"cache_key":"5061a49721ce6c55da1a2514b0fd7683f5ce7d1d74f157660f8bd0bfdfe0bf6e","segment_id":"environment.md:1ec31258a6b45ea9","source_path":"environment.md","text_hash":"1ec31258a6b45ea903cd76f5b0190a99ab56afff6241a04f0681eb12b7a02484","text":"Env var equivalents:","translated":"等效的环境变量:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:55Z"} +{"cache_key":"5069b751d3f01eba9ff4cce578a200affed4e5065ca542d65061b2e2a93b8852","segment_id":"help/index.md:frontmatter:read_when:0","source_path":"help/index.md:frontmatter:read_when:0","text_hash":"ee0615553374970664b58ebd8e5d0ebc9bc8a5f03387671afbfd0096b390aa9b","text":"You’re new and want the “what do I click/run” guide","translated":"你是新手,想要一份\"我该点击/运行什么\"的指南","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:08Z"} +{"cache_key":"509d70fe9cd2a784c14c42ef3d0ca4a5767c2fa6959deb7ed3671b4ec368dfe8","segment_id":"help/index.md:frontmatter:read_when:1","source_path":"help/index.md:frontmatter:read_when:1","text_hash":"857eafc389d179e83e21e46c10527fec40894fe064c63847ba06b946b7d5eb73","text":"Something broke and you want the fastest path to a fix","translated":"出了问题,你想要最快的修复方法","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:18:59Z"} +{"cache_key":"50a84870e2aca4cf2eb629a6742293526dcc33fa7910e6ac417b9a604f50960b","segment_id":"start/wizard.md:822369845cd7506f","source_path":"start/wizard.md","text_hash":"822369845cd7506fbdc11a1e2e1410b3c4d56d1b38ce7e0e3ac68132daa3bc41","text":" (mode, bind, auth, tailscale)","translated":" (模式、绑定、认证、Tailscale)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:39Z"} +{"cache_key":"50b11cd9357a73a81c5f192b9ffe99a8d3c273a366ff83647c224fb21678c414","segment_id":"index.md:ec05222b3777fd7f","source_path":"index.md","text_hash":"ec05222b3777fd7f91a2964132f05e3cfc75777eaeec6f06a9a5c9c34a8fc3e9","text":"Nix mode","translated":"Nix 模式","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:36Z"} +{"cache_key":"50f4e14d41f688eeb460afe9ad362eb37e693b4ed995b45ee5d9bfaf1fab401b","segment_id":"start/getting-started.md:aa9e63906bb59344","source_path":"start/getting-started.md","text_hash":"aa9e63906bb5934462d7a9f29afd4a9562d5366c583706512cb48dce19c847df","text":"Web tools","translated":"网络工具","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:36Z"} +{"cache_key":"50f8833ee612dd2b521fe352a3b7fdf5c623c2ebbf2a839889a5ce67c5c0e461","segment_id":"help/index.md:5c94724fa7810fa9","source_path":"help/index.md","text_hash":"5c94724fa7810fa9902e565cf66c5f5a973074f2961fcd3a40bad4ee4aeca5e0","text":"If you want a quick “get unstuck” flow, start here:","translated":"如果你想要一个快速的\"解决卡点\"流程,从这里开始:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:03Z"} +{"cache_key":"50fd13ae6258975366903d5a2acb0d0b04ce90ba43f94a4d6c7beaca595f7ad2","segment_id":"help/index.md:bfc5930cc2660330","source_path":"help/index.md","text_hash":"bfc5930cc2660330260afd407e98d86adaec0af48dd72b88dc33ef8e9066e2c9","text":"Install sanity (Node/npm/PATH):","translated":"安装健全性检查(Node/npm/PATH):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:39Z"} +{"cache_key":"5101decf1454ab8482f88283cdff28292f81cb8c5b67c60c5540d20e58d322c3","segment_id":"start/wizard.md:32e1de6dc8abca82","source_path":"start/wizard.md","text_hash":"32e1de6dc8abca82d76e0f29f7946d2ee7a92d4966b491162f39ccb8a4dd545b","text":": optional QR login.","translated":":可选二维码登录。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:21Z"} +{"cache_key":"513ac8bfe713d5e2eb46a1c890b9a73bb5fd37a64fbf5ddd1761b54104f0ce75","segment_id":"index.md:25d853ca04397b6a","source_path":"index.md","text_hash":"25d853ca04397b6ae248036d4d029d19d94a4981290387e5c29ef61b0eca9021","text":"Media: audio","translated":"媒体:音频","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:01Z"} +{"cache_key":"5151695b8579a569668c665a07f985e54e47ae59b74de6c35d4eeb91d791b91c","segment_id":"environment.md:87e89abb4c1c551f","source_path":"environment.md","text_hash":"87e89abb4c1c551fe08d355d097f18b8de78edca5f556997085681662fce8eed","text":"Config ","translated":"配置 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:48Z"} +{"cache_key":"5164ecd8153172c108648dc8feef9d627a89b9324d78c60e951e3f1c3af844f2","segment_id":"index.md:bbf8779fd9010043","source_path":"index.md","text_hash":"bbf8779fd9010043ac23a2f89ba34901f3a1f58296539c3177d51a9040ea209d","text":") — Blogwatcher skill","translated":")— Blogwatcher 技能","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:21Z"} +{"cache_key":"5190486a1cf97164d85f07222ca6e274b6674eeda169c17a0eccc3c7be43b044","segment_id":"start/wizard.md:c8e1d64e1512e6b8","source_path":"start/wizard.md","text_hash":"c8e1d64e1512e6b81ad317afe04f71cc8ea0fe457ff607c007e34800a6e8e103","text":" keeps the defaults:","translated":" 保留默认设置:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:43Z"} +{"cache_key":"51c65ff267a63fd40e68e63331750ce27c6e882f309e162d6972e537cabf4072","segment_id":"environment.md:453c14128fbfb5f6","source_path":"environment.md","text_hash":"453c14128fbfb5f6757511557132a1dbb3bcbf243267630bfec49db8518c7780","text":"Env var substitution in config","translated":"配置中的 环境变量 替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:23Z"} +{"cache_key":"51e4a79d50e7b6faf4b5fbce36a1c2dc9d941659190740833308d280cb27a5bb","segment_id":"help/index.md:569ca49f4aaf7846","source_path":"help/index.md","text_hash":"569ca49f4aaf7846e952c1d4aeca72febd0b79fa1c4f9db08fd3127551218572","text":"Install","translated":"安装","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:19Z"} +{"cache_key":"5256dac86be4cff1bbfdd8b43cd74fa2633b518c084db7f691706eedee0e1d77","segment_id":"index.md:6b3f22c979b9e6f8","source_path":"index.md","text_hash":"6b3f22c979b9e6f8622031a6b638ec5f730c32de646d013e616078e03f5a6149","text":"iOS node","translated":"iOS 节点","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:35Z"} +{"cache_key":"525b28d219cb06fdcc377d15a5e9c3f60ba1e1169087c1b9ab43b1efe3a8349d","segment_id":"start/wizard.md:d92f3712b6e72ea2","source_path":"start/wizard.md","text_hash":"d92f3712b6e72ea2bac4e633c85d861d9f300aa323fd76c8781a8f56d8a4c009","text":"(configurable).","translated":"(可配置)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:43Z"} +{"cache_key":"5268570b8d2770d6d5f735117d493a2ea8bd09de727afcf860253c47a704ded3","segment_id":"start/getting-started.md:c2ab5611178d6d90","source_path":"start/getting-started.md","text_hash":"c2ab5611178d6d908636cc22a3aed2cb295c4108fc42f754094d3e67505358a6","text":"Recommended:","translated":"推荐:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:28Z"} +{"cache_key":"526b2832980f55051a3a71d889b1300bbb233cd79e79b885d4e785d9114dba2b","segment_id":"environment.md:d08a8493f686363a","source_path":"environment.md","text_hash":"d08a8493f686363a78b913d45ebfbd87a3768d1c77b70f23b1fdade3c066e481","text":"Shell env import","translated":"Shell 环境导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:12Z"} +{"cache_key":"5275f3af15c7dfcb4b24b60d848e0c9ed11c9e2abf25bc62a2b99a7cab4c7542","segment_id":"index.md:2adc964c084749b1","source_path":"index.md","text_hash":"2adc964c084749b1f2d8aef24030988b667dbda2e38a6a1699556c93e07c1cea","text":"Start here","translated":"从这里开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:03Z"} +{"cache_key":"52aeed244ab712fffb8102660391a13fc4a8f9a479605dd7bcbfa4b355c58834","segment_id":"start/wizard.md:8b1d44c58a75ff49","source_path":"start/wizard.md","text_hash":"8b1d44c58a75ff49adca5363a3cbd3e61bfee0645eddb1496b8a6750129b7bc8","text":"Skills: ","translated":"技能: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:49:15Z"} +{"cache_key":"52ef5bab0c525d962f3d30c6cc5f251916fbadf5e697dc633e2ace0ecbbb42c2","segment_id":"start/wizard.md:d80ef914e27a7691","source_path":"start/wizard.md","text_hash":"d80ef914e27a7691f1ed9989a37a43dfd34cfef90ee4459a627bf718954df4a3","text":": config is auto-written.","translated":":配置会自动写入。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:57Z"} +{"cache_key":"531330c3712e720f0c442c71f862e191045a1b8230f18bd10f68e2319bf22155","segment_id":"index.md:468886872909c70d","source_path":"index.md","text_hash":"468886872909c70d3bfb4836ec60a6485f4cbbd0f8a0acedbacb9b477f01a251","text":"Workspace templates","translated":"工作区模板","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:23Z"} +{"cache_key":"534402481da76bfd10c88a10c6a4910b6e634bdddd9e419a006b283058cff637","segment_id":"environment.md:f0442e6e05ccca16","source_path":"environment.md","text_hash":"f0442e6e05ccca160d17de0e7d509891b91b921366b2202b2b5c80435824e140","text":"Two equivalent ways to set inline env vars (both are non-overriding):","translated":"两种等效的内联环境变量设置方式(均为非覆盖式):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:33Z"} +{"cache_key":"5348f8f12aaa8a00c0f5a88d0cad414c4fe54eaba081f2173b39cbf188125da3","segment_id":"index.md:4eb58187170dc141","source_path":"index.md","text_hash":"4eb58187170dc14198eacb534c8577bef076349c26f2479e1f6a2e31df8eb948","text":" — An AI, probably high on tokens","translated":" — 大概是一个嗑多了 token 的 AI 说的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:09Z"} +{"cache_key":"53513c3f1d1bda6a78f2c08ae26548a59521cc465217abb5716c816e50b3f663","segment_id":"help/index.md:729bc562eec2658b","source_path":"help/index.md","text_hash":"729bc562eec2658bd11ffdd522fe5277177dc73e86eaca7baac0b472a4d8f8b2","text":"If you’re looking for conceptual questions (not “something broke”):","translated":"如果你在寻找概念性问题的答案(而不是\"出了什么问题\"):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:21:39Z"} +{"cache_key":"5360de70878292f462b4ab63b6b2169dbb4bfcdbb0826892292183e82654a749","segment_id":"help/index.md:569ca49f4aaf7846","source_path":"help/index.md","text_hash":"569ca49f4aaf7846e952c1d4aeca72febd0b79fa1c4f9db08fd3127551218572","text":"Install","translated":"安装","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:25Z"} +{"cache_key":"5474cc8e7d4c6f83b601be6d40ebc9282578264e3f75ebf4da637cac7907ed88","segment_id":"index.md:7d8b3819c6a9fb72","source_path":"index.md","text_hash":"7d8b3819c6a9fb726f40c191f606079b473f6f72d4080c13bf3b99063a736187","text":"Ops and safety:","translated":"运维和安全:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:45Z"} +{"cache_key":"549c689e9c5183f7b035a845a929a3bf6f9db58a4887d12d0cb2455f24ac5335","segment_id":"index.md:898e28d91a14b400","source_path":"index.md","text_hash":"898e28d91a14b400e7dc11f9dc861afe9143c18bf9424b1d1b274841615f38b1","text":"If you want to lock it down, start with ","translated":"如果你想进行锁定配置,请从以下内容开始 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:35Z"} +{"cache_key":"54d155bfaa944dfce20caeefa7452e7022732c19d46e7b3c31c6656fdb93f33d","segment_id":"environment.md:32ebb1abcc1c601c","source_path":"environment.md","text_hash":"32ebb1abcc1c601ceb9c4e3c4faba0caa5b85bb98c4f1e6612c40faa528a91c9","text":" (","translated":" (","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:58Z"} +{"cache_key":"550ba8127479edc00f347fd187d45bbfe02ae216e0dbe41b3d6a40db52c003e0","segment_id":"help/index.md:71095a6d42f5d9c2","source_path":"help/index.md","text_hash":"71095a6d42f5d9c2464a8e3f231fc53636d4ce0f9356b645d245874162ec07e2","text":"Gateway troubleshooting","translated":"Gateway 故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:29Z"} +{"cache_key":"557e4752d46bf19af760606c924d355964729b977705da1c324ed0d5488df7c5","segment_id":"environment.md:1ec31258a6b45ea9","source_path":"environment.md","text_hash":"1ec31258a6b45ea903cd76f5b0190a99ab56afff6241a04f0681eb12b7a02484","text":"Env var equivalents:","translated":"等效的环境变量:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:52Z"} +{"cache_key":"5588623b87444ab2f10920e15cae26afa748d33fcaa532d91d6190d720f1c44b","segment_id":"help/index.md:6cb77499abdccd9a","source_path":"help/index.md","text_hash":"6cb77499abdccd9a2dbb7c93a4d31eed01613dda06302933057970df9ecdeb54","text":"Logs:","translated":"日志:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:48Z"} +{"cache_key":"5598b6f2bb72cf8a1238b70f389ac26d5c39189a4b9ad8b76af4cd49eb33a713","segment_id":"start/wizard.md:4410e6ca609a533f","source_path":"start/wizard.md","text_hash":"4410e6ca609a533faee63dec02ec71a5c50e5b97062f0d93369139e0fe1b0d82","text":": optional ","translated":":可选 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:48Z"} +{"cache_key":"55a8e387b1f1138051af732f3f201a7f97a6e0a670aff0a74c5c5b4a509f6434","segment_id":"start/wizard.md:d2089be672953d11","source_path":"start/wizard.md","text_hash":"d2089be672953d1136faa84079af1b6f3967fed8932dabffba3032d30e3c0618","text":"Token","translated":"令牌","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:56Z"} +{"cache_key":"55bccdb299ca0c443fbee7ae8c28a88be0a40e6973b497cd17f15dd048a91558","segment_id":"start/wizard.md:dbd212a8183236f0","source_path":"start/wizard.md","text_hash":"dbd212a8183236f07f7a17afce31b2d18665e319b32dae90af1d04765fe2625d","text":"Config reference: ","translated":"配置参考: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:49:08Z"} +{"cache_key":"56135692918078250894cd24cb873bc5e59b3913ca7c8f70192db42b5c1552a3","segment_id":"index.md:4d4d75c23a2982e1","source_path":"index.md","text_hash":"4d4d75c23a2982e184011f79e62190533f93cdad41ba760046419678fa68d430","text":"Runtime requirement: ","translated":"运行时要求: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:08Z"} +{"cache_key":"562db402fedea0d89bb4b457c0bf0a29473db6c37066eb838cf16cee6491bcb0","segment_id":"index.md:81023dcc765309dd","source_path":"index.md","text_hash":"81023dcc765309dd05af7638f927fd7faa070c58abe7cad33c378aa02db9baa2","text":" (token is required for non-loopback binds).","translated":" (非回环绑定需要令牌)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:47Z"} +{"cache_key":"569404a9b6463e543124c499f821d6ac2f2c24b6ad6a2821e13fdf758bc5ae6e","segment_id":"environment.md:f0442e6e05ccca16","source_path":"environment.md","text_hash":"f0442e6e05ccca160d17de0e7d509891b91b921366b2202b2b5c80435824e140","text":"Two equivalent ways to set inline env vars (both are non-overriding):","translated":"两种等效的方式来设置内联环境变量(两者都是非覆盖的):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:47Z"} +{"cache_key":"56a23cfaebcc81253e55771aec19e4fd69bdd738fccc96d76b27a9229c483aa0","segment_id":"start/wizard.md:7c19f1358e5a91a8","source_path":"start/wizard.md","text_hash":"7c19f1358e5a91a8bf5165c597be85be56510330c5e754af349899104e6dca05","text":": if ","translated":":如果 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:11Z"} +{"cache_key":"56c452948915062308b68b03169a7e032ae1404911a12ac62b0234c408ec18a5","segment_id":"environment.md:61115f6649792387","source_path":"environment.md","text_hash":"61115f664979238731a390e84433a818965b7eaf1d38fa5b4b1507c33ef28c91","text":"Precedence (highest → lowest)","translated":"优先级(从高到低)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:24Z"} +{"cache_key":"56f0053c5e04eb858cff8d23ac7c15f18df295163eca33fcf5481592fe4c9e7e","segment_id":"index.md:11450a0f023dc48c","source_path":"index.md","text_hash":"11450a0f023dc48cc9cef026357e2b4569a2b756290191c45a9eb0120a919cb7","text":" and (for groups) mention rules.","translated":" 以及(针对群组的)提及规则。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:41Z"} +{"cache_key":"570aa7e523634c91d2e5091a861a2656c0af61316e18d9d53d28ff9b1dd32ee3","segment_id":"index.md:bf0e823c81b87c5d","source_path":"index.md","text_hash":"bf0e823c81b87c5de79676155debf20a29b52d6d7eb7e77deda73a56d0afbaaa","text":"🧠 ","translated":"🧠 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:15Z"} +{"cache_key":"576285ac236140f5584a71845cd3ab297a14b96100ac5c8efa39439ea81af132","segment_id":"start/getting-started.md:0b5979b793d7bafc","source_path":"start/getting-started.md","text_hash":"0b5979b793d7bafcae2346d1323747631b04df91cbbdbf878cb9b419233af218","text":"optional background service","translated":"可选的后台服务","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:02Z"} +{"cache_key":"5797b6a21c5b4993623f1b645eada0826ba49d498f93da9e4535b2bc66ecebe3","segment_id":"index.md:2f1626425f985d9a","source_path":"index.md","text_hash":"2f1626425f985d9ad8c124ea8ccb606e404ae5f43c58bd16b6c109d6d2694083","text":"Most operations flow through the ","translated":"大多数操作通过 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:33Z"} +{"cache_key":"57faa67fdf48914b9f543f1f16050dbd5161c7af426c58b0391d519d6506deca","segment_id":"help/index.md:569ca49f4aaf7846","source_path":"help/index.md","text_hash":"569ca49f4aaf7846e952c1d4aeca72febd0b79fa1c4f9db08fd3127551218572","text":"Install","translated":"安装","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:40Z"} +{"cache_key":"580953a19863c3d4f19ed1bfc789c4681bf548a213b44d05890c81e3c183bddc","segment_id":"index.md:e3572f8733529fd3","source_path":"index.md","text_hash":"e3572f8733529fd30a8604d41d624c15f4433df68f40bd092d1ee61f7d8d15e2","text":"Agent bridge","translated":"智能体 桥接","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:26Z"} +{"cache_key":"580e74e39c7246c3298ca172ea6f14364440b964fe9bc6a8d341194037dea02e","segment_id":"start/wizard.md:37e38f71b148eca2","source_path":"start/wizard.md","text_hash":"37e38f71b148eca2086a3c2186d62507e4f8cbb09a54edcb316d651bb1f29557","text":": local ","translated":":本地 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:56Z"} +{"cache_key":"581b9d2ca381a3956cb2c34ee44736e34f2fc8c9c12beacf66c3940034bf38b3","segment_id":"index.md:a97c0f391117ef55","source_path":"index.md","text_hash":"a97c0f391117ef554586ed43255ab3ff0e15adcfc1829c62b6d359672c0bec93","text":" — Mention-based by default; owner can toggle ","translated":" — 默认基于提及触发;所有者可切换 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:33Z"} +{"cache_key":"58518d711b63edb4aa641534a198510edcada769a3213a0a69a4f1c7a11cdc5f","segment_id":"start/wizard.md:7ddb0704314b289e","source_path":"start/wizard.md","text_hash":"7ddb0704314b289e7df028a91980144a09de964e2155c0b1d2b5263996c9bb7a","text":"Vercel AI Gateway","translated":"Vercel AI Gateway","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:53Z"} +{"cache_key":"5854b7c02dc640d3a8eefbdbcfe6257017838bee852fb6459e657c3d25dba670","segment_id":"environment.md:46ab081177a452aa","source_path":"environment.md","text_hash":"46ab081177a452aa62354b581730f4675cb03e58cde8282071da30cabe18fb2e","text":"Optional login-shell import","translated":"可选的登录 shell 导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:34Z"} +{"cache_key":"58685380a9fc556f1364bbc64e7d1471c341cc4b6e23c0f7792b7f1f83b90c0b","segment_id":"start/wizard.md:d3c2c33c63d513d7","source_path":"start/wizard.md","text_hash":"d3c2c33c63d513d77ca245c9b66527155c15adcf3b687fa72b4da67f80ed27b9","text":" exists, choose ","translated":" 存在,请选择 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:03Z"} +{"cache_key":"587a20717b7a463343b0975b76259c80107d7b353e2274384589d2b39f9426e1","segment_id":"start/wizard.md:320754cd5c316bdf","source_path":"start/wizard.md","text_hash":"320754cd5c316bdfec2957a249e26bef7cc1bcd3d7a6668b9378a14704714b40","text":"Wizard attempts to enable lingering via ","translated":"向导会尝试通过 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:19Z"} +{"cache_key":"58b9a1752caf49f80928c56d27ed1a2bc036495ad60d1dae62913fb293b46a55","segment_id":"start/wizard.md:0cfdc51cb2368973","source_path":"start/wizard.md","text_hash":"0cfdc51cb236897362d81cf81a533f21184ce1f5e83afe14713a943593ac3a0f","text":": stores the key for you.","translated":":为您存储密钥。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:46Z"} +{"cache_key":"58ff8f5714b801a09dbe57ef9e43f987926fb18ddfbf06dd710873990251b4c2","segment_id":"index.md:723fad6d27da9393","source_path":"index.md","text_hash":"723fad6d27da939353c65417bbaf646b65903b316eb4456297ff4a1c20811e8d","text":": HTTP file server on ","translated":":HTTP 文件服务器位于 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:57Z"} +{"cache_key":"5962bcb8baac7a5a279ff1ee2c82efe20db4c0c28e1f6244a25aa3de214a48e6","segment_id":"start/getting-started.md:frontmatter:summary","source_path":"start/getting-started.md:frontmatter:summary","text_hash":"f6955d3daff59d2b0a5cdb5731848998bfb3b6b1fa133c8587b5da1137b49dd1","text":"Beginner guide: from zero to first message (wizard, auth, channels, pairing)","translated":"新手指南:从零开始到发送第一条消息(向导、认证、渠道、配对)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:15Z"} +{"cache_key":"5999b798f983aca853bfa20dee21a17340561fab7d1e736475141ee6a6c6c9ef","segment_id":"help/index.md:bfc5930cc2660330","source_path":"help/index.md","text_hash":"bfc5930cc2660330260afd407e98d86adaec0af48dd72b88dc33ef8e9066e2c9","text":"Install sanity (Node/npm/PATH):","translated":"安装完整性检查(Node/npm/PATH):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:40Z"} +{"cache_key":"59c1f2c382072b7399fb13a23472af019ef5e481c697051eeacd4250a633a44a","segment_id":"index.md:76d6f9c532961885","source_path":"index.md","text_hash":"76d6f9c5329618856f133dc695e78f085545ae05fae74228fb1135cba7009fca","text":") — Pi creator, security pen-tester","translated":")— Pi 创作者,安全渗透测试员","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:40Z"} +{"cache_key":"59cd3f5bae0fc6f3c5c68e641d8023b8abc6683a5b46e97eeddd4252f7bd9cf3","segment_id":"index.md:a97c0f391117ef55","source_path":"index.md","text_hash":"a97c0f391117ef554586ed43255ab3ff0e15adcfc1829c62b6d359672c0bec93","text":" — Mention-based by default; owner can toggle ","translated":" —— 默认基于提及触发;所有者可以切换 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:43Z"} +{"cache_key":"5a54b33c72ae9262caf7fb631174cd7ba166e35d90a0fedada04f1341d480d2b","segment_id":"environment.md:907940a35852447a","source_path":"environment.md","text_hash":"907940a35852447aad5f21c5a180d993ff31cfd5807b1352ed0c24eabe183465","text":"never override existing values","translated":"永远不覆盖已有的值","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:53Z"} +{"cache_key":"5a584dcf9fe91e72165672d18b1e4edf88478a25cd6219842c6b26e791f4649f","segment_id":"index.md:9f4d843a5d04e23b","source_path":"index.md","text_hash":"9f4d843a5d04e23b22eb79b3bfa0fbad70ede435ddb5d047e7d77e830efa6019","text":" — Bot token + WebSocket events","translated":" — Bot 令牌 + WebSocket 事件","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:47Z"} +{"cache_key":"5ac64275154111e455f8ad15880f47a2dfd9dc428ac06b485dff574b25771a69","segment_id":"index.md:9dea37e7f1ff0e24","source_path":"index.md","text_hash":"9dea37e7f1ff0e24f7daecf6ea9cc38a58194f11fbeab1d3cfaa3a5645099ef4","text":"Updating / rollback","translated":"更新 / 回滚","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:05Z"} +{"cache_key":"5acb6159e9978fd41ab798d8bdb9d754f75409541ef52fc4f584c82e1d2111b0","segment_id":"help/index.md:5c94724fa7810fa9","source_path":"help/index.md","text_hash":"5c94724fa7810fa9902e565cf66c5f5a973074f2961fcd3a40bad4ee4aeca5e0","text":"If you want a quick “get unstuck” flow, start here:","translated":"如果你想快速\"解决卡住的问题\",从这里开始:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:34Z"} +{"cache_key":"5ad3f65c184c4a08ef211b77a6927634d4ffbb4237d717ea6df811df08f138ec","segment_id":"start/wizard.md:c2912d74db583b26","source_path":"start/wizard.md","text_hash":"c2912d74db583b2672bc6ee18cac65b4f95a547cf5535cf457fd7534981644b1","text":": prompts for ","translated":":提示输入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:35Z"} +{"cache_key":"5af6e45efa085bf05463db83e35c7d337a67597574fe09331f7220925949bba6","segment_id":"help/index.md:frontmatter:read_when:1","source_path":"help/index.md:frontmatter:read_when:1","text_hash":"857eafc389d179e83e21e46c10527fec40894fe064c63847ba06b946b7d5eb73","text":"Something broke and you want the fastest path to a fix","translated":"出了问题,你想找到最快的修复方法","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:21:34Z"} +{"cache_key":"5af8a2aa97675994afa5c5fe3b78418fb9836171d4db6c883e7d26189c199a7e","segment_id":"index.md:4d87941d681ca4e8","source_path":"index.md","text_hash":"4d87941d681ca4e89ca303d033b7d383d3acfbb6d9d9616bd88d7c19cf92c3dd","text":"Pi","translated":"Pi","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:58Z"} +{"cache_key":"5b3300af7348ec2a1e6a63faed5d2d36b21f592dda0270c5431d43adae59b1d1","segment_id":"index.md:6201111b83a0cb5b","source_path":"index.md","text_hash":"6201111b83a0cb5b0922cb37cc442b9a40e24e3b1ce100a4bb204f4c63fd2ac0","text":" and ","translated":" 和 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:13Z"} +{"cache_key":"5b6535c3e3743405e859a5b26d0d96cc35789c5a3c642c76ea81b79386635441","segment_id":"start/wizard.md:b482e45229e19f5f","source_path":"start/wizard.md","text_hash":"b482e45229e19f5f7ba590b5ac81bdb25d5d24116ed961bfa0eb1a23c20a204c","text":" (or ","translated":" (或 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:37Z"} +{"cache_key":"5c1d43ddd497832b75c32dfbaaa644936f42480df0b9630a0974cf6e2f523656","segment_id":"start/wizard.md:8a5edab282632443","source_path":"start/wizard.md","text_hash":"8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1","text":" / ","translated":" / ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:32Z"} +{"cache_key":"5c3c725a47f409c7342bc422f59aeb14d9de2c891fc092f6eda3299a14e1def4","segment_id":"environment.md:ffa63583dfa6706b","source_path":"environment.md","text_hash":"ffa63583dfa6706b87d284b86b0d693a161e4840aad2c5cf6b5d27c3b9621f7d","text":"missing","translated":"缺失的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:49Z"} +{"cache_key":"5c5f7754116c27bc91d76e82699d3d46ae75acf3ebcebfd217d6a8c4667f47be","segment_id":"start/getting-started.md:c16fb1db14572857","source_path":"start/getting-started.md","text_hash":"c16fb1db145728574044899ab5577f464ecd30cd4b297b45b4385ce39dcbab70","text":"If you installed the service during onboarding, the Gateway should already be running:","translated":"如果您在上手引导过程中安装了服务,Gateway 应该已经在运行:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:49Z"} +{"cache_key":"5c775f8101cacd367ff5c7722b3b2c3a5dce43493d19e42aa30282c74ee24a7b","segment_id":"index.md:2b402c90e9b15d9c","source_path":"index.md","text_hash":"2b402c90e9b15d9c3ef65c432c4111108f54ee544cda5424db46f6ac974928e4","text":"🔐 ","translated":"🔐 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:23Z"} +{"cache_key":"5c780db9d3f1b4fef594dae3510c0bf35d432d48acf5889e9d4f4f6e844d46a5","segment_id":"start/getting-started.md:8816c52bc5877a2b","source_path":"start/getting-started.md","text_hash":"8816c52bc5877a2b24e3a2f4ae7313d29cf4eba0ca568a36f2d00616cfe721d0","text":"Wizard","translated":"向导","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:06Z"} +{"cache_key":"5c90f7114b3baa2b4a5d8c980df5c3be37909dda0be1f3318d91f8810181cd50","segment_id":"index.md:37ed7c96b16160d4","source_path":"index.md","text_hash":"37ed7c96b16160d491e44676aa09fe625301de9c018ad086e263f59398b8be8a","text":"🎤 ","translated":"🎤 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:19Z"} +{"cache_key":"5cfd51b6ed282f1ab9449da2a23c095cd4c28c738d56b5e6525e372d0f602907","segment_id":"index.md:cec2be6f871d276b","source_path":"index.md","text_hash":"cec2be6f871d276b45d13e3010c788f01b03ae2f1caca3264bbf759afacace46","text":"Telegram Bot","translated":"Telegram 机器人","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:35Z"} +{"cache_key":"5d5941af110e6856ee1abe848dc7404970d7e151226fe533a22e9a7f936292ea","segment_id":"index.md:88d90e2eef3374ce","source_path":"index.md","text_hash":"88d90e2eef3374ce1a7b5e7fbd3b1159364b26a8ceb2493d6e546d4444b03cda","text":"Tailscale","translated":"Tailscale","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:40Z"} +{"cache_key":"5d83de16c61f5425e1149b23d1001f7ef7ed0028c6f453ce8f74df31fd2a2262","segment_id":"environment.md:f0442e6e05ccca16","source_path":"environment.md","text_hash":"f0442e6e05ccca160d17de0e7d509891b91b921366b2202b2b5c80435824e140","text":"Two equivalent ways to set inline env vars (both are non-overriding):","translated":"两种等效的内联 环境变量 设置方式(均不会覆盖):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:10Z"} +{"cache_key":"5daf1c9089fed361745301c1f4a5ef332e660187481b4a0ee10f384c16d08098","segment_id":"index.md:ab201ddd7ab330d0","source_path":"index.md","text_hash":"ab201ddd7ab330d04be364c0ac14ce68c52073a0ee8d164a98c3034e91ce1848","text":" from the repo.","translated":" 从仓库中执行。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:40Z"} +{"cache_key":"5dbafe2a97e2fd217ed8ae3c96a68526e3aeb0924d460025aaed526821245bc7","segment_id":"index.md:297d5c673f5439aa","source_path":"index.md","text_hash":"297d5c673f5439aa31dca3bbc965cb657a89a643803997257defb3baef870f89","text":"Open the dashboard (local Gateway):","translated":"打开仪表板(本地 Gateway):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:55Z"} +{"cache_key":"5e1da320f32d4ee8aff0094e46c98e584ddfc953913e27eeb950f1a73cdbda40","segment_id":"environment.md:ffa63583dfa6706b","source_path":"environment.md","text_hash":"ffa63583dfa6706b87d284b86b0d693a161e4840aad2c5cf6b5d27c3b9621f7d","text":"missing","translated":"缺失的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:42Z"} +{"cache_key":"5e2c30218fd9868878dbe2c938ebef80fe51f6b4f9e17f12144d1a8349afb7b3","segment_id":"start/wizard.md:2d8879a4fb313aa0","source_path":"start/wizard.md","text_hash":"2d8879a4fb313aa0515b0a575b00f60de6a2369e30129bc31c20ae0c25e538bd","text":" and chat in the browser. Docs: ","translated":" 然后在浏览器中对话。文档: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:09Z"} +{"cache_key":"5e43eebc024e0b75c56a6288f219508bbe17b68fe85f1eca16ec03c1481bc99b","segment_id":"help/index.md:frontmatter:read_when:1","source_path":"help/index.md:frontmatter:read_when:1","text_hash":"857eafc389d179e83e21e46c10527fec40894fe064c63847ba06b946b7d5eb73","text":"Something broke and you want the fastest path to a fix","translated":"遇到故障了,你想找到最快的修复方法","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:14Z"} +{"cache_key":"5e4d7f1b9311d07ef5ce4f39f1e47a953b0916b1a5ca7df4b395179b564796fc","segment_id":"start/getting-started.md:4c3d9aa7ad8a4496","source_path":"start/getting-started.md","text_hash":"4c3d9aa7ad8a449660623429f93ee51afcf8e2d77d7ca16229a19d52262ecab6","text":"Next steps (optional, but great)","translated":"后续步骤(可选,但强烈推荐)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:16Z"} +{"cache_key":"5e58639dd12e22ac1e6e022b66e5c0edfaf2e17279bd951b86047e5ed952b65d","segment_id":"index.md:f1e3b32c8eb0df8e","source_path":"index.md","text_hash":"f1e3b32c8eb0df8ea105f043edf614005742c15581e2cebc5a9c3bafb0b90303","text":"Multi-agent routing","translated":"多 智能体 路由","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:18Z"} +{"cache_key":"5e6f4e17b35988acf25c0cf67edb5bb0267aa378b3a700d43efdf21503475c13","segment_id":"environment.md:f15f5f9f4ef4d668","source_path":"environment.md","text_hash":"f15f5f9f4ef4d6688876c894f8eba251ed1db6eaf2209084028d43c9e76a8ba1","text":" (aka ","translated":" (即 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:34Z"} +{"cache_key":"5e819d45951c185c25d0c543873e913e628e57d81aa0a617e31158890a669e15","segment_id":"help/index.md:5c94724fa7810fa9","source_path":"help/index.md","text_hash":"5c94724fa7810fa9902e565cf66c5f5a973074f2961fcd3a40bad4ee4aeca5e0","text":"If you want a quick “get unstuck” flow, start here:","translated":"如果你想要一个快速的\"快速排障\"流程,请从这里开始:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:18Z"} +{"cache_key":"5e941e344b30824bf659b63b0325cbbc0fe0a2b4a687eff1e79174aa1133b8e8","segment_id":"help/index.md:24669ff48290c187","source_path":"help/index.md","text_hash":"24669ff48290c1875d8067bbd241e8a55444839747bffb8ab99f3a34ef248436","text":"Doctor","translated":"诊断","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:44Z"} +{"cache_key":"5ee69009fd3da1ee495a4d68f7cce4f38b9e39bf9d9e6fca4bd1ddc066a70819","segment_id":"index.md:2566561f81db7a7c","source_path":"index.md","text_hash":"2566561f81db7a7c4adb6cee3e93139155a6b01d52ff0d3d5c11648f46bc79bb","text":"📱 ","translated":"📱 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:24Z"} +{"cache_key":"5eebf79b3ae425984310ea74305f2dfe6ce49f0942b2144044781ecb00b105c9","segment_id":"start/getting-started.md:41884234ba7e0041","source_path":"start/getting-started.md","text_hash":"41884234ba7e0041d39bd06003bd12c5b7811a92b95bb7dbba71bd33b2a1a896","text":"If a token is configured, paste it into the Control UI settings (stored as ","translated":"如果配置了令牌,请将其粘贴到控制界面设置中(存储为 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:55Z"} +{"cache_key":"5eecedb868edab3c718ba04090d4964a74779499d46101c0661259e7f90e4f65","segment_id":"environment.md:frontmatter:summary","source_path":"environment.md:frontmatter:summary","text_hash":"78351223e7068721146d2de022fdf440c2866b2ee02fbbb50bf64369b999820b","text":"Where OpenClaw loads environment variables and the precedence order","translated":"OpenClaw 加载环境变量的位置及优先级顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:21:46Z"} +{"cache_key":"5f10dfed67a40e4e3332100f92b41fe1b3d47e0e6e6bf4bb6385fa478524c38b","segment_id":"index.md:898e28d91a14b400","source_path":"index.md","text_hash":"898e28d91a14b400e7dc11f9dc861afe9143c18bf9424b1d1b274841615f38b1","text":"If you want to lock it down, start with ","translated":"如果你想锁定访问权限,请从以下内容开始 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:39Z"} +{"cache_key":"5f5af7c41d6bd3bdcf3992da945b51ccd3a2d373b7acdfc6afb17d462e38e72b","segment_id":"start/wizard.md:c084c70e0e8978a4","source_path":"start/wizard.md","text_hash":"c084c70e0e8978a4add1624dfb4f3f6ddb9b8d09530122749fe443d68bae6ce0","text":"OpenCode Zen example:","translated":"OpenCode Zen 示例:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:34Z"} +{"cache_key":"5f87ef9c51ba75be8e473df32b40b1fd4a7c3000ad679f5551be4605640d997e","segment_id":"help/index.md:3c33340bd23b8db8","source_path":"help/index.md","text_hash":"3c33340bd23b8db89f18fe7d05a954738c0dd5ba9623cf6bdb7bb5d1a3729cfc","text":"FAQ (concepts)","translated":"常见问题(概念)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:05Z"} +{"cache_key":"5f9b30a629fbd7152505c6cd2a19f6200a808e96198dcce0f0a87efaa862a6ca","segment_id":"start/getting-started.md:6a40edf1fc87a29f","source_path":"start/getting-started.md","text_hash":"6a40edf1fc87a29f243a7eefdbed57d19bfe16ab2e039d7ae1a44c097297e2f3","text":"WhatsApp","translated":"WhatsApp","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:14Z"} +{"cache_key":"600dc3f3ca0e2b1ab03d4449dfd67b69ddc839f9bd15a60ba9e382f875570e53","segment_id":"start/wizard.md:cda454f61dfcac70","source_path":"start/wizard.md","text_hash":"cda454f61dfcac7007a9edc538f9f58cf38caa0652e253975979308162bccc53","text":"Gateway configuration","translated":"Gateway 配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:49:10Z"} +{"cache_key":"604e3fe87674a94bdb57317af8bf1685c73dd5bad1c72ed1570c2f0989c34fb0","segment_id":"index.md:b214cd10585678ca","source_path":"index.md","text_hash":"b214cd10585678ca1250ce1ae1a50ad4001de4577a10e36be396a3409314e442","text":"@badlogicc","translated":"@badlogicc","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:02Z"} +{"cache_key":"605a5c23c689ae3b3531bdda797af578f1b09bf2801b93d2a9956d79651c1d79","segment_id":"environment.md:3bfb78f689d2a990","source_path":"environment.md","text_hash":"3bfb78f689d2a9908d74fb3694eb6284201f276d61c8c83e50b9f258b83ff807","text":"), applied only for missing expected","translated":"),仅在缺少预期","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:19Z"} +{"cache_key":"606008c50996fdd54d71d6dd64dacb4235aea44dd1e4f38bef2dbd70e9bc71b0","segment_id":"start/wizard.md:72e16ab00d3e1b7f","source_path":"start/wizard.md","text_hash":"72e16ab00d3e1b7fe8d1c9127fc3f475192ad16f8c1a7f40e71a18b5541d7315","text":"); it tries without sudo first.","translated":");它会先尝试不使用 sudo。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:27Z"} +{"cache_key":"609cc86f40f9b958987a73b8bf63da515fc2edd851f410e949b9c29c097e3a77","segment_id":"start/wizard.md:aeb8df5ac5b2a23f","source_path":"start/wizard.md","text_hash":"aeb8df5ac5b2a23f4491dec84235080e499723987ce22d246e3a40face0afa55","text":"Vercel AI Gateway (multi-model proxy)","translated":"Vercel AI Gateway(多模型代理)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:48Z"} +{"cache_key":"609f00fe9446aa4a32a1eb8cdb850f7655716d5b18db42ac65dd51c107637f56","segment_id":"index.md:eec70d1d47ec5ac0","source_path":"index.md","text_hash":"eec70d1d47ec5ac00f04e59437e7d8b0988984c0cea3dddd81b1a2a10257960b","text":" — DMs + groups via grammY","translated":" — 通过 grammY 支持私聊和群组","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:37Z"} +{"cache_key":"60b4aabf7487a78610b106bb8bdece56d18d22bc8bc54fa17ebbaffd4d111e1b","segment_id":"start/wizard.md:28513cbd3be49624","source_path":"start/wizard.md","text_hash":"28513cbd3be496244d0e2e1f54d3bc382d466ca58f6b127dd6b5213e36c298b5","text":"If the config is invalid or contains legacy keys, the wizard stops and asks\n you to run ","translated":"如果配置无效或包含遗留键,向导会停止并要求您运行 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:19Z"} +{"cache_key":"60bfa0a92eff33a33728f88b482cb2663dc1e19e6a3dc3023021e231ee0a89db","segment_id":"index.md:3c8aa7ad1cfe03c1","source_path":"index.md","text_hash":"3c8aa7ad1cfe03c1cb68d48f0c155903ca49f14c9b5626059d279bffc98a8f4e","text":": connect to the Gateway WebSocket (LAN/tailnet/SSH as needed); legacy TCP bridge is deprecated/removed.","translated":":连接到 Gateway WebSocket(根据需要使用 LAN/tailnet/SSH);旧版 TCP 桥接已弃用/移除。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:16Z"} +{"cache_key":"60c75897f641a043a33c9a88656df4a3dc1cce376a938c3b6df6b981339df50c","segment_id":"start/getting-started.md:5f0802429b8d0ea9","source_path":"start/getting-started.md","text_hash":"5f0802429b8d0ea99aec0b3456fac2d5721bbddd7ca4edeb47bb71a2a6619e63","text":"Discord: ","translated":"Discord: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:24Z"} +{"cache_key":"60cd1a8fee21c221c625fe6961c620592e9f99a88910d9f557d86f92e17d793c","segment_id":"start/wizard.md:1d6bc09c9a9a3dad","source_path":"start/wizard.md","text_hash":"1d6bc09c9a9a3dad8fcbe9ed89a206b2dba3d8cf16046315aee976577d534cae","text":"Downloads the appropriate release asset.","translated":"下载相应的发布资源。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:59Z"} +{"cache_key":"60f998f050fe63afd0938f40b2f1cf78a16d5dd9fa6abc631aa8e217ce1e7cc5","segment_id":"index.md:053bc65874ad6098","source_path":"index.md","text_hash":"053bc65874ad6098e58c41c57b378a2f36b0220e5e0b46722245e6c2f796818c","text":"Discord","translated":"Discord","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:15Z"} +{"cache_key":"61277a40a0e409e2f324452a28cc35c44e1ac080b4400e7bdaa3c161ce51d545","segment_id":"start/wizard.md:3fcf806de5c2ace5","source_path":"start/wizard.md","text_hash":"3fcf806de5c2ace5327f65078cfb2139aaa8dd33ffdc3b04e9fef6f11778423c","text":"MiniMax M2.1","translated":"MiniMax M2.1","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:55Z"} +{"cache_key":"613744b9849b1cacbbcdcebd3fcb2637696f177d0364b9e32042a74bf2c1b350","segment_id":"index.md:80fc402133201fbe","source_path":"index.md","text_hash":"80fc402133201fbe0e4e9962a9570e741856aa8b0c033f1a20a9bcb06c68e809","text":"Discovery","translated":"发现","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:20Z"} +{"cache_key":"613d01b2aa6e9a9127f428233d5f88e84e2c86b5079776f57becfe4143f86992","segment_id":"start/wizard.md:3ccbb3a92014470f","source_path":"start/wizard.md","text_hash":"3ccbb3a92014470f73c71c81684da45b1e07ee3a49cca372ec678ce89229ea58","text":"Vercel AI Gateway example:","translated":"Vercel AI Gateway 示例:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:26Z"} +{"cache_key":"614a1ff5ae5f98f2f46f1ee6bbb53ace3482d9d15a8842906f26dcbad10c4d71","segment_id":"index.md:084514e91f37c3ce","source_path":"index.md","text_hash":"084514e91f37c3ce85360e26c70b77fdc95f0d3551ce309db96fbcf956a53b01","text":"Dashboard (browser Control UI)","translated":"仪表板(浏览器控制界面)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:30Z"} +{"cache_key":"619f1d68210cd4f4763a855771ec7e821343568b465996ee365552e40ecaadc4","segment_id":"index.md:da22b9d6584e1d8a","source_path":"index.md","text_hash":"da22b9d6584e1d8aa709165be214e0f9bdf2be428816e9ce1c4506bf86218cb4","text":"Core Contributors","translated":"核心贡献者","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:47Z"} +{"cache_key":"61f5af5889e4b2f0a5990d65fdd5b3fdc94d5fd178ef4d80c9cb134a37745cd5","segment_id":"index.md:4818a3f84331b702","source_path":"index.md","text_hash":"4818a3f84331b702815c94b4402067e09e9e2d27ebc1a79258df8315f2c8600b","text":"📎 ","translated":"📎 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:13Z"} +{"cache_key":"6261f859049427393c85f0f32d3db92e9fd57735f4855522a37fb535f791a35a","segment_id":"environment.md:frontmatter:read_when:0","source_path":"environment.md:frontmatter:read_when:0","text_hash":"90fc0487bff88009979cff1061c1a882df8c3b1baa9c43538331d9d5dab15479","text":"You need to know which env vars are loaded, and in what order","translated":"你需要了解哪些环境变量会被加载,以及它们的加载顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:44Z"} +{"cache_key":"62631b9bcaa4b5c5f2603b93e0f658180f8b3f6c897506e90a26feab650f09b8","segment_id":"index.md:3f8466cd9cb153d0","source_path":"index.md","text_hash":"3f8466cd9cb153d0c78a88f6a209e2206992db28c6dab45424132dc187974e2b","text":"Note: legacy Claude/Codex/Gemini/Opencode paths have been removed; Pi is the only coding-agent path.","translated":"注意:旧版 Claude/Codex/Gemini/Opencode 路径已被移除;Pi 是唯一的编程 智能体 路径。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:46Z"} +{"cache_key":"627572a4323c2872b6db51c5d819b4213c571df88da85e170f85d77f96eb55d8","segment_id":"index.md:81023dcc765309dd","source_path":"index.md","text_hash":"81023dcc765309dd05af7638f927fd7faa070c58abe7cad33c378aa02db9baa2","text":" (token is required for non-loopback binds).","translated":" (非回环绑定需要令牌)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:10Z"} +{"cache_key":"62bd68ff9cbf96b3905a12162b9474b1284e8e16101d63a711144fd5a7c311cc","segment_id":"help/index.md:8cd501e1124c3047","source_path":"help/index.md","text_hash":"8cd501e1124c30473473c06e536a2d145e2a14a6d7dc1b99028ce818e14442e2","text":"Repairs:","translated":"修复:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:42Z"} +{"cache_key":"62eab355a91a29c11800cfb1fa5d04f8a626123e8f9e9b12bb46a42fee12b00d","segment_id":"environment.md:f7e239a42b7cd986","source_path":"environment.md","text_hash":"f7e239a42b7cd986a1558fed234e975ed2e96e9d37cf0a93f381778c461c89dd","text":"OpenClaw pulls environment variables from multiple sources. The rule is ","translated":"OpenClaw 从多个来源获取环境变量。规则是 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:51Z"} +{"cache_key":"633b27d62b9c0884576b289c4417f9e9caf3a669d9743346c3713e6df7135d9d","segment_id":"start/getting-started.md:d6053f5f95b19aef","source_path":"start/getting-started.md","text_hash":"d6053f5f95b19aef2ba01e965f8caaf95fd2746c1965b907a7f8c0083680351d","text":"Wizard doc: ","translated":"向导文档: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:26Z"} +{"cache_key":"63707c20cc5a0d1176ffd1db451cc4c84b2168e4ec534e052a7a0906e97abeb7","segment_id":"environment.md:ffa63583dfa6706b","source_path":"environment.md","text_hash":"ffa63583dfa6706b87d284b86b0d693a161e4840aad2c5cf6b5d27c3b9621f7d","text":"missing","translated":"缺失的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:51Z"} +{"cache_key":"63a4d4ad29115c6bce10a5f64dad28c623d7d4c7b9e7c78d6281496a1e2f3d34","segment_id":"environment.md:28b1103adde15a9d","source_path":"environment.md","text_hash":"28b1103adde15a9ddd8fc71f0c57dc155395ade46a0564865ccb5135b01c99b7","text":"OpenClaw pulls environment variables from multiple sources. The rule is **never override existing values**.","translated":"OpenClaw 从多个来源拉取环境变量。规则是**永远不覆盖已有的值**。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:39Z"} +{"cache_key":"63aa81c04f67fe845a1309e5882381f68dcf88a5cbba1ebe971adb247324ff2d","segment_id":"help/index.md:cad44fbae951d379","source_path":"help/index.md","text_hash":"cad44fbae951d3791565b0cee788c01c3bd10e0176167acb691b8dba0f7895f8","text":"Gateway logging","translated":"Gateway 日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:52Z"} +{"cache_key":"63d76859e8f7dbf46bffcdaf3a95db6646334012c91a4d543fdf67f5e2c95e1a","segment_id":"index.md:4d4d75c23a2982e1","source_path":"index.md","text_hash":"4d4d75c23a2982e184011f79e62190533f93cdad41ba760046419678fa68d430","text":"Runtime requirement: ","translated":"运行时要求: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:53Z"} +{"cache_key":"63da7e7d14afa27ec40108c6b4b12db69d8f34c281095027a0939c0191ac77d6","segment_id":"start/wizard.md:c127ea338fd00fac","source_path":"start/wizard.md","text_hash":"c127ea338fd00fac2629a67910d8cbeade17990294fede336b54298e9b13a40c","text":"Telegram + WhatsApp DMs default to ","translated":"Telegram + WhatsApp 私信默认为 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:04Z"} +{"cache_key":"63edf6f6952fda49b0c75bad9c622396999c6b488d33644d8098f6346a1b2a17","segment_id":"start/getting-started.md:d7b4edd9ca795c46","source_path":"start/getting-started.md","text_hash":"d7b4edd9ca795c469606230849212eb080f0591477cff35400f276649d3910a9","text":" shows “no auth configured”, go back to the wizard and set OAuth/key auth — the agent won’t be able to respond without it.","translated":" 显示\"未配置认证\",请返回向导设置 OAuth/密钥认证——智能体在没有认证的情况下将无法响应。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:04Z"} +{"cache_key":"64412b08e5674ea41e50286a0e96cecf117837ff2738c6ff030b0949cfb72990","segment_id":"index.md:0a4a282eda1af348","source_path":"index.md","text_hash":"0a4a282eda1af34874b588bce628b76331fbe907de07b57d39afdedccac2ba14","text":" http://127.0.0.1:18789/ (or http://localhost:18789/)","translated":" http://127.0.0.1:18789/(或 http://localhost:18789/)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:58Z"} +{"cache_key":"644dafc0cc5f8edf1a480b2645ce841416abfc28022f45d45aed1ace6e2f8e0a","segment_id":"start/getting-started.md:eea56a0072aa60af","source_path":"start/getting-started.md","text_hash":"eea56a0072aa60afb5d46c629647ded6ff689e0f44e5725c90788fd103a509fa","text":" is the best pasteable, read-only debug report.\nHealth probes: ","translated":" 是最佳的可粘贴只读调试报告。\n健康探针: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:09Z"} +{"cache_key":"649d0c8a8010fa282e9856eafb02cc5527e7227c27b3c2dfe4eaa9713feb6a05","segment_id":"environment.md:0f18d564547eb32a","source_path":"environment.md","text_hash":"0f18d564547eb32aed995d190644ce9605af6b501b582d871359ebcd4fa51f66","text":" for full","translated":" 了解完整","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:47:09Z"} +{"cache_key":"64cf4d8cfd9d6b5409d1cff5433fe8065140174f76482589a8fb0e49fbdf3fee","segment_id":"start/wizard.md:f3e485ab2f76c031","source_path":"start/wizard.md","text_hash":"f3e485ab2f76c031c52bd164935ed8cac883a7aadf24bdf4fd09e484603968c0","text":"Anthropic OAuth (Claude Code CLI)","translated":"Anthropic OAuth (Claude Code CLI)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:55Z"} +{"cache_key":"64d70118440cf15f1338e65f651e5974d1a46e5c7a82edadd6ec50d965818d6d","segment_id":"start/wizard.md:f9225188070a558a","source_path":"start/wizard.md","text_hash":"f9225188070a558a048f29723fbee7dedb56bdc8f3e8caf0517b063bcc309c16","text":" walks you through:","translated":" 引导您完成:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:16Z"} +{"cache_key":"65168a9f26b2e2f8956203b7db6e482a46a9e40ffda04423b3ad3da71e0e1f5e","segment_id":"index.md:f12242785ecda793","source_path":"index.md","text_hash":"f12242785ecda7935ded50cd48418357d32d3bac290f7a199bc9f0c7fbd13123","text":") — Location parsing (Telegram + WhatsApp)","translated":")— 位置解析(Telegram + WhatsApp)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:02Z"} +{"cache_key":"65234bc3c31a162f6a66e59fb06d36ff735b520d4b8aad7c6f24230f5d0ec345","segment_id":"index.md:6638cf2301d3109d","source_path":"index.md","text_hash":"6638cf2301d3109da66a44ee3506fbd35b29773fa4ca33ff35eb838c21609e19","text":"Features (high level)","translated":"功能(概述)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:22Z"} +{"cache_key":"65a3efc02834181b87543fe4787306b30aed7810e28d100617fe8ba5465b15dc","segment_id":"help/index.md:frontmatter:summary","source_path":"help/index.md:frontmatter:summary","text_hash":"aece82a2d540ab1a9a21c7b038127cae6e9db2149491564bb1856b6f8999f205","text":"Help hub: common fixes, install sanity, and where to look when something breaks","translated":"帮助中心:常见修复方法、安装完整性检查,以及出现问题时的排查方向","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:00Z"} +{"cache_key":"65ab4527cf40950eae093485da13531121309a7404aabda07b243ec350c17d62","segment_id":"index.md:7e2735e5df8f4e9f","source_path":"index.md","text_hash":"7e2735e5df8f4e9f006d10e079fe8045612aa662b02a9d1948081d1173798dec","text":"MIT — Free as a lobster in the ocean 🦞","translated":"MIT — 像海洋中的龙虾一样自由 🦞","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:51Z"} +{"cache_key":"65d8ee3af16e324a3478a3d1f4e54621fb52f93e2508b55e9e9e991562425a84","segment_id":"index.md:37ed7c96b16160d4","source_path":"index.md","text_hash":"37ed7c96b16160d491e44676aa09fe625301de9c018ad086e263f59398b8be8a","text":"🎤 ","translated":"🎤 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:41Z"} +{"cache_key":"65e123a5806897466856108c21b4b513c5975eae6575984c019adafbb796a36d","segment_id":"start/wizard.md:b1ff7bd17092d95e","source_path":"start/wizard.md","text_hash":"b1ff7bd17092d95ea7811719ce3df6d79b0c3a576695636fc411f2d95dc908b2","text":"Mattermost","translated":"Mattermost","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:40Z"} +{"cache_key":"65e76ddd96b75b84f98d4165a471f8fcf85255313b695d5718400e8d5c87aada","segment_id":"index.md:d372b90f0ccffad0","source_path":"index.md","text_hash":"d372b90f0ccffad0ae6e3df3c3aaeccd7a17eb59b4bc492a5469dc05ac3629ec","text":", OpenClaw uses the bundled Pi binary in RPC mode with per-sender sessions.","translated":",OpenClaw 将使用内置的 Pi 二进制文件以 RPC 模式运行,并采用按发送者区分的会话。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:37Z"} +{"cache_key":"661b1fde84d92d603e939aea97a699f0c3d13d8ef1cf06240cdcf4086ea99e9a","segment_id":"start/getting-started.md:d087dd8116e1ea75","source_path":"start/getting-started.md","text_hash":"d087dd8116e1ea751e94c787e0c856f9fb51528528551b60ef7c610f12439120","text":"Telegram: ","translated":"Telegram: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:21Z"} +{"cache_key":"6689e918af1f418c89cbfd79e956dccccd85d3f2c0d7d08ca42674bb5fb46837","segment_id":"index.md:b79cac926e0b2e34","source_path":"index.md","text_hash":"b79cac926e0b2e347e72cc91d5174037c9e17ae7733fd7bdb570f71b10cd7bfc","text":"Help","translated":"帮助","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:50Z"} +{"cache_key":"669bd1fca3c6f7a5810302de54fcba2375123e94dfe30b61bbbb0df0b365b558","segment_id":"start/wizard.md:dcae3eda386cc9bb","source_path":"start/wizard.md","text_hash":"dcae3eda386cc9bbc068aaf01dc3a2543abb6d0504e176138ad4fbc4087767b5","text":" if present or prompts for a key, then saves it for daemon use.","translated":" (如果存在)或提示输入密钥,然后保存供守护进程使用。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:52Z"} +{"cache_key":"66c7246d1b6097539541673d8d9c8153a54d4fdb537ad31be453e514fb3754b9","segment_id":"index.md:f0d82ba647b4a33d","source_path":"index.md","text_hash":"f0d82ba647b4a33da3008927253f9bed21e380f54eab0608b1136de4cbff1286","text":"OpenClaw bridges WhatsApp (via WhatsApp Web / Baileys), Telegram (Bot API / grammY), Discord (Bot API / channels.discord.js), and iMessage (imsg CLI) to coding agents like ","translated":"OpenClaw 将 WhatsApp(通过 WhatsApp Web / Baileys)、Telegram(Bot API / grammY)、Discord(Bot API / channels.discord.js)和 iMessage(imsg CLI)桥接至编程智能体,例如 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:27:55Z"} +{"cache_key":"66cb3d6e2c27c1ee009c0531751f45f9927e2b3d09a4702546a67a9275ee5c49","segment_id":"environment.md:a806a90c34d867e4","source_path":"environment.md","text_hash":"a806a90c34d867e4445dda95ff64422e0b9a527d8fdd03490f255cddbeb84fdb","text":"Env var","translated":"环境变量","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:48Z"} +{"cache_key":"66d9604676a679978159598a722db6d8c4c96e082051763e3b1d5f47576894e2","segment_id":"environment.md:ab5aec4424cf678d","source_path":"environment.md","text_hash":"ab5aec4424cf678dcfb1ad3d2c2929c1e0b2b1ff61b82b961ada48ad033367b4","text":" (dotenv default; does not override).","translated":" (dotenv 默认行为;不覆盖)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:27Z"} +{"cache_key":"66e16e494883bd6fd041d66e577243e277a362ce785db530887996c9c14b93a9","segment_id":"start/wizard.md:frontmatter:read_when:1","source_path":"start/wizard.md:frontmatter:read_when:1","text_hash":"9bd20424220aa1c64181f1dce46bd8fe5d63d8cd8544f5a1cbaddb1030ad108b","text":"Setting up a new machine","translated":"设置新机器","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:55Z"} +{"cache_key":"66f6fd3c85fe2be6d76b21dae8ef66bb76ee3ebd3d92291e61abee595aa0e39d","segment_id":"index.md:66354a1d3225edbf","source_path":"index.md","text_hash":"66354a1d3225edbf01146504d06aaea1242dcf50424054c3001fc6fa2ddece0f","text":"Remote access","translated":"远程访问","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:18Z"} +{"cache_key":"672567848acf9fed5207cc54f76e9d0bffe7cbbd85569cbe74fc4a01e703b1ff","segment_id":"index.md:ab201ddd7ab330d0","source_path":"index.md","text_hash":"ab201ddd7ab330d04be364c0ac14ce68c52073a0ee8d164a98c3034e91ce1848","text":" from the repo.","translated":" 从仓库中执行。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:12Z"} +{"cache_key":"67355c084d419c2ec0eddd93cd1bf67b68218e2c141a65ebcdd96022e1a446df","segment_id":"environment.md:0ec3a996c8167512","source_path":"environment.md","text_hash":"0ec3a996c81675128a64349203e6af81e6d257ceb3124b120e0b894b26024680","text":" (dotenv default; does not","translated":" (dotenv 默认;不会","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:43Z"} +{"cache_key":"673925efd6296fa4423b6a1607689bebb6f61f0f1273c1ebc52daa1b44eb43b5","segment_id":"index.md:8816c52bc5877a2b","source_path":"index.md","text_hash":"8816c52bc5877a2b24e3a2f4ae7313d29cf4eba0ca568a36f2d00616cfe721d0","text":"Wizard","translated":"向导","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:08Z"} +{"cache_key":"675e8725187ebc4c5ee0560ddc38667c783d61c37a69680ea73fb1ca832690d1","segment_id":"index.md:65fd6e65268ff905","source_path":"index.md","text_hash":"65fd6e65268ff9057a49d832cccfcd5a376e46a908a2129be5b43f945fa8d8ca","text":": Gateway WS defaults to ","translated":":Gateway WS 默认监听 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:50Z"} +{"cache_key":"67688daae57335b03c42a3b327f5dc0a54f849238f4d03b3b6e113d76e3c21b0","segment_id":"index.md:11d28de5b79e3973","source_path":"index.md","text_hash":"11d28de5b79e3973f6a3e44d08725cdd5852e3e65e2ff188f6708ae9ce776afc","text":"Docs hubs (all pages linked)","translated":"文档中心(所有页面链接)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:47Z"} +{"cache_key":"678ce4ebc70142dc95d2df24b30a8f49ed54750c7cbdee7128254851be4d33f6","segment_id":"start/wizard.md:e9643f092e1f762c","source_path":"start/wizard.md","text_hash":"e9643f092e1f762c9a7e15bf5429a6c0081c210e464e56a3a35830834a9d4d59","text":"To add more isolated agents (separate workspace + sessions + auth), use:","translated":"要添加更多隔离的智能体(独立的工作区 + 会话 + 认证),请使用:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:43Z"} +{"cache_key":"67bfbb214f6fd84279273d721c587d520c889b48409a1123879c6d79522f7558","segment_id":"start/wizard.md:47eea376ece81e4b","source_path":"start/wizard.md","text_hash":"47eea376ece81e4bb17a281eabb2ddc5aa0458acd4c91a43f576f337ef5ee175","text":" wipe anything unless you explicitly choose ","translated":" 不会删除任何内容,除非您明确选择 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:11Z"} +{"cache_key":"67db94076306469669c78e1176f5af9cd7a5e6ba4528ce053e203e96bd12fdc7","segment_id":"help/index.md:cad44fbae951d379","source_path":"help/index.md","text_hash":"cad44fbae951d3791565b0cee788c01c3bd10e0176167acb691b8dba0f7895f8","text":"Gateway logging","translated":"Gateway 日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:51Z"} +{"cache_key":"681929db09dc269d58c525c09744bdebddf03842689478831d1f59575161d74f","segment_id":"index.md:274162b77e02a189","source_path":"index.md","text_hash":"274162b77e02a1898044ea787db109077a2969634f007221c29b53c2e159b0cc","text":". Plugins add Mattermost (Bot API + WebSocket) and more.\nOpenClaw also powers the OpenClaw assistant.","translated":"。插件可添加 Mattermost(Bot API + WebSocket)等更多渠道支持。\nOpenClaw 同时也驱动着 OpenClaw 助手。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:27:58Z"} +{"cache_key":"685f06b3659dc0d7b4f41f7b15a9722e9de70a2794b168650f8414873d7c168f","segment_id":"index.md:7ac362063b9f2046","source_path":"index.md","text_hash":"7ac362063b9f204602f38f9f1ec9cf047f03e0d7b83896571c9df6d31ad41e9c","text":"Nodes","translated":"节点","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:13Z"} +{"cache_key":"6871c777c178113b08a646e4826f7bc149fa796d803947ab84e9d7a8af45cea7","segment_id":"environment.md:1ec31258a6b45ea9","source_path":"environment.md","text_hash":"1ec31258a6b45ea903cd76f5b0190a99ab56afff6241a04f0681eb12b7a02484","text":"Env var equivalents:","translated":"环境变量 等效项:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:13Z"} +{"cache_key":"687dd62cc9018f0e74dadb0abaab9318503de6d5071253dca9c789f4352b9efa","segment_id":"start/wizard.md:fd3ef9f6b8315cd4","source_path":"start/wizard.md","text_hash":"fd3ef9f6b8315cd4cdfef9c6e295ed50e858a820f31a9b6555366054af144907","text":"Recommended: set up a Brave Search API key so the agent can use ","translated":"推荐:设置 Brave Search API 密钥,以便智能体可以使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:17Z"} +{"cache_key":"68c5c21091478bdd701de8955d662e20de4e91e7cf7626d3a7ad444230c802d0","segment_id":"index.md:6b8ebac7903757ce","source_path":"index.md","text_hash":"6b8ebac7903757ce7399cc729651a27e459903c24c64aa94827b20d8a2a411d2","text":"For Tailnet access, run ","translated":"如需 Tailnet 访问,请运行 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:45Z"} +{"cache_key":"68e1b25eafa11dfe6ffd16682d3f4f72d3f1774db82b6cd7b08e0dc617d7dbf4","segment_id":"start/wizard.md:1e3abf61a37e3cad","source_path":"start/wizard.md","text_hash":"1e3abf61a37e3cad36b11b459b1cc39e76feb6a0c369fe5270957468288dcc5c","text":"If ","translated":"如果 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:01Z"} +{"cache_key":"690712dd7f5a91ba48c9cbced5b6696f3db30d836271a363f94e57d84e674554","segment_id":"start/wizard.md:873f11af0a4e26ee","source_path":"start/wizard.md","text_hash":"873f11af0a4e26ee426ad19295a3f36d0256b0a6da1e0744832fe62d7a0cdf27","text":"Model/Auth","translated":"模型/认证","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:44Z"} +{"cache_key":"690bea2d411c2b07780745f517baf643d26686e96f534e5bb1f2eaaf441448b5","segment_id":"start/getting-started.md:d059230b2daf747b","source_path":"start/getting-started.md","text_hash":"d059230b2daf747b7ca874e806c334070d67c8f02fa017ad61f2701d61354d55","text":"Recommended Anthropic path:","translated":"推荐的 Anthropic 路径:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:30Z"} +{"cache_key":"69223c700e3933064992a3b935b8e443e6475dd5e5f63ba2447d85b76f68b53e","segment_id":"environment.md:61115f6649792387","source_path":"environment.md","text_hash":"61115f664979238731a390e84433a818965b7eaf1d38fa5b4b1507c33ef28c91","text":"Precedence (highest → lowest)","translated":"优先级(从高到低)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:28Z"} +{"cache_key":"697717108124b156f8f1fb7c823e71fd6d5bbbe71e43ed8b4c62e2bbbdafa7bd","segment_id":"environment.md:a16d7a83f4f565a8","source_path":"environment.md","text_hash":"a16d7a83f4f565a8d1aca9d8646b3eaa76308e8307be4634f9261ed0a0dccd67","text":"Config `env` block","translated":"配置 `env` 块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:45Z"} +{"cache_key":"698c8d3774af0dc5196c75622b024794a3f45792871ab62821e75607b64fe050","segment_id":"environment.md:cdb4ee2aea69cc6a","source_path":"environment.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":"。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:54Z"} +{"cache_key":"69b9351215888d772cb7294618ccac031ec230dc7dd3d94db9a0fc323fdd68e1","segment_id":"index.md:be48ae89c73a75da","source_path":"index.md","text_hash":"be48ae89c73a75da3454d565526d777938c20664618905a9bc77d6a0a21a689d","text":"\"EXFOLIATE! EXFOLIATE!\"","translated":"\"去角质!去角质!\"","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:50Z"} +{"cache_key":"6a0067f355b734f73cc5d06c2415e833a0237f4e1c0f086d4be41b01ca666065","segment_id":"help/index.md:frontmatter:summary","source_path":"help/index.md:frontmatter:summary","text_hash":"aece82a2d540ab1a9a21c7b038127cae6e9db2149491564bb1856b6f8999f205","text":"Help hub: common fixes, install sanity, and where to look when something breaks","translated":"帮助中心:常见修复方法、安装健全性检查,以及出问题时该去哪里排查","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:25Z"} +{"cache_key":"6a24e3ca10f074b02180cd94a12d97d06ba02d3ed50c0b414b6e82f6a567e2aa","segment_id":"start/wizard.md:6a40edf1fc87a29f","source_path":"start/wizard.md","text_hash":"6a40edf1fc87a29f243a7eefdbed57d19bfe16ab2e039d7ae1a44c097297e2f3","text":"WhatsApp","translated":"WhatsApp","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:14Z"} +{"cache_key":"6a33a478d12a3b427e017a6e516fcb413a3a5342725b674ac3ac5c9e5aca3973","segment_id":"index.md:c0aa8fcb6528510a","source_path":"index.md","text_hash":"c0aa8fcb6528510aea46361e8c871d88340063926a8dfdd4ba849b6190dec713","text":": it is the only process allowed to own the WhatsApp Web session. If you need a rescue bot or strict isolation, run multiple gateways with isolated profiles and ports; see ","translated":":它是唯一允许拥有 WhatsApp Web 会话 的进程。如果需要救援机器人或严格隔离,请使用隔离的配置文件和端口运行多个网关;参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:56Z"} +{"cache_key":"6a386646cb5e09a391827ea6dd82475e9d6edbe2c6acbd9c797f030f3c24bcff","segment_id":"index.md:bf0e823c81b87c5d","source_path":"index.md","text_hash":"bf0e823c81b87c5de79676155debf20a29b52d6d7eb7e77deda73a56d0afbaaa","text":"🧠 ","translated":"🧠 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:41Z"} +{"cache_key":"6a47aab59ec3c6e8096fa2733fa963a3233dc254b4ec8a306635e196ffe0928f","segment_id":"index.md:316cd41f595f3095","source_path":"index.md","text_hash":"316cd41f595f3095f149f98af70f77ab85404307a1505467ee45a26b316a9984","text":"Guided setup (recommended):","translated":"引导式设置(推荐):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:06Z"} +{"cache_key":"6a5441f83cd64d6920441e8eedade5c472aa328b00ed9f05ccf638493bce1b10","segment_id":"environment.md:d4a67341570f4656","source_path":"environment.md","text_hash":"d4a67341570f4656784c5f8fe1bfb48a738ace57b52544977431d50e2b718099","text":"FAQ: env vars and .env loading","translated":"常见问题:环境变量 和 .env 加载","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:34Z"} +{"cache_key":"6a914cfd2e0ac0d7ccc179c0361f67fc4574234e9d8cbfce616285591ed37b2e","segment_id":"start/wizard.md:769e62863db91849","source_path":"start/wizard.md","text_hash":"769e62863db91849711d2b06aa7480c8874950c7764035a155268ae80bcaaa5d","text":". Docs: ","translated":"存储。文档: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:25Z"} +{"cache_key":"6ac32faba08302a413cf9de9061c4f7ab03bd96929649f2c17c6a6d2b1c25ce2","segment_id":"environment.md:f0442e6e05ccca16","source_path":"environment.md","text_hash":"f0442e6e05ccca160d17de0e7d509891b91b921366b2202b2b5c80435824e140","text":"Two equivalent ways to set inline env vars (both are non-overriding):","translated":"两种等效的内联环境变量设置方式(两者都不会覆盖):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:07Z"} +{"cache_key":"6af973157939ccd33570e5047d622de4263119466c45f46681f300f577b79faf","segment_id":"start/getting-started.md:7bac3209ac343388","source_path":"start/getting-started.md","text_hash":"7bac3209ac3433880eb9d1d0a1867cd9a0617f43ca27493375bc005051d869b7","text":"OAuth credentials (legacy import): ","translated":"OAuth 凭据(旧版导入): ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:36Z"} +{"cache_key":"6b0625352ff5092cab159cf3242fc10826b63c47c7d7524d3c3ee8e85cbe8f9f","segment_id":"index.md:5afbb1c887f6d850","source_path":"index.md","text_hash":"5afbb1c887f6d8501dba36cd2113d8f8b6ce6fa711a0d3e7efdc66f170abd2c2","text":"Cron jobs","translated":"定时任务","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:22Z"} +{"cache_key":"6b14f5e839df1e54026ee6d3db5886a6e9360039fd681101a4a9a2b101ff0919","segment_id":"index.md:084514e91f37c3ce","source_path":"index.md","text_hash":"084514e91f37c3ce85360e26c70b77fdc95f0d3551ce309db96fbcf956a53b01","text":"Dashboard (browser Control UI)","translated":"仪表盘(浏览器控制界面)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:21Z"} +{"cache_key":"6b3dbfa396df75c279946f5b8741a67863a0107d3f08c55dc642a8fac173a4c8","segment_id":"index.md:1074116f823ec992","source_path":"index.md","text_hash":"1074116f823ec992e76d7e8be19d3235fec5ddd7020562b06e7242e410174686","text":"Remote use","translated":"远程使用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:11Z"} +{"cache_key":"6b44e5cb8d21527ef6ad754e2792b9416080f2a132c8fd7b6d431fc76113aad9","segment_id":"environment.md:a42cc4a7174c83a8","source_path":"environment.md","text_hash":"a42cc4a7174c83a853752b3e74cb001a234f3eca099688fdf0dd2540c60bb1e2","text":" expected keys:","translated":" 预期的键:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:25Z"} +{"cache_key":"6c18bb32586b6c812ebf5323b8ed442c63be7b4014bc62e51f0d7f5eb46d223b","segment_id":"environment.md:582967534d0f909d","source_path":"environment.md","text_hash":"582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf","text":" in ","translated":" 在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:54Z"} +{"cache_key":"6c1b9632694258c227417b61df6433ac71eca1f2d35ff31cb5e145a7188dacfe","segment_id":"start/getting-started.md:d7849463c3ab6a49","source_path":"start/getting-started.md","text_hash":"d7849463c3ab6a496d77b8e6745d00ad430324bc5ed419a859f7c9e494102d68","text":"Manual run (foreground):","translated":"手动运行(前台):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:51Z"} +{"cache_key":"6c3d2263be9d0d6dd77934bd87f882599e2e9449e67bdee4388f84ab0aa6571b","segment_id":"start/wizard.md:698fdfc9c55bd3e4","source_path":"start/wizard.md","text_hash":"698fdfc9c55bd3e4ed5a9365317ae70aac20783ec38057088da27012a470a901","text":"Gateway port ","translated":"Gateway 端口 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:50Z"} +{"cache_key":"6cbd9a98f43c5cd7ee42cde62e8bdf2fab7d10c65a1aebd8540be50477452284","segment_id":"environment.md:6db0742daaf9f191","source_path":"environment.md","text_hash":"6db0742daaf9f191ab7816d2c9d317b1ea1693453a8c63b95af8b01477e0f5bb","text":" runs your login shell and imports only ","translated":" 运行你的登录 shell,并仅导入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:12Z"} +{"cache_key":"6ce678386b3562455734243bc70c673a1b20aeb902456025275220465b508211","segment_id":"index.md:274162b77e02a189","source_path":"index.md","text_hash":"274162b77e02a1898044ea787db109077a2969634f007221c29b53c2e159b0cc","text":". Plugins add Mattermost (Bot API + WebSocket) and more.\nOpenClaw also powers the OpenClaw assistant.","translated":"。插件可添加 Mattermost(Bot API + WebSocket)等更多平台。\nOpenClaw 还为 OpenClaw 助手提供支持。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:01Z"} +{"cache_key":"6d11b3d022e2bde1caefb2917a26aa0169fa2e6e13c62d6595b010d9130fecb9","segment_id":"environment.md:87e89abb4c1c551f","source_path":"environment.md","text_hash":"87e89abb4c1c551fe08d355d097f18b8de78edca5f556997085681662fce8eed","text":"Config ","translated":"配置 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:57Z"} +{"cache_key":"6d347e25d4ffcc9340ab0172ccb04190e3780bc68d026152202edbdce466b09e","segment_id":"index.md:82ba9b60b12da3ab","source_path":"index.md","text_hash":"82ba9b60b12da3ab4e7dbcb0d7d937214cff80c82268311423a6dc8c4bc09df5","text":"OpenClaw 🦞","translated":"OpenClaw 🦞","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:48Z"} +{"cache_key":"6d365b29cf4305b02714d7c3f130301954ffc45574d088db9bb553d065f20854","segment_id":"index.md:1e37e607483201e2","source_path":"index.md","text_hash":"1e37e607483201e2152d2e9c68874dd4027648efdd9cfccb7bf8c9837398d143","text":"), serving ","translated":"),提供 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:11Z"} +{"cache_key":"6d78259f49a7bf9fd44a58e590c3f18b7646b810d8e07e7d34b5fb0e73aa5844","segment_id":"start/wizard.md:fe21d672d145bf9d","source_path":"start/wizard.md","text_hash":"fe21d672d145bf9dcbb12ba1cc1677a0b8718bed342f5bfeb774b2996fed9889","text":"Lets you choose a node manager: ","translated":"让您选择一个 Node 管理器: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:45Z"} +{"cache_key":"6da895990489d77240c02d6c6f51892e4f6b7a5ec658cca2e3f6e92084fa7a72","segment_id":"index.md:5cf9ea2e20780551","source_path":"index.md","text_hash":"5cf9ea2e2078055129b38cfbc394142ca6ca41556bd6e31cbd527425647c1d1e","text":"One Gateway per host (recommended)","translated":"每台主机一个 Gateway(推荐)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:53Z"} +{"cache_key":"6dc2e2b52833ce2b82f2a886285fffff2f3a6e1d9d23875ec57d61f1328cda06","segment_id":"environment.md:668e5590b5bb9990","source_path":"environment.md","text_hash":"668e5590b5bb9990eeb25bf657f7d17281a4c613ee4442036787cd4b2efd22bb","text":"If the config file is missing entirely, step 4 is skipped; shell import still runs if enabled.","translated":"如果配置文件完全缺失,则跳过第 4 步;如果已启用,shell 导入仍会运行。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:07Z"} +{"cache_key":"6e0b579a98c31961263b11f7805c45b08b9850506746275df639a7a236ceccf5","segment_id":"index.md:496bcd8a502babde","source_path":"index.md","text_hash":"496bcd8a502babde0470e7105dfed7ba95bbc3193b7c6ba196b3ed0997e84294","text":"Voice notes","translated":"语音消息","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:56Z"} +{"cache_key":"6e109ac5e9791bc39a36e94e14a107a5e270e18cd20cd2b8d50132d6170c9dc9","segment_id":"environment.md:6f59001999ef7b71","source_path":"environment.md","text_hash":"6f59001999ef7b7128bab80d2034c419f3034497e05f69fbdf67f7b655cdc173","text":"Configuration: Env var substitution","translated":"配置:环境变量替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:47:07Z"} +{"cache_key":"6e297c0b91d3a16fec1d93183437778addf7c0908be226b39d4ee3dacab5c6f4","segment_id":"start/getting-started.md:b1ff7bd17092d95e","source_path":"start/getting-started.md","text_hash":"b1ff7bd17092d95ea7811719ce3df6d79b0c3a576695636fc411f2d95dc908b2","text":"Mattermost","translated":"Mattermost","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:30Z"} +{"cache_key":"6e3de6afce0bcbadbe662882ab64575df2fa60edee81930593c1f854e7bed6e7","segment_id":"start/wizard.md:de500b08e6825815","source_path":"start/wizard.md","text_hash":"de500b08e6825815c64066def01809cd44b9b86fe3de9142c48edb43644e6ec5","text":"Z.AI example:","translated":"Z.AI 示例:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:24Z"} +{"cache_key":"6e7bb00810a1c89548ff84b0cadc9b0b1f2f3c12625ab3fcbc78216c60a02b81","segment_id":"help/index.md:6cb77499abdccd9a","source_path":"help/index.md","text_hash":"6cb77499abdccd9a2dbb7c93a4d31eed01613dda06302933057970df9ecdeb54","text":"Logs:","translated":"日志:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:21Z"} +{"cache_key":"6ed4c62933bde0307cf9d37c7cb57e20d5fecc3da59e7ea185f4c101f80f4344","segment_id":"index.md:1eb6926214b56b39","source_path":"index.md","text_hash":"1eb6926214b56b396336f22c22a6f8a4c360cfe7109c8be0f9869655b9ff6235","text":"Pairing (DM + nodes)","translated":"配对(私聊 + 节点)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:34Z"} +{"cache_key":"6f2bf42e3ab6c9dfe240a6e878f8d322a9ec3956cf722b0d0b6aa221467d33cd","segment_id":"start/wizard.md:fd5f5ef720b423af","source_path":"start/wizard.md","text_hash":"fd5f5ef720b423af38c9113f3fce3be2eeccfef9f35b56c075bc8145297ebe59","text":" (auto-installs UI deps).","translated":" (自动安装 UI 依赖项)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:09Z"} +{"cache_key":"6f721a6913c75aac92f1890a4942631c3370e08f7e4180950dcc08a03e0765ba","segment_id":"environment.md:9c85ab59cb358b12","source_path":"environment.md","text_hash":"9c85ab59cb358b1299c623e16f52f3aee204a81fb6d1c956e37607a220d13b08","text":"You can reference env vars directly in config string values using `${VAR_NAME}` syntax:","translated":"你可以使用 `${VAR_NAME}` 语法在配置字符串值中直接引用环境变量:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:56Z"} +{"cache_key":"6f9e33ab431225304bd1fa8a39bb0efd5d4279d45975ebd5b20f24e09bb98cbc","segment_id":"start/wizard.md:531995e8b52db462","source_path":"start/wizard.md","text_hash":"531995e8b52db462df5a6b23a5f7af4d5c57415a397438b002364edebcdc1e14","text":" writes ","translated":" 写入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:45Z"} +{"cache_key":"6fc0fd840e70231dec1ea7ea900c6bab5c29245170836fc0625f3898b05f4edb","segment_id":"index.md:b5ccaf9b1449291c","source_path":"index.md","text_hash":"b5ccaf9b1449291c92f855b8318aeb2880a9aa1a75272d17f55cf646071b3eae","text":"Gmail hooks (Pub/Sub)","translated":"Gmail 钩子(Pub/Sub)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:53Z"} +{"cache_key":"6fe259de45e43265b4853300aa3cd6972b5cbbd607ab967eed0618c0f860247a","segment_id":"help/index.md:5c94724fa7810fa9","source_path":"help/index.md","text_hash":"5c94724fa7810fa9902e565cf66c5f5a973074f2961fcd3a40bad4ee4aeca5e0","text":"If you want a quick “get unstuck” flow, start here:","translated":"如果你想快速了解\"快速排障\"流程,请从这里开始:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:33Z"} +{"cache_key":"70155d1dc5c21119f33f83bea22521d80b2d73a2d089a04817d3cf20cb55177c","segment_id":"index.md:93c89511a7a5dda3","source_path":"index.md","text_hash":"93c89511a7a5dda3b3f36253d17caee1e31f905813449d475bc6fed1a61f1430","text":"common fixes + troubleshooting","translated":"常见修复 + 故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:22Z"} +{"cache_key":"70626932ec406bd2253ce4134561af2088dc5ee89aa51a4336f95288b4f863c2","segment_id":"environment.md:a16d7a83f4f565a8","source_path":"environment.md","text_hash":"a16d7a83f4f565a8d1aca9d8646b3eaa76308e8307be4634f9261ed0a0dccd67","text":"Config `env` block","translated":"配置 `env` 块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:30Z"} +{"cache_key":"70d246c2dab8d15be4dc7dcf914f0df1b95aeb517a09c88d86fa095e1c465095","segment_id":"index.md:268ebcd6be28e8d8","source_path":"index.md","text_hash":"268ebcd6be28e8d853ace3a6e28f269fbda1343b53e3f0de97ea3d5bf1a0e33e","text":"Clawd","translated":"Clawd","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:07Z"} +{"cache_key":"71667555ad1cea654225fec33df1804c97a0b8167affbf3d3c426ccb778e780a","segment_id":"start/wizard.md:82e1216ede141cb1","source_path":"start/wizard.md","text_hash":"82e1216ede141cb1553d20be7356c3f1ab9da9a4a05303cf7cd05ef01142558f","text":"Gateway settings (port/bind/auth/tailscale)","translated":"Gateway 设置(端口/绑定/认证/Tailscale)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:23Z"} +{"cache_key":"7170dcd349905701fd3cde7dc5bce0aed2618717e87ffa06e9ab230041f689a1","segment_id":"environment.md:cdb4ee2aea69cc6a","source_path":"environment.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":"。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:26Z"} +{"cache_key":"724a450b6cdfc09dd0fc5acf94bb7f20a45c43e524810239d0e6e7cac65ff74b","segment_id":"index.md:bd293e4db98037bc","source_path":"index.md","text_hash":"bd293e4db98037bc9da5137af50453ac9c81b49e14eb4c47f121b12bed880877","text":" — Direct chats collapse into shared ","translated":" — 直接聊天合并到共享的 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:59Z"} +{"cache_key":"72d5ce369dd6489f427c02710fae70f6426a51de9441678410a023761cee215b","segment_id":"start/wizard.md:8f7c7d2f15e90b42","source_path":"start/wizard.md","text_hash":"8f7c7d2f15e90b420fb6f2cc7632d7d7a433bc94eeb262d9718286e5ffd9b365","text":"Related docs","translated":"相关文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:49:00Z"} +{"cache_key":"730b6369e65b8f27f57a90f6ee355beca28d783793767209a7cfe7beb736769b","segment_id":"start/wizard.md:eda31fe8fb873697","source_path":"start/wizard.md","text_hash":"eda31fe8fb873697fd7d5bfba08f263eaa917808a644bddd2b6d89d3a6b1c868","text":"QuickStart vs Advanced","translated":"快速入门与高级模式","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:30Z"} +{"cache_key":"73164a8584f9cc4e546493100199d4ebcbb65ce74c33e21d06da689c6d7b9328","segment_id":"start/wizard.md:ce85fecfbffa2746","source_path":"start/wizard.md","text_hash":"ce85fecfbffa2746f0a9b66464140eb2ed5a085ce85fff062ef0ff8b5686a0a5","text":".\nSessions are stored under ","translated":"下。会话存储在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:54Z"} +{"cache_key":"73343b447da60470e1e14745df6653212cfb901cb8591540364f6cc906d42fd8","segment_id":"index.md:f1e3b32c8eb0df8e","source_path":"index.md","text_hash":"f1e3b32c8eb0df8ea105f043edf614005742c15581e2cebc5a9c3bafb0b90303","text":"Multi-agent routing","translated":"多 智能体 路由","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:43Z"} +{"cache_key":"7354cca5c4abf7f22290854ebf29a79803372316786f435b6d197b844847c177","segment_id":"start/wizard.md:fdd0a77c1e77ac7b","source_path":"start/wizard.md","text_hash":"fdd0a77c1e77ac7bffeea35de300966019f55c682bd3046ae045d8d5db9e68cb","text":"Writes ","translated":"写入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:04Z"} +{"cache_key":"7364ee790ee697a9be18a8878b36241f6087253c4952dec1d7f9ed766fb7ba57","segment_id":"index.md:c491e0553683a70a","source_path":"index.md","text_hash":"c491e0553683a70a2fb52303f74675d2f7b725814ed70d5167473cb5fbe46450","text":"@steipete","translated":"@steipete","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:55Z"} +{"cache_key":"7396e8f216f016e9505d0ce0709809834376675cca202b48cc8592fdc8461357","segment_id":"environment.md:f7e239a42b7cd986","source_path":"environment.md","text_hash":"f7e239a42b7cd986a1558fed234e975ed2e96e9d37cf0a93f381778c461c89dd","text":"OpenClaw pulls environment variables from multiple sources. The rule is ","translated":"OpenClaw 从多个来源获取环境变量。规则是 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:21Z"} +{"cache_key":"73b0734779c4cb925c37ffe5e84b08453879c88667f95afe39d096031f55d1ec","segment_id":"environment.md:aac7246f5e97142c","source_path":"environment.md","text_hash":"aac7246f5e97142c3f257b7d8b84976f10c29e1b89804bb9d3eb7c43cc03cb8e","text":"Environment variables","translated":"环境变量","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:21:55Z"} +{"cache_key":"73c3930f846d6be7446b678ee4181328fead10032d5ac3217dd5a7dad818f119","segment_id":"environment.md:6db0742daaf9f191","source_path":"environment.md","text_hash":"6db0742daaf9f191ab7816d2c9d317b1ea1693453a8c63b95af8b01477e0f5bb","text":" runs your login shell and imports only ","translated":" 运行你的登录 shell 并仅导入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:49Z"} +{"cache_key":"740260cd2027024814eb7dbbe5605642907d5720259bea069322bf4422ab7abe","segment_id":"index.md:e1b33cfa2a781bde","source_path":"index.md","text_hash":"e1b33cfa2a781bde9ef6c1d08bf95993c62f780a6664f5c5b92e3d3633e1fcf8","text":" (@nachoiacovino, ","translated":" (@nachoiacovino, ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:53Z"} +{"cache_key":"741c513df5edc25161f93a87a83b3335320749b9560fb3dedddcd1a9e02f8309","segment_id":"start/wizard.md:9f6f919dc1088468","source_path":"start/wizard.md","text_hash":"9f6f919dc1088468f8197ef0c27501e1c0a71a94b9faed9d363410305d3a472b","text":"Agent workspace","translated":"智能体工作区","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:51Z"} +{"cache_key":"743cddc057adf1927666ea67a9d672d0e924c93c938fac5086b278e6d0dac789","segment_id":"index.md:e3209251e20896ec","source_path":"index.md","text_hash":"e3209251e20896ecc60fa4da2817639f317fbb576288a9fc52d11e5030ecc44a","text":"Windows (WSL2)","translated":"Windows (WSL2)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:40Z"} +{"cache_key":"74759aa496b1b361eadf49b7e6245708b41bb91d571dc6a34e0f79ab602f23f9","segment_id":"environment.md:aac7246f5e97142c","source_path":"environment.md","text_hash":"aac7246f5e97142c3f257b7d8b84976f10c29e1b89804bb9d3eb7c43cc03cb8e","text":"Environment variables","translated":"Could you please provide the file path or the full text about \"Environment variables\" that you'd like me to translate?","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:37Z"} +{"cache_key":"74784eac2b412aa6a24c3e0d7f66e14ac2ac8aeb85905dafd36f4f6c680fd94d","segment_id":"environment.md:39d9dca6df060f67","source_path":"environment.md","text_hash":"39d9dca6df060f6708b30f0f6b1581105c607e96a66f282bf4a0fe75e92dc205","text":"Env var substitution in","translated":"环境变量替换在","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:56Z"} +{"cache_key":"74a32b88954158955f70bb053e86f28337b079cf11feb27cec6a4af1d9926f6b","segment_id":"start/getting-started.md:13bf3a75f8be5632","source_path":"start/getting-started.md","text_hash":"13bf3a75f8be5632d9f92212f0c5a61750a0b4654af5db87a9d91ade89b72e5b","text":"Default posture: unknown DMs get a short code and messages are not processed until approved.\nIf your first DM gets no reply, approve the pairing:","translated":"默认策略:未知私信会收到一个短码,消息在批准之前不会被处理。\n如果您的第一条私信没有收到回复,请批准配对:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:39Z"} +{"cache_key":"74b57577f77fd5b865970d086c56b3f7d760c94e57a5c11babad0173e6b6bc1f","segment_id":"start/getting-started.md:df3db5b08f6e98f3","source_path":"start/getting-started.md","text_hash":"df3db5b08f6e98f31a9242361eb5d1f325c35f4acbb6c7cd8ac9afa85bf8eaa7","text":"Local vs Remote","translated":"本地 vs 远程","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:00Z"} +{"cache_key":"753971a27214ecb4551eb400d1bace8931dd2b658bef6bc8d55506b6adeba974","segment_id":"environment.md:668e5590b5bb9990","source_path":"environment.md","text_hash":"668e5590b5bb9990eeb25bf657f7d17281a4c613ee4442036787cd4b2efd22bb","text":"If the config file is missing entirely, step 4 is skipped; shell import still runs if enabled.","translated":"如果配置文件完全缺失,则跳过第 4 步;如果已启用,shell 导入仍会运行。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:07Z"} +{"cache_key":"759d3f3cb39af3e2d57e711d9680a2b999ef3bc08a4184eccd9b1d53c18f7b1f","segment_id":"index.md:95cae5ed127bd44d","source_path":"index.md","text_hash":"95cae5ed127bd44dcc30345a1925d77f333284b43a6f97832f149a63dc38e0e0","text":"The wizard now generates a gateway token by default (even for loopback).","translated":"向导 现在默认会生成网关令牌(即使是回环连接)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:06Z"} +{"cache_key":"75deb7505d1a042e24a4c83cdddf479326929a80edeffcfaa49863bf115ab848","segment_id":"help/index.md:24669ff48290c187","source_path":"help/index.md","text_hash":"24669ff48290c1875d8067bbd241e8a55444839747bffb8ab99f3a34ef248436","text":"Doctor","translated":"诊断工具","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:58Z"} +{"cache_key":"76148f338fd0041621eb7cda1759d78690a3cb0d0d9a1ca8c2cd4af02dfff679","segment_id":"start/wizard.md:9022ac86cfbabdac","source_path":"start/wizard.md","text_hash":"9022ac86cfbabdac3512fdd7797b7f0a3db628d4873e0b3d64b2f5c752724d03","text":"Tailscale exposure ","translated":"Tailscale 暴露 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:00Z"} +{"cache_key":"762684ab35f0d829663da7f4de49060030ad02772df37776113660266af70236","segment_id":"help/index.md:729bc562eec2658b","source_path":"help/index.md","text_hash":"729bc562eec2658bd11ffdd522fe5277177dc73e86eaca7baac0b472a4d8f8b2","text":"If you’re looking for conceptual questions (not “something broke”):","translated":"如果你在寻找概念性问题的解答(而不是\"出了问题\"):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:32Z"} +{"cache_key":"762e4d6415fd6b11bfb7837a3d751030659263ba7f6292f3defcf734097ada17","segment_id":"environment.md:6f59001999ef7b71","source_path":"environment.md","text_hash":"6f59001999ef7b7128bab80d2034c419f3034497e05f69fbdf67f7b655cdc173","text":"Configuration: Env var substitution","translated":"配置:环境变量替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:13:05Z"} +{"cache_key":"76653677000dc673dea8f2bff5f0d86e7118627d575314948b1592b82cd490be","segment_id":"environment.md:baa5be7f6320780b","source_path":"environment.md","text_hash":"baa5be7f6320780bd7bb7b7ddbb8cd1ffb26ccf7d94d363350668c50aedcf95f","text":" (applied only if missing).","translated":" (仅在缺失时应用)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:56Z"} +{"cache_key":"76934bd605258decffe7f40a10419e7a19405bc7a09f19c65a9447682a805337","segment_id":"start/wizard.md:8e70d4cdad7bdb70","source_path":"start/wizard.md","text_hash":"8e70d4cdad7bdb70b333c34e14862f46905fbfd6fb678a968f857747f2ee2389","text":"Pick a default model from detected options (or enter provider/model manually).","translated":"从检测到的选项中选择默认模型(或手动输入提供商/模型)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:22Z"} +{"cache_key":"76be6836deb53495879f2e5cc5f57af37d12f5fb67d27f22ecc8c7dc885a6c7a","segment_id":"index.md:4b4051e77af8844f","source_path":"index.md","text_hash":"4b4051e77af8844fcf86a298214527e7840938258f99bfe97b900bbc0d8d2f4b","text":"The dashboard is the browser Control UI for chat, config, nodes, sessions, and more.\nLocal default: http://127.0.0.1:18789/\nRemote access: ","translated":"仪表板是用于聊天、配置、节点、会话 等功能的浏览器控制界面。\n本地默认地址:http://127.0.0.1:18789/\n远程访问: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:33Z"} +{"cache_key":"76ffac273c1ab348f20e97d66f7d9a8218789d2df1be41d676e824f64c949ef4","segment_id":"start/wizard.md:72ea058924a0acec","source_path":"start/wizard.md","text_hash":"72ea058924a0acecc4dd9dae83410a37dd2c43d9b526fb770f88685d27aed0b1","text":"Remote mode","translated":"远程模式","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:34Z"} +{"cache_key":"7748e8a6d7f7a768cc6003487448b27848640b4e9df17154fcf6ad93c707b4aa","segment_id":"environment.md:frontmatter:read_when:0","source_path":"environment.md:frontmatter:read_when:0","text_hash":"90fc0487bff88009979cff1061c1a882df8c3b1baa9c43538331d9d5dab15479","text":"You need to know which env vars are loaded, and in what order","translated":"你需要了解加载了哪些环境变量,以及加载的顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:21:48Z"} +{"cache_key":"7749f2ac757311f26619b43b362bfc9265176ac801f7a38b42ab835c8af89d85","segment_id":"environment.md:6863067eb0a2c749","source_path":"environment.md","text_hash":"6863067eb0a2c7499425c6c189b2c88bac55ca754285a6ab1ef37b75b4cfad4d","text":"See ","translated":"参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:30Z"} +{"cache_key":"775fa7e7f44ee6a3a24c821c866f68606b4ecad281b47f4b744de729460eb521","segment_id":"index.md:cec2be6f871d276b","source_path":"index.md","text_hash":"cec2be6f871d276b45d13e3010c788f01b03ae2f1caca3264bbf759afacace46","text":"Telegram Bot","translated":"Telegram 机器人","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:58Z"} +{"cache_key":"7781b8121d68b25732c0ef1ac9c2b3c6573a376f2912bd6a3860f4d7f6bf3e45","segment_id":"environment.md:08ba1569cc7ada49","source_path":"environment.md","text_hash":"08ba1569cc7ada49ef908e8f19b1d36252072d5876086ae6726c55672d571603","text":" non-overriding):","translated":" 非覆盖的):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:31Z"} +{"cache_key":"77936e1851104e6dac3b5785a85c10f838ca0173ad387391588eb25f884c3a59","segment_id":"environment.md:e234227b0e001687","source_path":"environment.md","text_hash":"e234227b0e001687821541fac3af38fc6be293ec6e13910c6826b9afc8ca33be","text":" syntax:","translated":" 语法:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:17:01Z"} +{"cache_key":"77a1d6fe1f2415835e41760b0765c3b93b4853664de26c500cf7acf3c512d60e","segment_id":"index.md:7ac362063b9f2046","source_path":"index.md","text_hash":"7ac362063b9f204602f38f9f1ec9cf047f03e0d7b83896571c9df6d31ad41e9c","text":"Nodes","translated":"节点","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:57Z"} +{"cache_key":"77b6a43a45b36b25b51859a5b976fa12609b6d19ed351bc0e84fae2290d32da9","segment_id":"help/index.md:2adc964c084749b1","source_path":"help/index.md","text_hash":"2adc964c084749b1f2d8aef24030988b667dbda2e38a6a1699556c93e07c1cea","text":"Start here","translated":"从这里开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:12Z"} +{"cache_key":"7806b590e1e2ff8ab2244875f7a2c370ab3b11462fd2061e5f4af9cf72f70d19","segment_id":"start/wizard.md:9c706a2bb9ebcb20","source_path":"start/wizard.md","text_hash":"9c706a2bb9ebcb206633616f2a40867b0c02716657ac4c0e95c7c1939287d3d8","text":"; auth profiles live in ","translated":";认证配置存储在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:31Z"} +{"cache_key":"78161c8de8a14607cd003796d4c4ace7048f9116ecbe036601136d7f0cef4ff3","segment_id":"start/getting-started.md:bfd99edf844f6205","source_path":"start/getting-started.md","text_hash":"bfd99edf844f62050af2f7d37df7cfa7f651b8e1be341eb4f07c3849ca4efc43","text":"Fastest chat: open the Control UI (no channel setup needed). Run ","translated":"最快聊天方式:打开控制界面(无需设置渠道)。运行 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:33Z"} +{"cache_key":"785cae01bc172c4c47e2e82cda4c5afd7d37d7069a008e44c8a4176eeacafe67","segment_id":"help/index.md:a8ab86b9313a9236","source_path":"help/index.md","text_hash":"a8ab86b9313a92362150f5e5ba8a19de4ee52f2e3162f9bd2bc6cf128a2fcd18","text":"If you’re looking for conceptual questions (not “something","translated":"如果你在寻找概念性问题(不是\"出了什么","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:00Z"} +{"cache_key":"78ae0fabb1aab02156d5bf1b4e148ba155369b079aa0b733aca5a750a3d0cdc2","segment_id":"index.md:329f3c913c0a1636","source_path":"index.md","text_hash":"329f3c913c0a16363949eb8ee7eb0cda7e81137a3851108019f33e5d18b57d8f","text":"Switching between npm and git installs later is easy: install the other flavor and run ","translated":"之后在 npm 和 git 安装之间切换很简单:安装另一种方式然后运行 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:30Z"} +{"cache_key":"791458a3464d7dd0036471e90590958905611942f9f0aefd8917c701e4e587d4","segment_id":"start/wizard.md:0516de0bbbd36c95","source_path":"start/wizard.md","text_hash":"0516de0bbbd36c95c5c45902d43caf2abdab59363114c4d6abae961f6ed1c1cb","text":" imply non-interactive mode. Use ","translated":" 意味着非交互模式。请使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:50Z"} +{"cache_key":"79156ca764918ee2f487da88a8917572551bbb6cac71a256748ba30bce781f0e","segment_id":"index.md:96be070791b7d545","source_path":"index.md","text_hash":"96be070791b7d545dc75084e59059d2170eed247350b351db5330fbd947e4be6","text":"👥 ","translated":"👥 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:37Z"} +{"cache_key":"791d43fa7f63c6479c1e7d2393c2b2790beee2cffe5aaebc547d18ed1b73741f","segment_id":"start/wizard.md:45e595586df0bdc3","source_path":"start/wizard.md","text_hash":"45e595586df0bdc3f10caef3511b7e215c0b32a1626548d1c8648501cdcb4c00","text":"If the Gateway is loopback‑only, use SSH tunneling or a tailnet.","translated":"如果 Gateway 仅绑定回环地址,请使用 SSH 隧道或 tailnet。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:32Z"} +{"cache_key":"7938daa81ee4f2884173676b22aaf901e847b654ce9f368be964ab10461b5852","segment_id":"environment.md:87e89abb4c1c551f","source_path":"environment.md","text_hash":"87e89abb4c1c551fe08d355d097f18b8de78edca5f556997085681662fce8eed","text":"Config ","translated":"配置 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:20Z"} +{"cache_key":"794456d8a1d905f17357dfe11942245d5486b210b163a8ed1608b11b27ce3508","segment_id":"index.md:45808d75bf8911fa","source_path":"index.md","text_hash":"45808d75bf8911fa21637f9dd3f0dace1877748211976b5d61fcc5c15db594d0","text":"Webhooks","translated":"Webhooks","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:24Z"} +{"cache_key":"794de06f9e33b312b5ae297991b32a00290f5f484059283f191e6169ee2e70c4","segment_id":"index.md:2566561f81db7a7c","source_path":"index.md","text_hash":"2566561f81db7a7c4adb6cee3e93139155a6b01d52ff0d3d5c11648f46bc79bb","text":"📱 ","translated":"📱 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:28Z"} +{"cache_key":"7956d19ecce3a275c0f47424d4f75e289b9f7e5742f3adbe0f6eee5ac4c906ca","segment_id":"environment.md:46ab081177a452aa","source_path":"environment.md","text_hash":"46ab081177a452aa62354b581730f4675cb03e58cde8282071da30cabe18fb2e","text":"Optional login-shell import","translated":"可选的登录 shell 导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:56Z"} +{"cache_key":"79a4ac9cc430df4e4cb0a8710c8d21a52baeef560c6220facc6199d5e5a383fc","segment_id":"index.md:98a670e2fb754896","source_path":"index.md","text_hash":"98a670e2fb7548964e8b78b90fef47f679580423427bfd15e5869aca9681d0dd","text":"\"We're all just playing with our own prompts.\"","translated":"\"我们都只是在玩弄自己的提示词罢了。\"","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:23Z"} +{"cache_key":"79b1bfcd80bed91b72fe6f15f1e6e1fdfd069cddc7f2fcc4fbd28f573a874866","segment_id":"index.md:eef0107bb5a4e06b","source_path":"index.md","text_hash":"eef0107bb5a4e06b9de432b9e62bcf1e39ca5dfbbb9cb0cc1c803ca7671c06ab","text":"Gateway runbook","translated":"Gateway 运行手册","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:28Z"} +{"cache_key":"7a2de748330ae022b15280d0444a6c2794d4c60313452e6f4c2470a395e58ca8","segment_id":"index.md:bd293e4db98037bc","source_path":"index.md","text_hash":"bd293e4db98037bc9da5137af50453ac9c81b49e14eb4c47f121b12bed880877","text":" — Direct chats collapse into shared ","translated":" — 私聊折叠为共享 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:25Z"} +{"cache_key":"7a3ab97c36c385c05719cd51ac71cf8b98e65cc27b71ffc71d3670f568d36e6c","segment_id":"start/getting-started.md:5a4d846f4fe5a72f","source_path":"start/getting-started.md","text_hash":"5a4d846f4fe5a72f693af0c9d3a98b2a2df8c99456429765f51706ff7b76b7f7","text":"Gateway (from this repo):","translated":"Gateway(从此仓库):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:54Z"} +{"cache_key":"7a4ee345ffcdd6965857db8eb1605eb4460433be999c17d2b03a9a6a9789bdaa","segment_id":"help/index.md:6201111b83a0cb5b","source_path":"help/index.md","text_hash":"6201111b83a0cb5b0922cb37cc442b9a40e24e3b1ce100a4bb204f4c63fd2ac0","text":" and ","translated":" 和 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:49Z"} +{"cache_key":"7a78848fc43c9758427283f5941f66521236977cbaeaeeb04577de87c4b55c59","segment_id":"index.md:11450a0f023dc48c","source_path":"index.md","text_hash":"11450a0f023dc48cc9cef026357e2b4569a2b756290191c45a9eb0120a919cb7","text":" and (for groups) mention rules.","translated":" 以及(针对群组的)提及规则。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:37Z"} +{"cache_key":"7a917e0cad8ee2f671d93d95939ff19d4545eac6723d3c7be11326cb65db5d25","segment_id":"index.md:c491e0553683a70a","source_path":"index.md","text_hash":"c491e0553683a70a2fb52303f74675d2f7b725814ed70d5167473cb5fbe46450","text":"@steipete","translated":"@steipete","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:20Z"} +{"cache_key":"7ab5c873654dc79ffc905151bf0bff3f05a41e3e7d6e20a368d64aa3c7c8300e","segment_id":"help/index.md:156597e2632411d1","source_path":"help/index.md","text_hash":"156597e2632411d1d5f634db15004072607ba45072a4e17dfa51790a37b6781f","text":"Gateway issues:","translated":"Gateway 问题:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:44Z"} +{"cache_key":"7adf10c75a13a4f39d1360a5f4f45f0e22b608904e9ca8616eed396a35b7c3c0","segment_id":"index.md:cda454f61dfcac70","source_path":"index.md","text_hash":"cda454f61dfcac7007a9edc538f9f58cf38caa0652e253975979308162bccc53","text":"Gateway configuration","translated":"Gateway 配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:07Z"} +{"cache_key":"7ae5133ee1cd21463f6a5373822eeddcebba9435512ebf67ec49d2f88d1a770f","segment_id":"index.md:1eb6926214b56b39","source_path":"index.md","text_hash":"1eb6926214b56b396336f22c22a6f8a4c360cfe7109c8be0f9869655b9ff6235","text":"Pairing (DM + nodes)","translated":"配对(私信 + 节点)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:08Z"} +{"cache_key":"7b14aa70efca84fdf7555ed77d263fae52ddaff260e935d45a3e22031f551c2a","segment_id":"environment.md:87e89abb4c1c551f","source_path":"environment.md","text_hash":"87e89abb4c1c551fe08d355d097f18b8de78edca5f556997085681662fce8eed","text":"Config ","translated":"配置 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:39Z"} +{"cache_key":"7b2f32af1ab182e748188eda2538cc9248faff3296bf459ee2365bf753cd3637","segment_id":"environment.md:907940a35852447a","source_path":"environment.md","text_hash":"907940a35852447aad5f21c5a180d993ff31cfd5807b1352ed0c24eabe183465","text":"never override existing values","translated":"永远不覆盖已有的值","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:00Z"} +{"cache_key":"7b38154bd954f484fa2247a129ccab23889881422b6d5415970eb7ef1dc4170f","segment_id":"environment.md:1ec31258a6b45ea9","source_path":"environment.md","text_hash":"1ec31258a6b45ea903cd76f5b0190a99ab56afff6241a04f0681eb12b7a02484","text":"Env var equivalents:","translated":"等效的环境变量:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:40Z"} +{"cache_key":"7b5e958eea98aae071adeeff78912bbce4b3a9616dabe5ade50538f31a372e6e","segment_id":"index.md:c011d6097bfbc8e9","source_path":"index.md","text_hash":"c011d6097bfbc8e936280addcf2e3e7d06ea2223ffd596973191b800a7035c32","text":"License","translated":"许可证","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:58Z"} +{"cache_key":"7b8d987fa7611cd9dfdf4089d114bce0fb150f5f3af5cfda3fdcf455be7afced","segment_id":"environment.md:3fe738a7ee6aaff5","source_path":"environment.md","text_hash":"3fe738a7ee6aaff51f099d9a8314510c99ced6a568eb38c67642cd43bb54eec0","text":" in the current working directory","translated":" 在当前工作目录中","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:08Z"} +{"cache_key":"7b91b68fc1e996f0909c890f91668386f9ef94974d0f8774a4d34d3cef43c638","segment_id":"help/index.md:frontmatter:read_when:1","source_path":"help/index.md:frontmatter:read_when:1","text_hash":"857eafc389d179e83e21e46c10527fec40894fe064c63847ba06b946b7d5eb73","text":"Something broke and you want the fastest path to a fix","translated":"出了问题,你想找到最快的修复方法","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:05Z"} +{"cache_key":"7c403e93e8396d4740e889ff8e6d078fe8079017dfda145496b3da29b0887144","segment_id":"environment.md:ab5aec4424cf678d","source_path":"environment.md","text_hash":"ab5aec4424cf678dcfb1ad3d2c2929c1e0b2b1ff61b82b961ada48ad033367b4","text":" (dotenv default; does not override).","translated":" (dotenv 默认行为;不会覆盖)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:38Z"} +{"cache_key":"7c487d305535a19790619ad3f172d0128d891e7b8488e84a7fb73ed9a7a9b32a","segment_id":"start/wizard.md:32ebb1abcc1c601c","source_path":"start/wizard.md","text_hash":"32ebb1abcc1c601ceb9c4e3c4faba0caa5b85bb98c4f1e6612c40faa528a91c9","text":"(","translated":"(","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:19Z"} +{"cache_key":"7c9e5b6fba8c9d85221b3c38a9d527d2d683facfd83a93e06f304e13c6771022","segment_id":"environment.md:b4736422e64c0a36","source_path":"environment.md","text_hash":"b4736422e64c0a369663d1b2d386f1b8f4b31b8936b588e4a54453c61a24e0fd","text":"Process environment","translated":"进程环境","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:27Z"} +{"cache_key":"7d14d64c713aa996c01b08945c1784ed78fa95b602c35f9fba369de60b9ffea5","segment_id":"environment.md:f7e239a42b7cd986","source_path":"environment.md","text_hash":"f7e239a42b7cd986a1558fed234e975ed2e96e9d37cf0a93f381778c461c89dd","text":"OpenClaw pulls environment variables from multiple sources. The rule is ","translated":"OpenClaw 从多个来源获取 环境变量。规则是 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:22Z"} +{"cache_key":"7d6ed7204c12f1d91564243dad60b560217dc6a29de3adf7a809de221b42c06a","segment_id":"start/wizard.md:bcd475104a873a42","source_path":"start/wizard.md","text_hash":"bcd475104a873a42ffaaed1aca9434981ce857adba97ebec4adc9e74e4d852f4","text":"allowlist","translated":"允许名单","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:05Z"} +{"cache_key":"7d8297d7b387f5a5302e0a09ea73266ba2e2075985e1af83b24a633c161cf10d","segment_id":"environment.md:46ab081177a452aa","source_path":"environment.md","text_hash":"46ab081177a452aa62354b581730f4675cb03e58cde8282071da30cabe18fb2e","text":"Optional login-shell import","translated":"可选的登录 shell 导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:29Z"} +{"cache_key":"7d82becc6d15c1be9fb97c06f9cc8ed5bf4949814e9d7af50d07380cb51e82f2","segment_id":"index.md:bd293e4db98037bc","source_path":"index.md","text_hash":"bd293e4db98037bc9da5137af50453ac9c81b49e14eb4c47f121b12bed880877","text":" — Direct chats collapse into shared ","translated":" —— 直接聊天折叠为共享的 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:32Z"} +{"cache_key":"7d927444fcf26b06d31a6f1f5d134416f8539e3aa1cc8dd3a4a7c5819fd1534a","segment_id":"index.md:f12242785ecda793","source_path":"index.md","text_hash":"f12242785ecda7935ded50cd48418357d32d3bac290f7a199bc9f0c7fbd13123","text":") — Location parsing (Telegram + WhatsApp)","translated":")— 位置解析(Telegram + WhatsApp)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:46Z"} +{"cache_key":"7da93ed9cf09f854e305f5deb4ddfac979802a4d1f6587247eea91555bdadc73","segment_id":"environment.md:1ec31258a6b45ea9","source_path":"environment.md","text_hash":"1ec31258a6b45ea903cd76f5b0190a99ab56afff6241a04f0681eb12b7a02484","text":"Env var equivalents:","translated":"等效的环境变量:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:54Z"} +{"cache_key":"7dca802a270f89fb4612993c8e7567b27da97fabd7b9ebd9c732ca2d53393244","segment_id":"help/index.md:729bc562eec2658b","source_path":"help/index.md","text_hash":"729bc562eec2658bd11ffdd522fe5277177dc73e86eaca7baac0b472a4d8f8b2","text":"If you’re looking for conceptual questions (not “something broke”):","translated":"如果你在寻找概念性问题的解答(而不是\"出了问题\"):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:56Z"} +{"cache_key":"7ddd9124594671bfd422e2bad8d56887ff8035a346f99a68d806deca63db0dcc","segment_id":"environment.md:46ab081177a452aa","source_path":"environment.md","text_hash":"46ab081177a452aa62354b581730f4675cb03e58cde8282071da30cabe18fb2e","text":"Optional login-shell import","translated":"可选的登录 shell 导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:58Z"} +{"cache_key":"7e1f91e8aeccc2aabf2dee95b6ee40ec27afb0aa5af4c97967b411ccded6826e","segment_id":"start/wizard.md:608acf5d419e2dad","source_path":"start/wizard.md","text_hash":"608acf5d419e2dadaef0b8082406cdbdb689e27953723644bf677feb09d1cf58","text":"Synthetic (Anthropic-compatible)","translated":"Synthetic(Anthropic 兼容)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:03Z"} +{"cache_key":"7e39b80026e0b63d7df55fcc142e8a2876ff972da67c4b263b619848e43417ec","segment_id":"index.md:19525ac5e5b9c476","source_path":"index.md","text_hash":"19525ac5e5b9c476b36a38c5697063e37e8fe2fae8ef6611f620def69430cf74","text":"Canvas host","translated":"Canvas 主机","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:18Z"} +{"cache_key":"7e93af146d7d04064fcba89e95f5a12c7320475af9b1c2e3208185cecb16a369","segment_id":"index.md:25d853ca04397b6a","source_path":"index.md","text_hash":"25d853ca04397b6ae248036d4d029d19d94a4981290387e5c29ef61b0eca9021","text":"Media: audio","translated":"媒体:音频","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:50Z"} +{"cache_key":"7ea531b1b4d75bfda8cb0a3a62e895b86310ab3f79a08cdcaddc1f2ccc61fbc2","segment_id":"index.md:3f8466cd9cb153d0","source_path":"index.md","text_hash":"3f8466cd9cb153d0c78a88f6a209e2206992db28c6dab45424132dc187974e2b","text":"Note: legacy Claude/Codex/Gemini/Opencode paths have been removed; Pi is the only coding-agent path.","translated":"注意:旧版 Claude/Codex/Gemini/Opencode 路径已移除;Pi 是唯一的编程智能体路径。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:04Z"} +{"cache_key":"7ec6a54cb7ceb1c31b47de147210b7193006db1d64b608c52b697512bd7e41aa","segment_id":"environment.md:32ebb1abcc1c601c","source_path":"environment.md","text_hash":"32ebb1abcc1c601ceb9c4e3c4faba0caa5b85bb98c4f1e6612c40faa528a91c9","text":" (","translated":" (","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:37Z"} +{"cache_key":"7eefff451137a5fd592db6fef6e65447cae69abe23699c34cb838a1c3cc04d73","segment_id":"start/wizard.md:d3745cec7a646b22","source_path":"start/wizard.md","text_hash":"d3745cec7a646b229f6d7123ef3557f68640f35a54a593f1e0e32776da0677c1","text":" (auto‑generated, even on loopback)","translated":" (自动生成,即使在回环地址上也是如此)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:58Z"} +{"cache_key":"7f2e9e14503f22acab8659b458900c0864bdc52ee5055d4a3a742508a8e41314","segment_id":"environment.md:45ca56d179d4788c","source_path":"environment.md","text_hash":"45ca56d179d4788c55ba9f7653b376d62e7faa738e92259e3d4f6f5c1b554f28","text":"Related","translated":"相关","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:47:13Z"} +{"cache_key":"7f4d30ae34bbfb95b016db35c14a77f46cdda52ff397a69b63ad655c6128f0f6","segment_id":"index.md:30f035b33a6c35d5","source_path":"index.md","text_hash":"30f035b33a6c35d51e09f9241c61061355c872f2fb9a82822cd2f5f443fd4ad4","text":"Group Chat Support","translated":"群聊支持","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:31Z"} +{"cache_key":"7f8a0ec6c0614299ed8aca539dde67e208ecc32d4022975fbb37f7930f3f70e5","segment_id":"start/getting-started.md:4cc7ae6d3b7fbaaf","source_path":"start/getting-started.md","text_hash":"4cc7ae6d3b7fbaaf56673ea3268caa38af191a587867ef1090c9f689ecccec96","text":"Headless/server tip: do OAuth on a normal machine first, then copy ","translated":"无头/服务器提示:先在普通机器上完成 OAuth,然后复制 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:40Z"} +{"cache_key":"7fec8c329b4438aef905e1918364b86faca2a2580bb29eded4850a67ba16109b","segment_id":"environment.md:496aca80e4d8f29f","source_path":"environment.md","text_hash":"496aca80e4d8f29fb8e8cd816c3afb48d3f103970b3a2ee1600c08ca67326dee","text":" block","translated":" 块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:48Z"} +{"cache_key":"8070c35741bdfaa2f8878a7460406a597ccf7fec7994522389adeafea46b6e8e","segment_id":"environment.md:frontmatter:read_when:0","source_path":"environment.md:frontmatter:read_when:0","text_hash":"90fc0487bff88009979cff1061c1a882df8c3b1baa9c43538331d9d5dab15479","text":"You need to know which env vars are loaded, and in what order","translated":"你需要了解加载了哪些环境变量,以及加载的顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:10Z"} +{"cache_key":"807dfa0f0d41dd91a0565a166afd1780eea045b0d30e177d91cc9dcf7dfce7db","segment_id":"help/index.md:569ca49f4aaf7846","source_path":"help/index.md","text_hash":"569ca49f4aaf7846e952c1d4aeca72febd0b79fa1c4f9db08fd3127551218572","text":"Install","translated":"安装","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:42Z"} +{"cache_key":"8088f34c0eace7e3e9131feea6cc0e9f333432c1fbc78720f10574d1b05197fb","segment_id":"help/index.md:6cb77499abdccd9a","source_path":"help/index.md","text_hash":"6cb77499abdccd9a2dbb7c93a4d31eed01613dda06302933057970df9ecdeb54","text":"Logs:","translated":"日志:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:46Z"} +{"cache_key":"81c954a409a9f6266a05f27d77a4b578631b1f6d86deca557279fd2f82ed29b5","segment_id":"index.md:2b402c90e9b15d9c","source_path":"index.md","text_hash":"2b402c90e9b15d9c3ef65c432c4111108f54ee544cda5424db46f6ac974928e4","text":"🔐 ","translated":"🔐 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:49Z"} +{"cache_key":"81cc99b7c2a7579fa478992233a19aeaea8c64586f07c24fe9e6f22f70610a96","segment_id":"index.md:1a36bded6916228a","source_path":"index.md","text_hash":"1a36bded6916228a5664c8b2bcdaa5661d342fe3e632aa41453f647a3daa3a61","text":" — Pairs as a node and exposes a Canvas surface","translated":" — 作为节点配对并提供 Canvas 界面","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:58Z"} +{"cache_key":"81e5e8a79bbaec139591a64a84574dfb14fcf22e8f803b68ddaa5950103c4c58","segment_id":"index.md:774f1d6b2910de20","source_path":"index.md","text_hash":"774f1d6b2910de200115afec1bd87fe1ea6b0bc2142ac729e121e10a45df4b5d","text":" ← ","translated":" ← ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:56Z"} +{"cache_key":"822efbc5bcf680421493847f6b76e9626f1d8202ff5ff47cd3e141ecdac58a9f","segment_id":"environment.md:496aca80e4d8f29f","source_path":"environment.md","text_hash":"496aca80e4d8f29fb8e8cd816c3afb48d3f103970b3a2ee1600c08ca67326dee","text":" block","translated":" 块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:27Z"} +{"cache_key":"829cc48b5c60f16b09e63437a5de27acc17910473f8e3dfbc505a0d3e3b593c7","segment_id":"start/wizard.md:79a482cf546c23b0","source_path":"start/wizard.md","text_hash":"79a482cf546c23b04cd48a33d4ca8411f62e5b7dc8c3a8f30165e28e747f263a","text":"iMessage","translated":"iMessage","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:54Z"} +{"cache_key":"82d122e7cc5c895b61dec28850c3f07a68e69c19f554d9088318f62c6cd30fe1","segment_id":"environment.md:6d28a9f099e563d9","source_path":"environment.md","text_hash":"6d28a9f099e563d9322b5bcdea9ff98af87e9c213c2222462ae738d2fb27ecbe","text":" block\n\nTwo equivalent ways to set inline env vars (both are non-overriding):","translated":" 块\n\n设置内联环境变量的两种等效方式(均为非覆盖式):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:44Z"} +{"cache_key":"8334186d1a61e931ed7b3905a26e470159f86593819124c5626df7a012733ee9","segment_id":"environment.md:frontmatter:summary","source_path":"environment.md:frontmatter:summary","text_hash":"78351223e7068721146d2de022fdf440c2866b2ee02fbbb50bf64369b999820b","text":"Where OpenClaw loads environment variables and the precedence order","translated":"其中 OpenClaw 加载 环境变量 及优先级顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:59Z"} +{"cache_key":"833685db37cf96f2342238018bd6a4a6e7812d1794a7389dc1e349917b140f50","segment_id":"environment.md:668e5590b5bb9990","source_path":"environment.md","text_hash":"668e5590b5bb9990eeb25bf657f7d17281a4c613ee4442036787cd4b2efd22bb","text":"If the config file is missing entirely, step 4 is skipped; shell import still runs if enabled.","translated":"如果配置文件完全缺失,则跳过第 4 步;如果启用了 shell 导入,它仍会运行。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:28Z"} +{"cache_key":"834bd8857aa5700b0ec493efb4625ba88e34c885a8254b13f6c44a75589021d2","segment_id":"index.md:9bcda844990ec646","source_path":"index.md","text_hash":"9bcda844990ec646b3b6ee63cbdf10f70b0403727dea3b5ab601ca55e3949db9","text":" for node WebViews; see ","translated":" 用于节点 WebView;请参阅 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:13Z"} +{"cache_key":"83b7bced23d11aea94d1b763db57522ce0fca9820fb5edcea109120ea955a46f","segment_id":"start/wizard.md:5cb343f0285df34e","source_path":"start/wizard.md","text_hash":"5cb343f0285df34e67f5215d063e3b53693dd3cdf65667f7d5c142f5db73f7a1","text":"Fastest first chat: open the Control UI (no channel setup needed). Run","translated":"最快的首次对话方式:打开 Control UI(无需设置渠道)。运行","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:07Z"} +{"cache_key":"83c4839813667de3bf67a2a050db86be067fa4bef9fa310d5baab23f82ebcfa5","segment_id":"index.md:aaa095329e21d86e","source_path":"index.md","text_hash":"aaa095329e21d86e24e8bec91bc001f7983d73a7a04c75646c0256448dac30ef","text":" — The space lobster who demanded a better name","translated":" — 那只要求取个更好名字的太空龙虾","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:09Z"} +{"cache_key":"841cbd53411a6aaa5b137d69b3feaa95de0ed0148f868dabd711786998382edb","segment_id":"index.md:6d6577cb1c128ac1","source_path":"index.md","text_hash":"6d6577cb1c128ac18a286d3c352755d1a265b1e3a03eded8885532c3f36e32ed","text":"Mario Zechner","translated":"Mario Zechner","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:36Z"} +{"cache_key":"842bdf601f288020ae8179f0d66f0d2d8a43112867d80efbb045acadbcd6626e","segment_id":"start/wizard.md:05bf3242414a96a7","source_path":"start/wizard.md","text_hash":"05bf3242414a96a764b57402b44b5852bbb0612ca017a9716e6364d47ecb0924","text":"Daemon install (LaunchAgent / systemd user unit)","translated":"守护进程安装(LaunchAgent / systemd 用户单元)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:28Z"} +{"cache_key":"843740adfdf616f31568963f47687512da2b547b5149b531b829112c01b57f5c","segment_id":"index.md:0b7e778664921066","source_path":"index.md","text_hash":"0b7e77866492106632e98e7718a8e1e89e8cb0ee3f44c1572dfd9e54845023de","text":"/concepts/streaming","translated":"/concepts/streaming","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:13Z"} +{"cache_key":"8469bc6049cc48c182c013768278e481d3ab521929f95cd267c63d0dc4bb5d38","segment_id":"index.md:5afbb1c887f6d850","source_path":"index.md","text_hash":"5afbb1c887f6d8501dba36cd2113d8f8b6ce6fa711a0d3e7efdc66f170abd2c2","text":"Cron jobs","translated":"定时任务","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:48Z"} +{"cache_key":"847900fa4457fc7d1dc92fa9688360479e337cedd03a88db8cd9f03cee8dbe51","segment_id":"index.md:99260acc29f71e4b","source_path":"index.md","text_hash":"99260acc29f71e4baeb36805a1fdbd2c17254b57c8e5a9cba29ee56518832397","text":" — Route provider accounts/peers to isolated agents (workspace + per-agent sessions)","translated":" —— 将 提供商 账户/对等方路由到隔离的 智能体(工作区 + 按 智能体 的 会话)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:21Z"} +{"cache_key":"84c686db4b4fc386bbb4efa35c380073babbc5fb4b2eb1ba3a8213a5f135a5bc","segment_id":"start/getting-started.md:161660030aa6c9e3","source_path":"start/getting-started.md","text_hash":"161660030aa6c9e32470cc1c023dab32dc748d80b0e61882b368cb775d12638e","text":" → ","translated":" → ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:27Z"} +{"cache_key":"84e200d4c823802e34a99da4faa8328d0e250aca858b0a32cc08e3ae12e0cc0e","segment_id":"start/wizard.md:e4442451c634e0db","source_path":"start/wizard.md","text_hash":"e4442451c634e0db2db0fae78725becbeafd567302e3ecbfeb5ccdc5887d29be","text":" from GitHub releases:","translated":" (从 GitHub 发布版本):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:56Z"} +{"cache_key":"85040674d9e2db6adb1ebb8c6215e72171d213a9dac8bd3c6bcb438178adc88b","segment_id":"index.md:0a4a282eda1af348","source_path":"index.md","text_hash":"0a4a282eda1af34874b588bce628b76331fbe907de07b57d39afdedccac2ba14","text":" http://127.0.0.1:18789/ (or http://localhost:18789/)","translated":" http://127.0.0.1:18789/(或 http://localhost:18789/)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:15Z"} +{"cache_key":"85cb0b7ed6991128b9fe65b7b103c5f32da742641cb24ffc1a3469002a2bcad6","segment_id":"start/getting-started.md:e24d86fa815827a4","source_path":"start/getting-started.md","text_hash":"e24d86fa815827a4dc5b8b22711caaf036427796512a74167ebaf615c495f9f8","text":"Telegram / Discord / others","translated":"Telegram / Discord / 其他","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:17Z"} +{"cache_key":"85e39779810391375b7241f2d999fbd5e6b2830ddf226a9ad561132c40d4fd47","segment_id":"start/wizard.md:21b111cbfe6e8fca","source_path":"start/wizard.md","text_hash":"21b111cbfe6e8fca2d181c43f53ad548b22e38aca955b9824706a504b0a07a2d","text":"Default ","translated":"默认 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:41Z"} +{"cache_key":"85fdea7998dfe111261588f998c93aceaa9b04ba174bc16bd188e3bbd8f3228a","segment_id":"environment.md:668e5590b5bb9990","source_path":"environment.md","text_hash":"668e5590b5bb9990eeb25bf657f7d17281a4c613ee4442036787cd4b2efd22bb","text":"If the config file is missing entirely, step 4 is skipped; shell import still runs if enabled.","translated":"如果配置文件完全缺失,则跳过第 4 步;如果已启用,shell 导入仍会运行。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:40Z"} +{"cache_key":"860ba81b08f80660c665451acb02944ed74cb09a277f70d86255a6bf6bb7b88f","segment_id":"index.md:f3047ab42a6a5bbf","source_path":"index.md","text_hash":"f3047ab42a6a5bbf164106356fa823ecada895064120c4e5a30e1f632741cc5f","text":"Web surfaces","translated":"Web 界面","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:35Z"} +{"cache_key":"861a980448662449d74017ee4183d74a8e54a772a24fefc3044d1dfffb8ca634","segment_id":"index.md:b332c3492d5eb10a","source_path":"index.md","text_hash":"b332c3492d5eb10a118eb6d8b0dcd689bc2477ce2ae16b303753b942b54377bc","text":"Configuration","translated":"配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:00Z"} +{"cache_key":"861c7c8e316f48bf6b0d22e066b9c76410b8d9b77a12fc7f28213c04ed5f1c30","segment_id":"help/index.md:frontmatter:read_when:0","source_path":"help/index.md:frontmatter:read_when:0","text_hash":"ee0615553374970664b58ebd8e5d0ebc9bc8a5f03387671afbfd0096b390aa9b","text":"You’re new and want the “what do I click/run” guide","translated":"你是新手,想要一份\"我该点什么/运行什么\"的指南","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:28Z"} +{"cache_key":"86305fdb36e4df79c4c5037e3d1a5117141feccd13f65dcf1b0fd366ec22c4bc","segment_id":"index.md:5583785669449fc8","source_path":"index.md","text_hash":"5583785669449fc81a8037458c908c11a8f345c21c28f7f3a95de742bd52199a","text":"Media Support","translated":"媒体支持","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:49Z"} +{"cache_key":"868f3087136c15f059a91fe3ef5ac07ed6a0791e0a14a9740fb959acda8fad28","segment_id":"help/index.md:569ca49f4aaf7846","source_path":"help/index.md","text_hash":"569ca49f4aaf7846e952c1d4aeca72febd0b79fa1c4f9db08fd3127551218572","text":"Install","translated":"安装","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:16Z"} +{"cache_key":"869c590a57afd29927a22cac794ad6fc2f4e464aebb30c0e06b85b2cc3be5bb4","segment_id":"start/wizard.md:69ba7688eac60797","source_path":"start/wizard.md","text_hash":"69ba7688eac60797286dd7bead426bcbd3405746cb3465ac44c997955bd95df2","text":"Config + credentials + sessions","translated":"配置 + 凭据 + 会话","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:41Z"} +{"cache_key":"86a9e0f21a152909fc53f77e35bd973583e2a5dc7cfe3837cf2c783d037a7a93","segment_id":"environment.md:frontmatter:read_when:1","source_path":"environment.md:frontmatter:read_when:1","text_hash":"a3a2d99a99de98220c8e0296d6f4e4b2a34024916bd2379d1b3b9179c8fae46f","text":"You are debugging missing API keys in the Gateway","translated":"你正在调试 Gateway 中缺失的 API 密钥","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:12Z"} +{"cache_key":"86ece013a8e276db3f513a6afa8df20c009f53d42bb3dc02b84dcb39f8697ffe","segment_id":"help/index.md:b79cac926e0b2e34","source_path":"help/index.md","text_hash":"b79cac926e0b2e347e72cc91d5174037c9e17ae7733fd7bdb570f71b10cd7bfc","text":"Help","translated":"帮助","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:01Z"} +{"cache_key":"87897ef5886d39e96385313c32bc5580aff102c89185c03679de8a223d712e01","segment_id":"index.md:a194ca16424ddd17","source_path":"index.md","text_hash":"a194ca16424ddd17dacc45f1cbd7d0e41376d8955a7b6d02bc38c295cedd04e4","text":"RPC adapters","translated":"RPC 适配器","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:49Z"} +{"cache_key":"879702cd9a8560ed1fa329cb78a77dcbe84c66bfa29f3a1460261552dca9dfb2","segment_id":"index.md:66d0f523a379b2de","source_path":"index.md","text_hash":"66d0f523a379b2de6f8d5fba3a817ebc395f7bcaa54cc132ca9dfa665d1e9378","text":"Skills","translated":"技能","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:42Z"} +{"cache_key":"87b42c17fb63bfdcd059198572016f6b8b3cd297aaa991c4c1dea8723a68fbfe","segment_id":"index.md:9abe8e9025013e78","source_path":"index.md","text_hash":"9abe8e9025013e78a6bf2913f8c20ee43134ad001ce29ced89e2af9c07096d8f","text":"Media: images","translated":"媒体:图片","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:48Z"} +{"cache_key":"87d80d180c9d4789c20123b3bc177f99c4d00909f70c6fe3c209c078bdcafdce","segment_id":"index.md:1074116f823ec992","source_path":"index.md","text_hash":"1074116f823ec992e76d7e8be19d3235fec5ddd7020562b06e7242e410174686","text":"Remote use","translated":"远程使用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:36Z"} +{"cache_key":"87f8e99a729beb8e55fdef7ca70ebe4b11f4ff1c5dbbfcb3e654429198c6bf0f","segment_id":"help/index.md:729bc562eec2658b","source_path":"help/index.md","text_hash":"729bc562eec2658bd11ffdd522fe5277177dc73e86eaca7baac0b472a4d8f8b2","text":"If you’re looking for conceptual questions (not “something broke”):","translated":"如果你在寻找概念性问题(不是\"出了故障\"):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:05Z"} +{"cache_key":"88ab429b0aa43b0cfc93a1fc0e69576a2acbf64d0cd407fc1028488a0c27c9fc","segment_id":"index.md:fdef9f917ee2f72f","source_path":"index.md","text_hash":"fdef9f917ee2f72fbd5c08b709272d28a2ae7ad8787c7d3b973063f0ebeeff7a","text":" to update the gateway service entrypoint.","translated":" 以更新网关服务入口点。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:03Z"} +{"cache_key":"88d02146dbe2246af19afc2deecbb627547528cd1bf8b9839d358e8987a88a99","segment_id":"index.md:9c870aa6e5e93270","source_path":"index.md","text_hash":"9c870aa6e5e93270170d5a81277ad3e623afe8d4efd186d3e28f3d2b646d52e6","text":"How it works","translated":"工作原理","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:42Z"} +{"cache_key":"88f63f39528cb8bcb530a350a6b610125dbf6ab7034c2509a772e2ec28ed9476","segment_id":"help/index.md:frontmatter:read_when:1","source_path":"help/index.md:frontmatter:read_when:1","text_hash":"857eafc389d179e83e21e46c10527fec40894fe064c63847ba06b946b7d5eb73","text":"Something broke and you want the fastest path to a fix","translated":"出了问题,你想找到最快的修复方法","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:10Z"} +{"cache_key":"8901c6c35445bae28f7f5cc6059387556bb67f591a89a7b3ff0d7b65dc1e85fd","segment_id":"environment.md:frontmatter:read_when:2","source_path":"environment.md:frontmatter:read_when:2","text_hash":"822b3d74ce16c1be19059fad4ca5bf7ae9327f58fa1ff4e75e78d5afa75c038f","text":"You are documenting provider auth or deployment environments","translated":"你正在编写提供商认证或部署环境的文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:47Z"} +{"cache_key":"8969e9b451aa17e28e3e2c32711b88094beda02a41bf0b2eb68d21aa8e84a63a","segment_id":"environment.md:3fe738a7ee6aaff5","source_path":"environment.md","text_hash":"3fe738a7ee6aaff51f099d9a8314510c99ced6a568eb38c67642cd43bb54eec0","text":" in the current working directory","translated":" 在当前工作目录中","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:40Z"} +{"cache_key":"89f351289752118559ed644ee4aaac84085f4b398cf7c7c80c25aa46429e85c4","segment_id":"index.md:82ba9b60b12da3ab","source_path":"index.md","text_hash":"82ba9b60b12da3ab4e7dbcb0d7d937214cff80c82268311423a6dc8c4bc09df5","text":"OpenClaw 🦞","translated":"OpenClaw 🦞","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:27:48Z"} +{"cache_key":"8a0eac24b3b1941f1a90900aecb71bf1530e8645519ce53d22168a6ee01e583d","segment_id":"start/wizard.md:41ed52921661c7f0","source_path":"start/wizard.md","text_hash":"41ed52921661c7f0d68d92511589cc9d7aaeab2b5db49fb27f0be336cbfdb7df","text":"Gateway","translated":"Gateway","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:54Z"} +{"cache_key":"8a1775a68c3ab8aefdffaadd63ebe7cbc027e198b618fb72bb9a1b16edd08d3a","segment_id":"index.md:9f4d843a5d04e23b","source_path":"index.md","text_hash":"9f4d843a5d04e23b22eb79b3bfa0fbad70ede435ddb5d047e7d77e830efa6019","text":" — Bot token + WebSocket events","translated":" —— 机器人令牌 + WebSocket 事件","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:49Z"} +{"cache_key":"8a32ea50ef9d28ef09b557c184b4db0a493dd539261fde0ce5260a60bb881904","segment_id":"index.md:4818a3f84331b702","source_path":"index.md","text_hash":"4818a3f84331b702815c94b4402067e09e9e2d27ebc1a79258df8315f2c8600b","text":"📎 ","translated":"📎 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:47Z"} +{"cache_key":"8a81f73e519177081d755623ff45ac47552fa513f5aaf9c77335ce2c329087f3","segment_id":"start/getting-started.md:524bf322c2034388","source_path":"start/getting-started.md","text_hash":"524bf322c2034388f76cd94c1c7834341cedfa09bc4a864676749a08b243416d","text":"model/auth (OAuth recommended)","translated":"模型/认证(推荐使用 OAuth)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:53Z"} +{"cache_key":"8a83aabc21a6b84ce7552d72a9bc0a7c2d99864c31350064cbd39564354421f1","segment_id":"index.md:9adcfa4aa10a4e8b","source_path":"index.md","text_hash":"9adcfa4aa10a4e8b991a72ccc45261cd64f296aed5b257e4caf9c87aff1290a0","text":" — Send and receive images, audio, documents","translated":" —— 发送和接收图片、音频、文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:51Z"} +{"cache_key":"8a984f774ac8874be4797ffddd21cbdddc9379fa6bc51121620fbe9395cd91cf","segment_id":"help/index.md:bfc5930cc2660330","source_path":"help/index.md","text_hash":"bfc5930cc2660330260afd407e98d86adaec0af48dd72b88dc33ef8e9066e2c9","text":"Install sanity (Node/npm/PATH):","translated":"安装完整性检查(Node/npm/PATH):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:18Z"} +{"cache_key":"8ac55f265f3496db43dce513fde21c137826476afcff2ed1b3e86e613ff28b3c","segment_id":"start/wizard.md:44dab6c89cc5e6d9","source_path":"start/wizard.md","text_hash":"44dab6c89cc5e6d9a3112d3cb45c19cd16c3a9963082276015d4b624e5e67782","text":"Some channels are delivered as plugins. When you pick one during onboarding, the wizard\nwill prompt to install it (npm or a local path) before it can be configured.","translated":"部分渠道以插件形式提供。当您在上手引导期间选择某个渠道时,向导会提示先安装它(通过 npm 或本地路径),然后才能进行配置。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:57Z"} +{"cache_key":"8b2c90beec3893be65468e57df762fcbc285a9772042200eee3d4bf8f7ff9c0d","segment_id":"index.md:96be070791b7d545","source_path":"index.md","text_hash":"96be070791b7d545dc75084e59059d2170eed247350b351db5330fbd947e4be6","text":"👥 ","translated":"👥 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:29Z"} +{"cache_key":"8b921a960a8b92bc6210c2e228fe886cd93000a5a77f1cb5ac97233de2c4f965","segment_id":"index.md:fb87b8dba88b3edc","source_path":"index.md","text_hash":"fb87b8dba88b3edced028edfe2efa5f884ab2639c1b26efa290ccd0469454d25","text":"Slash commands","translated":"斜杠命令","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:03Z"} +{"cache_key":"8bdf5dbe57d7db52bbddf554ea4eed6bfa8e92209d24733e8f57355beba0ecb9","segment_id":"index.md:74926756385b8442","source_path":"index.md","text_hash":"74926756385b844294a215b2830576e3b2e93b84c5a8c8112b3816c5960f3022","text":" — DMs + guild channels via channels.discord.js","translated":" — 通过 channels.discord.js 支持私聊和服务器频道","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:43Z"} +{"cache_key":"8c2486104e938755d3aef3b6c16fe1e13db8efe500c6559d60fc003ad1acd319","segment_id":"environment.md:cf3f9ba035da9f09","source_path":"environment.md","text_hash":"cf3f9ba035da9f09202ba669adca3109148811ef31d484cc2efa1ff50a1621b1","text":" (what the Gateway process already has from the parent shell/daemon).","translated":" (Gateway 进程从父 shell/守护进程继承的已有环境变量)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:33Z"} +{"cache_key":"8c7d9724c491e8ae94a27ab7b11fb116922f6f3b5d61664aae76ab5fd88d2f0a","segment_id":"index.md:5cf9ea2e20780551","source_path":"index.md","text_hash":"5cf9ea2e2078055129b38cfbc394142ca6ca41556bd6e31cbd527425647c1d1e","text":"One Gateway per host (recommended)","translated":"每台主机一个 Gateway(推荐)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:40Z"} +{"cache_key":"8c84e9f488f94b32acf52cfc44019211a043af87a9c65b7305825db1a67fa421","segment_id":"environment.md:fefb88f0e707cf40","source_path":"environment.md","text_hash":"fefb88f0e707cf40854f27e99b81ac3cb08f0249f47ee200a80e6a5c16841b99","text":"Two equivalent ways to set inline env vars (both are","translated":"两种等效的内联环境变量设置方式(两者都是","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:29Z"} +{"cache_key":"8c9152b9d2d5dae37266587767f1afb6c33e8f471714b92f4a8cd7f91787afc2","segment_id":"environment.md:a258b30f88c30650","source_path":"environment.md","text_hash":"a258b30f88c30650e73073d5bdde5cfcc6987100ae62d37789e5c46a0d85b7c6","text":"Global ","translated":"全局 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:29Z"} +{"cache_key":"8cac6173616db6cb8fe86a594893041cbcf322a1e0faeaf01528aeac4ca00759","segment_id":"help/index.md:6201111b83a0cb5b","source_path":"help/index.md","text_hash":"6201111b83a0cb5b0922cb37cc442b9a40e24e3b1ce100a4bb204f4c63fd2ac0","text":" and ","translated":" 和 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:24Z"} +{"cache_key":"8ceb849e69710631dc80f2eaa57838541deab798818efa76d69b2923f4ab9815","segment_id":"start/wizard.md:b06d5b13b5a1b910","source_path":"start/wizard.md","text_hash":"b06d5b13b5a1b91014ecd8016bec44f379a5269376b602326c42a399004c8491","text":": run ","translated":":运行 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:04Z"} +{"cache_key":"8d99559630736c2a11c549fcfed24d9ff242793fbac2956e758c3ac5b9f5fe7d","segment_id":"start/wizard.md:361f035d290095c6","source_path":"start/wizard.md","text_hash":"361f035d290095c6a1a00757c6ff6d5208dcb600fd6dd4b130bb42047fe3f08b","text":"18789","translated":"18789","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:51Z"} +{"cache_key":"8dac40cb3bfd86d7cfbe99acdb4641cd63d389ea15bd6bfa948a1c734204e925","segment_id":"index.md:496bcd8a502babde","source_path":"index.md","text_hash":"496bcd8a502babde0470e7105dfed7ba95bbc3193b7c6ba196b3ed0997e84294","text":"Voice notes","translated":"语音消息","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:21Z"} +{"cache_key":"8db9b500f11e5390f21a454ab89a4193991966e384e452f49e968afb9e280a69","segment_id":"environment.md:453c14128fbfb5f6","source_path":"environment.md","text_hash":"453c14128fbfb5f6757511557132a1dbb3bcbf243267630bfec49db8518c7780","text":"Env var substitution in config","translated":"配置中的环境变量替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:56Z"} +{"cache_key":"8e5f833a1ebf122c23edb718754bcd685bfc77afbbac60eb1a2aff7234b60a27","segment_id":"index.md:a10f6ed8c1ddbc10","source_path":"index.md","text_hash":"a10f6ed8c1ddbc10d3528db7f7b6921c1dd5a5e78aa191ff017bf29ce2d26449","text":"⏱️ ","translated":"⏱️ ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:00Z"} +{"cache_key":"8e641ec66f3ae7edd18dd57ec47a5e61ff6ec0e585e0cbb966f09ebe803ed02f","segment_id":"index.md:ba5ec51d07a4ac0e","source_path":"index.md","text_hash":"ba5ec51d07a4ac0e951608704431d59a02b21a4e951acc10505a8dc407c501ee","text":")","translated":")","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:17Z"} +{"cache_key":"8e67881037945410ab1d9a08a670ff5947dfbd577da1a7c2d5c9fee74987194b","segment_id":"index.md:0eb95fb6244c03f1","source_path":"index.md","text_hash":"0eb95fb6244c03f1ccca696718a06766485c231347bf382424fb273145472355","text":"Quick start","translated":"快速开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:06Z"} +{"cache_key":"8e8e8756585cb2edf84845f3f8a7dfe14781b3b4acfe7ed6ef1d635aac3f4fef","segment_id":"start/wizard.md:1afc5c1f69b6ae2d","source_path":"start/wizard.md","text_hash":"1afc5c1f69b6ae2d91519459b548f196ead4eddba5882c0d3eb53032c35deee8","text":" so the Gateway stays up after logout.","translated":" 启用驻留,以便在注销后 Gateway 保持运行。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:22Z"} +{"cache_key":"8eb25fbece39afeec23d63e391e40f5e81d561838787d905058492ecc5a8b9df","segment_id":"index.md:15cd10b29ec14516","source_path":"index.md","text_hash":"15cd10b29ec1451670b80eae4b381e26e84fa8bdb3e8bea90ec943532411b189","text":" (@Hyaxia, ","translated":" (@Hyaxia, ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:51Z"} +{"cache_key":"8ebe2d251018b02257f263d2a16eff5974332bc1187abf5526d990777596d622","segment_id":"index.md:cf9f12b2c24ada73","source_path":"index.md","text_hash":"cf9f12b2c24ada73bb0474c0251333f65e6d5d50e56e605bdb264ff32ad0a588","text":"Config lives at ","translated":"配置文件位于 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:23Z"} +{"cache_key":"8f284740058a03d3e3f1eb5dce6f13b548a48866fa3b7bba381f06b93bc6fd88","segment_id":"environment.md:c2d7247c8acb83a5","source_path":"environment.md","text_hash":"c2d7247c8acb83a5a020458fa836c2445922b51513dbdbf154ab5f7656cb04e9","text":"; does not override).","translated":";不覆盖已有值)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:17Z"} +{"cache_key":"8f48c119b19172331a14c91c05b056ff50c806eac677b102b4ab6803687c663c","segment_id":"start/wizard.md:a274352ee48cdb04","source_path":"start/wizard.md","text_hash":"a274352ee48cdb048273ff9ca060d9f76b541a3df3e7d07cf07e4e8379475bb5","text":": on macOS the wizard checks Keychain item \"Claude Code-credentials\" (choose \"Always Allow\" so launchd starts don't block); on Linux/Windows it reuses ","translated":":在 macOS 上,向导会检查钥匙串项 \"Claude Code-credentials\"(请选择\"始终允许\"以避免 launchd 启动时被阻止);在 Linux/Windows 上,它会复用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:57Z"} +{"cache_key":"8f638ba10519facb8bb0ca4a86605815fdb2358aaaca87ffe1e56dd9c59c18f9","segment_id":"start/getting-started.md:de10e3b2385f09a3","source_path":"start/getting-started.md","text_hash":"de10e3b2385f09a36e17e5e94d04d1b40b50fb1ea489a406db4c032d69683001","text":"pairing defaults (secure DMs)","translated":"配对默认设置(安全私信)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:58Z"} +{"cache_key":"8f85617fbbf28b9de5f1702889a5b731fb69ca71be4e7baac5388814f0946226","segment_id":"index.md:297d5c673f5439aa","source_path":"index.md","text_hash":"297d5c673f5439aa31dca3bbc965cb657a89a643803997257defb3baef870f89","text":"Open the dashboard (local Gateway):","translated":"打开仪表盘(本地 Gateway):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:13Z"} +{"cache_key":"8f8728437e28a03d18e6b0dc21669ea86fcfd4ae6b89c60e7442baf1975436b7","segment_id":"index.md:aaa095329e21d86e","source_path":"index.md","text_hash":"aaa095329e21d86e24e8bec91bc001f7983d73a7a04c75646c0256448dac30ef","text":" — The space lobster who demanded a better name","translated":" — 那只要求取个更好名字的太空龙虾","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:44Z"} +{"cache_key":"8fd4298d2a5388956240bc02b51a7b6c227ce0a1397da46538c00af6a564e8c1","segment_id":"index.md:c3af076f92c5ed8d","source_path":"index.md","text_hash":"c3af076f92c5ed8dcb0d0b0d36dd120bc31b68264efea96cf8019ca19f1c13a3","text":"Troubleshooting","translated":"故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:59Z"} +{"cache_key":"9031f7b1b0d90eab21e7d9029bd4eb11f1ed5a9e0c9c5638082744c233c92e43","segment_id":"index.md:83f4fc80f6b452f7","source_path":"index.md","text_hash":"83f4fc80f6b452f7cdf426f6b87f08346d7a2d9c74a0fb62815dce2bfddacf63","text":" — A space lobster, probably","translated":" —— 大概是一只太空龙虾说的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:52Z"} +{"cache_key":"907c8f6a0763b469cdeb4bb64835922245714239ced9d3ed569f49fe760c3a54","segment_id":"index.md:9adcfa4aa10a4e8b","source_path":"index.md","text_hash":"9adcfa4aa10a4e8b991a72ccc45261cd64f296aed5b257e4caf9c87aff1290a0","text":" — Send and receive images, audio, documents","translated":" — 发送和接收图片、音频、文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:17Z"} +{"cache_key":"907e9eee8caead29b80ff841b945f1df714df32948bfa54c56cef29685b1bc00","segment_id":"index.md:b5ccaf9b1449291c","source_path":"index.md","text_hash":"b5ccaf9b1449291c92f855b8318aeb2880a9aa1a75272d17f55cf646071b3eae","text":"Gmail hooks (Pub/Sub)","translated":"Gmail 钩子(Pub/Sub)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:26Z"} +{"cache_key":"90c8b075eff65b5f916b6ffcb3f8305a95bb6c162e9f8cac12e7fecc3f2409b0","segment_id":"index.md:25d853ca04397b6a","source_path":"index.md","text_hash":"25d853ca04397b6ae248036d4d029d19d94a4981290387e5c29ef61b0eca9021","text":"Media: audio","translated":"媒体:音频","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:28Z"} +{"cache_key":"90eac59e70026b85f505d0d2bfe603ba2880721e5abafedd52bdeeaf21def2f5","segment_id":"start/getting-started.md:5ead037957578a63","source_path":"start/getting-started.md","text_hash":"5ead037957578a63002170be037d777c909bad991ab7ea1c606b55ddfa60ccad","text":"Alternative (global install):","translated":"替代方式(全局安装):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:53Z"} +{"cache_key":"917e181e50cd2d2f7596153167295a7294816bb3a66714820a4e205f06859a61","segment_id":"index.md:c0aa8fcb6528510a","source_path":"index.md","text_hash":"c0aa8fcb6528510aea46361e8c871d88340063926a8dfdd4ba849b6190dec713","text":": it is the only process allowed to own the WhatsApp Web session. If you need a rescue bot or strict isolation, run multiple gateways with isolated profiles and ports; see ","translated":":它是唯一被允许拥有 WhatsApp Web 会话 的进程。如果您需要救援机器人或严格隔离,请使用隔离的配置文件和端口运行多个网关;参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:33Z"} +{"cache_key":"91c6437ace26aa4f27b7bc4023db93c6cc1db80da1ebc4aea9d791e86fd125b5","segment_id":"start/wizard.md:67b696468610b879","source_path":"start/wizard.md","text_hash":"67b696468610b879ed7f224dbf6b0861f27e39d20454cb9d7af1ec52d3e5eeaa","text":"Dashboard","translated":"仪表盘","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:10Z"} +{"cache_key":"91d1558d4947a913141ec4bc1a247285174da3d016fcc62ed430c690fcad7dd3","segment_id":"index.md:f0e2018271f51504","source_path":"index.md","text_hash":"f0e2018271f515041084c8189f297236abe18f9ec77edad1a61c5413310bbd9e","text":"🖥️ ","translated":"🖥️ ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:00Z"} +{"cache_key":"91ff2d0607cc2fb36dcd28db903c8cd10df497a6ee53085072c1fab662322443","segment_id":"environment.md:f6b2ffe1d0d5f521","source_path":"environment.md","text_hash":"f6b2ffe1d0d5f521b76cabc67d6e96da2b1170eef8086d530558e9906a7f092d","text":"Models overview","translated":"模型 概述","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:36Z"} +{"cache_key":"92f138d40ad656de1f7508a72408aa280eb1010d096114a30af97085d0bfa447","segment_id":"start/wizard.md:42db531f91673e36","source_path":"start/wizard.md","text_hash":"42db531f91673e36e120292f33152cd0e1e53087f5668f4fec8e519809ee8d85","text":"macOS: LaunchAgent","translated":"macOS:LaunchAgent","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:10Z"} +{"cache_key":"93114bd8806e7d10e3c22b3415d23eec041357c24c8f6dc651d62cacc41ad375","segment_id":"start/getting-started.md:69c1cae4e20f3b2b","source_path":"start/getting-started.md","text_hash":"69c1cae4e20f3b2b4d3b3dd3ea7636d8faed8460af512aa7a7d3a3c09696f5fc","text":" Bun has known issues with these\nchannels. If you use WhatsApp or Telegram, run the Gateway with ","translated":" Bun 在这些渠道上存在已知问题。如果您使用 WhatsApp 或 Telegram,请使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:03Z"} +{"cache_key":"9332e0a6cbeffb7af77e26039be6a3fb42905022a7775699a3ff6aa4cd6bb862","segment_id":"start/wizard.md:5e52bafa51b66711","source_path":"start/wizard.md","text_hash":"5e52bafa51b667115904e942882f5aaf55262059621f3927b0d5699e08512c56","text":"DM security: default is pairing. First DM sends a code; approve via ","translated":"私信安全:默认为配对模式。首次私信会发送一个验证码;通过 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:02Z"} +{"cache_key":"93a02264b644d55b3fd01345f4e180207ab2e42e653686393c45e736ef355f86","segment_id":"environment.md:baa5be7f6320780b","source_path":"environment.md","text_hash":"baa5be7f6320780bd7bb7b7ddbb8cd1ffb26ccf7d94d363350668c50aedcf95f","text":" (applied only if missing).","translated":" (仅在缺失时应用)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:27Z"} +{"cache_key":"93e072d0402b8e5c6f32b9aabff58f378e0ceaf8815886e0b5a873fad83f9e36","segment_id":"environment.md:ab5aec4424cf678d","source_path":"environment.md","text_hash":"ab5aec4424cf678dcfb1ad3d2c2929c1e0b2b1ff61b82b961ada48ad033367b4","text":" (dotenv default; does not override).","translated":" (dotenv 默认行为;不会覆盖)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:11Z"} +{"cache_key":"93e5b6f997f3fd1199e507267858a37604727435b4fbbe418b39b953e7102fa6","segment_id":"environment.md:a258b30f88c30650","source_path":"environment.md","text_hash":"a258b30f88c30650e73073d5bdde5cfcc6987100ae62d37789e5c46a0d85b7c6","text":"Global ","translated":"全局 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:13Z"} +{"cache_key":"93ed507f9f7ad50ae11b95d49a6d547ac605a4bb966e1d9800da110bf2f85ff6","segment_id":"index.md:5583785669449fc8","source_path":"index.md","text_hash":"5583785669449fc81a8037458c908c11a8f345c21c28f7f3a95de742bd52199a","text":"Media Support","translated":"媒体支持","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:15Z"} +{"cache_key":"93f8819a09c973fae0ec648305d9c7e50ebee3771359b807686c605023b0b705","segment_id":"start/getting-started.md:eba2ed5d6cc0239d","source_path":"start/getting-started.md","text_hash":"eba2ed5d6cc0239dd5d0475d7ea57b120ff06eb1100c67f4cf713c3bb167f0a0","text":": Node (recommended; required for WhatsApp/Telegram). Bun is ","translated":":Node(推荐;WhatsApp/Telegram 必需)。Bun 为 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:19Z"} +{"cache_key":"94142aa44168395437a427ea262b059160a067ce005c11ceedb11f664eeec66e","segment_id":"start/wizard.md:3b0c9c223937ca13","source_path":"start/wizard.md","text_hash":"3b0c9c223937ca1308ceb186bb6cde91e811d0fefedcdf119c47e4d7cf58ec9a","text":"The Gateway exposes the wizard flow over RPC (","translated":"Gateway 通过 RPC 暴露向导流程(","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:43Z"} +{"cache_key":"9425ad8ab2d143b8d1558adc989c0b4416bf7144082034f0eb317527934e9936","segment_id":"index.md:d00eca1bae674280","source_path":"index.md","text_hash":"d00eca1bae6742803906ab42a831e8b5396d15b6573ea13c139ec31631208ec1","text":"Getting Started","translated":"快速入门","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:44Z"} +{"cache_key":"943aadb2a660dc3c85e9c5e1581741edaf50fd5be23f87f43f509ea1cdf162f0","segment_id":"index.md:add4778f9e60899d","source_path":"index.md","text_hash":"add4778f9e60899d7f44218483498c0baf7a0468154bc593a60747ee769c718c","text":"Android node","translated":"Android 节点","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:15Z"} +{"cache_key":"944265cf5c15fd945a3ceb8d27730e4839e78556bcec52463b9e83467b63df5f","segment_id":"start/wizard.md:d13b8b4ebb7477f9","source_path":"start/wizard.md","text_hash":"d13b8b4ebb7477f96681a90cc723fa7532710b595d8aba6f9a840f47299515fd","text":"macOS app onboarding: ","translated":"macOS 应用上手引导: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:49:02Z"} +{"cache_key":"9481b030bd57d871b28ddf5316096a8cc8fc1fc317bd03e508a5d9239e3d93c5","segment_id":"start/getting-started.md:aeba20c4d03f146e","source_path":"start/getting-started.md","text_hash":"aeba20c4d03f146e967a7b748d8dee3859c34b0de6b6402851edd2ea08f9b09a","text":"5) DM safety (pairing approvals)","translated":"5)私信安全(配对审批)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:36Z"} +{"cache_key":"94a860b1ca3e9303574016027c1e3c170689f08e72bfd49acb315353f38633e8","segment_id":"environment.md:6f59001999ef7b71","source_path":"environment.md","text_hash":"6f59001999ef7b7128bab80d2034c419f3034497e05f69fbdf67f7b655cdc173","text":"Configuration: Env var substitution","translated":"配置:环境变量替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:17:05Z"} +{"cache_key":"94dd1cb509ea10b9fce425cbde9d55373457d90dd1ccd06ffe6362643b29cce2","segment_id":"start/wizard.md:4d5278f9b1f0b84c","source_path":"start/wizard.md","text_hash":"4d5278f9b1f0b84c0ad3f87ffbbd6ed35b2d223c2eb2f866682026b9d00e636d","text":"Token if the remote Gateway requires auth (recommended)","translated":"如果远程 Gateway 需要认证,则需提供令牌(推荐)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:23Z"} +{"cache_key":"950eae91a2abdbc1062fa1fb78a43a5b2883dda0245c95c5b02bceac0c1bfbc9","segment_id":"start/wizard.md:d6c64db69399b7ae","source_path":"start/wizard.md","text_hash":"d6c64db69399b7ae55bae206d47ae2efa6071a8e49f7cf1cd793d5994b5c2976","text":" to create a separate agent with its own workspace,\nsessions, and auth profiles. Running without ","translated":" 创建一个拥有独立工作区、会话和认证配置的单独智能体。不使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:50Z"} +{"cache_key":"958b1f38beeaa4e69690d389ff0191ffc0c3a9f97863ccc3c17a11097ec4c512","segment_id":"help/index.md:frontmatter:summary","source_path":"help/index.md:frontmatter:summary","text_hash":"aece82a2d540ab1a9a21c7b038127cae6e9db2149491564bb1856b6f8999f205","text":"Help hub: common fixes, install sanity, and where to look when something breaks","translated":"帮助中心:常见修复方法、安装完整性检查,以及出问题时该去哪里排查","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:23Z"} +{"cache_key":"95aad0f0fde6668b0ddea6c8212249c754769fe12739b8338c427f21860c8c7b","segment_id":"start/wizard.md:96192b2485e20320","source_path":"start/wizard.md","text_hash":"96192b2485e203201d62348dde087408b660e53f1df0fe65728759e16fac82bb","text":"Anthropic token (paste setup-token)","translated":"Anthropic 令牌(粘贴 setup-token)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:02Z"} +{"cache_key":"95b902406b2a68302a809d07f80f069bf4bac5d96fec5e55b4d76f4863492faf","segment_id":"environment.md:87e89abb4c1c551f","source_path":"environment.md","text_hash":"87e89abb4c1c551fe08d355d097f18b8de78edca5f556997085681662fce8eed","text":"Config ","translated":"配置 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:09Z"} +{"cache_key":"9638dca44bfb62a1f8c5f57d97d7c5636eb72da5567b4aa587b1cfd25592df76","segment_id":"environment.md:5b06ccc0bf4ede1b","source_path":"environment.md","text_hash":"5b06ccc0bf4ede1b00437d274b91d1a22cf7c0dc421b279348d9e333505fd264","text":" shell/daemon).","translated":" shell/守护进程中获得的内容)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:38Z"} +{"cache_key":"96fd19674037838fbf4ae365f247dad43d7d88f1eafecdd40527df1305639695","segment_id":"start/getting-started.md:73fc16837b0a6b13","source_path":"start/getting-started.md","text_hash":"73fc16837b0a6b13c23d4100f65a5e58460aac38cd66f884c5884b74a553f93a","text":"Control UI","translated":"控制界面","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:42Z"} +{"cache_key":"972e8e07b8a59145f0ed3291dc6b3f72f715e8299cd2078abe5588c64819a265","segment_id":"start/wizard.md:cdb4ee2aea69cc6a","source_path":"start/wizard.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":"。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:13Z"} +{"cache_key":"975f5db56766c17a2b10af9d74333f67595593ac0a6513b908618c296cc4f605","segment_id":"index.md:3d8fed7c358b2ccf","source_path":"index.md","text_hash":"3d8fed7c358b2ccf225ee16857a0bb9b950fd414319749e0f6fff58c99fa5f22","text":"Subscription auth","translated":"订阅认证","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:51Z"} +{"cache_key":"9767a108ed5a174a4fd54d7d9c6213f6d294afe78f1a08a32f46eb624ee3c424","segment_id":"start/wizard.md:0ba91e19ba6d7b97","source_path":"start/wizard.md","text_hash":"0ba91e19ba6d7b970cdd563b05fd2c5f32751202c010c6c5adf4e40044023ed3","text":"Daemon install","translated":"守护进程安装","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:07Z"} +{"cache_key":"97b2e80f9008ad199527a8380466b8cb9e08c9f7bd52256f899ddd77b0c7f060","segment_id":"index.md:d00eca1bae674280","source_path":"index.md","text_hash":"d00eca1bae6742803906ab42a831e8b5396d15b6573ea13c139ec31631208ec1","text":"Getting Started","translated":"入门指南","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:07Z"} +{"cache_key":"97d83391e42ba7d3c2019f295e24a2981299c23dab40af45fab4ebd24ec272d7","segment_id":"environment.md:f15f5f9f4ef4d668","source_path":"environment.md","text_hash":"f15f5f9f4ef4d6688876c894f8eba251ed1db6eaf2209084028d43c9e76a8ba1","text":" (aka ","translated":" (即 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:20Z"} +{"cache_key":"97db9a094700b6722c7d627483ea58cf2263ec4a343062563c166cab96c324ca","segment_id":"index.md:fb87b8dba88b3edc","source_path":"index.md","text_hash":"fb87b8dba88b3edced028edfe2efa5f884ab2639c1b26efa290ccd0469454d25","text":"Slash commands","translated":"斜杠命令","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:29Z"} +{"cache_key":"97e64a162c2ed197b0aabfd9479dfc8f8a2be8f754e8170e70e152327f02fe5e","segment_id":"index.md:ee8b06871d5e335e","source_path":"index.md","text_hash":"ee8b06871d5e335e6e686f4e2ee9c9e6de5d389ece6636e0b5e654e0d4dd5b7e","text":"Control UI (browser)","translated":"控制界面(浏览器)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:43Z"} +{"cache_key":"983385317e20206e673531fcf329991718de8cd556d261974454832bf1222781","segment_id":"start/wizard.md:69f2e29c4496ba8d","source_path":"start/wizard.md","text_hash":"69f2e29c4496ba8d72788bdc5326ed5a74751c5b6e67115cd9a641ab49520997","text":" for a machine‑readable summary.","translated":" 以获取机器可读的摘要。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:17Z"} +{"cache_key":"986141bb219554b112fbaaa6ab9722f121b126f35d306b6398dae0e0d9d0fbcb","segment_id":"help/index.md:71095a6d42f5d9c2","source_path":"help/index.md","text_hash":"71095a6d42f5d9c2464a8e3f231fc53636d4ce0f9356b645d245874162ec07e2","text":"Gateway troubleshooting","translated":"Gateway 故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:46Z"} +{"cache_key":"9878b9b1f86218e0cf79b700dbb48857de209bbeb665a370642c6f25490ef0a3","segment_id":"start/wizard.md:d143f4078cca268c","source_path":"start/wizard.md","text_hash":"d143f4078cca268c9d6d569cbd06460e7ccc5af0a487c42e655ff1e1587b69fb","text":"Java 21","translated":"Java 21","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:12Z"} +{"cache_key":"98946553d70879085d2c248422199de47fecde1138aa7d97301da8415f5dd7a9","segment_id":"index.md:1074116f823ec992","source_path":"index.md","text_hash":"1074116f823ec992e76d7e8be19d3235fec5ddd7020562b06e7242e410174686","text":"Remote use","translated":"远程使用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:19Z"} +{"cache_key":"98ccfc4d8aa8cbec392810df9c7ec0169da2595e35ee80950d991a26cee1dd8d","segment_id":"index.md:15cd10b29ec14516","source_path":"index.md","text_hash":"15cd10b29ec1451670b80eae4b381e26e84fa8bdb3e8bea90ec943532411b189","text":" (@Hyaxia, ","translated":" (@Hyaxia, ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:18Z"} +{"cache_key":"98d3cdf18a2db583a11d3eb9c8159f58997167f3983c6d8d64b80328eddb1b19","segment_id":"environment.md:aac7246f5e97142c","source_path":"environment.md","text_hash":"aac7246f5e97142c3f257b7d8b84976f10c29e1b89804bb9d3eb7c43cc03cb8e","text":"Environment variables","translated":"环境变量","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:49Z"} +{"cache_key":"98d73d2aa5399573ee48d8f16092a00b1d2eadae28493c02ff77524338175f2e","segment_id":"help/index.md:156597e2632411d1","source_path":"help/index.md","text_hash":"156597e2632411d1d5f634db15004072607ba45072a4e17dfa51790a37b6781f","text":"Gateway issues:","translated":"Gateway 问题:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:17Z"} +{"cache_key":"98ea6f91820d8c3481102e31672db08e7244fe1323f120f2fd8e61e89b94335d","segment_id":"index.md:9abe8e9025013e78","source_path":"index.md","text_hash":"9abe8e9025013e78a6bf2913f8c20ee43134ad001ce29ced89e2af9c07096d8f","text":"Media: images","translated":"媒体:图片","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:59Z"} +{"cache_key":"99777f2060729ab9a46bd52bd1987164d05761c7d99620992bc4cd4faaf79fdf","segment_id":"start/wizard.md:355a68267542db8b","source_path":"start/wizard.md","text_hash":"355a68267542db8b128049bdf8c3a39dda00fb9534370564874c04752aac8cd4","text":"which stores ","translated":"它会将 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:23Z"} +{"cache_key":"99d81c989d83fd644fbd647a5b6e583ccd7f640ef687e5a62751e2c1da8ba138","segment_id":"environment.md:e8c89c33e900bb9b","source_path":"environment.md","text_hash":"e8c89c33e900bb9b97f9c3b025f349fd3d91202293f3eff66c7fb4de7da892b6","text":" enabled.","translated":" 启用,shell 导入仍会运行。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:27Z"} +{"cache_key":"99ec1731cc9a06b32983cce57635d9b8df9ac1989c84ec9406049fba273998a4","segment_id":"environment.md:b1d6b91b67c2afa5","source_path":"environment.md","text_hash":"b1d6b91b67c2afa5e322988d9462638d354ddf8a1ef79dba987f815c22b4baee","text":" at ","translated":" 位于 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:12Z"} +{"cache_key":"99fddd046201ffe3b168ecf4215f0360e5fd2691e6027266a31bf76b2882ab71","segment_id":"start/wizard.md:a30cb0435098e376","source_path":"start/wizard.md","text_hash":"a30cb0435098e3761bf442f8085eb0abbc96b38de185a291bfc09c2c31540b51","text":"OpenAI Code (Codex) subscription (Codex CLI)","translated":"OpenAI Code (Codex) 订阅 (Codex CLI)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:09Z"} +{"cache_key":"99fe8d690ab356c552c582382dc05f3b5f26bedd3ccc366caa37f9ed80844213","segment_id":"start/wizard.md:a276c16f5217dcae","source_path":"start/wizard.md","text_hash":"a276c16f5217dcaede2670c6683c189989c1ef08d928f3cd563b92bf138a42ea","text":"Primary entrypoint:","translated":"主要入口:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:05Z"} +{"cache_key":"9a064e63d5ae22ffdcaf42bd4bf73604e1a87c082e0195db4c3d382a48d1276c","segment_id":"start/wizard.md:f56c761705123bae","source_path":"start/wizard.md","text_hash":"f56c761705123bae6b46571f53cc1d68b2da4a34b76aaf5c76a47438f42e2d8b","text":"/concepts/oauth","translated":"/concepts/oauth","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:36Z"} +{"cache_key":"9a6e0001bdbf4e254feed1fae82e1c51386ae1721b274ba14a89c4efe47ef794","segment_id":"environment.md:8d076464a84995bc","source_path":"environment.md","text_hash":"8d076464a84995bc095e934b0aa1e4419372f27cd71d033571e4dbba201ee5d8","text":"You can reference env vars directly in config string values using ","translated":"您可以使用以下方式在配置字符串值中直接引用 环境变量 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:18Z"} +{"cache_key":"9a6ff65f8974f826fabad2312ba3e0b54a6288f56782335b2ce21d931fe6b30a","segment_id":"start/getting-started.md:996c32b35f2182a9","source_path":"start/getting-started.md","text_hash":"996c32b35f2182a9c83815395113f92344269ebb4ab3525017c4cafaa3d1a8fd","text":"Providers","translated":"提供商","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:09Z"} +{"cache_key":"9a7478d471c30618239146c8b7adbd3669fd552a2fafba13cc6dc8b51c083243","segment_id":"index.md:a194ca16424ddd17","source_path":"index.md","text_hash":"a194ca16424ddd17dacc45f1cbd7d0e41376d8955a7b6d02bc38c295cedd04e4","text":"RPC adapters","translated":"RPC 适配器","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:25Z"} +{"cache_key":"9aaaeb76bc162fe216b19290b0978994ad43023335a81224b65bf7e4849ed5b6","segment_id":"index.md:frontmatter:summary","source_path":"index.md:frontmatter:summary","text_hash":"891b2aa093410f546b89f8cf1aa2b477ba958c2c06d2ae772e126d49786df061","text":"Top-level overview of OpenClaw, features, and purpose","translated":"OpenClaw 的顶层概述、功能和用途","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:18Z"} +{"cache_key":"9b0b553b6bb64b97bc340190fc4f10febadb5c4542122d2dea4661534f60b8b6","segment_id":"index.md:a10f6ed8c1ddbc10","source_path":"index.md","text_hash":"a10f6ed8c1ddbc10d3528db7f7b6921c1dd5a5e78aa191ff017bf29ce2d26449","text":"⏱️ ","translated":"⏱️ ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:04Z"} +{"cache_key":"9bb6f5ad39ff9d7aff3bca1fda6f474e19f25c0ffaaffaf3b19c924234d8c03a","segment_id":"index.md:f0d82ba647b4a33d","source_path":"index.md","text_hash":"f0d82ba647b4a33da3008927253f9bed21e380f54eab0608b1136de4cbff1286","text":"OpenClaw bridges WhatsApp (via WhatsApp Web / Baileys), Telegram (Bot API / grammY), Discord (Bot API / channels.discord.js), and iMessage (imsg CLI) to coding agents like ","translated":"OpenClaw 将 WhatsApp(通过 WhatsApp Web / Baileys)、Telegram(Bot API / grammY)、Discord(Bot API / 渠道.discord.js)和 iMessage(imsg CLI)桥接到编程 智能体,例如 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:31Z"} +{"cache_key":"9c03abf2c27129fa2698e7640a7b9add5936e84cf6d779d5f189bf9a27940aa6","segment_id":"index.md:310cc8cec6b20a30","source_path":"index.md","text_hash":"310cc8cec6b20a3003ffab12f5aade078a0e7a7d6a27ff166d62ab4c3a1ee23d","text":"If you ","translated":"如果你 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:25Z"} +{"cache_key":"9c11b2ec1c922e332f69000a8a937f0a2318b5356faa6278a7580cc49c3526d5","segment_id":"index.md:e47cdb55779aa06a","source_path":"index.md","text_hash":"e47cdb55779aa06a74ae994c998061bd9b7327f5f171c141caf2cf9f626bfe4b","text":"Peter Steinberger","translated":"Peter Steinberger","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:52Z"} +{"cache_key":"9c2360243508b8766d5d9813350a4c3153aeb8349b8ddf8f214ba33983b71f50","segment_id":"environment.md:1ec31258a6b45ea9","source_path":"environment.md","text_hash":"1ec31258a6b45ea903cd76f5b0190a99ab56afff6241a04f0681eb12b7a02484","text":"Env var equivalents:","translated":"环境变量 等效项:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:21Z"} +{"cache_key":"9c32d4d41cfaa814eacd6b9157f02b4ae0f9824751479280fd755479974d0695","segment_id":"index.md:ba5ec51d07a4ac0e","source_path":"index.md","text_hash":"ba5ec51d07a4ac0e951608704431d59a02b21a4e951acc10505a8dc407c501ee","text":")","translated":")","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:53Z"} +{"cache_key":"9c583361a5ae41c801a429bb6666f9a7b2ec6705ff7f1446fcf6281b40f2d5da","segment_id":"index.md:b332c3492d5eb10a","source_path":"index.md","text_hash":"b332c3492d5eb10a118eb6d8b0dcd689bc2477ce2ae16b303753b942b54377bc","text":"Configuration","translated":"配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:25Z"} +{"cache_key":"9c80e959862fdf2310d9719e9854c2424bb1e2fa55aabcde8b5caf060184bd85","segment_id":"start/wizard.md:197b37e09b318165","source_path":"start/wizard.md","text_hash":"197b37e09b3181655a23576caec90510709eacfecd39d7c55d9dca93cccaac9a","text":"npm / pnpm","translated":"npm / pnpm","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:49Z"} +{"cache_key":"9cbdb7ff14fdd8d015b7bcce3b3c0d48b1711e631ff86cae2c699684f8e4d143","segment_id":"start/wizard.md:c4b2896a2081395e","source_path":"start/wizard.md","text_hash":"c4b2896a2081395e282313d6683f07c81e3339ef8b9d2b5a299ea5b626a0998f","text":").","translated":")。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:17Z"} +{"cache_key":"9d44e8f510b7e2cf5ea7b08188a9c606937bc3db8c49e22d903828b34b8b04c1","segment_id":"start/wizard.md:19f53c2ccaf19969","source_path":"start/wizard.md","text_hash":"19f53c2ccaf199696e23d43812941e23fed0625900d2a551533304d6ca1980f6","text":" install or change anything on the remote host.","translated":" 在远程主机上安装或更改任何内容。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:40Z"} +{"cache_key":"9d7b3ce341253f712ecd8b4ca661ae0a6d85b1ee8e8ddf00b1ec02ca13d67237","segment_id":"help/index.md:569ca49f4aaf7846","source_path":"help/index.md","text_hash":"569ca49f4aaf7846e952c1d4aeca72febd0b79fa1c4f9db08fd3127551218572","text":"Install","translated":"安装","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:41Z"} +{"cache_key":"9db03f9dc7b789dbc3b4115e9b644cd22de2a63adeed02eb3b403a223d96b819","segment_id":"index.md:2b402c90e9b15d9c","source_path":"index.md","text_hash":"2b402c90e9b15d9c3ef65c432c4111108f54ee544cda5424db46f6ac974928e4","text":"🔐 ","translated":"🔐 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:14Z"} +{"cache_key":"9e0b7ed9895b612971d582145c837e95bfec8b051c6bccddd008d56dff778711","segment_id":"start/wizard.md:28d03596d24eeb4e","source_path":"start/wizard.md","text_hash":"28d03596d24eeb4eab2d6fe21ca1cb95be7cb1fa6f92933db05e2cc4f4cdfa06","text":"Skip","translated":"跳过","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:16Z"} +{"cache_key":"9e3a338fc3d6bce679ff4711d74e67c66877245b6ebd2c2a08f182a3a788dae6","segment_id":"start/getting-started.md:fd82e54418ec23cd","source_path":"start/getting-started.md","text_hash":"fd82e54418ec23cda00219878eaf76c3b37337b3dcb7560a941db6a0d2ec249e","text":": background install (launchd/systemd; WSL2 uses systemd)","translated":":后台安装(launchd/systemd;WSL2 使用 systemd)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:15Z"} +{"cache_key":"9e9a7f1005f6c8fc07bbbcded4f31d4f5564a378e2c4af541dbe1c1315165fa2","segment_id":"environment.md:b1d6b91b67c2afa5","source_path":"environment.md","text_hash":"b1d6b91b67c2afa5e322988d9462638d354ddf8a1ef79dba987f815c22b4baee","text":" at ","translated":" 位于 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:17Z"} +{"cache_key":"9f18072e77601b529d2c7b3ccba29effcace5e2ff848e7dc253434f6bbc94d39","segment_id":"start/getting-started.md:aa7fc908228260b4","source_path":"start/getting-started.md","text_hash":"aa7fc908228260b49b7837767419fdb1ab6be7f1a6930175fd00795cb1bd19fc","text":"Daemon","translated":"守护进程","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:13Z"} +{"cache_key":"9f321a29940495419d67ad4ba9b74534941c03957df80c8ddd22d40e2ed71d9c","segment_id":"environment.md:907940a35852447a","source_path":"environment.md","text_hash":"907940a35852447aad5f21c5a180d993ff31cfd5807b1352ed0c24eabe183465","text":"never override existing values","translated":"永远不覆盖已有的值","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:24Z"} +{"cache_key":"9f8debe489928579a649aee67a82d66af48bb993e545843a1ba939323fd52594","segment_id":"index.md:frontmatter:read_when:0","source_path":"index.md:frontmatter:read_when:0","text_hash":"08965a8ab25e66157009d1617fc167bcc2404fa0c0ca50b1e5e5750957be3b10","text":"Introducing OpenClaw to newcomers","translated":"向新用户介绍 OpenClaw","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:45Z"} +{"cache_key":"9f97e722bb08309f9f0490ef497ed3b8e9b5b00071c59dde29a3dd9471da6389","segment_id":"start/wizard.md:1bf470ef04c760ee","source_path":"start/wizard.md","text_hash":"1bf470ef04c760eeab30f680b75729f851e0045bd0c63a9f5fc56a8e3562b193","text":"Requires a logged-in user session; for headless, use a custom LaunchDaemon (not shipped).","translated":"需要已登录的用户会话;对于无头模式,请使用自定义 LaunchDaemon(未随附)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:14Z"} +{"cache_key":"9fd51e3ee4b19d2de868d2b4e8811d44509bdc07ae4fc5c9ad3f9cdffff41b4f","segment_id":"start/wizard.md:483a226d3bf316d4","source_path":"start/wizard.md","text_hash":"483a226d3bf316d46abacada3304da39fddb44f53ff4eb0cb627061a9ab44cab","text":" so launchd can read it.","translated":" 以便 launchd 可以读取。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:30Z"} +{"cache_key":"9fe10747da6ed5a4362c668166c1501624c52fc26255cde686f999a17e6186ca","segment_id":"environment.md:cda454f61dfcac70","source_path":"environment.md","text_hash":"cda454f61dfcac7007a9edc538f9f58cf38caa0652e253975979308162bccc53","text":"Gateway configuration","translated":"Gateway 配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:32Z"} +{"cache_key":"9fe3f448ea4b66ae71aaa710f4684b854e1de585336fa81f594ab40d91843b3c","segment_id":"help/index.md:bfc5930cc2660330","source_path":"help/index.md","text_hash":"bfc5930cc2660330260afd407e98d86adaec0af48dd72b88dc33ef8e9066e2c9","text":"Install sanity (Node/npm/PATH):","translated":"安装完整性检查(Node/npm/PATH):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:14Z"} +{"cache_key":"9ff4e3a77b7395b11a7ccb909093b21c475fe55afff74e5f7e5d2d8e6122b424","segment_id":"index.md:8fdfb6437318756c","source_path":"index.md","text_hash":"8fdfb6437318756c950bf2261538f06236e36040986891fa7b43452b987fb9f3","text":" — an AI, probably high on tokens","translated":" — 大概是一个嗑多了 token 的 AI 说的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:25Z"} +{"cache_key":"9ff80a7969b1f50607f2046588db0ff9bfa745245e27cd65bcd5f3f5a7181354","segment_id":"start/wizard.md:6ea5cd459d660a33","source_path":"start/wizard.md","text_hash":"6ea5cd459d660a33a88276c5483ca067aaefa500b8b349067ed7eaeda6d871a8","text":"No remote installs or daemon changes are performed.","translated":"不会执行远程安装或守护进程更改。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:29Z"} +{"cache_key":"a00706550adc72d0953bfca3d2d9ba92c66c2462d8110da48a062d7618ab3092","segment_id":"index.md:10bf8b343a32f7dc","source_path":"index.md","text_hash":"10bf8b343a32f7dc01276fc8ae5cf8082e1b39c61c12d0de8ec9b596e115c981","text":"WebChat","translated":"WebChat","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:08Z"} +{"cache_key":"a05d1b3ace09d73190450de5094411e34c68a30679d27f7485cd5077e6eb93b4","segment_id":"environment.md:frontmatter:summary","source_path":"environment.md:frontmatter:summary","text_hash":"78351223e7068721146d2de022fdf440c2866b2ee02fbbb50bf64369b999820b","text":"Where OpenClaw loads environment variables and the precedence order","translated":"OpenClaw 加载环境变量的位置及优先级顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:07Z"} +{"cache_key":"a066cc68d6f3b2d3eb59c1a8859348223e884c87eb512c19cde3cb5e14ebc7ca","segment_id":"start/wizard.md:ab744fe26b887abd","source_path":"start/wizard.md","text_hash":"ab744fe26b887abdb3558472d5bfe074f2716bbd88c8fab2b86bc745cbe7cf52","text":"Tip: ","translated":"提示: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:45Z"} +{"cache_key":"a08b0f8129a90b28e13de7f9610a1f2d9421d75eed227b3d4036c3bfb91b06c5","segment_id":"start/wizard.md:fbb0f1b48888c121","source_path":"start/wizard.md","text_hash":"fbb0f1b48888c1213ed6d214e58b88f98b885fde7be5ea69b81caa8d32ffce29","text":"Sets ","translated":"设置 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:20Z"} +{"cache_key":"a09638c50f961a7ca5d6f411261c7dbc4a1c70677b9b54dd69f7c19300035a18","segment_id":"environment.md:baa5be7f6320780b","source_path":"environment.md","text_hash":"baa5be7f6320780bd7bb7b7ddbb8cd1ffb26ccf7d94d363350668c50aedcf95f","text":" (applied only if missing).","translated":" (仅在缺失时应用)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:53Z"} +{"cache_key":"a09a1449f338df66eb814dfd44c4ba2fb803af25fdb880365d9656fd10e68896","segment_id":"index.md:1eb6926214b56b39","source_path":"index.md","text_hash":"1eb6926214b56b396336f22c22a6f8a4c360cfe7109c8be0f9869655b9ff6235","text":"Pairing (DM + nodes)","translated":"配对(私聊 + 节点)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:07Z"} +{"cache_key":"a09eb80d6a469c1f8c38b2f519e5563d3e70b0c6d437c1379f9a1218996f56cb","segment_id":"index.md:frontmatter:read_when:0","source_path":"index.md:frontmatter:read_when:0","text_hash":"08965a8ab25e66157009d1617fc167bcc2404fa0c0ca50b1e5e5750957be3b10","text":"Introducing OpenClaw to newcomers","translated":"向新用户介绍 OpenClaw","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:27:26Z"} +{"cache_key":"a0a0b7d915a1d0f6cdedf629867e973881d7354388fd9ce112d4863e6d5e8e2f","segment_id":"start/wizard.md:656458ef5481a088","source_path":"start/wizard.md","text_hash":"656458ef5481a0885762810b02f1a4c75c6f6ffa968fd85028b9e810f5e1219f","text":"Re-running the wizard does ","translated":"重新运行向导 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:10Z"} +{"cache_key":"a0ba382a0fbf8fd57a0f05d2058dbf6147bcd4387a60e8b082c2009fc31db28b","segment_id":"help/index.md:3c33340bd23b8db8","source_path":"help/index.md","text_hash":"3c33340bd23b8db89f18fe7d05a954738c0dd5ba9623cf6bdb7bb5d1a3729cfc","text":"FAQ (concepts)","translated":"常见问题(概念)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:38Z"} +{"cache_key":"a0c0d04dc411248ead0dc8669af49162ca2857cc967670a1db53f5350ef36c7a","segment_id":"help/index.md:8ddb7fc8a87904de","source_path":"help/index.md","text_hash":"8ddb7fc8a87904dedc2afc16400fbe4e78582b302e01c30b1319c8a465d04684","text":"Troubleshooting:","translated":"故障排除:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:20Z"} +{"cache_key":"a0d2cd21a3b93f857394aa3ed248a36130e8edfcf329e3cf57411efb04382e5a","segment_id":"environment.md:f7e239a42b7cd986","source_path":"environment.md","text_hash":"f7e239a42b7cd986a1558fed234e975ed2e96e9d37cf0a93f381778c461c89dd","text":"OpenClaw pulls environment variables from multiple sources. The rule is ","translated":"OpenClaw 从多个来源获取环境变量。规则是 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:17Z"} +{"cache_key":"a0e99af5ca5e84733312e288abcca135768e88eccf093eceeb670be82e40d41f","segment_id":"help/index.md:24669ff48290c187","source_path":"help/index.md","text_hash":"24669ff48290c1875d8067bbd241e8a55444839747bffb8ab99f3a34ef248436","text":"Doctor","translated":"诊断工具","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:35Z"} +{"cache_key":"a21eca32ff057c4ce091d2964d7860ed8ec2edc05aa6c20fefc81f158d396755","segment_id":"help/index.md:729bc562eec2658b","source_path":"help/index.md","text_hash":"729bc562eec2658bd11ffdd522fe5277177dc73e86eaca7baac0b472a4d8f8b2","text":"If you’re looking for conceptual questions (not “something broke”):","translated":"如果你在寻找概念性问题(而不是\"出了问题\"):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:01Z"} +{"cache_key":"a235aca76de620b9ed0805727dc5f142a660dc6dac3254a01531acad96cb084d","segment_id":"index.md:d53b75d922286041","source_path":"index.md","text_hash":"d53b75d9222860417f783b0829023b450905d982011d35f0e71de8eed93d90fc","text":"New install from zero:","translated":"从零开始全新安装:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:05Z"} +{"cache_key":"a28528856eac855eaf431dc468f5d1a9b3918df6dc73a9bb54c488aa7c23faad","segment_id":"start/getting-started.md:387847437e10c06c","source_path":"start/getting-started.md","text_hash":"387847437e10c06cae87567a6579b38e71849aea9c2355eba4a8d090418360b9","text":"The wizard can write tokens/config for you. If you prefer manual config, start with:","translated":"向导可以为您写入令牌/配置。如果您更喜欢手动配置,请从以下内容开始:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:19Z"} +{"cache_key":"a28d9fd85bfd4afc9a62b3cfe12607c86001b32a9a97d72eeb6cd50993fb51ee","segment_id":"index.md:c6e91f3b51641b1c","source_path":"index.md","text_hash":"c6e91f3b51641b1c43d297281ee782b40d9b3a0bdd7afc144ba86ba329d5f95f","text":"OpenClaw = CLAW + TARDIS","translated":"OpenClaw = CLAW + TARDIS","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:04Z"} +{"cache_key":"a2c462e51d228b070aba2a14a09d41aa54e0962d795724d5a090c71c7e242dfe","segment_id":"start/getting-started.md:acdd1e734125f341","source_path":"start/getting-started.md","text_hash":"acdd1e734125f341604c0efbabdcc4c4b0597e8f6235d66c2445edd1812838c1","text":"Telegram","translated":"Telegram","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:22Z"} +{"cache_key":"a2f08193fbeb8a9400b75d96157bbbf488ab3aa51d50658094d00bb841646217","segment_id":"help/index.md:2adc964c084749b1","source_path":"help/index.md","text_hash":"2adc964c084749b1f2d8aef24030988b667dbda2e38a6a1699556c93e07c1cea","text":"Start here","translated":"从这里开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:37Z"} +{"cache_key":"a32d46351380765e1ec38639781fc9e5abaccdf74240eee7ab685f570551f487","segment_id":"index.md:7d8b3819c6a9fb72","source_path":"index.md","text_hash":"7d8b3819c6a9fb726f40c191f606079b473f6f72d4080c13bf3b99063a736187","text":"Ops and safety:","translated":"运维与安全:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:04Z"} +{"cache_key":"a33cc9039329637ba985cef1ca2948d9f26eb2445653d3b7530bec79b97f550e","segment_id":"index.md:774f1d6b2910de20","source_path":"index.md","text_hash":"774f1d6b2910de200115afec1bd87fe1ea6b0bc2142ac729e121e10a45df4b5d","text":" ← ","translated":" ← ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:20Z"} +{"cache_key":"a34a85b676726b7a90c88b91c5bb2a67ef320ebcac8bd9eabe626eefb3e8dee1","segment_id":"environment.md:62d66b8c36a6c9aa","source_path":"environment.md","text_hash":"62d66b8c36a6c9aa7134c8f9fe5912435cb0b3bfce3172712646a187954e7040","text":"See [Configuration: Env var substitution](/gateway/configuration#env-var-substitution-in-config) for full details.","translated":"详见 [配置:环境变量替换](/gateway/configuration#env-var-substitution-in-config)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:47Z"} +{"cache_key":"a34be228f3b2eda3844fb225eb35e1ebb8875ee64a19a2bba1e88f5c21146ec3","segment_id":"start/getting-started.md:6ae8b12a4b2d056a","source_path":"start/getting-started.md","text_hash":"6ae8b12a4b2d056ab9e19350d8bbffea9178d4fe1aad54e7cb6805578e75a34d","text":": OpenAI Code (Codex) subscription (OAuth) or API keys. For Anthropic we recommend an API key; ","translated":":OpenAI Code (Codex) 订阅(OAuth)或 API 密钥。对于 Anthropic,我们推荐使用 API 密钥; ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:06Z"} +{"cache_key":"a3909a297d0e74a4cb418a7a549f495f6eed24048ebf8f12f448eff8d7a20c50","segment_id":"environment.md:1ec31258a6b45ea9","source_path":"environment.md","text_hash":"1ec31258a6b45ea903cd76f5b0190a99ab56afff6241a04f0681eb12b7a02484","text":"Env var equivalents:","translated":"等效的环境变量:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:18Z"} +{"cache_key":"a3e59ee4578bdb5fd68940692f78e9389e163da63e350ba9f0689ffbc980d4a5","segment_id":"environment.md:28b1103adde15a9d","source_path":"environment.md","text_hash":"28b1103adde15a9ddd8fc71f0c57dc155395ade46a0564865ccb5135b01c99b7","text":"OpenClaw pulls environment variables from multiple sources. The rule is **never override existing values**.","translated":"OpenClaw 从多个来源拉取环境变量。规则是**永远不覆盖已有的值**。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:23Z"} +{"cache_key":"a4384986e5ce06eca0118051e6a851ac0fd3d922d4d1f31b60000687962a2288","segment_id":"start/wizard.md:ec1a3a5d6d6f0bac","source_path":"start/wizard.md","text_hash":"ec1a3a5d6d6f0baca7805bf1ea17fc7b02042416f02f80bc1970ad8c710abd89","text":"Flow details (local)","translated":"流程详情(本地)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:56Z"} +{"cache_key":"a46b3daf9b1e1045e72e437a283e8377ec9b4820cde181d05a24a9a582cbf914","segment_id":"start/wizard.md:12754931af777521","source_path":"start/wizard.md","text_hash":"12754931af777521bcb6a904d2a7d342d0d77e6c4f1f2eb1b8b3753d25a1ab4a","text":"If the Control UI assets are missing, the wizard attempts to build them; fallback is ","translated":"如果 Control UI 资源文件缺失,向导会尝试构建它们;后备方案是 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:06Z"} +{"cache_key":"a4a009f8c9411234d5dd3ef4a71fdf292ec59e29a2b74d197acea1c789825536","segment_id":"help/index.md:6cb77499abdccd9a","source_path":"help/index.md","text_hash":"6cb77499abdccd9a2dbb7c93a4d31eed01613dda06302933057970df9ecdeb54","text":"Logs:","translated":"日志:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:46Z"} +{"cache_key":"a4b963e5c58f681343b2e7b98ade4df71e3a328906ed382ffc8c0e4853fdf162","segment_id":"environment.md:b1d6b91b67c2afa5","source_path":"environment.md","text_hash":"b1d6b91b67c2afa5e322988d9462638d354ddf8a1ef79dba987f815c22b4baee","text":" at ","translated":" 位于 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:39Z"} +{"cache_key":"a4cca9ee9c91e2df4fbfddb735c879510d4ef8e808b15a6b2697d94e08e08696","segment_id":"index.md:233cfad76c3aa9dd","source_path":"index.md","text_hash":"233cfad76c3aa9dd5cc0566746af197eac457a88c1e300ae788a8ada7f96b383","text":"From source (development):","translated":"从源码安装(开发):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:06Z"} +{"cache_key":"a4f4e3c0c2201e9d7bb71be5c98cfd3035febf5faea9901a446d2acfabaf119f","segment_id":"start/wizard.md:35dbeb1dcbaf6ec1","source_path":"start/wizard.md","text_hash":"35dbeb1dcbaf6ec104ff612596126f8f6eb79bca9e75e88e93021b57b1c3590b","text":"Providers: ","translated":"提供商: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:49:13Z"} +{"cache_key":"a501788647b1bdfef85962c5f388a3813fb838cf35407849bbce0d5f5090622d","segment_id":"environment.md:d942f64886578d87","source_path":"environment.md","text_hash":"d942f64886578d8747312e368ed92d9f6b2a8d45556f0f924e2444fe911d15af","text":" import","translated":" 导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:37Z"} +{"cache_key":"a52a1dde459a24de35447cda1771491fefcb09e9c555e0bbf08ee1a315353a2f","segment_id":"start/wizard.md:4fc4905e7b9c21f7","source_path":"start/wizard.md","text_hash":"4fc4905e7b9c21f7b34ec04b677a7f443624c0f724849ef2ca258da070ac35ca","text":" install + account config.","translated":" 安装 + 账户配置。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:51Z"} +{"cache_key":"a53c70efce0e16817f30acfd99d7db48bac27a7ec5d2c6235d65c8d97f59d781","segment_id":"start/wizard.md:daee7606b339f3c3","source_path":"start/wizard.md","text_hash":"daee7606b339f3c339076fe2c9f372a3ff40c8ee896005d829c7481b64ca5303","text":"Reset","translated":"重置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:13Z"} +{"cache_key":"a5767baee89195aa9db45c28cde3149e24b750a0e2e80d3730e1b61daec207e6","segment_id":"start/wizard.md:5c462b6b373504d5","source_path":"start/wizard.md","text_hash":"5c462b6b373504d54bc3262921f4a1a0cf666b8653e4122b418630d3f35f3ed3","text":" launches the wizard.","translated":" 运行会启动向导。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:52Z"} +{"cache_key":"a58f3ba9f36e7098f425445110c616f706c428aa8cd60c3e31c7d027229fd02e","segment_id":"help/index.md:frontmatter:summary","source_path":"help/index.md:frontmatter:summary","text_hash":"aece82a2d540ab1a9a21c7b038127cae6e9db2149491564bb1856b6f8999f205","text":"Help hub: common fixes, install sanity, and where to look when something breaks","translated":"帮助中心:常见修复方法、安装完整性检查,以及出现问题时的排查方向","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:06Z"} +{"cache_key":"a5b98e5a231f8db1b639acf7d415ecc749f34a640c80228784de562431a620af","segment_id":"start/wizard.md:6b09602d76f9ec29","source_path":"start/wizard.md","text_hash":"6b09602d76f9ec29755127ad2eb6a286fc47675e58b2df4cd1749a5dc4e19376","text":") and offers scopes:","translated":")并提供作用域:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:29Z"} +{"cache_key":"a5ce1d689305d466562771f1be3de56b5a492ced09caf35aaaa25b35c0a314eb","segment_id":"index.md:0eb95fb6244c03f1","source_path":"index.md","text_hash":"0eb95fb6244c03f1ccca696718a06766485c231347bf382424fb273145472355","text":"Quick start","translated":"快速开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:49Z"} +{"cache_key":"a5f308741639ce5bbd185e1ebe60322316c02afc8eb8caf44b469ee2041fded0","segment_id":"start/getting-started.md:d03502c43d74a30b","source_path":"start/getting-started.md","text_hash":"d03502c43d74a30b936740a9517dc4ea2b2ad7168caa0a774cefe793ce0b33e7","text":", ","translated":", ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:09Z"} +{"cache_key":"a626e7fe04bc58aa97f7363efbdaa14d5804691b203594e954e7373d26bc5bbb","segment_id":"start/getting-started.md:f68f6c2d3e9114cf","source_path":"start/getting-started.md","text_hash":"f68f6c2d3e9114cfec906d6a20cd048091e580c6e1d00a8066165dba188f9b3e","text":"channels (WhatsApp/Telegram/Discord/Mattermost (plugin)/...)","translated":"渠道(WhatsApp/Telegram/Discord/Mattermost(插件)/...)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:56Z"} +{"cache_key":"a6765fa54adfb2c44e2c668f9e03bb6668ee81809487078ceafc3e25ab776985","segment_id":"index.md:ded906ea94d05152","source_path":"index.md","text_hash":"ded906ea94d0515249f0bcab1ba63835b5968c142e9c7ea0cb6925317444d98c","text":"Configuration examples","translated":"配置示例","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:00Z"} +{"cache_key":"a696427cc9f77535e0a437bc4ced6dbbed14ef7d40f617ee28ff6c96b03b3888","segment_id":"start/getting-started.md:8ed8fc3de6f7cb89","source_path":"start/getting-started.md","text_hash":"8ed8fc3de6f7cb899073925b4e51ad2ce2d41fc97493347125c0f501f96ae205","text":"workspace bootstrap + skills","translated":"工作区引导 + 技能","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:00Z"} +{"cache_key":"a6e1f8b003a9aa3df1fc6040ef393aff9f02788a25d88903604584ac44a7cfde","segment_id":"index.md:65fd6e65268ff905","source_path":"index.md","text_hash":"65fd6e65268ff9057a49d832cccfcd5a376e46a908a2129be5b43f945fa8d8ca","text":": Gateway WS defaults to ","translated":":Gateway WS 默认为 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:40Z"} +{"cache_key":"a708335602471087cfca37672f53ab2f79c69ddf48fdb3d9f18a79065b57d68c","segment_id":"index.md:6201111b83a0cb5b","source_path":"index.md","text_hash":"6201111b83a0cb5b0922cb37cc442b9a40e24e3b1ce100a4bb204f4c63fd2ac0","text":" and ","translated":" 和 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:38Z"} +{"cache_key":"a70d2c258834cd52f862bddbf79987e31a906cb42a011a4b01c5833810163e67","segment_id":"help/index.md:d3ef01b4a9c99103","source_path":"help/index.md","text_hash":"d3ef01b4a9c9910364c9b26b2499c8787a0461d2d24ab80376fff736a288b34c","text":"Logging","translated":"日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:28Z"} +{"cache_key":"a7acef28bba8cdb6a32f047b98acad22efeb347de55a39db88b2191da5e2b0d7","segment_id":"index.md:93c89511a7a5dda3","source_path":"index.md","text_hash":"93c89511a7a5dda3b3f36253d17caee1e31f905813449d475bc6fed1a61f1430","text":"common fixes + troubleshooting","translated":"常见修复方案 + 故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:58Z"} +{"cache_key":"a7ba9dcc031859590f1c52cf8ee0e6243302b15838ac61a0513bcdef5ad90138","segment_id":"help/index.md:bfc5930cc2660330","source_path":"help/index.md","text_hash":"bfc5930cc2660330260afd407e98d86adaec0af48dd72b88dc33ef8e9066e2c9","text":"Install sanity (Node/npm/PATH):","translated":"安装完整性检查(Node/npm/PATH):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:23Z"} +{"cache_key":"a86f676c046c31e9ec14194f2cd6b154bad22422ff1e0cd75504746b2e3ff3e9","segment_id":"index.md:2f1626425f985d9a","source_path":"index.md","text_hash":"2f1626425f985d9ad8c124ea8ccb606e404ae5f43c58bd16b6c109d6d2694083","text":"Most operations flow through the ","translated":"大多数操作通过 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:21Z"} +{"cache_key":"a8956cdeec536a6d374d68798de5d28d4415bd3929c6129b678f86333a476663","segment_id":"index.md:0d3a30eb74e2166c","source_path":"index.md","text_hash":"0d3a30eb74e2166c1fc51b99b180841f808f384be53fe1392cecb67fdc9363c4","text":" (default ","translated":" (默认 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:24Z"} +{"cache_key":"a8b62b93b0c0bf52adc8e6428cf65abd66a23a669fc4902297be8ac01330e248","segment_id":"environment.md:9e471951a1b4106e","source_path":"environment.md","text_hash":"9e471951a1b4106e54be128a21112b02914fe98cc79b2c92b49ee80c5464487c","text":"Environment","translated":"环境","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:17Z"} +{"cache_key":"a8c116397b4632fb63df875275cd7a20e4eb7bcccf5f1015140f94df02c46874","segment_id":"index.md:86e2bbbc305c31aa","source_path":"index.md","text_hash":"86e2bbbc305c31aa988751196a1e207da68801a48798c48b90485c11578443a0","text":"Providers and UX:","translated":"提供商与用户体验:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:30Z"} +{"cache_key":"a8c2c86f1c2602cf80227b2f202b054928d4713c034b77d5bffa32f45a43f662","segment_id":"help/index.md:8ddb7fc8a87904de","source_path":"help/index.md","text_hash":"8ddb7fc8a87904dedc2afc16400fbe4e78582b302e01c30b1319c8a465d04684","text":"Troubleshooting:","translated":"故障排除:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:35Z"} +{"cache_key":"a93199a15f18e1ac6b70e21111f3bcce4117105f7e56633e0ec5653e45402bd6","segment_id":"index.md:0c67abfaa5415391","source_path":"index.md","text_hash":"0c67abfaa5415391a31cf3a4624746b6b212b5ae66364be28ee2d131f014e0c6","text":"🧩 ","translated":"🧩 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:45Z"} +{"cache_key":"a935bca4180982ba3ca63187d99531e61543ace3acdb5664f583de4dadebb841","segment_id":"index.md:3fc5f55ea5862824","source_path":"index.md","text_hash":"3fc5f55ea5862824fc266d26cd39fb5da22cc56670c11905d5743adac10bc9ef","text":"Mattermost Bot (plugin)","translated":"Mattermost 机器人(插件)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:11Z"} +{"cache_key":"a95002f09359a779a93f9b9c36001885ec2e7db3ab63c978bcfe94052728248d","segment_id":"start/wizard.md:9f088dbebd6c3c70","source_path":"start/wizard.md","text_hash":"9f088dbebd6c3c70a5ddbc2c943b11e4ca9acea5757b0b4f2b32479f0dbb747e","text":"Advanced","translated":"高级","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:39Z"} +{"cache_key":"a9c30fa450ed436cb03bc256b3075761a9215bd99bcd7bd2891cf15317ffd34f","segment_id":"environment.md:d08a8493f686363a","source_path":"environment.md","text_hash":"d08a8493f686363a78b913d45ebfbd87a3768d1c77b70f23b1fdade3c066e481","text":"Shell env import","translated":"Shell 环境导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:47Z"} +{"cache_key":"aa80cfc76e76409c5ba7bf331e4fb8aadf72703ead80d203c94e74209da993f9","segment_id":"index.md:310cc8cec6b20a30","source_path":"index.md","text_hash":"310cc8cec6b20a3003ffab12f5aade078a0e7a7d6a27ff166d62ab4c3a1ee23d","text":"If you ","translated":"如果你 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:31Z"} +{"cache_key":"aaa5becdcd694b68de2e61f6a13bd932c3f80f8b0b5a959a054a61ad5911beef","segment_id":"index.md:81a1c0449ea684aa","source_path":"index.md","text_hash":"81a1c0449ea684aadad54a7f8575061ddc5bfa713b6ca3eb8a0228843d2a3ea1","text":"Nodes (iOS/Android)","translated":"节点(iOS/Android)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:22Z"} +{"cache_key":"aacffcbc2a97abf1a5eccd00e5893be1125e364251fa27f3e0c88ef2db2b0248","segment_id":"index.md:acdd1e734125f341","source_path":"index.md","text_hash":"acdd1e734125f341604c0efbabdcc4c4b0597e8f6235d66c2445edd1812838c1","text":"Telegram","translated":"Telegram","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:36Z"} +{"cache_key":"aad00bc21098071ff9c86ff467cb7f5c65d3467ce4bf7d707f560479783e9eaa","segment_id":"index.md:b79cac926e0b2e34","source_path":"index.md","text_hash":"b79cac926e0b2e347e72cc91d5174037c9e17ae7733fd7bdb570f71b10cd7bfc","text":"Help","translated":"帮助","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:51Z"} +{"cache_key":"aae01909516ef373ddb2e4996f9016675f297208f7f075a68490f1f48eb0c87f","segment_id":"environment.md:6a26e1694d9e8520","source_path":"environment.md","text_hash":"6a26e1694d9e852038e5a472ed6b54cc023b4ace8ac10d745cad426d5dc057f3","text":" details.","translated":" 详情。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:47:11Z"} +{"cache_key":"aae4e71d06b01c462919dcb88e06b6e65c9edf88f774847e6397e907b81af99b","segment_id":"environment.md:7175517a370b5cd2","source_path":"environment.md","text_hash":"7175517a370b5cd2e664e3fd29c4ea9db5ce17058eb9772fe090a5485e49dad6","text":" or ","translated":" 或 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:03Z"} +{"cache_key":"aaf2e5a5c90fbf43eb61201449ef2794c5a272f1262285178a51a22890816101","segment_id":"environment.md:d4a67341570f4656","source_path":"environment.md","text_hash":"d4a67341570f4656784c5f8fe1bfb48a738ace57b52544977431d50e2b718099","text":"FAQ: env vars and .env loading","translated":"常见问题:环境变量与 `.env` 加载","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:13:14Z"} +{"cache_key":"ab19c27dcd5a1799b5d41ad95ccd7cc9a8ec1e685e7b7bcbc6f620a57ba64c73","segment_id":"index.md:39bbb719fa2b9d22","source_path":"index.md","text_hash":"39bbb719fa2b9d2251039cbf2cd072e1120a414278263e2f11d99af0236c4262","text":"Groups","translated":"群组","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:42Z"} +{"cache_key":"ab2362ccd249b707169072e9b3e0030307eca102e4795d4252be21f596247a95","segment_id":"start/getting-started.md:624f09022ea974b9","source_path":"start/getting-started.md","text_hash":"624f09022ea974b98abb7e922576072ca4467f4f6cce62d39b5591207fca4232","text":" (Ubuntu recommended). WSL2 is strongly recommended; native Windows is untested, more problematic, and has poorer tool compatibility. Install WSL2 first, then run the Linux steps inside WSL. See ","translated":" (推荐 Ubuntu)。强烈推荐使用 WSL2;原生 Windows 未经测试,问题较多,且工具兼容性较差。请先安装 WSL2,然后在 WSL 内执行 Linux 步骤。参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:42Z"} +{"cache_key":"ab5a661b139f2271cc3da6eb98afbd8c56c9a47b1bfa2570aba46677a28bb509","segment_id":"index.md:6d6577cb1c128ac1","source_path":"index.md","text_hash":"6d6577cb1c128ac18a286d3c352755d1a265b1e3a03eded8885532c3f36e32ed","text":"Mario Zechner","translated":"Mario Zechner","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:00Z"} +{"cache_key":"abafe9669ff562150a4e76ad066e4ad761bb391e29ce4416a9b58e1583e500be","segment_id":"environment.md:7175517a370b5cd2","source_path":"environment.md","text_hash":"7175517a370b5cd2e664e3fd29c4ea9db5ce17058eb9772fe090a5485e49dad6","text":" or ","translated":" 或 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:55Z"} +{"cache_key":"abc5cfa176d8a536bccc8bdf09aa69c56c08c41f519d5e050384ecf88670ce2d","segment_id":"help/index.md:8cd501e1124c3047","source_path":"help/index.md","text_hash":"8cd501e1124c30473473c06e536a2d145e2a14a6d7dc1b99028ce818e14442e2","text":"Repairs:","translated":"修复:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:33Z"} +{"cache_key":"abdba3de87eed812fa8b91c34ca0a00364c0d432e6dd6229b58ca9ab81f3828a","segment_id":"index.md:316cd41f595f3095","source_path":"index.md","text_hash":"316cd41f595f3095f149f98af70f77ab85404307a1505467ee45a26b316a9984","text":"Guided setup (recommended):","translated":"引导式设置(推荐):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:46Z"} +{"cache_key":"abf5a32f0d0613c45205a09d8a62ba4454c5a1e6342938a841eb266f169648fa","segment_id":"environment.md:496aca80e4d8f29f","source_path":"environment.md","text_hash":"496aca80e4d8f29fb8e8cd816c3afb48d3f103970b3a2ee1600c08ca67326dee","text":" block","translated":" 块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:22Z"} +{"cache_key":"ac1c676f8b0fc38c55da8beae422685700924821fc4a22af902f4028e6b6b1b4","segment_id":"start/getting-started.md:b97a7337efe8076b","source_path":"start/getting-started.md","text_hash":"b97a7337efe8076beea41f887d7fb1006d383c094728e3ddfe3e6228e47ca095","text":"macOS remote","translated":"macOS 远程","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:44Z"} +{"cache_key":"ac7c1c475e44053caaa8f0aad4a4c7cf61d349b95857ea7b44ac1e48836f9783","segment_id":"environment.md:6863067eb0a2c749","source_path":"environment.md","text_hash":"6863067eb0a2c7499425c6c189b2c88bac55ca754285a6ab1ef37b75b4cfad4d","text":"See ","translated":"参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:13:03Z"} +{"cache_key":"ad1eb4b87dcff4153a93d9aa9f3adb2be423b8f3eb61c8c69e79cc843b9b06dc","segment_id":"start/getting-started.md:7843665e87c6ef82","source_path":"start/getting-started.md","text_hash":"7843665e87c6ef82a8995362c43cacaf9aac743f9737aae4130de8fb3548e37b","text":").\n See ","translated":")。\n 参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:34Z"} +{"cache_key":"ad534581940aa1b636a88890801421659be78fa961141a10a595506ad9413584","segment_id":"index.md:3fc5f55ea5862824","source_path":"index.md","text_hash":"3fc5f55ea5862824fc266d26cd39fb5da22cc56670c11905d5743adac10bc9ef","text":"Mattermost Bot (plugin)","translated":"Mattermost 机器人(插件)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:47Z"} +{"cache_key":"ad6b8f87fd0971ae528bf36026dd7d1d1aecace6621ef3bfe00bc4f0195deece","segment_id":"start/wizard.md:325f237dda4ec247","source_path":"start/wizard.md","text_hash":"325f237dda4ec24753c4b157abd9645efd361ae1adf64a5a97f023c8bef7baff","text":"What the wizard does","translated":"向导的功能","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:11Z"} +{"cache_key":"ade480827c0ce46d4dfc9141efcaf7ff0afac9c4895ae48a4824049c1b079791","segment_id":"start/wizard.md:f3f51d88046314e4","source_path":"start/wizard.md","text_hash":"f3f51d88046314e4f0fb9e0e6d84a21ffd8ffeb7f8643f282c928a6176f84196","text":"The wizard starts with ","translated":"向导以 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:32Z"} +{"cache_key":"adfb3af54146b47b4e744815d9ccc0855ba7030eb0580a74b0bc2fc25be8825f","segment_id":"index.md:0b7e778664921066","source_path":"index.md","text_hash":"0b7e77866492106632e98e7718a8e1e89e8cb0ee3f44c1572dfd9e54845023de","text":"/concepts/streaming","translated":"/concepts/streaming","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:38Z"} +{"cache_key":"ae362832194711d0f893594a03e3bb80106c5f270cf53505aa8d85909cf18d1b","segment_id":"help/index.md:71095a6d42f5d9c2","source_path":"help/index.md","text_hash":"71095a6d42f5d9c2464a8e3f231fc53636d4ce0f9356b645d245874162ec07e2","text":"Gateway troubleshooting","translated":"Gateway 故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:44Z"} +{"cache_key":"ae38697f064f10b478a11c227a88eb0a8649159a6488fe8d31acc2cec8ad05fa","segment_id":"index.md:6e0f6eca4ff17d33","source_path":"index.md","text_hash":"6e0f6eca4ff17d3377c1c3e8e1f73457553ad3b9cfcd5e4f2b94cfb1028b6234","text":"iOS app","translated":"iOS 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:08Z"} +{"cache_key":"ae6374b547927202ad7b2766b4b93d614453d51af2667ce8e8c4c50a1788ccda","segment_id":"index.md:79a482cf546c23b0","source_path":"index.md","text_hash":"79a482cf546c23b04cd48a33d4ca8411f62e5b7dc8c3a8f30165e28e747f263a","text":"iMessage","translated":"iMessage","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:18Z"} +{"cache_key":"ae7043304208a45c9727b207699b4a24db4fe776eee16a1c8f1bed9d9fcd7c5c","segment_id":"index.md:bf084dc7b82e1e62","source_path":"index.md","text_hash":"bf084dc7b82e1e62c63727b13451d1eba2269860e27db290d2d5908d7ade0529","text":" — Pairs as a node and exposes Canvas + Chat + Camera","translated":" — 作为节点配对并提供 Canvas + 聊天 + 相机","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:02Z"} +{"cache_key":"ae7343dadbee931e1ac99fcf3a1bdc0745e6960c0e075482401e7dc615439225","segment_id":"environment.md:46ab081177a452aa","source_path":"environment.md","text_hash":"46ab081177a452aa62354b581730f4675cb03e58cde8282071da30cabe18fb2e","text":"Optional login-shell import","translated":"可选的登录 shell 导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:50Z"} +{"cache_key":"ae96b8aee2f9be9d9843ec8c1f0c693d9d64a220bb3b226e904be86c041e5af4","segment_id":"index.md:41ed52921661c7f0","source_path":"index.md","text_hash":"41ed52921661c7f0d68d92511589cc9d7aaeab2b5db49fb27f0be336cbfdb7df","text":"Gateway","translated":"Gateway","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:34Z"} +{"cache_key":"aeac09e385428be1a6afe9d98844b4f45ffa5f9690937b11572543441dfbe93e","segment_id":"start/getting-started.md:frontmatter:read_when:0","source_path":"start/getting-started.md:frontmatter:read_when:0","text_hash":"1cbb4fd6536838366360092615465643e07ae65489e0d0a68f9b7500a7ac6c96","text":"First time setup from zero","translated":"从零开始的首次设置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:17Z"} +{"cache_key":"aeb7007c273f0c7bca86dbf2cd6cd544ca79abb504054d08244ad9f11abd4fa5","segment_id":"index.md:b0d125182029e6c5","source_path":"index.md","text_hash":"b0d125182029e6c500cbcc81011341df77de8fe24d9e80190c32be390c916ec2","text":"🤖 ","translated":"🤖 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:55Z"} +{"cache_key":"af003c0a076e77417f3b2415efeeb038bf57f2a1eed124f692238fcdb66119e8","segment_id":"start/wizard.md:1f66d361f1307d4e","source_path":"start/wizard.md","text_hash":"1f66d361f1307d4e66676bb21e36b6bc6be07759ca8cd0b1c73561821e298188","text":"Discovery hints:","translated":"发现提示:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:34Z"} +{"cache_key":"af2c767d10d616dd189bb9ed963e45f036beb388e91afbaa60bf62be6ef35d1e","segment_id":"index.md:075a4a45c3999f34","source_path":"index.md","text_hash":"075a4a45c3999f340be8487cd7c0dd2ed77ced931054d75e95e5e24d5539b45b","text":" — Pi (RPC mode) with tool streaming","translated":" —— Pi(RPC 模式),支持 工具 流式传输","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:02Z"} +{"cache_key":"af2f58bcf5bdd60d1c98dcbc846239117cef3e202bea91afc78f0147c45c3a60","segment_id":"index.md:255ce77b7a6a015f","source_path":"index.md","text_hash":"255ce77b7a6a015f8595868a524b67c134e8fb405f4584fdac020e57f4ccd5f6","text":"Loopback-first","translated":"回环优先","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:37Z"} +{"cache_key":"af3c614067406b2bfae3faa3dc5c74b9ad7de00832ef2213f1d208a39e4eae92","segment_id":"index.md:3c064c83b8d244fe","source_path":"index.md","text_hash":"3c064c83b8d244fef61e5fd8ce5f070b857a3578a71745e61eea02892788c020","text":" — Anthropic (Claude Pro/Max) + OpenAI (ChatGPT/Codex) via OAuth","translated":" — 通过 OAuth 支持 Anthropic(Claude Pro/Max)+ OpenAI(ChatGPT/Codex)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:20Z"} +{"cache_key":"af41fffb606a61d612d3709f3732fc9cddca09ff369ed0bf469af9c994fcc648","segment_id":"environment.md:8d076464a84995bc","source_path":"environment.md","text_hash":"8d076464a84995bc095e934b0aa1e4419372f27cd71d033571e4dbba201ee5d8","text":"You can reference env vars directly in config string values using ","translated":"你可以使用以下方式在配置的字符串值中直接引用环境变量 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:32Z"} +{"cache_key":"af52d0343a217e1ebc960bf8e847f48d24146c9a5f695eb4d0cfb1c13bd92e1c","segment_id":"start/getting-started.md:b482e45229e19f5f","source_path":"start/getting-started.md","text_hash":"b482e45229e19f5f7ba590b5ac81bdb25d5d24116ed961bfa0eb1a23c20a204c","text":" (or ","translated":" (或 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:11Z"} +{"cache_key":"af7a992a13d7295a28b94032d28c8cc7ae177dba2b4f2fbb2008c3de7a74c3dc","segment_id":"start/wizard.md:a6c7a84baa6750fc","source_path":"start/wizard.md","text_hash":"a6c7a84baa6750fce33f7512acd6793e53def1d228b5f2efb8074b42648424fc","text":"Finish","translated":"完成","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:58Z"} +{"cache_key":"af9372d7088143330cee32dde6ee4ea2058a314debffdfacbf5343da8e95da7b","segment_id":"environment.md:ffa63583dfa6706b","source_path":"environment.md","text_hash":"ffa63583dfa6706b87d284b86b0d693a161e4840aad2c5cf6b5d27c3b9621f7d","text":"missing","translated":"缺失的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:16Z"} +{"cache_key":"afb8249d9b9d237120a860c3f9c70470fc1ba2125f5b94110e50b3b0073032c5","segment_id":"environment.md:cda454f61dfcac70","source_path":"environment.md","text_hash":"cda454f61dfcac7007a9edc538f9f58cf38caa0652e253975979308162bccc53","text":"Gateway configuration","translated":"Gateway 配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:47:16Z"} +{"cache_key":"afba4d250aee5bbd63f27e2e64fdb895b043fdda06ee9b89a277422664d39428","segment_id":"environment.md:6863067eb0a2c749","source_path":"environment.md","text_hash":"6863067eb0a2c7499425c6c189b2c88bac55ca754285a6ab1ef37b75b4cfad4d","text":"See ","translated":"参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:47:05Z"} +{"cache_key":"afca6ce610f4888a3cfb0237a69f5700b984c656c5b829646fe19b2e61b8a190","segment_id":"start/wizard.md:316877bf8e401701","source_path":"start/wizard.md","text_hash":"316877bf8e401701c9ac95fdb7dee63577480e090eb586b6eb7cf7b36fa24cbf","text":"Google Chat","translated":"Google Chat","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:35Z"} +{"cache_key":"b004008c93e0b1ea2852beb2c430beae131fc3e19a69b11c5c9f2a24cda8590b","segment_id":"index.md:4818a3f84331b702","source_path":"index.md","text_hash":"4818a3f84331b702815c94b4402067e09e9e2d27ebc1a79258df8315f2c8600b","text":"📎 ","translated":"📎 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:35Z"} +{"cache_key":"b006bf9903fff3583e0a70cd9c332cdc44d30e5432e47628924d2b8d3f704444","segment_id":"index.md:053bc65874ad6098","source_path":"index.md","text_hash":"053bc65874ad6098e58c41c57b378a2f36b0220e5e0b46722245e6c2f796818c","text":"Discord","translated":"Discord","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:48Z"} +{"cache_key":"b0b8109bdac59602c326a82adc11b20713a0c0c2ad6595be6894fb0a3a489dc9","segment_id":"index.md:f0b349e90cb60b2f","source_path":"index.md","text_hash":"f0b349e90cb60b2f96222d0be1ff6532185f385f4909a19dd269ea3e9e77a04d","text":" (default); groups are isolated","translated":" (默认);群组为隔离","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:27Z"} +{"cache_key":"b0fcfd73b064dce0675db3e53661b400af1cfed802373334f865c27a3eda6303","segment_id":"help/index.md:frontmatter:summary","source_path":"help/index.md:frontmatter:summary","text_hash":"aece82a2d540ab1a9a21c7b038127cae6e9db2149491564bb1856b6f8999f205","text":"Help hub: common fixes, install sanity, and where to look when something breaks","translated":"帮助中心:常见修复方法、安装完整性检查,以及出现问题时的排查方向","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:18:54Z"} +{"cache_key":"b1248cc34d9a7c8ecfaa5612bfffbdaf26305acc8a6db269255ae6f591b4a841","segment_id":"start/getting-started.md:e16e5747158aac73","source_path":"start/getting-started.md","text_hash":"e16e5747158aac73e7f9e2ddb7c99efda2431fa25bb3effe93102c55fc7dbe77","text":": the wizard generates one by default (even on loopback) and stores it in ","translated":":向导默认会生成一个(即使在回环地址上)并将其存储在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:25Z"} +{"cache_key":"b15acb5c7418f2e49045d730674b2f6470f73699aa97b03c7ada099d55cd53e8","segment_id":"environment.md:frontmatter:read_when:2","source_path":"environment.md:frontmatter:read_when:2","text_hash":"822b3d74ce16c1be19059fad4ca5bf7ae9327f58fa1ff4e75e78d5afa75c038f","text":"You are documenting provider auth or deployment environments","translated":"你正在编写提供商认证或部署环境的文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:18Z"} +{"cache_key":"b1a0214973416cbfb4dcac01605c51911f412a6b7d862a6b8aed7db6364bb93a","segment_id":"start/wizard.md:1a0f5fc7ca6e8a74","source_path":"start/wizard.md","text_hash":"1a0f5fc7ca6e8a74bc099d9c397a23564b55eca50c3b2e33c472acb7032a6f3b","text":" (if Minimax chosen)","translated":" (如果选择了 Minimax)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:35Z"} +{"cache_key":"b1babe6ce88663854adf02aa4a23f21c9a98e036c72bf36dbe4b518d5d025d8b","segment_id":"environment.md:8d076464a84995bc","source_path":"environment.md","text_hash":"8d076464a84995bc095e934b0aa1e4419372f27cd71d033571e4dbba201ee5d8","text":"You can reference env vars directly in config string values using ","translated":"您可以使用以下方式在配置字符串值中直接引用 环境变量 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:25Z"} +{"cache_key":"b1bfed2a2039ffc6f83d8201645caf18d6b942a8e5efbe2a28ca24978f750aa7","segment_id":"index.md:a97c0f391117ef55","source_path":"index.md","text_hash":"a97c0f391117ef554586ed43255ab3ff0e15adcfc1829c62b6d359672c0bec93","text":" — Mention-based by default; owner can toggle ","translated":" — 默认基于提及;所有者可切换 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:09Z"} +{"cache_key":"b1e93b43d06bcf0651c4bee0920f356e1f38bceca29db1936d449b4be99e77d2","segment_id":"index.md:8f6fb4eb7f42c0e2","source_path":"index.md","text_hash":"8f6fb4eb7f42c0e245e29e63f5b82cc3ba19852681d1ed9aed291f59cf75ec0e","text":"Security","translated":"安全","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:56Z"} +{"cache_key":"b212246fea49637bc0db899bd39dff2b1762ecf0d8cac3ec6160a8cd4c4da860","segment_id":"start/wizard.md:1f01936efef6e09c","source_path":"start/wizard.md","text_hash":"1f01936efef6e09cd29c9b1a9b6a64c1fcdb35682c9cf25db02dfde331f83fa7","text":" if present or prompts for a key, then saves it to ","translated":" (如果存在)或提示输入密钥,然后保存到 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:29Z"} +{"cache_key":"b240cb7927de51aca09fb318798ffd79fe597965722be259f799a2002cbe0f43","segment_id":"start/getting-started.md:4ea5ee68fea05586","source_path":"start/getting-started.md","text_hash":"4ea5ee68fea05586106890ded5733820bb77d919cda27bc4b8139b7cd33b8889","text":" gateway","translated":" Gateway","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:02Z"} +{"cache_key":"b27a4eb21eb3ee61916c2db4b356e29106524ae9d8e48aeb3f68f690c6cfb8f7","segment_id":"start/wizard.md:97f068362253059c","source_path":"start/wizard.md","text_hash":"97f068362253059c26de02d1c75c972c102f2ca201fca6015153c8077cfdbdd7","text":" way to set up OpenClaw on macOS,\nLinux, or Windows (via WSL2; strongly recommended).\nIt configures a local Gateway or a remote Gateway connection, plus channels, skills,\nand workspace defaults in one guided flow.","translated":" 在 macOS、Linux 或 Windows(通过 WSL2;强烈推荐)上设置 OpenClaw 的方式。它通过一个引导式流程配置本地 Gateway 或远程 Gateway 连接,以及渠道、技能和工作区默认设置。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:03Z"} +{"cache_key":"b2d36a6219cd6ef9fa18da47d2583999f398895d209ec3595c2c1f3789ded3f2","segment_id":"index.md:b79cac926e0b2e34","source_path":"index.md","text_hash":"b79cac926e0b2e347e72cc91d5174037c9e17ae7733fd7bdb570f71b10cd7bfc","text":"Help","translated":"帮助","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:17Z"} +{"cache_key":"b324a4a080cbe3b8cd7ae6ea1f8812027eeee42cdbd1db38d84f4240371db0ba","segment_id":"help/index.md:frontmatter:read_when:1","source_path":"help/index.md:frontmatter:read_when:1","text_hash":"857eafc389d179e83e21e46c10527fec40894fe064c63847ba06b946b7d5eb73","text":"Something broke and you want the fastest path to a fix","translated":"出了问题,你想要最快的修复方法","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:27Z"} +{"cache_key":"b36d09f6dceced206ef224552875840995ff1ad070c158298f356c7a308c4401","segment_id":"start/getting-started.md:f9194e73f9e9459e","source_path":"start/getting-started.md","text_hash":"f9194e73f9e9459e3450ea10a179cdf77aafa695beecd3b9344a98d111622243","text":"zero","translated":"零开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:26Z"} +{"cache_key":"b38f8218a329aa459516734a74c0141efdd0901ffc65900b9b5e3ffc338cb49d","segment_id":"start/getting-started.md:6201111b83a0cb5b","source_path":"start/getting-started.md","text_hash":"6201111b83a0cb5b0922cb37cc442b9a40e24e3b1ce100a4bb204f4c63fd2ac0","text":" and ","translated":" 和 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:40Z"} +{"cache_key":"b3eb30fbc137a10687841225ce40db87439bcd2052ede47102f01f5a3da81d12","segment_id":"environment.md:582967534d0f909d","source_path":"environment.md","text_hash":"582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf","text":" in ","translated":" 在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:25Z"} +{"cache_key":"b3f38013bdfa47cf7e56f9f97e5f0c56d9ceb3fdede7720d31afe1aa3ed90d47","segment_id":"start/wizard.md:acde1b96aeebd08f","source_path":"start/wizard.md","text_hash":"acde1b96aeebd08fade2a26e1979ff55edee9a7e5b3b8d8bc7dd03b024ace1d0","text":"Skills (recommended)","translated":"技能(推荐)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:32Z"} +{"cache_key":"b3fd77464fffaf86fd7c4db02054abe4ad46b8da5cd9a6338a6a164a559039fb","segment_id":"index.md:1cce617e15b49dca","source_path":"index.md","text_hash":"1cce617e15b49dca89b212bb5290edfcfee010ef2eeef369b36af78c53756e1c","text":" — Optional transcription hook","translated":" — 可选的转录钩子","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:25Z"} +{"cache_key":"b42df969bf0af88635c8889e57849a3ae5110eab05a4f8e10b1c753221608cdb","segment_id":"environment.md:83848a0a1c101b44","source_path":"environment.md","text_hash":"83848a0a1c101b44035abecc16764b51778799d9824facbfaea7ac1f20205160","text":" missing).","translated":" 缺失时应用)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:09Z"} +{"cache_key":"b4368e7921aef9e2b39ca194a48d47f8f2f748e7fc40db1eaf6a96299c60c035","segment_id":"environment.md:frontmatter:summary","source_path":"environment.md:frontmatter:summary","text_hash":"78351223e7068721146d2de022fdf440c2866b2ee02fbbb50bf64369b999820b","text":"Where OpenClaw loads environment variables and the precedence order","translated":"OpenClaw 加载环境变量的位置及优先级顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:42Z"} +{"cache_key":"b45cf341beae5b0925d7ae30c7cfb491da5599a692818f25de942e5f6d44fd5f","segment_id":"help/index.md:3c33340bd23b8db8","source_path":"help/index.md","text_hash":"3c33340bd23b8db89f18fe7d05a954738c0dd5ba9623cf6bdb7bb5d1a3729cfc","text":"FAQ (concepts)","translated":"常见问题(概念)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:03Z"} +{"cache_key":"b49a5c75c4eda0ec2bb03b48bc5f8fb35df49f92e48f750d30803e61536712db","segment_id":"environment.md:7af0b3e47c35820f","source_path":"environment.md","text_hash":"7af0b3e47c35820fabef69cc542392bd2d0f6e37c349851728f0c683013563ce","text":" variables","translated":" 变量","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:19Z"} +{"cache_key":"b49cd3645127938e9fa70191b75226ab757511ee636cdd90fd4dc9ef40062aac","segment_id":"index.md:a7a19d4f14d001a5","source_path":"index.md","text_hash":"a7a19d4f14d001a56c27f68a13ff267859a407c7a9ab457c0945693c9067dd1c","text":"Configuration (optional)","translated":"配置(可选)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:26Z"} +{"cache_key":"b4a0896a2b31bdc227d4c1aca7b2e0ff76155083208928f489c597b2ea6ec83d","segment_id":"start/getting-started.md:ab201ddd7ab330d0","source_path":"start/getting-started.md","text_hash":"ab201ddd7ab330d04be364c0ac14ce68c52073a0ee8d164a98c3034e91ce1848","text":" from the repo.","translated":" (从仓库中)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:49Z"} +{"cache_key":"b4fb8e7bfdb8c5557d0ae1e567ebe8d168cf15239a265bfc4f64adb97ce03bcf","segment_id":"environment.md:d08a8493f686363a","source_path":"environment.md","text_hash":"d08a8493f686363a78b913d45ebfbd87a3768d1c77b70f23b1fdade3c066e481","text":"Shell env import","translated":"Shell 环境导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:35Z"} +{"cache_key":"b51ede64ac884a3ba6ed593bb845e2b3e70fa2bcda693b30c537cde875c51011","segment_id":"index.md:9c870aa6e5e93270","source_path":"index.md","text_hash":"9c870aa6e5e93270170d5a81277ad3e623afe8d4efd186d3e28f3d2b646d52e6","text":"How it works","translated":"工作原理","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:30Z"} +{"cache_key":"b52208d557116bde692639f735198f71a925dc90223bf31e0b71e9ac7b5bf86d","segment_id":"help/index.md:24669ff48290c187","source_path":"help/index.md","text_hash":"24669ff48290c1875d8067bbd241e8a55444839747bffb8ab99f3a34ef248436","text":"Doctor","translated":"诊断工具","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:54Z"} +{"cache_key":"b5687bd5a0443bd1ccaa45996bbe3a784f66fa059e4aa68048a14712f853d56e","segment_id":"start/wizard.md:5f6a8991209034d4","source_path":"start/wizard.md","text_hash":"5f6a8991209034d4d6473c75e2f74dc3df90cc6cde2723d7d25085dbfc3fad24","text":"Providers (Telegram, WhatsApp, Discord, Google Chat, Mattermost (plugin), Signal)","translated":"提供商(Telegram、WhatsApp、Discord、Google Chat、Mattermost(插件)、Signal)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:26Z"} +{"cache_key":"b576ef2b8e071c57934d6ae354dfaa261e4f7db4bf4b3b56f33219032da96187","segment_id":"index.md:74926756385b8442","source_path":"index.md","text_hash":"74926756385b844294a215b2830576e3b2e93b84c5a8c8112b3816c5960f3022","text":" — DMs + guild channels via channels.discord.js","translated":" — 通过 channels.discord.js 支持私信和服务器 渠道","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:07Z"} +{"cache_key":"b5bd5c17c88739060e3c2a4e7a8f55897a310a69c59782ab65ef312c4d191057","segment_id":"environment.md:baa5be7f6320780b","source_path":"environment.md","text_hash":"baa5be7f6320780bd7bb7b7ddbb8cd1ffb26ccf7d94d363350668c50aedcf95f","text":" (applied only if missing).","translated":" (仅在缺失时应用)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:48Z"} +{"cache_key":"b5c57e3a1f3580ad70993c4901523fe0625b4b6b817da47743f3294dd6cf756e","segment_id":"environment.md:f0442e6e05ccca16","source_path":"environment.md","text_hash":"f0442e6e05ccca160d17de0e7d509891b91b921366b2202b2b5c80435824e140","text":"Two equivalent ways to set inline env vars (both are non-overriding):","translated":"设置内联环境变量的两种等效方式(均为不覆盖模式):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:43Z"} +{"cache_key":"b5d2ae67c5041c7e1d1c9eee9352714412cb0f7e25d70400ede3ec30640d3481","segment_id":"start/getting-started.md:0fe1f092dca5c0a5","source_path":"start/getting-started.md","text_hash":"0fe1f092dca5c0a52a3225794df21faacf2c8aecbb58e4b35256494e611b88bd","text":" your first DM returns a pairing code. Approve it (see next step) or the bot won’t respond.","translated":" 您的第一条私信会返回一个配对码。请批准它(参见下一步),否则机器人将不会响应。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:35Z"} +{"cache_key":"b634da14ec3675bd8c43260adb814ce2e1991550d8eec3a159a73a19bcae0a9a","segment_id":"environment.md:b1d6b91b67c2afa5","source_path":"environment.md","text_hash":"b1d6b91b67c2afa5e322988d9462638d354ddf8a1ef79dba987f815c22b4baee","text":" at ","translated":" 位于 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:41Z"} +{"cache_key":"b6ab46af0248d53e3135ec04e8fdf33e79acec2a08cc8870fdc18ceca6b5b032","segment_id":"start/wizard.md:16f0ee47f993d627","source_path":"start/wizard.md","text_hash":"16f0ee47f993d6270c9059450473eea493ca8ae037f8877782ae2bc176f24d18","text":"API key","translated":"API 密钥","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:43Z"} +{"cache_key":"b6acf6603c3288ff678824fbc05208f2ffb9265ef1bd538af6b719f3bd0a3117","segment_id":"index.md:2f1626425f985d9a","source_path":"index.md","text_hash":"2f1626425f985d9ad8c124ea8ccb606e404ae5f43c58bd16b6c109d6d2694083","text":"Most operations flow through the ","translated":"大多数操作通过 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:45Z"} +{"cache_key":"b728d99548c47aac6f8b5df5cba915a124aa44c07b51c9bc7a298f73f98caf13","segment_id":"start/wizard.md:1e9806e4227ba3b9","source_path":"start/wizard.md","text_hash":"1e9806e4227ba3b9a986732f1b09a21fd6b96043d12e5a4334a326ec5ad39842","text":"Signal","translated":"Signal","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:46Z"} +{"cache_key":"b74d2e77f6dff2d670948e7bc471317b3d93cdcbd69be8b2a1c8b1c1e29fa6e7","segment_id":"index.md:1cce617e15b49dca","source_path":"index.md","text_hash":"1cce617e15b49dca89b212bb5290edfcfee010ef2eeef369b36af78c53756e1c","text":" — Optional transcription hook","translated":" —— 可选的转录钩子","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:58Z"} +{"cache_key":"b798dd1056c4bde2b213da50c0deaf67f6fa43b67ba57c7e8608a4ba80573de8","segment_id":"index.md:c011d6097bfbc8e9","source_path":"index.md","text_hash":"c011d6097bfbc8e936280addcf2e3e7d06ea2223ffd596973191b800a7035c32","text":"License","translated":"许可证","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:04Z"} +{"cache_key":"b7b8bda0e930aa53d189e38c5844ac805547a37ca102751746c8e425c06a684c","segment_id":"index.md:0d3a30eb74e2166c","source_path":"index.md","text_hash":"0d3a30eb74e2166c1fc51b99b180841f808f384be53fe1392cecb67fdc9363c4","text":" (default ","translated":" (默认 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:09Z"} +{"cache_key":"b7c642921d34922bbb25206e04a52428c8707414d90f0aa9bbc07366d3165e09","segment_id":"start/getting-started.md:73526fff31f4fa0a","source_path":"start/getting-started.md","text_hash":"73526fff31f4fa0a98e4e135e0610652867bd8842a6abeb821e02ee87842bb96","text":"Telegram DM tip:","translated":"Telegram 私信提示:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:33Z"} +{"cache_key":"b7ef55ac0b21abd132744ee6daa0d8aebba830cf42b99105a8aa15035f636f7c","segment_id":"help/index.md:8cd501e1124c3047","source_path":"help/index.md","text_hash":"8cd501e1124c30473473c06e536a2d145e2a14a6d7dc1b99028ce818e14442e2","text":"Repairs:","translated":"修复:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:56Z"} +{"cache_key":"b842ea6173ee701821bd377af17913bb92cafb54dc487075c302ab3d329c88cc","segment_id":"index.md:723784fa2b6a0876","source_path":"index.md","text_hash":"723784fa2b6a0876540a92223ee1019f24603499d335d6d82afbc520ef5b5d57","text":") — Creator, lobster whisperer","translated":")— 创作者,龙虾低语者","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:34Z"} +{"cache_key":"b879fc6c7bf9bcf2521829ee80839cc6b64fa033303e0d3ad8f4c14519022dd7","segment_id":"index.md:b332c3492d5eb10a","source_path":"index.md","text_hash":"b332c3492d5eb10a118eb6d8b0dcd689bc2477ce2ae16b303753b942b54377bc","text":"Configuration","translated":"配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:58Z"} +{"cache_key":"b8d882b2664af754e0a9242db46afe45a00690cb9294ebf818b517be4eb004fd","segment_id":"index.md:a10f6ed8c1ddbc10","source_path":"index.md","text_hash":"a10f6ed8c1ddbc10d3528db7f7b6921c1dd5a5e78aa191ff017bf29ce2d26449","text":"⏱️ ","translated":"⏱️ ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:31Z"} +{"cache_key":"b8d9c5b6ac9e5a115d60a75c55a842231d71850c2d69bfb8c20b79e3e7744b35","segment_id":"environment.md:d4a67341570f4656","source_path":"environment.md","text_hash":"d4a67341570f4656784c5f8fe1bfb48a738ace57b52544977431d50e2b718099","text":"FAQ: env vars and .env loading","translated":"常见问题:环境变量和 .env 加载","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:47:18Z"} +{"cache_key":"b8efaaee77774922e208bb819be2e16edb0632860d03d901df8701e7582bec11","segment_id":"index.md:8816c52bc5877a2b","source_path":"index.md","text_hash":"8816c52bc5877a2b24e3a2f4ae7313d29cf4eba0ca568a36f2d00616cfe721d0","text":"Wizard","translated":"向导","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:48Z"} +{"cache_key":"b90215fad5e3df7edc635820365a97567dc5fed769e90812e8444decb4691cc5","segment_id":"start/getting-started.md:45e6d69dbe995a36","source_path":"start/getting-started.md","text_hash":"45e6d69dbe995a36f7bc20755eff4eb4d2afaaedbcac4668ab62540c57219f32","text":"macOS app","translated":"macOS 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:23Z"} +{"cache_key":"b9140801ceed17bc6beff66df05f3fb6f825ffb03c25525672a9ed9d37cc8bef","segment_id":"index.md:be48ae89c73a75da","source_path":"index.md","text_hash":"be48ae89c73a75da3454d565526d777938c20664618905a9bc77d6a0a21a689d","text":"\"EXFOLIATE! EXFOLIATE!\"","translated":"\"EXFOLIATE! EXFOLIATE!\"","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:27:51Z"} +{"cache_key":"b91b95d70281a4d1d45bd8c853fa8bfa893d10fa36509361b58b83df1111b31b","segment_id":"help/index.md:cad44fbae951d379","source_path":"help/index.md","text_hash":"cad44fbae951d3791565b0cee788c01c3bd10e0176167acb691b8dba0f7895f8","text":"Gateway logging","translated":"Gateway 日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:54Z"} +{"cache_key":"b9b11fe51f278fc05b76b9e48d84a6b796c35bd940491457befd53ac08255496","segment_id":"help/index.md:b79cac926e0b2e34","source_path":"help/index.md","text_hash":"b79cac926e0b2e347e72cc91d5174037c9e17ae7733fd7bdb570f71b10cd7bfc","text":"Help","translated":"帮助","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:31Z"} +{"cache_key":"b9c7cee99b82c57ac554d288a0b5aee19b5ca5fc10cdd6f59b31a4fc7450c3a9","segment_id":"index.md:22159a426e4f2635","source_path":"index.md","text_hash":"22159a426e4f26356382cc3ac9b2e7af5123c1309250332f5dcbbc6e6f952b0e","text":"Network model","translated":"网络模型","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:38Z"} +{"cache_key":"b9cc5f90d0c6e7deedd6ec40f46f56ce1c36844b849a3acbd488724173d8b7f4","segment_id":"start/wizard.md:254a5988b52ecb17","source_path":"start/wizard.md","text_hash":"254a5988b52ecb1730f5ab74e7998f0789c62c194e32d6a29c9500129905438d","text":"More detail: ","translated":"更多详情: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:50Z"} +{"cache_key":"ba73a727d35cc4ad3a5a48130b91107a13324a115d536a8b936ca4b56d0b8ebf","segment_id":"start/wizard.md:b248f2e01881f536","source_path":"start/wizard.md","text_hash":"b248f2e01881f536176ab4f5c76d6c067348339e0ddd2be6d2b0b0435c09f614","text":"MiniMax","translated":"MiniMax","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:00Z"} +{"cache_key":"ba7cd0c5865f73af1ced8609de573bce503046cc0135f10edf71d69ac7bed742","segment_id":"index.md:45808d75bf8911fa","source_path":"index.md","text_hash":"45808d75bf8911fa21637f9dd3f0dace1877748211976b5d61fcc5c15db594d0","text":"Webhooks","translated":"Webhooks","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:51Z"} +{"cache_key":"ba881a89787827ca73c2b6efade0f1b148a3093729931f54bcedd6516714ef9a","segment_id":"environment.md:3fe738a7ee6aaff5","source_path":"environment.md","text_hash":"3fe738a7ee6aaff51f099d9a8314510c99ced6a568eb38c67642cd43bb54eec0","text":" in the current working directory","translated":" 在当前工作目录中","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:25Z"} +{"cache_key":"bab136853746e7adb4f3d6a9085f276c4b3b60b32935bf0abee97c4b8b0847d2","segment_id":"index.md:frontmatter:read_when:0","source_path":"index.md:frontmatter:read_when:0","text_hash":"08965a8ab25e66157009d1617fc167bcc2404fa0c0ca50b1e5e5750957be3b10","text":"Introducing OpenClaw to newcomers","translated":"向新用户介绍 OpenClaw","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:20Z"} +{"cache_key":"bab5f315b0b714729442371eeede15ca920f42aa5f8a6a5bbf4f2831cec6bab7","segment_id":"start/getting-started.md:1e3abf61a37e3cad","source_path":"start/getting-started.md","text_hash":"1e3abf61a37e3cad36b11b459b1cc39e76feb6a0c369fe5270957468288dcc5c","text":"If ","translated":"如果 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:00Z"} +{"cache_key":"bb01273ae2008ef3e65dac6325f0912e3297b1445007151a0eb13c637d664344","segment_id":"environment.md:907940a35852447a","source_path":"environment.md","text_hash":"907940a35852447aad5f21c5a180d993ff31cfd5807b1352ed0c24eabe183465","text":"never override existing values","translated":"永远不覆盖已有的值","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:19Z"} +{"cache_key":"bb01eace88e3c0c55a9f90dcd2ef4db17d3ef428c9c3f0cbbc533816b3673889","segment_id":"start/getting-started.md:5ca32046e4b3e547","source_path":"start/getting-started.md","text_hash":"5ca32046e4b3e5476abcfc30f1d5abfcc42cf2cb6ad8b42b35ed51f62cddaead","text":"). It sets up:","translated":")。它会设置:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:51Z"} +{"cache_key":"bb8fe17d51b04ff11d3cdd2b428662d48746db111cb4bc5cb91f4c30ab33c86e","segment_id":"start/wizard.md:c10c181a3b7e8440","source_path":"start/wizard.md","text_hash":"c10c181a3b7e84404d307e21cf48264c7ff7e0d4a04ee15af969b08ebe47d7a3","text":" (and ","translated":" (以及 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:52Z"} +{"cache_key":"bbae60d9c55f0a4c17edd70724bf025a80c357507af18bc456b69d8e22351dd3","segment_id":"environment.md:d08a8493f686363a","source_path":"environment.md","text_hash":"d08a8493f686363a78b913d45ebfbd87a3768d1c77b70f23b1fdade3c066e481","text":"Shell env import","translated":"Shell 环境导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:10Z"} +{"cache_key":"bbd317ed227cca52a63156dec7f92240d0a532979467fb3bb2f12481519aa3a6","segment_id":"index.md:5583785669449fc8","source_path":"index.md","text_hash":"5583785669449fc81a8037458c908c11a8f345c21c28f7f3a95de742bd52199a","text":"Media Support","translated":"媒体支持","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:36Z"} +{"cache_key":"bbe1dd74f66fb83dcdd47e77fb4ce919331298e2a8b6bb3fc8b3d0ee940a031a","segment_id":"index.md:f0a7f9d068cb7a14","source_path":"index.md","text_hash":"f0a7f9d068cb7a146d0bb89b3703688d690ed0b92734b78bcdb909aace617dbf","text":"WhatsApp group messages","translated":"WhatsApp 群消息","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:23Z"} +{"cache_key":"bc2419d59f866ec8c3f5529c5f2e87039a9e0ec7403f6fa82664b7ef9af23d47","segment_id":"start/getting-started.md:b1c8a72bb57dc747","source_path":"start/getting-started.md","text_hash":"b1c8a72bb57dc747671a456250fab49db53d0fef744eae4b959a66a4abb7aba9","text":"exe.dev","translated":"exe.dev","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:39Z"} +{"cache_key":"bc2967e4d37bce4abb8008d556e2894e97049fdfe54c4a2d6b6bdf8639a1cfd3","segment_id":"environment.md:c2d7247c8acb83a5","source_path":"environment.md","text_hash":"c2d7247c8acb83a5a020458fa836c2445922b51513dbdbf154ab5f7656cb04e9","text":"; does not override).","translated":";不会覆盖)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:22Z"} +{"cache_key":"bc6f614c30433e6b3bff168a2080525f05fc94e339dc42f43f2e189e3a0b226e","segment_id":"index.md:329f3c913c0a1636","source_path":"index.md","text_hash":"329f3c913c0a16363949eb8ee7eb0cda7e81137a3851108019f33e5d18b57d8f","text":"Switching between npm and git installs later is easy: install the other flavor and run ","translated":"之后在 npm 和 git 安装之间切换很简单:安装另一种方式并运行 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:00Z"} +{"cache_key":"bcaa9af5387d4c16acfcf673ef371654f20d3f5740f64c92747435d166d53bee","segment_id":"start/wizard.md:d65be5fbfc8f6bc9","source_path":"start/wizard.md","text_hash":"d65be5fbfc8f6bc9316db63dff758f2a5758d3fa4ddde8562b89a9baa35c0b9d","text":"Starts the Gateway (if needed) and runs ","translated":"启动 Gateway(如需)并运行 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:38Z"} +{"cache_key":"bcc6f5f4ada16ba9c99157f111747d22c499aab86af420e947d68797df7d0dc2","segment_id":"environment.md:a258b30f88c30650","source_path":"environment.md","text_hash":"a258b30f88c30650e73073d5bdde5cfcc6987100ae62d37789e5c46a0d85b7c6","text":"Global ","translated":"全局 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:09Z"} +{"cache_key":"bd0afd9947ca223c780705636e9fd81efec6d821d54ead3dd5755b82ca6cabbb","segment_id":"index.md:86e2bbbc305c31aa","source_path":"index.md","text_hash":"86e2bbbc305c31aa988751196a1e207da68801a48798c48b90485c11578443a0","text":"Providers and UX:","translated":"提供商 和用户体验:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:04Z"} +{"cache_key":"bd1a787c9d8cd0ad83cfd8fd6de5a4da5fdb050d4b594904e623a1d17c5b8c21","segment_id":"index.md:c7a5e268ddd8545e","source_path":"index.md","text_hash":"c7a5e268ddd8545e5a59a58ef1365189862f802cc7b61d4a3212c70565e2dff1","text":"WhatsApp Integration","translated":"WhatsApp 集成","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:30Z"} +{"cache_key":"bde9f3ebeb2359b3b7aedd826d0a1d12e084a4a61310d0f5bd394d8eb5a120ba","segment_id":"index.md:39bbb719fa2b9d22","source_path":"index.md","text_hash":"39bbb719fa2b9d2251039cbf2cd072e1120a414278263e2f11d99af0236c4262","text":"Groups","translated":"群组","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:53Z"} +{"cache_key":"bdecbc1be817872a0692411e78c70677191fe2da6e081c369fb09de0ef2601cf","segment_id":"start/getting-started.md:618240b69ec6c809","source_path":"start/getting-started.md","text_hash":"618240b69ec6c8090801f0a1c0298939ec16e6c30607b1117173bd5e4770f27e","text":"first working chat","translated":"第一次成功聊天","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:29Z"} +{"cache_key":"bdf975c1288d74f830e912ea439f34bd12327414e67a0e3b0031b20daee8fa90","segment_id":"environment.md:a5839747a1cd90df","source_path":"environment.md","text_hash":"a5839747a1cd90df1cb7dbb6df6d1dddba552865d54e3e2fa0c6b87e6616c666","text":"; does not","translated":";不会","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:54Z"} +{"cache_key":"bdfbc7a0fd631f051f7b46e21b996d7aa66ab700fe12e4153d61fb8cccd72b43","segment_id":"environment.md:32ebb1abcc1c601c","source_path":"environment.md","text_hash":"32ebb1abcc1c601ceb9c4e3c4faba0caa5b85bb98c4f1e6612c40faa528a91c9","text":" (","translated":" (","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:15Z"} +{"cache_key":"be43620abdc44274f5a6124fe94af02680937d7b3c843471640e6d3cfdbcb11b","segment_id":"index.md:81a1c0449ea684aa","source_path":"index.md","text_hash":"81a1c0449ea684aadad54a7f8575061ddc5bfa713b6ca3eb8a0228843d2a3ea1","text":"Nodes (iOS/Android)","translated":"节点(iOS/Android)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:30Z"} +{"cache_key":"be853f7b692e34fd9acbac3fc2a4beaeffb4fccfc645083457d04704ce7e80a6","segment_id":"start/getting-started.md:32ebb1abcc1c601c","source_path":"start/getting-started.md","text_hash":"32ebb1abcc1c601ceb9c4e3c4faba0caa5b85bb98c4f1e6612c40faa528a91c9","text":" (","translated":" (","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:49Z"} +{"cache_key":"be9ef45489c42d85ef02ddbdc619e8f571efb5ad273236b11af6b087a73aac32","segment_id":"start/wizard.md:d03502c43d74a30b","source_path":"start/wizard.md","text_hash":"d03502c43d74a30b936740a9517dc4ea2b2ad7168caa0a774cefe793ce0b33e7","text":", ","translated":", ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:09Z"} +{"cache_key":"bed2a7f7ebfcaa0b5e9c08db15a562558ebb609b6ad450b19a160511fd76f36d","segment_id":"start/getting-started.md:569ca49f4aaf7846","source_path":"start/getting-started.md","text_hash":"569ca49f4aaf7846e952c1d4aeca72febd0b79fa1c4f9db08fd3127551218572","text":"Install","translated":"安装","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:50Z"} +{"cache_key":"bed8e880f819b1664d27c979ee19546883dc77b25b3f4c2bca3bb320cdb7a997","segment_id":"index.md:9bd86b0bbc71de88","source_path":"index.md","text_hash":"9bd86b0bbc71de88337aa8ca00f0365c1333c43613b77aaa46394c431cb9afd8","text":"Maxim Vovshin","translated":"Maxim Vovshin","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:41Z"} +{"cache_key":"bedbf38b79db3a7e2c68181e1c39bb9dbb0ec7872bd05c86a18d5a2cea9ff52d","segment_id":"environment.md:3fe738a7ee6aaff5","source_path":"environment.md","text_hash":"3fe738a7ee6aaff51f099d9a8314510c99ced6a568eb38c67642cd43bb54eec0","text":" in the current working directory","translated":" 在当前工作目录中","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:35Z"} +{"cache_key":"bf1804a981e692a3e488d95ec6501ae0a175844faed4b62050b2c407110d73e9","segment_id":"environment.md:e234227b0e001687","source_path":"environment.md","text_hash":"e234227b0e001687821541fac3af38fc6be293ec6e13910c6826b9afc8ca33be","text":" syntax:","translated":" 语法:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:28Z"} +{"cache_key":"bf2db6ac9b982594da3a3e3dd13d6ca4e223ff16e13a95d31ffb072ab1d32c8e","segment_id":"start/getting-started.md:883c79fabfe68ee2","source_path":"start/getting-started.md","text_hash":"883c79fabfe68ee271a7635815ea9c87295a436a075926633e8865ec60c4303e","text":" (optional; recommended if you build from source)","translated":" (可选;如果从源码构建则推荐安装)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:26Z"} +{"cache_key":"bf37699805bcf078c1b1ce444bf6d1198e99667a6db48d7eb7e641c41262087b","segment_id":"start/getting-started.md:76dfd9f9a399a76a","source_path":"start/getting-started.md","text_hash":"76dfd9f9a399a76a13b092e0ce512519b8fc0cfef720142556a8350f70a040ab","text":"Pairing","translated":"配对","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:12Z"} +{"cache_key":"bf6afd51b6d116b7f7aac3bb45cc7db66e823c2fc1abd26e91d2f29989e56a53","segment_id":"index.md:da22b9d6584e1d8a","source_path":"index.md","text_hash":"da22b9d6584e1d8aa709165be214e0f9bdf2be428816e9ce1c4506bf86218cb4","text":"Core Contributors","translated":"核心贡献者","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:38Z"} +{"cache_key":"bf6c745f2cf524d912a0e53b92bb7278771b97f3974e15bf7d7d5c21d2cb2bb7","segment_id":"start/wizard.md:fd42bd9065e9791f","source_path":"start/wizard.md","text_hash":"fd42bd9065e9791f5e6a611205a54d922d1b8046f78d72cb2b35a156a2ee379a","text":"WhatsApp credentials go under ","translated":"WhatsApp 凭据存储在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:51Z"} +{"cache_key":"bf825adb6efc12b0b76cb65939a149b13d9affa681ea8c41f0ff54043e15afc1","segment_id":"environment.md:7175517a370b5cd2","source_path":"environment.md","text_hash":"7175517a370b5cd2e664e3fd29c4ea9db5ce17058eb9772fe090a5485e49dad6","text":" or ","translated":" 或 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:35Z"} +{"cache_key":"c01e11953c6ba2efa9bec09338b3e7fcbdc647a92bf09fd08678e0c6e1ee9598","segment_id":"index.md:ec05222b3777fd7f","source_path":"index.md","text_hash":"ec05222b3777fd7f91a2964132f05e3cfc75777eaeec6f06a9a5c9c34a8fc3e9","text":"Nix mode","translated":"Nix 模式","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:10Z"} +{"cache_key":"c0282f2e4f7da80d51262220226e41d0c83df835b9e776ed420a3fe11663d5b2","segment_id":"start/wizard.md:6301b8b1517facda","source_path":"start/wizard.md","text_hash":"6301b8b1517facda1ab48a0af2e5ed47f68867711466089050b20180cfc22433","text":"Synthetic example:","translated":"Synthetic 示例:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:31Z"} +{"cache_key":"c09d5cb253479a62ae433edd398f06b46aff64efd80ab44a984de33922120de6","segment_id":"start/getting-started.md:160d9109519d8d17","source_path":"start/getting-started.md","text_hash":"160d9109519d8d17b25b1d2f8202aaab71eafe0a21aa1384978dc89d2679d370","text":"From source (development)","translated":"从源码安装(开发)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:43Z"} +{"cache_key":"c100ce5c5170c043a021982a580ebd78cad6232e67057fb8d0d55dfa3fe1e8d3","segment_id":"environment.md:ffa63583dfa6706b","source_path":"environment.md","text_hash":"ffa63583dfa6706b87d284b86b0d693a161e4840aad2c5cf6b5d27c3b9621f7d","text":"missing","translated":"缺失的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:23Z"} +{"cache_key":"c11f020ea3afe93aee794662658476af49988cea0ddc160f7f8c27b1b245076a","segment_id":"environment.md:9c85ab59cb358b12","source_path":"environment.md","text_hash":"9c85ab59cb358b1299c623e16f52f3aee204a81fb6d1c956e37607a220d13b08","text":"You can reference env vars directly in config string values using `${VAR_NAME}` syntax:","translated":"你可以在配置字符串值中使用 `${VAR_NAME}` 语法直接引用环境变量:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:44Z"} +{"cache_key":"c1300944d87f5d93e003235afb1a2a255806cb0ca7ca73081c0bda9081c00781","segment_id":"index.md:4d4d75c23a2982e1","source_path":"index.md","text_hash":"4d4d75c23a2982e184011f79e62190533f93cdad41ba760046419678fa68d430","text":"Runtime requirement: ","translated":"运行时要求: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:25Z"} +{"cache_key":"c1ed30ab3d008a94d1201ceb1b0681fb09d05d747adddc2cd9bd9ec64544cddf","segment_id":"start/wizard.md:cb773b9bc6fc5373","source_path":"start/wizard.md","text_hash":"cb773b9bc6fc5373e0b338fbcb709df301cd8e11f0699de40cb0c1c4bf3def77","text":"Existing config detection","translated":"现有配置检测","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:58Z"} +{"cache_key":"c2188cce98f83b4b4240fddcdd99a6504e9b9e044a40f429257a85d2f2485f22","segment_id":"help/index.md:71095a6d42f5d9c2","source_path":"help/index.md","text_hash":"71095a6d42f5d9c2464a8e3f231fc53636d4ce0f9356b645d245874162ec07e2","text":"Gateway troubleshooting","translated":"Gateway 故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:23Z"} +{"cache_key":"c226a7b155f9acc3489810036a9112a8b4d498f14a983ecad4c72d8b48925751","segment_id":"index.md:63a3abfa879299dd","source_path":"index.md","text_hash":"63a3abfa879299ddcc03558012bfd6075cbd72f7a175b739095bf979700297f7","text":"Multi-instance quickstart (optional):","translated":"多实例快速开始(可选):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:15Z"} +{"cache_key":"c2802148a29fff6480dd7c4126df1d7787f83156807ce1f6e0abb05d2e0a7863","segment_id":"index.md:6e0f6eca4ff17d33","source_path":"index.md","text_hash":"6e0f6eca4ff17d3377c1c3e8e1f73457553ad3b9cfcd5e4f2b94cfb1028b6234","text":"iOS app","translated":"iOS 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:36Z"} +{"cache_key":"c2acf62bea34b4557cbab8b7ceadd55c5cf37516c124b93afc1b8e9f08d62ab0","segment_id":"index.md:39bbb719fa2b9d22","source_path":"index.md","text_hash":"39bbb719fa2b9d2251039cbf2cd072e1120a414278263e2f11d99af0236c4262","text":"Groups","translated":"群组","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:21Z"} +{"cache_key":"c2e74d237df6614199282b8822741be509ff03e31b7319f3184bb2537860e8a9","segment_id":"index.md:bf084dc7b82e1e62","source_path":"index.md","text_hash":"bf084dc7b82e1e62c63727b13451d1eba2269860e27db290d2d5908d7ade0529","text":" — Pairs as a node and exposes Canvas + Chat + Camera","translated":" — 作为节点配对并提供 Canvas + 聊天 + 相机","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:43Z"} +{"cache_key":"c335a0e455574c0e23a45c10a55511400b6168c38aa7d8e43521b1c8650e58f9","segment_id":"environment.md:frontmatter:read_when:1","source_path":"environment.md:frontmatter:read_when:1","text_hash":"a3a2d99a99de98220c8e0296d6f4e4b2a34024916bd2379d1b3b9179c8fae46f","text":"You are debugging missing API keys in the Gateway","translated":"您正在调试 Gateway 中缺失的 API 密钥","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:15Z"} +{"cache_key":"c34f893f16dcd3b37a3752585df805b44212829550f3d82cb5f539fdb50a5a50","segment_id":"environment.md:87e89abb4c1c551f","source_path":"environment.md","text_hash":"87e89abb4c1c551fe08d355d097f18b8de78edca5f556997085681662fce8eed","text":"Config ","translated":"配置 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:46Z"} +{"cache_key":"c359a69d5e0e9e6470f36436f1b27a946ef28ef1069e7b7d59e0ea3132f6003c","segment_id":"start/wizard.md:4cd440e57b28aba7","source_path":"start/wizard.md","text_hash":"4cd440e57b28aba7f789ba11d0bb5837f09937ba45bab9a80b9a6a980894250e","text":"Follow‑up reconfiguration:","translated":"后续重新配置:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:15Z"} +{"cache_key":"c360b15d624bad75d881fff636c494f57b21345481b98d674df5baa6a31c7b06","segment_id":"index.md:cdb4ee2aea69cc6a","source_path":"index.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":"。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:02Z"} +{"cache_key":"c363b2aa05942d39fd0ddcddc9b63daca312937a794a7bc8027a049c9befb2bb","segment_id":"environment.md:61115f6649792387","source_path":"environment.md","text_hash":"61115f664979238731a390e84433a818965b7eaf1d38fa5b4b1507c33ef28c91","text":"Precedence (highest → lowest)","translated":"优先级(从高到低)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:40Z"} +{"cache_key":"c3c32ca9a6e0b7331bd674903379664ef8c5ab9f675dbb531062af512452343e","segment_id":"index.md:acdd1e734125f341","source_path":"index.md","text_hash":"acdd1e734125f341604c0efbabdcc4c4b0597e8f6235d66c2445edd1812838c1","text":"Telegram","translated":"Telegram","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:46Z"} +{"cache_key":"c3f6ef9654ecec9e668759d52d4b3b337eb11cfc8c41c6c29afbd4c7a6b1a3aa","segment_id":"index.md:f0b349e90cb60b2f","source_path":"index.md","text_hash":"f0b349e90cb60b2f96222d0be1ff6532185f385f4909a19dd269ea3e9e77a04d","text":" (default); groups are isolated","translated":" (默认);群组是隔离的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:35Z"} +{"cache_key":"c459652c41ab2b7b00625ccdcbb406c410e20c6427b9c7db02f6fdd47ba6f749","segment_id":"help/index.md:156597e2632411d1","source_path":"help/index.md","text_hash":"156597e2632411d1d5f634db15004072607ba45072a4e17dfa51790a37b6781f","text":"Gateway issues:","translated":"Gateway 问题:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:21Z"} +{"cache_key":"c483b6ba1c94a31f76c8e7312a407d38c30bce0f4712658564a6f18c1216a82d","segment_id":"environment.md:frontmatter:read_when:1","source_path":"environment.md:frontmatter:read_when:1","text_hash":"a3a2d99a99de98220c8e0296d6f4e4b2a34024916bd2379d1b3b9179c8fae46f","text":"You are debugging missing API keys in the Gateway","translated":"您正在调试 Gateway 中缺失的 API 密钥","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:04Z"} +{"cache_key":"c492c9a161bdd51ea2c2cdd14a9b9bb5db1cd52cf0c29fb37109d054b7ee9a0d","segment_id":"help/index.md:frontmatter:summary","source_path":"help/index.md:frontmatter:summary","text_hash":"aece82a2d540ab1a9a21c7b038127cae6e9db2149491564bb1856b6f8999f205","text":"Help hub: common fixes, install sanity, and where to look when something breaks","translated":"帮助中心:常见修复方法、安装健全性检查,以及出问题时该去哪里排查","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:21:29Z"} +{"cache_key":"c4cdc8fbd5869ac2ecac6d2aedef557b386f308d0e2819293e3c743d3cc6ae86","segment_id":"help/index.md:3c33340bd23b8db8","source_path":"help/index.md","text_hash":"3c33340bd23b8db89f18fe7d05a954738c0dd5ba9623cf6bdb7bb5d1a3729cfc","text":"FAQ (concepts)","translated":"常见问题(概念)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:50Z"} +{"cache_key":"c504cdf411edd24aafa9f9af4a1d9555dd4813e7717812dd30f12f6ce0f36335","segment_id":"start/wizard.md:14290e1d06812977","source_path":"start/wizard.md","text_hash":"14290e1d0681297772dedd7ea7e78b2d2492a46382251c6f8f49a2977978ece1","text":"Health check","translated":"健康检查","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:30Z"} +{"cache_key":"c50cf8a23b65ef73b5bfb717f8d28d8e2e13435175b38a9b94a6a92fd79c241a","segment_id":"start/wizard.md:2addbbaf06856d61","source_path":"start/wizard.md","text_hash":"2addbbaf06856d61875d46a98c898d3985a48f1028e2e5f1f8b68022902f5879","text":"Kimi Coding","translated":"Kimi Coding","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:10Z"} +{"cache_key":"c5341e93cca2bf9b412fba71811b5c75affd70642d5cac522c20f656fce8c171","segment_id":"start/getting-started.md:85ed1b061af844c7","source_path":"start/getting-started.md","text_hash":"85ed1b061af844c761d40a5328177c10aea1be3a6eb49e3ef2aad5e9724c5edc","text":"Always-on / VPN setups: ","translated":"常驻运行 / VPN 设置: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:38Z"} +{"cache_key":"c547a034bcb14649348b839344981ab2abe4d278dd058e299ee088aca6d1cbb2","segment_id":"index.md:19525ac5e5b9c476","source_path":"index.md","text_hash":"19525ac5e5b9c476b36a38c5697063e37e8fe2fae8ef6611f620def69430cf74","text":"Canvas host","translated":"Canvas 主机","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:55Z"} +{"cache_key":"c577961fb1dd2981c632731703b6fa32ce458c2a1d22f624053d893601313a69","segment_id":"index.md:9fc31bacba5cb332","source_path":"index.md","text_hash":"9fc31bacba5cb33207804b9e6a8775a3f9521c9a653133fd06e5d14206103e48","text":"Streaming + chunking","translated":"流式传输与分块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:02Z"} +{"cache_key":"c59753265e4fde2eba581fac96edc31fac666f999016b10be79673bb9f8fff01","segment_id":"index.md:f3047ab42a6a5bbf","source_path":"index.md","text_hash":"f3047ab42a6a5bbf164106356fa823ecada895064120c4e5a30e1f632741cc5f","text":"Web surfaces","translated":"Web 界面","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:25Z"} +{"cache_key":"c5a0c89316164529f7023f5315efd593449709ea51025067e3e3ac600c2b8955","segment_id":"index.md:f1e3b32c8eb0df8e","source_path":"index.md","text_hash":"f1e3b32c8eb0df8ea105f043edf614005742c15581e2cebc5a9c3bafb0b90303","text":"Multi-agent routing","translated":"多智能体路由","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:10Z"} +{"cache_key":"c5aa6ee094793c8175cf46e51a84ccfa7bfb96483511447ee39bffc5c5d621a6","segment_id":"index.md:f9b8279bc46e847b","source_path":"index.md","text_hash":"f9b8279bc46e847bfcc47b8701fd5c5dc27baa304d5add8278a7f97925c3ec13","text":"Mattermost (plugin)","translated":"Mattermost(插件)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:51Z"} +{"cache_key":"c600fc61e6150bfb212aae76377cc9c818199be5b646524cacdc83e1c8548e4c","segment_id":"help/index.md:2adc964c084749b1","source_path":"help/index.md","text_hash":"2adc964c084749b1f2d8aef24030988b667dbda2e38a6a1699556c93e07c1cea","text":"Start here","translated":"从这里开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:22Z"} +{"cache_key":"c63aa51793c779b2a349df7ffac1628bb2cc332f86766a178ca09f0d1ab6b9ef","segment_id":"environment.md:d08a8493f686363a","source_path":"environment.md","text_hash":"d08a8493f686363a78b913d45ebfbd87a3768d1c77b70f23b1fdade3c066e481","text":"Shell env import","translated":"Shell 环境导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:45Z"} +{"cache_key":"c6579c041588ea1bb181e9a8deb7415e62a84d1bd20b12e4570bfbd9c2ade3d8","segment_id":"index.md:233cfad76c3aa9dd","source_path":"index.md","text_hash":"233cfad76c3aa9dd5cc0566746af197eac457a88c1e300ae788a8ada7f96b383","text":"From source (development):","translated":"从源码安装(开发):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:17Z"} +{"cache_key":"c68def9780e982378b5c6b30c5c52340f6495cfc16ebe6378fa8655b7df12662","segment_id":"start/wizard.md:663ea1bfffe5038f","source_path":"start/wizard.md","text_hash":"663ea1bfffe5038f3f0cf667f14c4257eff52d77ce7f2a218f72e9286616ea39","text":" to ","translated":" 为 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:22Z"} +{"cache_key":"c6ca6417d36b17f38103f8c80bf1974f694de7f8e5cf6c75e2df8722898afc33","segment_id":"environment.md:frontmatter:read_when:0","source_path":"environment.md:frontmatter:read_when:0","text_hash":"90fc0487bff88009979cff1061c1a882df8c3b1baa9c43538331d9d5dab15479","text":"You need to know which env vars are loaded, and in what order","translated":"您需要了解加载了哪些 环境变量,以及加载顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:12Z"} +{"cache_key":"c6f804812e9ae46bd893fabd31bc85463705d5a761157ef2dccfdc6f8a278d20","segment_id":"index.md:da22b9d6584e1d8a","source_path":"index.md","text_hash":"da22b9d6584e1d8aa709165be214e0f9bdf2be428816e9ce1c4506bf86218cb4","text":"Core Contributors","translated":"核心贡献者","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:12Z"} +{"cache_key":"c6fafa0a56fb2daa3b5eb1ab12bcde96e81c8b5eb8c495ac27c999aa7ece81f0","segment_id":"index.md:66354a1d3225edbf","source_path":"index.md","text_hash":"66354a1d3225edbf01146504d06aaea1242dcf50424054c3001fc6fa2ddece0f","text":"Remote access","translated":"远程访问","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:41Z"} +{"cache_key":"c749935b054cdee1215d5c7bc80ccadc89b5251b7b720e58f1fc750832c291cc","segment_id":"start/getting-started.md:f940dae2228542bc","source_path":"start/getting-started.md","text_hash":"f940dae2228542bc51f88220681f263413d5d91c47a84b411600abc82294299a","text":"),\nso group/channel sessions are sandboxed. If you want the main agent to always\nrun on host, set an explicit per-agent override:","translated":"),因此群组/渠道会话是沙箱化的。如果您希望主智能体始终在主机上运行,请设置显式的逐智能体覆盖:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:21Z"} +{"cache_key":"c7938f197a6a0913e762962c7a145a194fb20261b6366796749cfff9bec325f1","segment_id":"help/index.md:cad44fbae951d379","source_path":"help/index.md","text_hash":"cad44fbae951d3791565b0cee788c01c3bd10e0176167acb691b8dba0f7895f8","text":"Gateway logging","translated":"Gateway 日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:31Z"} +{"cache_key":"c7d8295ce2f5f373b188cd04e782c94c0d1c45ee5dfcf10d220f7a24629104a4","segment_id":"start/getting-started.md:8f6fb4eb7f42c0e2","source_path":"start/getting-started.md","text_hash":"8f6fb4eb7f42c0e245e29e63f5b82cc3ba19852681d1ed9aed291f59cf75ec0e","text":"Security","translated":"安全","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:14Z"} +{"cache_key":"c7f525205b3a6feadb47fbfcbcbfc68f82fe9ae13af1a5c16ac3d52b9c9bf288","segment_id":"index.md:2a6b24ad28722034","source_path":"index.md","text_hash":"2a6b24ad287220345e96eb8021fe29d42b0785766c8df658827e7251da2d36dc","text":"Credits","translated":"致谢","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:15Z"} +{"cache_key":"c804bb5b5895281827002da2fcf801becaeb7680046827908a93ec9b050d971b","segment_id":"index.md:03279877bfe1de07","source_path":"index.md","text_hash":"03279877bfe1de0766393b51e69853dec7e95c287ef887d65d91c8bbe84ff9ff","text":"WebChat + macOS app","translated":"WebChat + macOS 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:02Z"} +{"cache_key":"c8226a707aea96b4c38666b0e128055b91ef72929100106d9e62985f5d0727bc","segment_id":"environment.md:a258b30f88c30650","source_path":"environment.md","text_hash":"a258b30f88c30650e73073d5bdde5cfcc6987100ae62d37789e5c46a0d85b7c6","text":"Global ","translated":"全局 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:39Z"} +{"cache_key":"c839449ed2f2e2c13f4b4732789e52a7884ced2ccc0f4f285709a62f52005527","segment_id":"index.md:6fa3cbf451b2a1d5","source_path":"index.md","text_hash":"6fa3cbf451b2a1d54159d42c3ea5ab8725b0c8620d831f8c1602676b38ab00e6","text":"Sessions","translated":"会话","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:56Z"} +{"cache_key":"c85ec585240e224ad62f0cde143c6625d9eb6e2dfc1a425098b24975e4aa43bf","segment_id":"index.md:856302569e24c4d6","source_path":"index.md","text_hash":"856302569e24c4d64997e2ec5c37729f852bcccf333ba1e2f71e189c9d172e6d","text":": SSH tunnel or tailnet/VPN; see ","translated":":SSH 隧道或 tailnet/VPN;参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:38Z"} +{"cache_key":"c8ced90adeff8e91c3f5418bdc11abd60378688097157d3e12c7b51e9841ca2c","segment_id":"environment.md:cdb4ee2aea69cc6a","source_path":"environment.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":"。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:58Z"} +{"cache_key":"c982edd40183708dbf5bc791228db4bfd5b4b33d5a623e1173ee48a697e31c6f","segment_id":"index.md:f12242785ecda793","source_path":"index.md","text_hash":"f12242785ecda7935ded50cd48418357d32d3bac290f7a199bc9f0c7fbd13123","text":") — Location parsing (Telegram + WhatsApp)","translated":")—— 位置解析(Telegram + WhatsApp)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:56Z"} +{"cache_key":"c98b98cde5f7adf29bada7169968b0e7c20763589cdef21766c06460d88f0f22","segment_id":"index.md:0c67abfaa5415391","source_path":"index.md","text_hash":"0c67abfaa5415391a31cf3a4624746b6b212b5ae66364be28ee2d131f014e0c6","text":"🧩 ","translated":"🧩 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:44Z"} +{"cache_key":"c9939001c16700c5d35daa87cee1e92d3290b1c7987abc44df7af44cb0549c21","segment_id":"help/index.md:frontmatter:read_when:0","source_path":"help/index.md:frontmatter:read_when:0","text_hash":"ee0615553374970664b58ebd8e5d0ebc9bc8a5f03387671afbfd0096b390aa9b","text":"You’re new and want the “what do I click/run” guide","translated":"你是新手,想要一份\"该点击什么/运行什么\"的指南","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:27Z"} +{"cache_key":"c9dab76bf88e0e641fc671ad2fbd902a1ae1db96eb22db04db9410d8a5ce0a79","segment_id":"index.md:63a3abfa879299dd","source_path":"index.md","text_hash":"63a3abfa879299ddcc03558012bfd6075cbd72f7a175b739095bf979700297f7","text":"Multi-instance quickstart (optional):","translated":"多实例快速开始(可选):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:23Z"} +{"cache_key":"ca3d654d1f779e0df22c1f09273aac145e550253cf972adfbc28d2751bbce6c5","segment_id":"index.md:1e37e607483201e2","source_path":"index.md","text_hash":"1e37e607483201e2152d2e9c68874dd4027648efdd9cfccb7bf8c9837398d143","text":"), serving ","translated":"),提供 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:01Z"} +{"cache_key":"ca81625ad797b914689b25dc7631b7d3b910d56f40d3f807c8b9253cdfd4d17f","segment_id":"index.md:f0e2018271f51504","source_path":"index.md","text_hash":"f0e2018271f515041084c8189f297236abe18f9ec77edad1a61c5413310bbd9e","text":"🖥️ ","translated":"🖥️ ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:49Z"} +{"cache_key":"caf51be0c1458b52f94033eb1b629dba33d1d3a372efd533cd0b13846db8c4d0","segment_id":"index.md:4d87941d681ca4e8","source_path":"index.md","text_hash":"4d87941d681ca4e89ca303d033b7d383d3acfbb6d9d9616bd88d7c19cf92c3dd","text":"Pi","translated":"Pi","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:27:56Z"} +{"cache_key":"cb6c11ef1460261e35016f0eaa5966553e6f8f20982b69d042a4f62515d65ad7","segment_id":"help/index.md:frontmatter:read_when:0","source_path":"help/index.md:frontmatter:read_when:0","text_hash":"ee0615553374970664b58ebd8e5d0ebc9bc8a5f03387671afbfd0096b390aa9b","text":"You’re new and want the “what do I click/run” guide","translated":"你是新手,想要一份\"该点什么/该运行什么\"的指南","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:12Z"} +{"cache_key":"cb7224509e3500bfd50fd737857395338c005b21a5cb2142a81af37ebe5204ad","segment_id":"environment.md:frontmatter:read_when:2","source_path":"environment.md:frontmatter:read_when:2","text_hash":"822b3d74ce16c1be19059fad4ca5bf7ae9327f58fa1ff4e75e78d5afa75c038f","text":"You are documenting provider auth or deployment environments","translated":"您正在记录 提供商 的认证或部署环境","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:17Z"} +{"cache_key":"cbc65efaa2c9304b41332d4d4b06ec60e7b2eaf66b98f9c7de9db4ada5b50007","segment_id":"help/index.md:frontmatter:read_when:0","source_path":"help/index.md:frontmatter:read_when:0","text_hash":"ee0615553374970664b58ebd8e5d0ebc9bc8a5f03387671afbfd0096b390aa9b","text":"You’re new and want the “what do I click/run” guide","translated":"你是新手,想要一份\"我该点击/运行什么\"的指南","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:21:32Z"} +{"cache_key":"cbccccc9ef3c5b2bdfc9137d40fcc79548902f77addaa40d473cf39ed46d1658","segment_id":"index.md:255ce77b7a6a015f","source_path":"index.md","text_hash":"255ce77b7a6a015f8595868a524b67c134e8fb405f4584fdac020e57f4ccd5f6","text":"Loopback-first","translated":"优先回环","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:48Z"} +{"cache_key":"cbff4c4140b6a285569765e9905785ee009781edd57d605ffb9171aff34c2d79","segment_id":"index.md:6b3f22c979b9e6f8","source_path":"index.md","text_hash":"6b3f22c979b9e6f8622031a6b638ec5f730c32de646d013e616078e03f5a6149","text":"iOS node","translated":"iOS 节点","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:08Z"} +{"cache_key":"cc06ade0909671964a2ea7220e8ac6cbb33aaa9dffe47a13da27bea6d2d9a0d3","segment_id":"index.md:d08cec54f66c140c","source_path":"index.md","text_hash":"d08cec54f66c140c655a1631f6d629927c7c38b9c8bfa91c875df9bd3ad3c559","text":"OpenClaw assistant setup","translated":"OpenClaw 助手设置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:14Z"} +{"cache_key":"cc58238acf407fd16eca091f737e3d7e588e27b1cad3453883c342c3c0e8e9b4","segment_id":"environment.md:cdb4ee2aea69cc6a","source_path":"environment.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":".","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:26Z"} +{"cache_key":"cc63b18c7aa9315b943c74483a99d77ec5c26a9ca9a1120637ac7e346b98fc4d","segment_id":"start/getting-started.md:fa6eee60553a165b","source_path":"start/getting-started.md","text_hash":"fa6eee60553a165b731e236a48d54169a31fa39cccbc1967e13fba9e4cc38868","text":"Pairing doc: ","translated":"配对文档: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:41Z"} +{"cache_key":"cc8f5dcfbe51a4638b375d367381be97b79d012b56b2c7eadd2e38d164cdd177","segment_id":"start/wizard.md:e18251a039a6b735","source_path":"start/wizard.md","text_hash":"e18251a039a6b7353675decc475898bfdb91d3bd9d37e83c8447d0359b8711c3","text":"Non-interactive flags: ","translated":"非交互标志: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:05Z"} +{"cache_key":"cc906618700533ea8dd9d752b8e2ef28ffb8707654a557d7cef1b867cdd57f1a","segment_id":"index.md:ceee4f2088b9d5ba","source_path":"index.md","text_hash":"ceee4f2088b9d5ba7d417bac7395003acfbcef576fd4cc1dd3063972f038218a","text":"The name","translated":"名称","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:01Z"} +{"cache_key":"cc93bf5458542a509cb8460472bf3269d769fe1cdee6201ab736c4b5460d64d5","segment_id":"start/wizard.md:4bba41aa0148ebb4","source_path":"start/wizard.md","text_hash":"4bba41aa0148ebb49b33763f1b38a983af7c0a4dd22fff07d3cf94fdcb96ecd3","text":"Linux (and Windows via WSL2): systemd user unit","translated":"Linux(以及通过 WSL2 的 Windows):systemd 用户单元","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:17Z"} +{"cache_key":"cd2d7cce6f1c10e008e8efe49ecf02b6ac401d686667986409f7e6796e9f1140","segment_id":"environment.md:45ca56d179d4788c","source_path":"environment.md","text_hash":"45ca56d179d4788c55ba9f7653b376d62e7faa738e92259e3d4f6f5c1b554f28","text":"Related","translated":"相关内容","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:44Z"} +{"cache_key":"cd4cdcf85e185ce70df30cbda64fb2d77baa6a6c989e67cde3f80315c06b3839","segment_id":"index.md:45e6d69dbe995a36","source_path":"index.md","text_hash":"45e6d69dbe995a36f7bc20755eff4eb4d2afaaedbcac4668ab62540c57219f32","text":"macOS app","translated":"macOS 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:33Z"} +{"cache_key":"cd82c395857efd6e374fec3ad86de5dd8989415770d38a86d8a1980cd372b7f5","segment_id":"start/wizard.md:c4e77a12a2c0b664","source_path":"start/wizard.md","text_hash":"c4e77a12a2c0b664f398de857da71528f66ffb4a70e65769897dcc7147167b2c","text":" or use allowlists.","translated":" 批准,或使用允许名单。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:05Z"} +{"cache_key":"cd9743cfc03baed1ac0aba354dec17a69f9204d0f64f1c71e9c137298bff5141","segment_id":"help/index.md:b79cac926e0b2e34","source_path":"help/index.md","text_hash":"b79cac926e0b2e347e72cc91d5174037c9e17ae7733fd7bdb570f71b10cd7bfc","text":"Help","translated":"帮助","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:16Z"} +{"cache_key":"cdb2a2bfea264785bf8cb89785edd4df2b7de3adf29db9507ad953dcbdd6d939","segment_id":"help/index.md:b79cac926e0b2e34","source_path":"help/index.md","text_hash":"b79cac926e0b2e347e72cc91d5174037c9e17ae7733fd7bdb570f71b10cd7bfc","text":"Help","translated":"帮助","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:21:35Z"} +{"cache_key":"cdd968f07504f0d2da9c8620421deda0bfb9153636d6be92a239eb6adcd9f2b9","segment_id":"environment.md:f0442e6e05ccca16","source_path":"environment.md","text_hash":"f0442e6e05ccca160d17de0e7d509891b91b921366b2202b2b5c80435824e140","text":"Two equivalent ways to set inline env vars (both are non-overriding):","translated":"两种等效的内联设置 环境变量 的方式(均为非覆盖):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:02Z"} +{"cache_key":"ce171e0ce019a7a095f4e7aaa27de6784ee9bb99d4353b3b3b9719eff6509d30","segment_id":"index.md:856302569e24c4d6","source_path":"index.md","text_hash":"856302569e24c4d64997e2ec5c37729f852bcccf333ba1e2f71e189c9d172e6d","text":": SSH tunnel or tailnet/VPN; see ","translated":":SSH 隧道或 Tailnet/VPN;参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:16Z"} +{"cache_key":"ce26a64b93065c2ad2be924884f77346c4578db84e4df79e49d5ee43b3ccb617","segment_id":"index.md:9fc31bacba5cb332","source_path":"index.md","text_hash":"9fc31bacba5cb33207804b9e6a8775a3f9521c9a653133fd06e5d14206103e48","text":"Streaming + chunking","translated":"流式传输 + 分块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:06Z"} +{"cache_key":"ce31f98c669ba131d564edefa106a53c0d099661680c8872048ae0636dfbe73c","segment_id":"environment.md:c2d7247c8acb83a5","source_path":"environment.md","text_hash":"c2d7247c8acb83a5a020458fa836c2445922b51513dbdbf154ab5f7656cb04e9","text":"; does not override).","translated":";不覆盖)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:37Z"} +{"cache_key":"ce3c2713f373fff6ebab9c70141debe3262d0a7ff6214fd146fa277b67c1ab3e","segment_id":"start/wizard.md:bd8a6e0ff884f51d","source_path":"start/wizard.md","text_hash":"bd8a6e0ff884f51d6a4a9b70f4680033876871936c72cf8af5df4e4b2836c75c","text":"Wizard runs a model check and warns if the configured model is unknown or missing auth.","translated":"向导会运行模型检查,如果配置的模型未知或缺少认证则发出警告。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:24Z"} +{"cache_key":"ce618de323766f3aa222b534fb69a1502c03699a6b57e801e6f1a1b3c32d3431","segment_id":"index.md:9abe8e9025013e78","source_path":"index.md","text_hash":"9abe8e9025013e78a6bf2913f8c20ee43134ad001ce29ced89e2af9c07096d8f","text":"Media: images","translated":"媒体:图片","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:25Z"} +{"cache_key":"ce62c5006939b21f7a2d236f9cdb545ce653778800504e85668fe99075067cbf","segment_id":"environment.md:6db0742daaf9f191","source_path":"environment.md","text_hash":"6db0742daaf9f191ab7816d2c9d317b1ea1693453a8c63b95af8b01477e0f5bb","text":" runs your login shell and imports only ","translated":" 运行你的登录 shell,并仅导入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:47Z"} +{"cache_key":"cf001b0403d7ae959797460c96aa4da24818c662362595f2da0be349caeb6a09","segment_id":"index.md:cda454f61dfcac70","source_path":"index.md","text_hash":"cda454f61dfcac7007a9edc538f9f58cf38caa0652e253975979308162bccc53","text":"Gateway configuration","translated":"Gateway 配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:31Z"} +{"cache_key":"cf9fc66b44905a0c47ca04f98d6e6507821789844f1e97ca2026f7df6e5b1451","segment_id":"environment.md:f7e239a42b7cd986","source_path":"environment.md","text_hash":"f7e239a42b7cd986a1558fed234e975ed2e96e9d37cf0a93f381778c461c89dd","text":"OpenClaw pulls environment variables from multiple sources. The rule is ","translated":"OpenClaw 从多个来源拉取 环境变量。规则是 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:11Z"} +{"cache_key":"cfc26997d872d590a2aba69f0aba6f704354d3aea9aa3bd433693ca7182cacdc","segment_id":"start/getting-started.md:1093115897879aa3","source_path":"start/getting-started.md","text_hash":"1093115897879aa3ad9511a1dc2850929cfb60ba45ec741605f69f5d20203472","text":"Runtime","translated":"运行时","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:17Z"} +{"cache_key":"d0594bae529c9774fa42aa68b86c4e1cb876bee2ffe9173b4d9f5a5f8325cae0","segment_id":"start/wizard.md:cac2e1b207fdd700","source_path":"start/wizard.md","text_hash":"cac2e1b207fdd700258939f1e7977375609e4b2e26785c93c230da25bc0cbd82","text":").\nClients (macOS app, Control UI) can render steps without re‑implementing onboarding logic.","translated":")。客户端(macOS 应用、Control UI)可以渲染步骤而无需重新实现上手引导逻辑。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:46Z"} +{"cache_key":"d076be47cee695839a6d7e0cd10b0c8b2a7da5ae5d222273b89c28de425b741e","segment_id":"environment.md:f6b2ffe1d0d5f521","source_path":"environment.md","text_hash":"f6b2ffe1d0d5f521b76cabc67d6e96da2b1170eef8086d530558e9906a7f092d","text":"Models overview","translated":"模型概览","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:47:21Z"} +{"cache_key":"d08787ed2ed706d9bd6e4f7296e7330177093a07d1b129a0487e2e0e151eb63e","segment_id":"start/getting-started.md:ea8c0ae0a9156b3b","source_path":"start/getting-started.md","text_hash":"ea8c0ae0a9156b3bf89fa7572f685a4d9fd24e89a7326fc7f41fc7e85f139b80","text":"WSL2","translated":"WSL2","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:39Z"} +{"cache_key":"d09b7c0117a630c96ed0f5f9c262caa47d5273ff6d51a8d46c0ca45721eaebe2","segment_id":"environment.md:3fe738a7ee6aaff5","source_path":"environment.md","text_hash":"3fe738a7ee6aaff51f099d9a8314510c99ced6a568eb38c67642cd43bb54eec0","text":" in the current working directory","translated":" 在当前工作目录中","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:04Z"} +{"cache_key":"d0d44c0cc0a3150ea2571f5ecd32d65671470df6b9b093decacc0852597b2201","segment_id":"start/wizard.md:5a5902a06688a396","source_path":"start/wizard.md","text_hash":"5a5902a06688a39618ade9c26292a6e3b13124cee42cc028d35943ccc1e21a5c","text":" (full control).","translated":" (完全控制)模式开始。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:41Z"} +{"cache_key":"d0f76abf14b1216bff9974f7e507a3c2a43f331f1ebd805279843692ae78f662","segment_id":"index.md:5cf9ea2e20780551","source_path":"index.md","text_hash":"5cf9ea2e2078055129b38cfbc394142ca6ca41556bd6e31cbd527425647c1d1e","text":"One Gateway per host (recommended)","translated":"每台主机一个 Gateway(推荐)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:30Z"} +{"cache_key":"d12af03e20c20a4ebdcdbf4c32f52081339c0aa7bd1bb44b311875547bb39918","segment_id":"start/wizard.md:14a01a1b76ad6311","source_path":"start/wizard.md","text_hash":"14a01a1b76ad63111eb126c1d124a893abcb5cc90fe893825a9c96362112ab4f","text":" adds gateway health probes to status output (requires a reachable gateway).","translated":" 将 Gateway 健康探测添加到状态输出中(需要可达的 Gateway)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:41Z"} +{"cache_key":"d1818c531bc4e1cca14e64f751cf8698cb0701a745fb3da03b37b4fd7129c18b","segment_id":"start/wizard.md:6d0323ac97e5a313","source_path":"start/wizard.md","text_hash":"6d0323ac97e5a3136bae41278bfd46f5985969ee57dea5f25d7faa78bb01c87e","text":" when model is unset or ","translated":" (当模型未设置或为 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:24Z"} +{"cache_key":"d1a349d8c1859f2d1c00367b86704fa95d4168c8615ada60834a6890215d1f58","segment_id":"index.md:3c064c83b8d244fe","source_path":"index.md","text_hash":"3c064c83b8d244fef61e5fd8ce5f070b857a3578a71745e61eea02892788c020","text":" — Anthropic (Claude Pro/Max) + OpenAI (ChatGPT/Codex) via OAuth","translated":" —— 通过 OAuth 支持 Anthropic(Claude Pro/Max)+ OpenAI(ChatGPT/Codex)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:28Z"} +{"cache_key":"d1d30ee69fb8519a966ebbb5cb51d2be029399b2951ef296b23f96d3fea4bc3a","segment_id":"start/wizard.md:3fad3d2e2c01a9ea","source_path":"start/wizard.md","text_hash":"3fad3d2e2c01a9ea3a66cbcb1b05a0d5982e3665cf0e1ec6dee0e031e83137e1","text":"Reads the available skills and checks requirements.","translated":"读取可用技能并检查依赖条件。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:43Z"} +{"cache_key":"d234d82b06f65337a5ab45e775d0f0abda696d4e04e6115c6a042853b3b11ca4","segment_id":"index.md:084514e91f37c3ce","source_path":"index.md","text_hash":"084514e91f37c3ce85360e26c70b77fdc95f0d3551ce309db96fbcf956a53b01","text":"Dashboard (browser Control UI)","translated":"仪表板(浏览器控制界面)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:04Z"} +{"cache_key":"d29dfffbf5c42410939bbb88504ae09e8009835fc6ba11b0bd27ae0da0839aee","segment_id":"environment.md:45ca56d179d4788c","source_path":"environment.md","text_hash":"45ca56d179d4788c55ba9f7653b376d62e7faa738e92259e3d4f6f5c1b554f28","text":"Related","translated":"相关内容","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:30Z"} +{"cache_key":"d2daa68c34089a85125ae39af1770f4ec07070bbe5b06c0d0c2d84ea0d10a6ec","segment_id":"index.md:ded906ea94d05152","source_path":"index.md","text_hash":"ded906ea94d0515249f0bcab1ba63835b5968c142e9c7ea0cb6925317444d98c","text":"Configuration examples","translated":"配置示例","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:27Z"} +{"cache_key":"d2daf9c0748530a05031c851236072d2d247919151adeb5afc085b3c1df0a5d2","segment_id":"index.md:b214cd10585678ca","source_path":"index.md","text_hash":"b214cd10585678ca1250ce1ae1a50ad4001de4577a10e36be396a3409314e442","text":"@badlogicc","translated":"@badlogicc","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:27Z"} +{"cache_key":"d2eeaf2250e691f5598d218f5ab0a4086d57b68635b5d91718b8895e00fd80e6","segment_id":"environment.md:61115f6649792387","source_path":"environment.md","text_hash":"61115f664979238731a390e84433a818965b7eaf1d38fa5b4b1507c33ef28c91","text":"Precedence (highest → lowest)","translated":"优先级(从高到低)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:25Z"} +{"cache_key":"d304bb8482d72d9a36276fe206308ad11314fae096c08348d76048bc1593c708","segment_id":"start/getting-started.md:d00eca1bae674280","source_path":"start/getting-started.md","text_hash":"d00eca1bae6742803906ab42a831e8b5396d15b6573ea13c139ec31631208ec1","text":"Getting Started","translated":"快速入门","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:21Z"} +{"cache_key":"d308117273fcffa99031b6168d0430801d743429421c4ebbc45aedace958b061","segment_id":"index.md:31365ab9453d6a1e","source_path":"index.md","text_hash":"31365ab9453d6a1ec03731622803d3b44f345b6afad08040d7f3e97290c77913","text":"do nothing","translated":"不做任何操作","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:30Z"} +{"cache_key":"d30d12f7e78eb693ff2d7b58b572be7efd8f8787f98a3ccad0b04752af019ce5","segment_id":"environment.md:b1d6b91b67c2afa5","source_path":"environment.md","text_hash":"b1d6b91b67c2afa5e322988d9462638d354ddf8a1ef79dba987f815c22b4baee","text":" at ","translated":" 位于 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:49Z"} +{"cache_key":"d41535413a3b4c62091cb7682dab05259a63ac65d34ea5b3463c5808ccb28960","segment_id":"index.md:268ebcd6be28e8d8","source_path":"index.md","text_hash":"268ebcd6be28e8d853ace3a6e28f269fbda1343b53e3f0de97ea3d5bf1a0e33e","text":"Clawd","translated":"Clawd","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:32Z"} +{"cache_key":"d43575ea070a82b8c1685440526dc44dd9aed79bc448b5192134b0fa0c008749","segment_id":"index.md:ee8b06871d5e335e","source_path":"index.md","text_hash":"ee8b06871d5e335e6e686f4e2ee9c9e6de5d389ece6636e0b5e654e0d4dd5b7e","text":"Control UI (browser)","translated":"控制界面(浏览器)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:10Z"} +{"cache_key":"d4735a7a8ac59df4f41d36c7c08984885356d88053b7708e6855dbd446102081","segment_id":"index.md:042c75df73389c8a","source_path":"index.md","text_hash":"042c75df73389c8a7c0871d2a451bd20431d24e908e2c192827a54022df95005","text":"Nacho Iacovino","translated":"Nacho Iacovino","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:55Z"} +{"cache_key":"d490073217e575e01f8f2e93e3101b423f269eba9ce72829891ee9b89843212e","segment_id":"index.md:0b60fe04b3c5c3c7","source_path":"index.md","text_hash":"0b60fe04b3c5c3c76371b6eca8b19c8e09a0e54c9010711ff87e782d87d2190b","text":"Android app","translated":"Android 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:38Z"} +{"cache_key":"d49ac0479b4e2121af227b4a3bdcebe1d4a0d610b35baa6782dafb7fbf4fc4a6","segment_id":"environment.md:8d076464a84995bc","source_path":"environment.md","text_hash":"8d076464a84995bc095e934b0aa1e4419372f27cd71d033571e4dbba201ee5d8","text":"You can reference env vars directly in config string values using ","translated":"你可以使用以下方式在配置字符串值中直接引用环境变量 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:47:01Z"} +{"cache_key":"d4d0c17af1fe72f822af0009148f75c60a1ed6451e748c2b3df85d55e7124987","segment_id":"start/getting-started.md:ebaef508acb6f7b6","source_path":"start/getting-started.md","text_hash":"ebaef508acb6f7b6bb2a0a4342b2aafd862c3694450fe11789070419c1591681","text":"iOS/Android nodes (Canvas/camera/voice): ","translated":"iOS/Android 节点(Canvas/相机/语音): ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:25Z"} +{"cache_key":"d4f41acdb842e7c1c8bfec5ad3ab1dab8d98a4792e99dd535877f4201a21a031","segment_id":"start/wizard.md:9db982e2d3194ff1","source_path":"start/wizard.md","text_hash":"9db982e2d3194ff10f91d59646b6193c1b3d36f86f8d4da50b3d1bf8a5ae2ac6","text":": bot token.","translated":":机器人令牌。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:30Z"} +{"cache_key":"d4f4558ec6bd856ca63ddc3f050e7f129c76188a898fa7765d990b8e1ca6fdcd","segment_id":"environment.md:496aca80e4d8f29f","source_path":"environment.md","text_hash":"496aca80e4d8f29fb8e8cd816c3afb48d3f103970b3a2ee1600c08ca67326dee","text":" block","translated":" 块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:51Z"} +{"cache_key":"d4f9bd5e931f08626a42d41967e2597390d16854993c968eeb9cc8720374a1a0","segment_id":"start/wizard.md:9fd728c66c9a256b","source_path":"start/wizard.md","text_hash":"9fd728c66c9a256b121472dabf32a34317aed01d8427d70ec830289cf23a7cc8","text":"Add ","translated":"添加 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:00Z"} +{"cache_key":"d5381f750f50864e130866c293987087c17d023cec62188df764f7e91dc7606a","segment_id":"index.md:e1b33cfa2a781bde","source_path":"index.md","text_hash":"e1b33cfa2a781bde9ef6c1d08bf95993c62f780a6664f5c5b92e3d3633e1fcf8","text":" (@nachoiacovino, ","translated":" (@nachoiacovino, ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:00Z"} +{"cache_key":"d5c1ce3309dbb00f67e9ff21a4f6dbef5f531ee3781b33f5fc1be91b6fd46196","segment_id":"start/wizard.md:5aa55e363e93c8bc","source_path":"start/wizard.md","text_hash":"5aa55e363e93c8bc3623dcb97e318cfc0784b4fb24e287f600192488208fd8f1","text":"Local mode (default)","translated":"本地模式(默认)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:13Z"} +{"cache_key":"d61140d8a641f1f6316535bc25bdb629b4508cb21951f549a6908b0e8c75b303","segment_id":"environment.md:a9d9b94d02c2f6ab","source_path":"environment.md","text_hash":"a9d9b94d02c2f6ab616036cab13ba821053514d384f064c56d338d748050ba7c","text":" lowest)","translated":" 最低)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:31Z"} +{"cache_key":"d62921e75336cfb2d915a837e650bc5d8690441848c19f2d5a57ecbf0247c33b","segment_id":"start/getting-started.md:88d90e2eef3374ce","source_path":"start/getting-started.md","text_hash":"88d90e2eef3374ce1a7b5e7fbd3b1159364b26a8ceb2493d6e546d4444b03cda","text":"Tailscale","translated":"Tailscale","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:34Z"} +{"cache_key":"d6390c8e7e97434033a209c981093a19cabd19baa33feab5462c9cbfe94ed51d","segment_id":"start/getting-started.md:8eb3ea9bbde63159","source_path":"start/getting-started.md","text_hash":"8eb3ea9bbde631592dfac3150044fabe4678c820a107c026035c13bf0c8ba9d7","text":"Auth","translated":"认证","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:03Z"} +{"cache_key":"d6402ced9e7963b9ac7e01b7552846636e06afd06ad8433345d9a108f4360fab","segment_id":"environment.md:453c14128fbfb5f6","source_path":"environment.md","text_hash":"453c14128fbfb5f6757511557132a1dbb3bcbf243267630bfec49db8518c7780","text":"Env var substitution in config","translated":"配置中的环境变量替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:21Z"} +{"cache_key":"d6cb6405997baeadc37aefa302a5594766dc76d757bdb0224e706a196265ab60","segment_id":"index.md:66d0f523a379b2de","source_path":"index.md","text_hash":"66d0f523a379b2de6f8d5fba3a817ebc395f7bcaa54cc132ca9dfa665d1e9378","text":"Skills","translated":"技能","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:13Z"} +{"cache_key":"d73268cbf726ddfd975878dfbe6a3b4d5418e1d7568bcb23d5745eea13b014b7","segment_id":"environment.md:frontmatter:read_when:0","source_path":"environment.md:frontmatter:read_when:0","text_hash":"90fc0487bff88009979cff1061c1a882df8c3b1baa9c43538331d9d5dab15479","text":"You need to know which env vars are loaded, and in what order","translated":"你需要了解加载了哪些环境变量,以及它们的加载顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:14Z"} +{"cache_key":"d771dee3183c3dde95a035d4dd963966fff7f9d7d0d35eb1d66e26e34e6e0746","segment_id":"help/index.md:frontmatter:read_when:1","source_path":"help/index.md:frontmatter:read_when:1","text_hash":"857eafc389d179e83e21e46c10527fec40894fe064c63847ba06b946b7d5eb73","text":"Something broke and you want the fastest path to a fix","translated":"出了问题,你想找到最快的修复方法","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:29Z"} +{"cache_key":"d78b68adf70db59ac77fac9cfe5e338025bf15b23845ec12fa109dffffd26525","segment_id":"environment.md:6db0742daaf9f191","source_path":"environment.md","text_hash":"6db0742daaf9f191ab7816d2c9d317b1ea1693453a8c63b95af8b01477e0f5bb","text":" runs your login shell and imports only ","translated":" 运行您的登录 shell 并仅导入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:14Z"} +{"cache_key":"d791df1af8af8b787e124642b683bf3a90723f32075b0da41ba134fab01e7b16","segment_id":"index.md:42071940eb773f4d","source_path":"index.md","text_hash":"42071940eb773f4dcb7111f0626b4a7a823fc44098e143ff425db8a03528609d","text":" — because every space lobster needs a time-and-space machine.","translated":" — 因为每只太空龙虾都需要一台时空机器。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:20Z"} +{"cache_key":"d798cc1cc5fcd0af14bb92521474c72168a3812ac48cc219e3c0757169d2f2b3","segment_id":"environment.md:1ec31258a6b45ea9","source_path":"environment.md","text_hash":"1ec31258a6b45ea903cd76f5b0190a99ab56afff6241a04f0681eb12b7a02484","text":"Env var equivalents:","translated":"等效的环境变量:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:27Z"} +{"cache_key":"d7efd30a0122aa5514cc6d7fb73d6279b2d1eee879e4ec731d2873142860e82b","segment_id":"index.md:723784fa2b6a0876","source_path":"index.md","text_hash":"723784fa2b6a0876540a92223ee1019f24603499d335d6d82afbc520ef5b5d57","text":") — Creator, lobster whisperer","translated":")—— 创建者,龙虾低语者","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:22Z"} +{"cache_key":"d82d08bf8b5d5245c698d1341d95dd2cbe797404269dffbb948000cab390fc3f","segment_id":"start/wizard.md:765dd901deb1679d","source_path":"start/wizard.md","text_hash":"765dd901deb1679d2fa08bebd5e5ca8a998e8c33b6203053cb18fd352ce22330","text":"Non‑interactive mode","translated":"非交互模式","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:11Z"} +{"cache_key":"d844ae7cf5ac1af1c8e77c093dc0a5b087dbe111241c75fcf0d68c38966fc760","segment_id":"environment.md:a258b30f88c30650","source_path":"environment.md","text_hash":"a258b30f88c30650e73073d5bdde5cfcc6987100ae62d37789e5c46a0d85b7c6","text":"Global ","translated":"全局 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:47Z"} +{"cache_key":"d89eb1af6a6780d9f17aa4ab63b9ea6fb426a6458811cc4898df06d14464d7cb","segment_id":"start/getting-started.md:7412cf3ea50ad037","source_path":"start/getting-started.md","text_hash":"7412cf3ea50ad0377e8450ef19d397a4b62fc2a44c9ab7f02cc012f80df90199","text":" (stores ","translated":" (存储 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:32Z"} +{"cache_key":"d8ad10373e0be1e5e296d2955307d55e6dca0e4e355d46968d5baed7c6914c70","segment_id":"environment.md:cda454f61dfcac70","source_path":"environment.md","text_hash":"cda454f61dfcac7007a9edc538f9f58cf38caa0652e253975979308162bccc53","text":"Gateway configuration","translated":"Gateway 配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:17:12Z"} +{"cache_key":"d8cc06094a692bfc0650f92c245909ce4308fcc945faabdc2b7bad4f9a1b9998","segment_id":"start/wizard.md:576ed4fd7e0e5fcd","source_path":"start/wizard.md","text_hash":"576ed4fd7e0e5fcd52f1a92c0b5a8df3ed8f33c4c280c9d15e53955d15633796","text":" (you’ll be prompted for your phone number)","translated":" (系统会提示您输入手机号码)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:07Z"} +{"cache_key":"d8fe9f40df201863d43f4937a52bac7d14019fae82150f1191fe4bb66819d827","segment_id":"help/index.md:3c33340bd23b8db8","source_path":"help/index.md","text_hash":"3c33340bd23b8db89f18fe7d05a954738c0dd5ba9623cf6bdb7bb5d1a3729cfc","text":"FAQ (concepts)","translated":"常见问题(概念)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:34Z"} +{"cache_key":"d93001811d4774893fac9a800d8e9c14259b90fc5ed85a3e5e6d381bfb591846","segment_id":"index.md:32ebb1abcc1c601c","source_path":"index.md","text_hash":"32ebb1abcc1c601ceb9c4e3c4faba0caa5b85bb98c4f1e6612c40faa528a91c9","text":" (","translated":" (","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:10Z"} +{"cache_key":"d952c24b47cb7a9f69823c976f2f5e103fdc731a8bd74cae1436d86f420022df","segment_id":"environment.md:frontmatter:read_when:1","source_path":"environment.md:frontmatter:read_when:1","text_hash":"a3a2d99a99de98220c8e0296d6f4e4b2a34024916bd2379d1b3b9179c8fae46f","text":"You are debugging missing API keys in the Gateway","translated":"你正在调试 Gateway 中缺失的 API 密钥","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:21:50Z"} +{"cache_key":"d972ebc19ef87492ca8c11159fd6342cced6b4e19743d79d81ae33fafe35bbd8","segment_id":"environment.md:f7e239a42b7cd986","source_path":"environment.md","text_hash":"f7e239a42b7cd986a1558fed234e975ed2e96e9d37cf0a93f381778c461c89dd","text":"OpenClaw pulls environment variables from multiple sources. The rule is ","translated":"OpenClaw 从多个来源获取环境变量。规则是 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:21:57Z"} +{"cache_key":"d9923f60f9531ccaaefa870fa682febfe862bf9a38ced5baa99ea8637d7fc5ae","segment_id":"start/getting-started.md:63d3b285bad7d501","source_path":"start/getting-started.md","text_hash":"63d3b285bad7d5015cea4d6e62f972e83221dfce48c6919bd536c5e894a6607d","text":" set an API key (wizard can store it for service use). ","translated":" 设置 API 密钥(向导可以将其存储以供服务使用)。 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:32Z"} +{"cache_key":"d9b22590788b6c0abf9a15102d23d2aeb6608cf4acc0339e69be4e52ae38af48","segment_id":"index.md:f9b8279bc46e847b","source_path":"index.md","text_hash":"f9b8279bc46e847bfcc47b8701fd5c5dc27baa304d5add8278a7f97925c3ec13","text":"Mattermost (plugin)","translated":"Mattermost(插件)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:18Z"} +{"cache_key":"da18bab9968b574835d3ac2fa578c4d9484bd549584abe26d6dd6ef900786186","segment_id":"start/wizard.md:b3903e5fd7656678","source_path":"start/wizard.md","text_hash":"b3903e5fd7656678464dd2a865aaddae81c1a9967b2b28de65963482c18101a4","text":", get it at ","translated":",请在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:39Z"} +{"cache_key":"da2e517a094d1b2ea1a3ef7068f6a9d51fdfdf0a022f7219b7cee208042f347e","segment_id":"environment.md:cdb4ee2aea69cc6a","source_path":"environment.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":"。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:22Z"} +{"cache_key":"da6fd0546d605ddbff40ee5eeab7a9dba889d06f55b7668b2ea364b8d13db5b0","segment_id":"start/getting-started.md:8026e8b07f2541e0","source_path":"start/getting-started.md","text_hash":"8026e8b07f2541e05438c325c641d6c725179032c826ab3d788f1d7f6ee6cc48","text":"gateway settings","translated":"Gateway 设置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:54Z"} +{"cache_key":"da93b7ddfcae6217e6d6986b9ce70bb9a1a2d9cfad63f48bfad0bf32de42231f","segment_id":"environment.md:7175517a370b5cd2","source_path":"environment.md","text_hash":"7175517a370b5cd2e664e3fd29c4ea9db5ce17058eb9772fe090a5485e49dad6","text":" or ","translated":" 或 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:17Z"} +{"cache_key":"daa769cecb2f8416182d068699a32d5eb21c0317b3290a243cdecd970d5962a8","segment_id":"index.md:0d517afa83f91ec3","source_path":"index.md","text_hash":"0d517afa83f91ec33ee74f756c400a43b11ad2824719e518f8ca791659679ef4","text":"Web surfaces (Control UI)","translated":"Web 界面(控制界面)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:26Z"} +{"cache_key":"dab106a105f2b823c007205705cad6e89b432c5ca1ef47eabc0f310d8efc383c","segment_id":"environment.md:6863067eb0a2c749","source_path":"environment.md","text_hash":"6863067eb0a2c7499425c6c189b2c88bac55ca754285a6ab1ef37b75b4cfad4d","text":"See ","translated":"参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:23Z"} +{"cache_key":"dac6075e2d2a3911099dba69ad509d84086bcd1b1c736fee0152408194e15e11","segment_id":"start/getting-started.md:6dd923776874c55b","source_path":"start/getting-started.md","text_hash":"6dd923776874c55bce97640e624fb7a344d86ed45b1c54be63346b52026a1652","text":"Auth profiles (OAuth + API keys): ","translated":"认证配置文件(OAuth + API 密钥): ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:38Z"} +{"cache_key":"db301ad112142ff90fb1b8331377445ca0dd7eae4b68bba7cc6930841d303d06","segment_id":"start/wizard.md:0ed32a8e95d8664d","source_path":"start/wizard.md","text_hash":"0ed32a8e95d8664d39b5e673327e225f72eb6d6733b764db17d1bbc0536a2880","text":"Windows uses WSL2; signal-cli install follows the Linux flow inside WSL.","translated":"Windows 使用 WSL2;signal-cli 安装遵循 WSL 内的 Linux 流程。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:18Z"} +{"cache_key":"dbd450b11463a9da9dd0c640abc716c08a4705dd68c1b0a4c25b354b9311d439","segment_id":"environment.md:f6b2ffe1d0d5f521","source_path":"environment.md","text_hash":"f6b2ffe1d0d5f521b76cabc67d6e96da2b1170eef8086d530558e9906a7f092d","text":"Models overview","translated":"模型 概述","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:44Z"} +{"cache_key":"dbec24d595565c4c294a91f556c491976ccdeb4f7976d9258e6420af47259608","segment_id":"help/index.md:24669ff48290c187","source_path":"help/index.md","text_hash":"24669ff48290c1875d8067bbd241e8a55444839747bffb8ab99f3a34ef248436","text":"Doctor","translated":"诊断","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:29Z"} +{"cache_key":"dbeeb5b2ad003e4152107ceade1290b2001163df5f2fb93a792c8c9d94cec345","segment_id":"start/getting-started.md:922f3f28b57bdd14","source_path":"start/getting-started.md","text_hash":"922f3f28b57bdd146b8892adf494a28a0969d5eaf21333bfdb314db2eb6c8da8","text":"Installer options (install method, non-interactive, from GitHub): ","translated":"安装选项(安装方式、非交互式、从 GitHub 安装): ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:48Z"} +{"cache_key":"dbf5bae2a9b91c346475334bdb1294ace20ee07ca1e471c488c5311579ef37ab","segment_id":"index.md:b0d125182029e6c5","source_path":"index.md","text_hash":"b0d125182029e6c500cbcc81011341df77de8fe24d9e80190c32be390c916ec2","text":"🤖 ","translated":"🤖 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:58Z"} +{"cache_key":"dc745b075f86ec95e5a22fbb2ba14c5a6f2c00911dfa570cbe2f5123627e887d","segment_id":"environment.md:f15f5f9f4ef4d668","source_path":"environment.md","text_hash":"f15f5f9f4ef4d6688876c894f8eba251ed1db6eaf2209084028d43c9e76a8ba1","text":" (aka ","translated":" (即 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:44Z"} +{"cache_key":"dc8c80f84e5339af07824daa81e39f2801c9d6beb851b21e632b3eb6ddf79749","segment_id":"start/wizard.md:4b2a013a2a09958e","source_path":"start/wizard.md","text_hash":"4b2a013a2a09958e251e8998bdfa5fd89cc1c69abb1273fe2c1522cf54363cc6","text":"JVM builds require ","translated":"JVM 构建需要 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:09Z"} +{"cache_key":"dcb357452715d4a3fee760c79dfdee6719f235e48d176456a053646ffae10f44","segment_id":"environment.md:d08a8493f686363a","source_path":"environment.md","text_hash":"d08a8493f686363a78b913d45ebfbd87a3768d1c77b70f23b1fdade3c066e481","text":"Shell env import","translated":"Shell 环境导入","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:04Z"} +{"cache_key":"dcde0de1d52251a80249b1dfaee7ed01776cefba6298068afc3f6c3d9cc5588a","segment_id":"index.md:9dea37e7f1ff0e24","source_path":"index.md","text_hash":"9dea37e7f1ff0e24f7daecf6ea9cc38a58194f11fbeab1d3cfaa3a5645099ef4","text":"Updating / rollback","translated":"更新 / 回滚","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:05Z"} +{"cache_key":"dd09aaae7520593f0b225738900febfd800584c0d3739ac738ad25471bbebd96","segment_id":"environment.md:32ebb1abcc1c601c","source_path":"environment.md","text_hash":"32ebb1abcc1c601ceb9c4e3c4faba0caa5b85bb98c4f1e6612c40faa528a91c9","text":" (","translated":" (","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:33Z"} +{"cache_key":"dd2638564931b358d794aeef59c89f44ebfb1a77fcb1cd80b46b517854fc66c5","segment_id":"environment.md:f15f5f9f4ef4d668","source_path":"environment.md","text_hash":"f15f5f9f4ef4d6688876c894f8eba251ed1db6eaf2209084028d43c9e76a8ba1","text":" (aka ","translated":" (即 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:12:15Z"} +{"cache_key":"dd36df20c6faba4d8a51480a0d3230e61b4dea629b8457271019bd76b56796bc","segment_id":"index.md:9182ff69cf35cb47","source_path":"index.md","text_hash":"9182ff69cf35cb477c02452600d23b52a49db7bd7c9833a9a8bc1dcd90c25812","text":"Node ≥ 22","translated":"Node ≥ 22","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:27Z"} +{"cache_key":"dd92326da2311615e4319e5c3a8fdb740de38c95fabe4004d5464423cc665458","segment_id":"index.md:4d87941d681ca4e8","source_path":"index.md","text_hash":"4d87941d681ca4e89ca303d033b7d383d3acfbb6d9d9616bd88d7c19cf92c3dd","text":"Pi","translated":"Pi","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:33Z"} +{"cache_key":"de23354a5644ee88dd6cda719c74f7e42f04f3b92a74eae6a035e39e3836505b","segment_id":"start/wizard.md:211b0693ae6d4a20","source_path":"start/wizard.md","text_hash":"211b0693ae6d4a20d6c1dc31c560b94a9c12096f0711c9c3a114f7be1eb2c606","text":"Installs optional dependencies (some use Homebrew on macOS).","translated":"安装可选依赖项(部分在 macOS 上使用 Homebrew)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:54Z"} +{"cache_key":"de45cbfead4c307b1c63c8e70a26ffd33d21776ae05b33f924b12b5f28ee26c6","segment_id":"environment.md:ffa63583dfa6706b","source_path":"environment.md","text_hash":"ffa63583dfa6706b87d284b86b0d693a161e4840aad2c5cf6b5d27c3b9621f7d","text":"missing","translated":"缺失的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:14Z"} +{"cache_key":"de5171e4493a39e50904a36b6951113b6d2301d68f06d7baac75051365bf6e21","segment_id":"index.md:frontmatter:summary","source_path":"index.md:frontmatter:summary","text_hash":"891b2aa093410f546b89f8cf1aa2b477ba958c2c06d2ae772e126d49786df061","text":"Top-level overview of OpenClaw, features, and purpose","translated":"OpenClaw 的顶层概述、功能和用途","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:43Z"} +{"cache_key":"de705dea3105826091973569de591048ac987d5a188374ba4aa8fcb94ea10a10","segment_id":"index.md:65fd6e65268ff905","source_path":"index.md","text_hash":"65fd6e65268ff9057a49d832cccfcd5a376e46a908a2129be5b43f945fa8d8ca","text":": Gateway WS defaults to ","translated":":Gateway WS 默认为 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:03Z"} +{"cache_key":"deab7aa2d56c6fe242f6f04eef414a3fed9e1ac64374fcba6ed245d7b2733f6b","segment_id":"start/getting-started.md:e0626242c2ea510e","source_path":"start/getting-started.md","text_hash":"e0626242c2ea510e9457d6fb1b2848fe7091b10201c13d28c9774e6450ad28b2","text":": WhatsApp QR login, Telegram/Discord bot tokens, Mattermost plugin tokens, etc.","translated":":WhatsApp 二维码登录、Telegram/Discord 机器人令牌、Mattermost 插件令牌等。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:11Z"} +{"cache_key":"debd94851d1f9c8951da5858e545b056346bbc436ba2720f05f5260a5dd44a44","segment_id":"start/wizard.md:aa9e63906bb59344","source_path":"start/wizard.md","text_hash":"aa9e63906bb5934462d7a9f29afd4a9562d5366c583706512cb48dce19c847df","text":"Web tools","translated":"网页工具","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:27Z"} +{"cache_key":"dfa9d0ec2c6831536363b0e1eed21cd1626774a92d3de45da94e234fae5386d2","segment_id":"environment.md:d4a67341570f4656","source_path":"environment.md","text_hash":"d4a67341570f4656784c5f8fe1bfb48a738ace57b52544977431d50e2b718099","text":"FAQ: env vars and .env loading","translated":"常见问题:环境变量 和 .env 加载","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:42Z"} +{"cache_key":"e02de3fd6a9838fd351be176f196cbde274da86bff8be2e8b2303bf6790df0cb","segment_id":"start/getting-started.md:698ca3e004f541ad","source_path":"start/getting-started.md","text_hash":"698ca3e004f541ad543cc5f936c56142f246a15f22c6dd5c9c7afd95532583c6","text":"3.5) Quick verify (2 min)","translated":"3.5)快速验证(2 分钟)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:04Z"} +{"cache_key":"e04e0151c02320e186d2fd1b07d89104ddb194e3ae4971af4bd1f9f1710bad19","segment_id":"index.md:032f5589cfa2b449","source_path":"index.md","text_hash":"032f5589cfa2b44973fe96c42e17dcc2692281413a05b16f48ff0f958f7f7ade","text":"Discord Bot","translated":"Discord 机器人","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:04Z"} +{"cache_key":"e08315c1cc4da73870b3503c2ab91309c6687ee63c42656605372e35941f2bfd","segment_id":"index.md:74f99190ef66a7d5","source_path":"index.md","text_hash":"74f99190ef66a7d513049d31bafc76e05f9703f3320bf757fb2693447a48c25b","text":"Linux app","translated":"Linux 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:53:43Z"} +{"cache_key":"e0893eb3c8cefa57f80842b1e6f91535ad0274b358f897d7bb69a01346be4a59","segment_id":"index.md:5eeecff4ba2df15c","source_path":"index.md","text_hash":"5eeecff4ba2df15c51bcc1ba70a5a2198fbcac141ebe047a2db7acf0e1e83450","text":" — Local UI + menu bar companion for ops and voice wake","translated":" — 本地界面 + 菜单栏辅助工具,用于操作和语音唤醒","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:33Z"} +{"cache_key":"e09e0f7a58717d8dd5e93c9405e9e7a87e99b23ed91d6f88fef646f8686c4c06","segment_id":"index.md:c7a5e268ddd8545e","source_path":"index.md","text_hash":"c7a5e268ddd8545e5a59a58ef1365189862f802cc7b61d4a3212c70565e2dff1","text":"WhatsApp Integration","translated":"WhatsApp 集成","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:26Z"} +{"cache_key":"e0a3b73e10d18fd81805c5666c076468ea1043dd951f611550833d143c7c86c7","segment_id":"environment.md:frontmatter:read_when:2","source_path":"environment.md:frontmatter:read_when:2","text_hash":"822b3d74ce16c1be19059fad4ca5bf7ae9327f58fa1ff4e75e78d5afa75c038f","text":"You are documenting provider auth or deployment environments","translated":"你正在记录提供商认证或部署环境","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:15Z"} +{"cache_key":"e0bae3d42ce06b6edf1f45f8f78cb8923b3cab4aa4c1e89ef2b78a6b8116bf98","segment_id":"environment.md:fb135d32fb09abb6","source_path":"environment.md","text_hash":"fb135d32fb09abb6844f68b8fdb5545a2929cbc0a980fd7e19fc1fcba4d8cb32","text":" (what the Gateway process already has from the parent","translated":" (Gateway 进程已从父级","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:36Z"} +{"cache_key":"e10ee0a761ae715ddd355ff5b07c6707d58a7c4aa3d27284863c46797dce8eb9","segment_id":"environment.md:668e5590b5bb9990","source_path":"environment.md","text_hash":"668e5590b5bb9990eeb25bf657f7d17281a4c613ee4442036787cd4b2efd22bb","text":"If the config file is missing entirely, step 4 is skipped; shell import still runs if enabled.","translated":"如果配置文件完全缺失,则跳过步骤 4;如果已启用,shell 导入仍会运行。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:05Z"} +{"cache_key":"e116abb724100f07db70423f94752290e45ae7e83fbbb522f560aa75f8827bf3","segment_id":"index.md:6fa3cbf451b2a1d5","source_path":"index.md","text_hash":"6fa3cbf451b2a1d54159d42c3ea5ab8725b0c8620d831f8c1602676b38ab00e6","text":"Sessions","translated":"会话","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:23Z"} +{"cache_key":"e1190c4a2612cc2cea5658f3b586bfab859bd0df7c15f12bc4be6d0657f84734","segment_id":"index.md:013e11a23ec9833f","source_path":"index.md","text_hash":"013e11a23ec9833f907b2ead492b0949015e25d10ba92461669609aee559335d","text":"Start here:","translated":"从这里开始:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:12Z"} +{"cache_key":"e1257e0dfdcc12dc7e241311ad2ab6bd8b89cc6ced9cda94ef01fc35920887b8","segment_id":"environment.md:cf3f9ba035da9f09","source_path":"environment.md","text_hash":"cf3f9ba035da9f09202ba669adca3109148811ef31d484cc2efa1ff50a1621b1","text":" (what the Gateway process already has from the parent shell/daemon).","translated":" (Gateway 进程已从父 shell/守护进程继承的值)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:29Z"} +{"cache_key":"e1d82e4a5f815268a0e65b21f1722eb4d465937ea4849a800bfacf6dc70869bf","segment_id":"environment.md:6d4090fbae05a048","source_path":"environment.md","text_hash":"6d4090fbae05a048bc57d06313e19799dd5d4b3c1d2a18c6eb745b3dd3442593","text":" equivalents:","translated":" 等效项:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:50Z"} +{"cache_key":"e1f970bed34760abb7d362cd2f7f4af368a2c76a63130e47fb36466f738231ec","segment_id":"index.md:1016b5bdce94a848","source_path":"index.md","text_hash":"1016b5bdce94a8484312c123416c1a18c29fab915ba2512155df3a82ee097f8f","text":"If the Gateway is running on the same computer, that link opens the browser Control UI\nimmediately. If it fails, start the Gateway first: ","translated":"如果 Gateway 运行在同一台计算机上,该链接会立即打开浏览器控制界面。如果无法打开,请先启动 Gateway: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:17Z"} +{"cache_key":"e288c66a34282338017002bdebb3d43b611e9268ee96a9a71377e27358f92a8d","segment_id":"start/wizard.md:0b7555ea7f832be2","source_path":"start/wizard.md","text_hash":"0b7555ea7f832be2c45b8912d6503cb867f500ab982c899ca3edf2bbd25da155","text":"Remote Gateway URL (","translated":"远程 Gateway URL(","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:18Z"} +{"cache_key":"e2a65642000db41fe132dae4ebaf8405dbcc8b607a6f85a2fe2b0ab89fc6113f","segment_id":"help/index.md:2adc964c084749b1","source_path":"help/index.md","text_hash":"2adc964c084749b1f2d8aef24030988b667dbda2e38a6a1699556c93e07c1cea","text":"Start here","translated":"从这里开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:15Z"} +{"cache_key":"e2be4f7a702604ffc4d6368630ac09d3dc83d72a7906b32ec1c6194d24768883","segment_id":"index.md:1cce617e15b49dca","source_path":"index.md","text_hash":"1cce617e15b49dca89b212bb5290edfcfee010ef2eeef369b36af78c53756e1c","text":" — Optional transcription hook","translated":" — 可选的转录钩子","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:46Z"} +{"cache_key":"e2bea8a812ba82ddc73f36802a93dadd6c4a0ab8d8c47a0b3959a2d3ac2e18e5","segment_id":"index.md:042c75df73389c8a","source_path":"index.md","text_hash":"042c75df73389c8a7c0871d2a451bd20431d24e908e2c192827a54022df95005","text":"Nacho Iacovino","translated":"Nacho Iacovino","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:25Z"} +{"cache_key":"e2f06db885ce6a775a64734d17016fb2c273cd62257def34b9ba0ca1a33a5b83","segment_id":"index.md:03279877bfe1de07","source_path":"index.md","text_hash":"03279877bfe1de0766393b51e69853dec7e95c287ef887d65d91c8bbe84ff9ff","text":"WebChat + macOS app","translated":"网页聊天 + macOS 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:50Z"} +{"cache_key":"e3046cb9f63303cfbf56509890a29667276de5c6b954a6d62bfec56bbd2f5f6f","segment_id":"index.md:e47cdb55779aa06a","source_path":"index.md","text_hash":"e47cdb55779aa06a74ae994c998061bd9b7327f5f171c141caf2cf9f626bfe4b","text":"Peter Steinberger","translated":"Peter Steinberger","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:29Z"} +{"cache_key":"e355a25ce68c149fd415e9a5282ed06cf6d1b14a323d007e6e4bb63f516b63e2","segment_id":"start/wizard.md:frontmatter:read_when:0","source_path":"start/wizard.md:frontmatter:read_when:0","text_hash":"644fc34986851b3419d5dbb492d58c980aaef5ba5b75385e789421654bac2f0e","text":"Running or configuring the onboarding wizard","translated":"运行或配置上手引导向导","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:53Z"} +{"cache_key":"e35afed952675c044e4af3fb46f49fb19ffe702d850a44bd68d322846b87c3a8","segment_id":"index.md:2566561f81db7a7c","source_path":"index.md","text_hash":"2566561f81db7a7c4adb6cee3e93139155a6b01d52ff0d3d5c11648f46bc79bb","text":"📱 ","translated":"📱 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:49Z"} +{"cache_key":"e35cd8ef4c58d52ece200d844acc87c82675d4bfab5626181d5a19a80619121b","segment_id":"index.md:fdef9f917ee2f72f","source_path":"index.md","text_hash":"fdef9f917ee2f72fbd5c08b709272d28a2ae7ad8787c7d3b973063f0ebeeff7a","text":" to update the gateway service entrypoint.","translated":" 以更新网关服务入口点。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:32Z"} +{"cache_key":"e373ad3f709800b61550e436e63f2d836a6d8ef0d20d024a17c1e84979c3123b","segment_id":"start/getting-started.md:d7fc08e9364a1f77","source_path":"start/getting-started.md","text_hash":"d7fc08e9364a1f778246387363b55f32ca59ece0738ae543c994da0dab3dba09","text":"What you’ll choose:","translated":"您需要选择的内容:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:58Z"} +{"cache_key":"e47ee10a7f2c053bb20dc3cc1e1019c5043b6704d065442933270fd16de75cbc","segment_id":"index.md:774f1d6b2910de20","source_path":"index.md","text_hash":"774f1d6b2910de200115afec1bd87fe1ea6b0bc2142ac729e121e10a45df4b5d","text":" ← ","translated":" ← ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:52Z"} +{"cache_key":"e4d336ccc6430b7ad958c679f191372f6e1cd5ad513c5ce8f9b77cda4f2766e7","segment_id":"index.md:eec70d1d47ec5ac0","source_path":"index.md","text_hash":"eec70d1d47ec5ac00f04e59437e7d8b0988984c0cea3dddd81b1a2a10257960b","text":" — DMs + groups via grammY","translated":" —— 通过 grammY 支持私聊和群组","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:36Z"} +{"cache_key":"e51947f3a8d4e7ab79dc357deb1fcb7df73a48359733696bcd8ef64aaf7c4a45","segment_id":"index.md:297d5c673f5439aa","source_path":"index.md","text_hash":"297d5c673f5439aa31dca3bbc965cb657a89a643803997257defb3baef870f89","text":"Open the dashboard (local Gateway):","translated":"打开仪表板(本地 Gateway):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:19Z"} +{"cache_key":"e535ba32611dbfdfbdb030dbefbe4fa338d0de9c3dcf09e716b80b85ac6ec56e","segment_id":"start/getting-started.md:9995caf4a7d96e04","source_path":"start/getting-started.md","text_hash":"9995caf4a7d96e04d44f069d0e4b3ef3a2b210186fb92c3b1e846daf26b21a24","text":"macOS: if you plan to build the apps, install Xcode / CLT. For the CLI + gateway only, Node is enough.\nWindows: use ","translated":"macOS:如果您计划构建应用程序,请安装 Xcode / CLT。如果仅使用 CLI + Gateway,Node 就足够了。\nWindows:使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:38Z"} +{"cache_key":"e5714db86354a7868e7543683f77af47aa597f3bcddb61f46f2c313cb4cf8636","segment_id":"index.md:74926756385b8442","source_path":"index.md","text_hash":"74926756385b844294a215b2830576e3b2e93b84c5a8c8112b3816c5960f3022","text":" — DMs + guild channels via channels.discord.js","translated":" —— 通过 渠道.discord.js 支持私聊和服务器 渠道","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:43Z"} +{"cache_key":"e5857a240e24225783be67421286d47a4b18135d04c6f4f031e82d2a61cb02a3","segment_id":"index.md:f0e2018271f51504","source_path":"index.md","text_hash":"f0e2018271f515041084c8189f297236abe18f9ec77edad1a61c5413310bbd9e","text":"🖥️ ","translated":"🖥️ ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:02:28Z"} +{"cache_key":"e5a865669cc0d84b9b7f66db70c9b2536473891af6dc11f20fc3f7d5fccfceb6","segment_id":"environment.md:b4736422e64c0a36","source_path":"environment.md","text_hash":"b4736422e64c0a369663d1b2d386f1b8f4b31b8936b588e4a54453c61a24e0fd","text":"Process environment","translated":"进程环境","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:33Z"} +{"cache_key":"e5ab95a17152cbd3025b5413a5d7d8f0642fb9e3e3c72d241c7eec3e73b9104a","segment_id":"environment.md:7175517a370b5cd2","source_path":"environment.md","text_hash":"7175517a370b5cd2e664e3fd29c4ea9db5ce17058eb9772fe090a5485e49dad6","text":" or ","translated":" 或 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:39Z"} +{"cache_key":"e5b4eab0ca38617f4b76c99dc5fa36151812c02576b33f954a56cf5f77703696","segment_id":"index.md:bf0e823c81b87c5d","source_path":"index.md","text_hash":"bf0e823c81b87c5de79676155debf20a29b52d6d7eb7e77deda73a56d0afbaaa","text":"🧠 ","translated":"🧠 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:08Z"} +{"cache_key":"e5be378ff2d92da3de35b20680f90f5d1aa0a98ce205139d6fcaeac91ef06f65","segment_id":"index.md:9bcda844990ec646","source_path":"index.md","text_hash":"9bcda844990ec646b3b6ee63cbdf10f70b0403727dea3b5ab601ca55e3949db9","text":" for node WebViews; see ","translated":" 用于节点 WebView;参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:04Z"} +{"cache_key":"e5d655052f08f79672770734c9717dc24a5a9359defba7095dc7a9e2cf9e801b","segment_id":"start/wizard.md:bba52d8bacabbacc","source_path":"start/wizard.md","text_hash":"bba52d8bacabbacc510a1902b4eb35435f691903eb2db22fd110d41eadedec8d","text":" exists, the wizard can reuse it.","translated":" 存在,向导可以复用它。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:13Z"} +{"cache_key":"e628a7773be8d41e10dc53dcb383a11096e0573ec6b470aa13d2a14adcefb8e7","segment_id":"start/wizard.md:e3ba8a2959965f9c","source_path":"start/wizard.md","text_hash":"e3ba8a2959965f9c8360537e304016b2f75d561bdb03655a42adb02ce75a0e3f","text":"Default workspaces follow ","translated":"默认工作区遵循 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:57Z"} +{"cache_key":"e62ed5670f8283396dcc6a81182cda94667ff98973f153e4c86a04db364a4895","segment_id":"start/wizard.md:a8dbd136ed7c8e55","source_path":"start/wizard.md","text_hash":"a8dbd136ed7c8e55f9c0ae6e5acd2576d485f642d964a61f3693afc1c0c4ffdf","text":": uses ","translated":":使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:50Z"} +{"cache_key":"e66b34ec94f9a9c10b99b098ad8806551356222f1ac50f6fec7d719991faceee","segment_id":"start/wizard.md:c36d819e7bc6d2b7","source_path":"start/wizard.md","text_hash":"c36d819e7bc6d2b7da51394411c733db89c395987885ca6770167a3b9bc45c3c","text":"Use ","translated":"使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:45Z"} +{"cache_key":"e689f27ba4febf31a28a5b79eb2af514a15a3dff5dfe458bb3067cc59b2e7481","segment_id":"index.md:be48ae89c73a75da","source_path":"index.md","text_hash":"be48ae89c73a75da3454d565526d777938c20664618905a9bc77d6a0a21a689d","text":"\"EXFOLIATE! EXFOLIATE!\"","translated":"\"去角质!去角质!\"","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:25Z"} +{"cache_key":"e6b4ca13a3b7e39f521b1aadbb4f54f37875d228cd918c6406bd6519d5c7b6c8","segment_id":"index.md:6638cf2301d3109d","source_path":"index.md","text_hash":"6638cf2301d3109da66a44ee3506fbd35b29773fa4ca33ff35eb838c21609e19","text":"Features (high level)","translated":"功能特性(概览)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:26Z"} +{"cache_key":"e6e2a9985237253e0478229a54f3693bc7b0472bc450d53a4122dc20dfe08b21","segment_id":"environment.md:6863067eb0a2c749","source_path":"environment.md","text_hash":"6863067eb0a2c7499425c6c189b2c88bac55ca754285a6ab1ef37b75b4cfad4d","text":"See ","translated":"参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:37Z"} +{"cache_key":"e6e456289628d5a4b6cbbc0fbb263d656ba7d49427a2009ce3c5f608b8505ea0","segment_id":"index.md:f0d82ba647b4a33d","source_path":"index.md","text_hash":"f0d82ba647b4a33da3008927253f9bed21e380f54eab0608b1136de4cbff1286","text":"OpenClaw bridges WhatsApp (via WhatsApp Web / Baileys), Telegram (Bot API / grammY), Discord (Bot API / channels.discord.js), and iMessage (imsg CLI) to coding agents like ","translated":"OpenClaw 将 WhatsApp(通过 WhatsApp Web / Baileys)、Telegram(Bot API / grammY)、Discord(Bot API / channels.discord.js)和 iMessage(imsg CLI)桥接到编程 智能体,例如 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:56Z"} +{"cache_key":"e723a0b2ab360a74b84f4ccd08fdc4cc1639b85d5178d45d8103a18069bd3d8d","segment_id":"start/getting-started.md:1b59a1d9fa6d392f","source_path":"start/getting-started.md","text_hash":"1b59a1d9fa6d392f1f68642200583ed0f7b372af2fbc7c01d5f7f00463e229de","text":" also bundles A2UI assets; if you need to run just that step, use ","translated":" 也会打包 A2UI 资源;如果您只需要运行该步骤,请使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:51Z"} +{"cache_key":"e7279b78eeb5dccdf1897af612ce9f34bbae6f6ad7d8a7fed40a48f2f59c2367","segment_id":"environment.md:frontmatter:summary","source_path":"environment.md:frontmatter:summary","text_hash":"78351223e7068721146d2de022fdf440c2866b2ee02fbbb50bf64369b999820b","text":"Where OpenClaw loads environment variables and the precedence order","translated":"OpenClaw 加载环境变量的位置及优先级顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:05Z"} +{"cache_key":"e73887cca1549bd1acf945a50dfbd054a3ec1c87741be5a0a4381a4840ce13e5","segment_id":"index.md:1df4f2299f0d9cc4","source_path":"index.md","text_hash":"1df4f2299f0d9cc466fa05abeb2831e76e9f89583228174ffcd9af415fd869fe","text":"Send a test message (requires a running Gateway):","translated":"发送测试消息(需要运行中的 Gateway):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:17Z"} +{"cache_key":"e747cc049257f34351f8e9510202e9a6f21541b6ab738d9c1e2aa1a41c519657","segment_id":"environment.md:cb133602d7dd4bc6","source_path":"environment.md","text_hash":"cb133602d7dd4bc6ecfe37a040de72b562547e609327bdd41ea294f9257b7248","text":" keys.","translated":" 密钥时应用。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:22Z"} +{"cache_key":"e758b5241da8091ae15d39a4bd67f4c86e9beb81d84def2a94118597695be1b4","segment_id":"index.md:42bb365211decccb","source_path":"index.md","text_hash":"42bb365211decccb3509f3bf8c4dfcb5ae05fe36dfdedb000cbf44e59e420dc9","text":" — Local imsg CLI integration (macOS)","translated":" — 本地 imsg CLI 集成(macOS)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:21Z"} +{"cache_key":"e7692faaf02464b2a4dd119d057cc5aced8c33764089e7974d2634ae997c09f2","segment_id":"environment.md:496aca80e4d8f29f","source_path":"environment.md","text_hash":"496aca80e4d8f29fb8e8cd816c3afb48d3f103970b3a2ee1600c08ca67326dee","text":" block","translated":" 块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:11Z"} +{"cache_key":"e7bc8ffa042426610faa9c40c7191933bfda50deb769ef153580d4ab1c75d679","segment_id":"start/getting-started.md:cdb4ee2aea69cc6a","source_path":"start/getting-started.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":"。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:45Z"} +{"cache_key":"e8160fc2a7763ac99c0933d4424a99f211b661b0d7649bb1d33f908c3ff5e0d2","segment_id":"start/getting-started.md:75e23f5184b23835","source_path":"start/getting-started.md","text_hash":"75e23f5184b23835efb6fdc64309312d3c9212d10566350b1a08ff7838c79d03","text":"2) Run the onboarding wizard (and install the service)","translated":"2)运行上手引导向导(并安装服务)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:35:55Z"} +{"cache_key":"e81fa8ea81e681a305d677a823722958c2fdf42c3afbf4149a2d5cdfc4c6e1df","segment_id":"index.md:4eb58187170dc141","source_path":"index.md","text_hash":"4eb58187170dc14198eacb534c8577bef076349c26f2479e1f6a2e31df8eb948","text":" — An AI, probably high on tokens","translated":" — 一个可能被令牌冲昏头脑的 AI","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:53Z"} +{"cache_key":"e87435d09fd52a520aeae4097eb83a149aeb498192ccfbdd63da8db57571de09","segment_id":"index.md:d08cec54f66c140c","source_path":"index.md","text_hash":"d08cec54f66c140c655a1631f6d629927c7c38b9c8bfa91c875df9bd3ad3c559","text":"OpenClaw assistant setup","translated":"OpenClaw 助手设置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:12Z"} +{"cache_key":"e8a313447619fd5d7895acf1c467e347d47a8c35861910facf5ff08f88a8905e","segment_id":"index.md:5928d14b4d45263d","source_path":"index.md","text_hash":"5928d14b4d45263d4964dfd301c84ed2674ca8b4b698c5efeb88fb86076d2bf9","text":"🎮 ","translated":"🎮 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:39Z"} +{"cache_key":"e8bfa9777ff1ca6f2921ef47688f6ddb7d1a68c074dc27c7af195521940fb68f","segment_id":"help/index.md:frontmatter:summary","source_path":"help/index.md:frontmatter:summary","text_hash":"aece82a2d540ab1a9a21c7b038127cae6e9db2149491564bb1856b6f8999f205","text":"Help hub: common fixes, install sanity, and where to look when something breaks","translated":"帮助中心:常见修复方法、安装完整性检查,以及出现问题时的排查指南","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:25Z"} +{"cache_key":"e8ee67c09bdbe71798a5c6348316e32fa4bf8cdf688a0fba4493ffc836a62fde","segment_id":"environment.md:c2d7247c8acb83a5","source_path":"environment.md","text_hash":"c2d7247c8acb83a5a020458fa836c2445922b51513dbdbf154ab5f7656cb04e9","text":"; does not override).","translated":";不会覆盖)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:44Z"} +{"cache_key":"e8fb144a38ce4b1553a092808d81c2faabee7f47fc5f950ff809998508ead2a9","segment_id":"environment.md:6db0742daaf9f191","source_path":"environment.md","text_hash":"6db0742daaf9f191ab7816d2c9d317b1ea1693453a8c63b95af8b01477e0f5bb","text":" runs your login shell and imports only ","translated":" 运行您的登录 shell 并仅导入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:07Z"} +{"cache_key":"e9196b72990174331920ecd407ae4e20e96e67c7a2bd9e9deecdf9dda0a49b1e","segment_id":"index.md:c4b2896a2081395e","source_path":"index.md","text_hash":"c4b2896a2081395e282313d6683f07c81e3339ef8b9d2b5a299ea5b626a0998f","text":").","translated":")。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:34Z"} +{"cache_key":"e96f23e744751e56e76bb4914d500540aa9e7477681bf82acf3e8d249b7443e9","segment_id":"start/wizard.md:fda4a25e07825d0e","source_path":"start/wizard.md","text_hash":"fda4a25e07825d0e741782945be50a3bbf326b9403943ae322f9ff2c9d959a99","text":"QuickStart","translated":"快速入门","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:34Z"} +{"cache_key":"e974c0b5a54da233c9d3202030578368ed8f3ea979c5c958f879fcce408ef324","segment_id":"index.md:frontmatter:summary","source_path":"index.md:frontmatter:summary","text_hash":"891b2aa093410f546b89f8cf1aa2b477ba958c2c06d2ae772e126d49786df061","text":"Top-level overview of OpenClaw, features, and purpose","translated":"OpenClaw 的顶层概述、功能特性与用途","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:27:24Z"} +{"cache_key":"ea45ea5fb5edafd10885c5996709509fad9abd882c5daacc6f032e390b66c408","segment_id":"start/wizard.md:b1f78eea9ea563ca","source_path":"start/wizard.md","text_hash":"b1f78eea9ea563cab0611c9d9f74199e0f1dc1b7855a0f4e0eb8f4e0b9848b9e","text":"Add agent (non‑interactive) example:","translated":"添加智能体(非交互)示例:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:37Z"} +{"cache_key":"eacecaae490a307e52e287a93f22dd76cb2bab3c62c7d3e8e95480d7333a1d84","segment_id":"index.md:0eb95fb6244c03f1","source_path":"index.md","text_hash":"0eb95fb6244c03f1ccca696718a06766485c231347bf382424fb273145472355","text":"Quick start","translated":"快速入门","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:22Z"} +{"cache_key":"eaf2d170adde0688e23ca9cabb4074fdfbddd11f9e9327e51891878b361dfb2d","segment_id":"index.md:d372b90f0ccffad0","source_path":"index.md","text_hash":"d372b90f0ccffad0ae6e3df3c3aaeccd7a17eb59b4bc492a5469dc05ac3629ec","text":", OpenClaw uses the bundled Pi binary in RPC mode with per-sender sessions.","translated":",OpenClaw 将使用捆绑的 Pi 二进制文件以 RPC 模式运行,并使用每个发送者的 会话。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:33Z"} +{"cache_key":"eba13072b1a354b471f3da30934e0e7c51b0a4954b7b528817a8f20be0ec9c53","segment_id":"index.md:ceee4f2088b9d5ba","source_path":"index.md","text_hash":"ceee4f2088b9d5ba7d417bac7395003acfbcef576fd4cc1dd3063972f038218a","text":"The name","translated":"名称由来","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:16Z"} +{"cache_key":"ec2ec567c80acb4eaebb70c38df1d9ab94f68714cb99694d11d947a071edfdd4","segment_id":"start/wizard.md:3f485847642a332e","source_path":"start/wizard.md","text_hash":"3f485847642a332ed0374201686055314594de14929920d4c40d44676929d972","text":" to automate or script onboarding:","translated":" 用于自动化或脚本化上手引导:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:14Z"} +{"cache_key":"ec52d1059c9865c5fc3c2a42df8c7a6bf0a0b11707cd03f66a7767f8ea7eb532","segment_id":"environment.md:453c14128fbfb5f6","source_path":"environment.md","text_hash":"453c14128fbfb5f6757511557132a1dbb3bcbf243267630bfec49db8518c7780","text":"Env var substitution in config","translated":"配置中的环境变量替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:19:42Z"} +{"cache_key":"ec6203797e9e6d7c8b84dff668fa87d4f4e18e599a55a3e235a54bcfa85dcc08","segment_id":"environment.md:6db0742daaf9f191","source_path":"environment.md","text_hash":"6db0742daaf9f191ab7816d2c9d317b1ea1693453a8c63b95af8b01477e0f5bb","text":" runs your login shell and imports only ","translated":" 运行你的登录 shell 并仅导入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:22:20Z"} +{"cache_key":"ec6544cf9a2fdf796cb6d3311bf84b9d9f4212fd4491ceb30cc7830f1bfe7024","segment_id":"help/index.md:b79cac926e0b2e34","source_path":"help/index.md","text_hash":"b79cac926e0b2e347e72cc91d5174037c9e17ae7733fd7bdb570f71b10cd7bfc","text":"Help","translated":"帮助","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:32Z"} +{"cache_key":"ec84b886dc2d0638c71fa040e38e36a5fa259ee781decdf9493570c2fec604fa","segment_id":"index.md:e9f63c8876aec738","source_path":"index.md","text_hash":"e9f63c8876aec7381ffb5a68efb39f50525f9fc4e732857488561516d47f5654","text":" — Uses Baileys for WhatsApp Web protocol","translated":" —— 使用 Baileys 实现 WhatsApp Web 协议","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:29Z"} +{"cache_key":"ec9e3eb6d2bd790ee1b161f31b6bb70649ee6b5df85dd2b6a0178ee01c443f69","segment_id":"start/wizard.md:61c5ae608ddc7474","source_path":"start/wizard.md","text_hash":"61c5ae608ddc7474cd3aadc92c22059f7a539eefb0a56b02f625c39e552ff7f7","text":"The wizard can install ","translated":"向导可以安装 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:51Z"} +{"cache_key":"eca7489e62538a4b68a7d49f3a67df1c6bad8affc75d6411f68ca1e81bef47b2","segment_id":"environment.md:f6b2ffe1d0d5f521","source_path":"environment.md","text_hash":"f6b2ffe1d0d5f521b76cabc67d6e96da2b1170eef8086d530558e9906a7f092d","text":"Models overview","translated":"模型概览","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:13:17Z"} +{"cache_key":"ecb4df64e132ff6212066948863adabaa06122c77d8971d5c924dc2e744df845","segment_id":"index.md:98a670e2fb754896","source_path":"index.md","text_hash":"98a670e2fb7548964e8b78b90fef47f679580423427bfd15e5869aca9681d0dd","text":"\"We're all just playing with our own prompts.\"","translated":"\"我们都只是在玩弄自己的提示词。\"","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:43Z"} +{"cache_key":"ecd894720faa37450014e0fe1630be8382cf6ec23cbb9bfe76bc4125495d8fa5","segment_id":"index.md:9adcfa4aa10a4e8b","source_path":"index.md","text_hash":"9adcfa4aa10a4e8b991a72ccc45261cd64f296aed5b257e4caf9c87aff1290a0","text":" — Send and receive images, audio, documents","translated":" — 收发图片、音频、文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:38Z"} +{"cache_key":"ed10c233aa195883b17061f166f647efac5a27535a85ce4d16fc90d40e138882","segment_id":"help/index.md:8cd501e1124c3047","source_path":"help/index.md","text_hash":"8cd501e1124c30473473c06e536a2d145e2a14a6d7dc1b99028ce818e14442e2","text":"Repairs:","translated":"修复:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:56Z"} +{"cache_key":"ed15427258ffbf85620a0c9c0c42deb7f37be17b7abeff5993a34962964f0e96","segment_id":"index.md:a194ca16424ddd17","source_path":"index.md","text_hash":"a194ca16424ddd17dacc45f1cbd7d0e41376d8955a7b6d02bc38c295cedd04e4","text":"RPC adapters","translated":"RPC 适配器","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:19Z"} +{"cache_key":"ed24753e60b54d629cfd978be87185f4772676322534432302319caf28452d29","segment_id":"index.md:ab201ddd7ab330d0","source_path":"index.md","text_hash":"ab201ddd7ab330d04be364c0ac14ce68c52073a0ee8d164a98c3034e91ce1848","text":" from the repo.","translated":" (在仓库目录中执行)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:21Z"} +{"cache_key":"ed37a2b1a8c3351a6c04bee81df6f507f306be344485e69eb87b3b2451aad89f","segment_id":"help/index.md:d3ef01b4a9c99103","source_path":"help/index.md","text_hash":"d3ef01b4a9c9910364c9b26b2499c8787a0461d2d24ab80376fff736a288b34c","text":"Logging","translated":"日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:47Z"} +{"cache_key":"ee3f1647acf674397ba7f7e1aee0f9972b9830f978b622695d8ab5360de5a496","segment_id":"index.md:255ce77b7a6a015f","source_path":"index.md","text_hash":"255ce77b7a6a015f8595868a524b67c134e8fb405f4584fdac020e57f4ccd5f6","text":"Loopback-first","translated":"回环优先","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:01Z"} +{"cache_key":"ee582fba5363de60fb2c00f9238f2ac9ad6dc7615694d8d23d24d88bf7ec13e1","segment_id":"environment.md:582967534d0f909d","source_path":"environment.md","text_hash":"582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf","text":" in ","translated":" 在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:29Z"} +{"cache_key":"eead1cfedffdef3e1e7e8bfc6339df973b1390f8cd648602a62448762b8963f4","segment_id":"start/wizard.md:15836cbac4abdca3","source_path":"start/wizard.md","text_hash":"15836cbac4abdca3c78de3c3470fdc7bea9a96d0f38a1d0e4ec941bfc18ecb26","text":"Config only","translated":"仅配置","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:41:30Z"} +{"cache_key":"eeebff3da1cf246a7ee248bd8bc9694ee3d98c0f3fe5a0dcbfefa5e252b113a2","segment_id":"index.md:c3af076f92c5ed8d","source_path":"index.md","text_hash":"c3af076f92c5ed8dcb0d0b0d36dd120bc31b68264efea96cf8019ca19f1c13a3","text":"Troubleshooting","translated":"故障排除","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:33Z"} +{"cache_key":"eeef5f9dd1ae51906bf8d4a97c86db5d9327f00c8117da5fe2276a1ac1b155f4","segment_id":"help/index.md:156597e2632411d1","source_path":"help/index.md","text_hash":"156597e2632411d1d5f634db15004072607ba45072a4e17dfa51790a37b6781f","text":"Gateway issues:","translated":"Gateway 问题:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:24:43Z"} +{"cache_key":"ef28fdc07b59ec5ce5915e3de7389d8d70ecb8ed31445ed4066d7118fe6dd63e","segment_id":"environment.md:6f59001999ef7b71","source_path":"environment.md","text_hash":"6f59001999ef7b7128bab80d2034c419f3034497e05f69fbdf67f7b655cdc173","text":"Configuration: Env var substitution","translated":"配置:环境变量 替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:41:33Z"} +{"cache_key":"ef3b396216400003eb534a0ab4fe41ae559b2fb39623ec3e2f9892c4f4cba9ef","segment_id":"index.md:ec05222b3777fd7f","source_path":"index.md","text_hash":"ec05222b3777fd7f91a2964132f05e3cfc75777eaeec6f06a9a5c9c34a8fc3e9","text":"Nix mode","translated":"Nix 模式","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:04:10Z"} +{"cache_key":"ef7f4605237a606f565a596c39809fa969774059be148db688b808634350bf09","segment_id":"index.md:5928d14b4d45263d","source_path":"index.md","text_hash":"5928d14b4d45263d4964dfd301c84ed2674ca8b4b698c5efeb88fb86076d2bf9","text":"🎮 ","translated":"🎮 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:38Z"} +{"cache_key":"efa246765d696f04600590562765687bb4f5fefce8a4df66bc2cbe3275f3f43e","segment_id":"start/wizard.md:426263b5cd4ab1f3","source_path":"start/wizard.md","text_hash":"426263b5cd4ab1f3211193944727955444c6454a1640bec5e6f35b017c6d285f","text":"Non‑loopback binds still require auth.","translated":"非回环绑定仍需认证。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:08Z"} +{"cache_key":"efd8767a5fede85377af51202b1450a0f73054f978162c2d8bcef5dfa6220323","segment_id":"start/getting-started.md:e67454c1b6dd66c2","source_path":"start/getting-started.md","text_hash":"e67454c1b6dd66c2f006a8a98ff9c6a1279f8283eab3a272c15436f164cefe7b","text":"Recommended path: use the ","translated":"推荐路径:使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:46Z"} +{"cache_key":"effbe87506ca4373185a6bd9eb8262362bc299b5fbd8da0ce76b0aa8fe73ff1d","segment_id":"environment.md:a258b30f88c30650","source_path":"environment.md","text_hash":"a258b30f88c30650e73073d5bdde5cfcc6987100ae62d37789e5c46a0d85b7c6","text":"Global ","translated":"全局 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:36Z"} +{"cache_key":"f02f949874120a6c5b691141073ad6c170eaa88039cdad423e870a2753e957b3","segment_id":"start/getting-started.md:caf33dca8b21dc18","source_path":"start/getting-started.md","text_hash":"caf33dca8b21dc18f96b1f009b0dba4d75ddc00ea245972e98d56b1d1a5a009d","text":"Mattermost (plugin): ","translated":"Mattermost(插件): ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:28Z"} +{"cache_key":"f04ed463aa434ea141889ce238029572813914c69789bd6fb5eacba8423f5768","segment_id":"help/index.md:frontmatter:read_when:0","source_path":"help/index.md:frontmatter:read_when:0","text_hash":"ee0615553374970664b58ebd8e5d0ebc9bc8a5f03387671afbfd0096b390aa9b","text":"You’re new and want the “what do I click/run” guide","translated":"你是新手,想要一份\"我该点击/运行什么\"的指南","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:44:25Z"} +{"cache_key":"f0bc0a82d8a06b403ce5154b870a817a8097bacdb2e4fe64ab876d6f084f389c","segment_id":"index.md:d372b90f0ccffad0","source_path":"index.md","text_hash":"d372b90f0ccffad0ae6e3df3c3aaeccd7a17eb59b4bc492a5469dc05ac3629ec","text":", OpenClaw uses the bundled Pi binary in RPC mode with per-sender sessions.","translated":",OpenClaw 将使用内置的 Pi 二进制文件以 RPC 模式运行,并为每个发送者提供 会话。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:58Z"} +{"cache_key":"f11584b1b8bb57dbe543960af7b37e9ff6fb5eab1a8da25c423f5780dd0d676c","segment_id":"start/getting-started.md:ab744fe26b887abd","source_path":"start/getting-started.md","text_hash":"ab744fe26b887abdb3558472d5bfe074f2716bbd88c8fab2b86bc745cbe7cf52","text":"Tip: ","translated":"提示: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:07Z"} +{"cache_key":"f16eb7fed19f8561d7438f4379417058d14d6effa70a7e8ab163a2c08e69b70f","segment_id":"start/wizard.md:8ef5034a90ff178a","source_path":"start/wizard.md","text_hash":"8ef5034a90ff178aded1c6f9898a864b8af345b28b62274e520c62e4bc44dec8","text":"Native builds are used when available.","translated":"如有原生构建则优先使用。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:15Z"} +{"cache_key":"f18978cae4cb765c8959cd68c4897fde778c8cece0f3e6a778e862fc767efebe","segment_id":"index.md:013e11a23ec9833f","source_path":"index.md","text_hash":"013e11a23ec9833f907b2ead492b0949015e25d10ba92461669609aee559335d","text":"Start here:","translated":"从这里开始:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:44Z"} +{"cache_key":"f1bf5865e234c088f292333d3304a20f3b9b69544d67f32494540f263fa1e1cc","segment_id":"index.md:2adc964c084749b1","source_path":"index.md","text_hash":"2adc964c084749b1f2d8aef24030988b667dbda2e38a6a1699556c93e07c1cea","text":"Start here","translated":"从这里开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:39Z"} +{"cache_key":"f1f9640f4e20ead3c4890cd38fa2d2f83e102d190c71f31bf74e43411b220707","segment_id":"environment.md:3527b238ea049608","source_path":"environment.md","text_hash":"3527b238ea04960811e4f77378c46a6cddaf9dbf907d8affb0974772028b269e","text":"If the config file is missing entirely, step 4 is skipped; shell import still runs if","translated":"如果配置文件完全缺失,则跳过第 4 步;如果","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:46:24Z"} +{"cache_key":"f2078834885c634ec26e8903f4ed129d2fa2611d43b07c1b65d99b4207dd3f17","segment_id":"index.md:cdb4ee2aea69cc6a","source_path":"index.md","text_hash":"cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8","text":".","translated":"。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:28Z"} +{"cache_key":"f218922442b56c5e09b8f23fab26599a3631012ca6e296456125326f409f1f7e","segment_id":"help/index.md:cad44fbae951d379","source_path":"help/index.md","text_hash":"cad44fbae951d3791565b0cee788c01c3bd10e0176167acb691b8dba0f7895f8","text":"Gateway logging","translated":"Gateway 日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:40Z"} +{"cache_key":"f22c948c8f08bba03ae5ab9b17be95ed84ed98de50cbcbea09d5812b3d9fd4e1","segment_id":"start/wizard.md:7c2a0a6b7bb37dc2","source_path":"start/wizard.md","text_hash":"7c2a0a6b7bb37dc269429103bc13c5f5172b11631d7d44e84e0d5e4881354e4f","text":" works without a key). Easiest path: ","translated":" 无需密钥也可使用)。最简单的方式: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:39:21Z"} +{"cache_key":"f23e602e5722bcb75d4969fec8ae88209555d9f30e4cc863e54cb0665c150f93","segment_id":"index.md:e3572f8733529fd3","source_path":"index.md","text_hash":"e3572f8733529fd30a8604d41d624c15f4433df68f40bd092d1ee61f7d8d15e2","text":"Agent bridge","translated":"智能体桥接","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:57Z"} +{"cache_key":"f258e8524ff328198c2d9437453a1d91d940664b2f522b1ec9ac79b0139fc660","segment_id":"start/wizard.md:54ec12801f42e556","source_path":"start/wizard.md","text_hash":"54ec12801f42e5568f617d1aad18c458515c72920de170a24ef0f2be60cd3d33","text":"Moonshot AI (Kimi + Kimi Coding)","translated":"Moonshot AI (Kimi + Kimi Coding)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:13Z"} +{"cache_key":"f25bc202081adc9aa4d305452fe50f1a9c63b9077c112ebdc0d9166737b3675a","segment_id":"index.md:99260acc29f71e4b","source_path":"index.md","text_hash":"99260acc29f71e4baeb36805a1fdbd2c17254b57c8e5a9cba29ee56518832397","text":" — Route provider accounts/peers to isolated agents (workspace + per-agent sessions)","translated":" — 将 提供商 账户/对等方路由到隔离的 智能体(工作区 + 每个 智能体 的 会话)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:46Z"} +{"cache_key":"f2a0941718593a4be66a7a033a4117a7b3a502ef64b25fd7d6d3475c77dd5a1a","segment_id":"environment.md:87e89abb4c1c551f","source_path":"environment.md","text_hash":"87e89abb4c1c551fe08d355d097f18b8de78edca5f556997085681662fce8eed","text":"Config ","translated":"配置 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:24Z"} +{"cache_key":"f2a0c70d8b9f94722b586320f11c58339d30dd1fe8ff7250a962bb2db84d5ab4","segment_id":"environment.md:ffa63583dfa6706b","source_path":"environment.md","text_hash":"ffa63583dfa6706b87d284b86b0d693a161e4840aad2c5cf6b5d27c3b9621f7d","text":"missing","translated":"缺失的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:09Z"} +{"cache_key":"f2c14989f888bbff9c7330f2d5b3892af3b900910840435595031590dc8248e3","segment_id":"environment.md:frontmatter:read_when:0","source_path":"environment.md:frontmatter:read_when:0","text_hash":"90fc0487bff88009979cff1061c1a882df8c3b1baa9c43538331d9d5dab15479","text":"You need to know which env vars are loaded, and in what order","translated":"你需要了解加载了哪些环境变量,以及它们的加载顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:47Z"} +{"cache_key":"f34789e2cb492196e8c057294dd98c5f9d4b8054d548a7b883a47f113efa1277","segment_id":"index.md:31365ab9453d6a1e","source_path":"index.md","text_hash":"31365ab9453d6a1ec03731622803d3b44f345b6afad08040d7f3e97290c77913","text":"do nothing","translated":"不做任何操作","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:55Z"} +{"cache_key":"f36f13a67a73f6768bfbf346d552067475ef4f8137e13edfd4f636e1b7ef2ef8","segment_id":"start/getting-started.md:649cfa2f76a80b42","source_path":"start/getting-started.md","text_hash":"649cfa2f76a80b42e1821c89edd348794689409dcdf619dcd10624fb577c676b","text":"not recommended","translated":"不推荐","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:36:21Z"} +{"cache_key":"f3701b1ce8ac7f8931cafd209250aa5ae388ecfdb0154dbbb21c03fd72ce5d08","segment_id":"help/index.md:729bc562eec2658b","source_path":"help/index.md","text_hash":"729bc562eec2658bd11ffdd522fe5277177dc73e86eaca7baac0b472a4d8f8b2","text":"If you’re looking for conceptual questions (not “something broke”):","translated":"如果你在寻找概念性问题(不是\"某个东西坏了\"):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:11:29Z"} +{"cache_key":"f37dcde1b1a3572f2e12cec637bb9435d7594f5d680ca4c8d2916587ceaa5b49","segment_id":"environment.md:baa5be7f6320780b","source_path":"environment.md","text_hash":"baa5be7f6320780bd7bb7b7ddbb8cd1ffb26ccf7d94d363350668c50aedcf95f","text":" (applied only if missing).","translated":" (仅在缺失时应用)。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:32Z"} +{"cache_key":"f3bae8376433842a2647a0f99681be1ae704993131bd626b47c7ead29db85121","segment_id":"index.md:41ed52921661c7f0","source_path":"index.md","text_hash":"41ed52921661c7f0d68d92511589cc9d7aaeab2b5db49fb27f0be336cbfdb7df","text":"Gateway","translated":"Gateway","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:48:23Z"} +{"cache_key":"f3d666bd4b1803904177f2fd15477daab9b1988d37873a621ff0ff20fc67430a","segment_id":"index.md:32ebb1abcc1c601c","source_path":"index.md","text_hash":"32ebb1abcc1c601ceb9c4e3c4faba0caa5b85bb98c4f1e6612c40faa528a91c9","text":" (","translated":" (","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:51Z"} +{"cache_key":"f44674e6fe8bdf7df11beea733dc32ed87d3f98aa27ab39d91af414342ea24ac","segment_id":"environment.md:frontmatter:read_when:1","source_path":"environment.md:frontmatter:read_when:1","text_hash":"a3a2d99a99de98220c8e0296d6f4e4b2a34024916bd2379d1b3b9179c8fae46f","text":"You are debugging missing API keys in the Gateway","translated":"你正在调试 Gateway 中缺失的 API 密钥","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:49Z"} +{"cache_key":"f4572fb2d4379ec9633f4e503fc4ffe1b6e5d42baf75386b995e4453a220112f","segment_id":"start/wizard.md:5c237035504bf1d8","source_path":"start/wizard.md","text_hash":"5c237035504bf1d829557c9f34d581e874170d29eb78178780d9de279686878b","text":": service account JSON + webhook audience.","translated":":服务账户 JSON + webhook 受众。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:37Z"} +{"cache_key":"f4b0c2b320a173553e165db9e33134bd687611509a67f872b3802da035e18003","segment_id":"start/wizard.md:c47c637c5420619c","source_path":"start/wizard.md","text_hash":"c47c637c5420619cf8a485038799bbf646ac4dd9fb434e4da93e49276e6c63cf","text":"Linux: Avahi (","translated":"Linux:Avahi(","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:39Z"} +{"cache_key":"f4b8ff8f3efbd8ee938358900957557c4222b284b44d2a7048b9d12bafcaccb3","segment_id":"environment.md:frontmatter:read_when:2","source_path":"environment.md:frontmatter:read_when:2","text_hash":"822b3d74ce16c1be19059fad4ca5bf7ae9327f58fa1ff4e75e78d5afa75c038f","text":"You are documenting provider auth or deployment environments","translated":"你正在记录提供商认证或部署环境的文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:12Z"} +{"cache_key":"f4bde41e2630aeb2a70bf71ad4d202512d708d38dd36418cd9ac8d4332cd2359","segment_id":"index.md:add4778f9e60899d","source_path":"index.md","text_hash":"add4778f9e60899d7f44218483498c0baf7a0468154bc593a60747ee769c718c","text":"Android node","translated":"Android 节点","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:59Z"} +{"cache_key":"f52a9c7d0d2374d22023815ee71b9d667d1f40014d21c495be00062bb7ff7e9d","segment_id":"start/wizard.md:9349cb3da677e30e","source_path":"start/wizard.md","text_hash":"9349cb3da677e30edeeea7e42cf0ef9b5bcbb063c2c1e11e4805728cfb809b27","text":"Auth recommendation: keep ","translated":"认证建议:保持 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:59Z"} +{"cache_key":"f560e7bf274a11b63b63dfc2b1e34b5d4f767099b60c828981323400825310c0","segment_id":"index.md:83f4fc80f6b452f7","source_path":"index.md","text_hash":"83f4fc80f6b452f7cdf426f6b87f08346d7a2d9c74a0fb62815dce2bfddacf63","text":" — A space lobster, probably","translated":" — 大概是一只太空龙虾说的","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:27:52Z"} +{"cache_key":"f5ce8d582224799c2c298caa9a9f7dfb7d86186f570cfddd641946668d1d13da","segment_id":"index.md:79a482cf546c23b0","source_path":"index.md","text_hash":"79a482cf546c23b04cd48a33d4ca8411f62e5b7dc8c3a8f30165e28e747f263a","text":"iMessage","translated":"iMessage","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:29:51Z"} +{"cache_key":"f5fa9cda34fd26fb939c24c123c64b46dd61b92c355cd4a750f394defd4a695c","segment_id":"index.md:2adc964c084749b1","source_path":"index.md","text_hash":"2adc964c084749b1f2d8aef24030988b667dbda2e38a6a1699556c93e07c1cea","text":"Start here","translated":"从这里开始","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:00Z"} +{"cache_key":"f5ffb1cdcefe6f0cd2d2b69e0756d6cc01a9c6a0e02b454f0e30b38b6ad7b2e2","segment_id":"index.md:723fad6d27da9393","source_path":"index.md","text_hash":"723fad6d27da939353c65417bbaf646b65903b316eb4456297ff4a1c20811e8d","text":": HTTP file server on ","translated":":HTTP 文件服务器位于 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:20Z"} +{"cache_key":"f60fee3592c356f74a3be54ab30e9b0a0715eb1a3bbf7e17b0f99aa6f3d33df7","segment_id":"environment.md:3f52403cd330847b","source_path":"environment.md","text_hash":"3f52403cd330847bbe6aabe3d447592616cdc1a8efcbc1f48fb6643f8384fe96","text":"Precedence (highest →","translated":"优先级(最高 →","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:28Z"} +{"cache_key":"f621705327b389ad82a822a75b8c7ca9f3373484abe4c0fa698439958d39456d","segment_id":"environment.md:6f59001999ef7b71","source_path":"environment.md","text_hash":"6f59001999ef7b7128bab80d2034c419f3034497e05f69fbdf67f7b655cdc173","text":"Configuration: Env var substitution","translated":"配置:环境变量 替换","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:58:25Z"} +{"cache_key":"f621dff6a1a64fd61fe1f234bee676aeae91455321dcee4f6e67091184df6c62","segment_id":"start/wizard.md:66d0f523a379b2de","source_path":"start/wizard.md","text_hash":"66d0f523a379b2de6f8d5fba3a817ebc395f7bcaa54cc132ca9dfa665d1e9378","text":"Skills","translated":"技能","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:49:18Z"} +{"cache_key":"f63fecf5eae55dcc313461e84c71dff7e4c62437c912b31e37160ab24e814c22","segment_id":"index.md:9dea37e7f1ff0e24","source_path":"index.md","text_hash":"9dea37e7f1ff0e24f7daecf6ea9cc38a58194f11fbeab1d3cfaa3a5645099ef4","text":"Updating / rollback","translated":"更新 / 回滚","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:31Z"} +{"cache_key":"f6b24d421bb819dd74d316c3be99e4848a1b48cd29aa83b5955b323ccf7a6c71","segment_id":"help/index.md:d3ef01b4a9c99103","source_path":"help/index.md","text_hash":"d3ef01b4a9c9910364c9b26b2499c8787a0461d2d24ab80376fff736a288b34c","text":"Logging","translated":"日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:56:33Z"} +{"cache_key":"f6bca6b4934d23476401fd77c2d68803d43a4cc7147a31663887d519bebad085","segment_id":"index.md:7af023c43013b9a5","source_path":"index.md","text_hash":"7af023c43013b9a53fbff7dd4b5821588bba3319308878229740489152c43f6d","text":"Docs","translated":"文档","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:31:46Z"} +{"cache_key":"f6bf8734b049080c670e9161d3f62cff12800947ad422096af488dda32c63f66","segment_id":"index.md:5eeecff4ba2df15c","source_path":"index.md","text_hash":"5eeecff4ba2df15c51bcc1ba70a5a2198fbcac141ebe047a2db7acf0e1e83450","text":" — Local UI + menu bar companion for ops and voice wake","translated":" — 本地界面 + 菜单栏辅助工具,支持操作和语音唤醒","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:30:54Z"} +{"cache_key":"f6cb43180d1cb38f88fcf0a8d2c978f67c90b54bde664ec85ac14abce14c1b83","segment_id":"help/index.md:8ddb7fc8a87904de","source_path":"help/index.md","text_hash":"8ddb7fc8a87904dedc2afc16400fbe4e78582b302e01c30b1319c8a465d04684","text":"Troubleshooting:","translated":"故障排除:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:35Z"} +{"cache_key":"f6f420edf7e69a495fa2341fbcbfcb89f4edd0193ad98bca1bf5bd34822e6914","segment_id":"index.md:316cd41f595f3095","source_path":"index.md","text_hash":"316cd41f595f3095f149f98af70f77ab85404307a1505467ee45a26b316a9984","text":"Guided setup (recommended):","translated":"引导式设置(推荐):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:59:10Z"} +{"cache_key":"f7109a2845e6fbe35c8bdf279b2c337808867d39dd637a5c7d9b2a1b91018916","segment_id":"start/getting-started.md:d48b35a5fde42ec0","source_path":"start/getting-started.md","text_hash":"d48b35a5fde42ec00cf04a49d5ddeb555c65a520eeb97108da303bc05673dc84","text":"WhatsApp doc: ","translated":"WhatsApp 文档: ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:12Z"} +{"cache_key":"f722cbdc201f4b5e079dd175c0f52bce3bf3aa1658174683d7b51d71a4e9cd84","segment_id":"index.md:6b8ebac7903757ce","source_path":"index.md","text_hash":"6b8ebac7903757ce7399cc729651a27e459903c24c64aa94827b20d8a2a411d2","text":"For Tailnet access, run ","translated":"如需 Tailnet 访问,请运行 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:28:53Z"} +{"cache_key":"f727381238c5d317e8cd685354a48f793bc0d76af5f89de378ced4f0307c043d","segment_id":"start/wizard.md:3dd83b614e806664","source_path":"start/wizard.md","text_hash":"3dd83b614e8066647eed34747cca7bd8ecd848f994ab0e1870611515a0947051","text":"macOS: Bonjour (","translated":"macOS:Bonjour(","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:36Z"} +{"cache_key":"f75c83d90f9118aeb4862c47a07a5896f5da054fa28cebd9a9770f2bd5fcbe1c","segment_id":"start/wizard.md:e7ac0786668e0ff0","source_path":"start/wizard.md","text_hash":"e7ac0786668e0ff0f02b62bd04f45ff636fd82db63b1104601c975dc005f3a67","text":":","translated":":","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:30Z"} +{"cache_key":"f76e7b041b6273a09aa1e9309c09963be833cac5d00695ee47013a664b4d68d7","segment_id":"help/index.md:frontmatter:read_when:0","source_path":"help/index.md:frontmatter:read_when:0","text_hash":"ee0615553374970664b58ebd8e5d0ebc9bc8a5f03387671afbfd0096b390aa9b","text":"You’re new and want the “what do I click/run” guide","translated":"你是新手,想要一份\"我该点击/运行什么\"的指南","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:18:57Z"} +{"cache_key":"f794b56056508717fd48cd6db6dc75a458a0fa23834757f5ab7a0993982c6594","segment_id":"environment.md:496aca80e4d8f29f","source_path":"environment.md","text_hash":"496aca80e4d8f29fb8e8cd816c3afb48d3f103970b3a2ee1600c08ca67326dee","text":" block","translated":" 块","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:59Z"} +{"cache_key":"f80879a2302c298e8c95d914d9d6c71f03acd6f6dd6f974af01bfc0bc6c2e1c5","segment_id":"start/wizard.md:b90faf89583190c7","source_path":"start/wizard.md","text_hash":"b90faf89583190c7e34f7f5da172378019ea35b5da533c04dd2f7eec4c22eb9b","text":"Add another agent","translated":"添加另一个智能体","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:43Z"} +{"cache_key":"f8ba17c2741fd5744982e25324fa40baf96c8bc58d317be0648263b55a430f7e","segment_id":"index.md:76d6f9c532961885","source_path":"index.md","text_hash":"76d6f9c5329618856f133dc695e78f085545ae05fae74228fb1135cba7009fca","text":") — Pi creator, security pen-tester","translated":")—— Pi 创建者,安全渗透测试员","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:54:30Z"} +{"cache_key":"f9105824cf6a7d20518e37b8bf0823c644d1c0f6ce291e122a94e6e6470b7533","segment_id":"index.md:898e28d91a14b400","source_path":"index.md","text_hash":"898e28d91a14b400e7dc11f9dc861afe9143c18bf9424b1d1b274841615f38b1","text":"If you want to lock it down, start with ","translated":"如果您想进行锁定配置,请从以下内容开始 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:00Z"} +{"cache_key":"f91d9117f2bb9b64cf66ea1411b0be3f171f40e08c8c9e9f26c55c7e8bfe7189","segment_id":"environment.md:6863067eb0a2c749","source_path":"environment.md","text_hash":"6863067eb0a2c7499425c6c189b2c88bac55ca754285a6ab1ef37b75b4cfad4d","text":"See ","translated":"参见 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:28Z"} +{"cache_key":"f94a81f9b0bf40ffe1357c455d8aa1521caf2e5b7567514ceebb6cddac71ed20","segment_id":"start/wizard.md:812ae9cc61bc8004","source_path":"start/wizard.md","text_hash":"812ae9cc61bc800431e08012a3e2dedf0f928f6f5d1266663f3f9c9009a33865","text":"What the wizard writes","translated":"向导写入的内容","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:48:22Z"} +{"cache_key":"f9d9e2053d57e1dbcea8393af82dbd0d30bed4822f1d89bfe03c7cfadb02ecd7","segment_id":"environment.md:8d076464a84995bc","source_path":"environment.md","text_hash":"8d076464a84995bc095e934b0aa1e4419372f27cd71d033571e4dbba201ee5d8","text":"You can reference env vars directly in config string values using ","translated":"你可以在配置的字符串值中直接引用环境变量,使用 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:26:23Z"} +{"cache_key":"f9f5b27505056942f667c21acc05200a9acbbdcb3fddaceca9d2a30e2dbe81a9","segment_id":"index.md:b214cd10585678ca","source_path":"index.md","text_hash":"b214cd10585678ca1250ce1ae1a50ad4001de4577a10e36be396a3409314e442","text":"@badlogicc","translated":"@badlogicc","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:38Z"} +{"cache_key":"fa024aedd372ab7765061298a10db13f4e5bcdc6133bc25a65c53f8236557315","segment_id":"environment.md:907940a35852447a","source_path":"environment.md","text_hash":"907940a35852447aad5f21c5a180d993ff31cfd5807b1352ed0c24eabe183465","text":"never override existing values","translated":"永远不要覆盖现有值","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T11:45:24Z"} +{"cache_key":"fa3713ea436d20ec73664c073e488b38fc0bb3809eaa3ac4dc08811132bee115","segment_id":"index.md:5afbb1c887f6d850","source_path":"index.md","text_hash":"5afbb1c887f6d8501dba36cd2113d8f8b6ce6fa711a0d3e7efdc66f170abd2c2","text":"Cron jobs","translated":"定时任务","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:33:06Z"} +{"cache_key":"fa78bcdd35b740179d777f1399ca259d74e49151d5fe68ebcb2e8e073e5cacbd","segment_id":"environment.md:582967534d0f909d","source_path":"environment.md","text_hash":"582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf","text":" in ","translated":" 在 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:25:51Z"} +{"cache_key":"fa7eadfbeb6089c235d526f5463bcba6bd1d0ab30fbc4eff7f170e3e03fb83be","segment_id":"help/index.md:5c94724fa7810fa9","source_path":"help/index.md","text_hash":"5c94724fa7810fa9902e565cf66c5f5a973074f2961fcd3a40bad4ee4aeca5e0","text":"If you want a quick “get unstuck” flow, start here:","translated":"如果你想快速排障,请从这里开始:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:09Z"} +{"cache_key":"fa8390ce00f9c591f6fb7e0d5d4753ca5f421b96668f90965f884e53f15ff87c","segment_id":"index.md:185beb968bd1a81d","source_path":"index.md","text_hash":"185beb968bd1a81d07ebcf82376642f7b29f1b5594b21fe9edee714efbdcaa44","text":"✈️ ","translated":"✈️ ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:49:31Z"} +{"cache_key":"fa9908d4e7381bb3cc4d9ce5dd90158a06ebae51ae44d2b138bc9191e25abc34","segment_id":"start/wizard.md:4c8906cf76f5740a","source_path":"start/wizard.md","text_hash":"4c8906cf76f5740ab8792aef9f0033fe21a92045e90b357816064e9f6860a03e","text":"Channels","translated":"渠道","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:44:11Z"} +{"cache_key":"faae749a1e3720731bd89450cc30ca39d65ca2d3968ac048373c3f6ba5087381","segment_id":"start/getting-started.md:9c7c1a1750d380e8","source_path":"start/getting-started.md","text_hash":"9c7c1a1750d380e8b4f5329437dd3e6066f20891e74af700595ddf8a5eac42a3","text":"Bun warning (WhatsApp + Telegram):","translated":"Bun 警告(WhatsApp + Telegram):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:37:01Z"} +{"cache_key":"fab1c40ef11182f7118f5528b5ba6ed5b5c169c37b302382107e3fbab3d200c1","segment_id":"index.md:3d8fed7c358b2ccf","source_path":"index.md","text_hash":"3d8fed7c358b2ccf225ee16857a0bb9b950fd414319749e0f6fff58c99fa5f22","text":"Subscription auth","translated":"订阅认证","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:50:25Z"} +{"cache_key":"fae191ae8b8380df30a34afd63fc9ba9125258cee9f76e625da9a9c41a858973","segment_id":"start/wizard.md:158ac20b77d1dc12","source_path":"start/wizard.md","text_hash":"158ac20b77d1dc1223a47723e75f03b49fe61d0a6d69de4c3bba9fdd4c123c04","text":" only configures the local client to connect to a Gateway elsewhere.\nIt does ","translated":" 仅配置本地客户端以连接到其他位置的 Gateway。它 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:40:36Z"} +{"cache_key":"faf6394b29b7de4f1af4a5c01405a2c33d4a1f8f58691915d75eedd3572b1d49","segment_id":"index.md:a7a19d4f14d001a5","source_path":"index.md","text_hash":"a7a19d4f14d001a56c27f68a13ff267859a407c7a9ab457c0945693c9067dd1c","text":"Configuration (optional)","translated":"配置(可选)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:03:21Z"} +{"cache_key":"fc41f7c0ff1d82b20353a8a79f2da756675af014a48e1c36b3e693e2030aca4c","segment_id":"help/index.md:6201111b83a0cb5b","source_path":"help/index.md","text_hash":"6201111b83a0cb5b0922cb37cc442b9a40e24e3b1ce100a4bb204f4c63fd2ac0","text":" and ","translated":" 和 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:39:50Z"} +{"cache_key":"fc43ec1fbbcff82d8d617e73687d1fa0c004b3fa731fdb6c9a1b0825ac2df2f5","segment_id":"start/wizard.md:d80c4025fe9728d6","source_path":"start/wizard.md","text_hash":"d80c4025fe9728d67b8330bdbb25a3062c7748ae6779d348b66687d5a796550f","text":"Gateway wizard RPC","translated":"Gateway 向导 RPC","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:47:41Z"} +{"cache_key":"fc503e5044847f8c5412b75ba55ec912df5577a3bc37a7a975393684059d9c12","segment_id":"environment.md:61115f6649792387","source_path":"environment.md","text_hash":"61115f664979238731a390e84433a818965b7eaf1d38fa5b4b1507c33ef28c91","text":"Precedence (highest → lowest)","translated":"优先级(从高到低)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:16:00Z"} +{"cache_key":"fc5a2a3c595c777506fa783ae7fdb46154bc1a9d2990062d2816de3f42b4a5a4","segment_id":"index.md:c011d6097bfbc8e9","source_path":"index.md","text_hash":"c011d6097bfbc8e936280addcf2e3e7d06ea2223ffd596973191b800a7035c32","text":"License","translated":"许可证","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:06:48Z"} +{"cache_key":"fc7b6106c6fe0ee6f9470690d4557420fe96c6bf88d32572c1c6bcebeeca0ba5","segment_id":"index.md:1e37e607483201e2","source_path":"index.md","text_hash":"1e37e607483201e2152d2e9c68874dd4027648efdd9cfccb7bf8c9837398d143","text":"), serving ","translated":"),提供 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:00:27Z"} +{"cache_key":"fc98ca0f83f0fb76119a9483b4e7cf04bba735dc5c4bac23b5fea356315322a6","segment_id":"start/wizard.md:78db1bd89a6a2b1c","source_path":"start/wizard.md","text_hash":"78db1bd89a6a2b1cfa5c7af25c03cdd0aaef049910f8532b3440fdf3e5d41759","text":"May prompt for sudo (writes ","translated":"可能会提示输入 sudo(写入 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:45:24Z"} +{"cache_key":"fca2c0b7fa4c88f595ccb62204b07c5d014cb1f1240a39a203bfe37e25fe8c07","segment_id":"index.md:eef0107bb5a4e06b","source_path":"index.md","text_hash":"eef0107bb5a4e06b9de432b9e62bcf1e39ca5dfbbb9cb0cc1c803ca7671c06ab","text":"Gateway runbook","translated":"Gateway 运行手册","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:54Z"} +{"cache_key":"fcb8a00898eb27b04a3ced786d117b0d7be079d0f45d8608b8a8fe87ad32f0eb","segment_id":"index.md:82ba9b60b12da3ab","source_path":"index.md","text_hash":"82ba9b60b12da3ab4e7dbcb0d7d937214cff80c82268311423a6dc8c4bc09df5","text":"OpenClaw 🦞","translated":"OpenClaw 🦞","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:47:22Z"} +{"cache_key":"fd042da779d8af0e3f90024d3ee3ed60dc05ed4220b6645c1c7afd148c481918","segment_id":"help/index.md:729bc562eec2658b","source_path":"help/index.md","text_hash":"729bc562eec2658bd11ffdd522fe5277177dc73e86eaca7baac0b472a4d8f8b2","text":"If you’re looking for conceptual questions (not “something broke”):","translated":"如果你在寻找概念性问题的答案(而不是\"出了问题\"):","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:15:36Z"} +{"cache_key":"fd16400d64e6f3b7376b1999211a6ed33688eeb2c9a6fd26ce226094628b2647","segment_id":"help/index.md:d3ef01b4a9c99103","source_path":"help/index.md","text_hash":"d3ef01b4a9c9910364c9b26b2499c8787a0461d2d24ab80376fff736a288b34c","text":"Logging","translated":"日志记录","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:11:22Z"} +{"cache_key":"fd42cd6d27d391746b39a68daf76869aab50130d11563f38793103f97b0cc634","segment_id":"environment.md:b4736422e64c0a36","source_path":"environment.md","text_hash":"b4736422e64c0a369663d1b2d386f1b8f4b31b8936b588e4a54453c61a24e0fd","text":"Process environment","translated":"进程环境","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:40:30Z"} +{"cache_key":"fd81a6834413dec93cb0fa720f94f980ebd8de062a9f03c67f8a5eac7dba177b","segment_id":"start/wizard.md:f9101c545949c8fd","source_path":"start/wizard.md","text_hash":"f9101c545949c8fd264de16e8705ea2867f73b1e72f14ed6701d37169226731b","text":"The onboarding wizard is the ","translated":"上手引导向导是 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:38:59Z"} +{"cache_key":"fdd0251e3da40ed9b7947f5fc52798e46adbdbe32b4687efe40bf1c34c3f8a54","segment_id":"environment.md:45ca56d179d4788c","source_path":"environment.md","text_hash":"45ca56d179d4788c55ba9f7653b376d62e7faa738e92259e3d4f6f5c1b554f28","text":"Related","translated":"相关内容","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:13:09Z"} +{"cache_key":"fe03652b8fbba7658cd3c33e1ecfc88bf7a2a2416727c8de537a1ff4a7d04c63","segment_id":"start/wizard.md:51aa8bdcedfdb0c9","source_path":"start/wizard.md","text_hash":"51aa8bdcedfdb0c9eefbf91a6fa25d78b4c367be285bd472553cc0b461d983c8","text":"OpenAI API key","translated":"OpenAI API 密钥","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:26Z"} +{"cache_key":"fe28d810ff498a350b586785445582bed45cf1b1de02ea8be1569cf0da546ecc","segment_id":"index.md:3f8466cd9cb153d0","source_path":"index.md","text_hash":"3f8466cd9cb153d0c78a88f6a209e2206992db28c6dab45424132dc187974e2b","text":"Note: legacy Claude/Codex/Gemini/Opencode paths have been removed; Pi is the only coding-agent path.","translated":"注意:旧版 Claude/Codex/Gemini/Opencode 路径已被移除;Pi 是唯一的编程 智能体 路径。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:51:20Z"} +{"cache_key":"fe4dd967a44b8e8082aa5b2441ea4e4fc4478e2e370087cf666830f23b215d1c","segment_id":"index.md:74f99190ef66a7d5","source_path":"index.md","text_hash":"74f99190ef66a7d513049d31bafc76e05f9703f3320bf757fb2693447a48c25b","text":"Linux app","translated":"Linux 应用","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:05:16Z"} +{"cache_key":"fe554549a7c67caf1f51ae69b2d4bdb126cc0bfeb0963610e8b0be605fb058e3","segment_id":"start/wizard.md:87bb59ba2f92f2a5","source_path":"start/wizard.md","text_hash":"87bb59ba2f92f2a5a9f13e021fd58dd14ae5c065b1046146875e6e68d5ebc8b7","text":"Workspace","translated":"工作区","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:43:38Z"} +{"cache_key":"fe81eef1d52c47b26c55cb74fd8c6fe31a5c648213d3dcf3de567d8125f222fd","segment_id":"index.md:11450a0f023dc48c","source_path":"index.md","text_hash":"11450a0f023dc48cc9cef026357e2b4569a2b756290191c45a9eb0120a919cb7","text":" and (for groups) mention rules.","translated":" 以及(针对群组的)提及规则。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:03Z"} +{"cache_key":"fe9fff29a8a3a18b8ba8f7493dc3331ffb90c4585bcdc2a3c03e402202f786ae","segment_id":"start/wizard.md:2f6975ca07f6b950","source_path":"start/wizard.md","text_hash":"2f6975ca07f6b95055db357fed97ef04d04d7ac57351e48bd69e0a0675ac47b1","text":"OpenCode Zen (multi-model proxy)","translated":"OpenCode Zen(多模型代理)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:42:32Z"} +{"cache_key":"fecfa9809bf3844fdc62208030ad2364304c83d2c2a278f691a06fe1d95eef29","segment_id":"environment.md:61115f6649792387","source_path":"environment.md","text_hash":"61115f664979238731a390e84433a818965b7eaf1d38fa5b4b1507c33ef28c91","text":"Precedence (highest → lowest)","translated":"优先级(从高到低)","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:18Z"} +{"cache_key":"fed9ca0b4a8c8162f989410401afbb3038f19d1060104d1804a5bacb2af45013","segment_id":"start/wizard.md:f7952490362d43d3","source_path":"start/wizard.md","text_hash":"f7952490362d43d362bce1e931f3e707e6b39369e9182fae26b54f677f778145","text":"If no GUI is detected, the wizard prints SSH port-forward instructions for the Control UI instead of opening a browser.","translated":"如果未检测到 GUI,向导会打印 Control UI 的 SSH 端口转发说明,而不是打开浏览器。","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:46:04Z"} +{"cache_key":"ff0818747bde0777bfd88d234d27b7ccd9e866cb8d477f1c022943f425735631","segment_id":"environment.md:frontmatter:read_when:0","source_path":"environment.md:frontmatter:read_when:0","text_hash":"90fc0487bff88009979cff1061c1a882df8c3b1baa9c43538331d9d5dab15479","text":"You need to know which env vars are loaded, and in what order","translated":"您需要了解哪些 环境变量 被加载,以及加载顺序","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:01Z"} +{"cache_key":"ff35a70223602ebd4e2ccb376f9a05a23436de50c0661a69a6c189e54386369c","segment_id":"environment.md:907940a35852447a","source_path":"environment.md","text_hash":"907940a35852447aad5f21c5a180d993ff31cfd5807b1352ed0c24eabe183465","text":"never override existing values","translated":"永远不覆盖已有的值","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:57:13Z"} +{"cache_key":"ff4870ed3d31dd15db9a3753847994b892bfbbcd169eaf654fa2a9347de1b80a","segment_id":"index.md:053bc65874ad6098","source_path":"index.md","text_hash":"053bc65874ad6098e58c41c57b378a2f36b0220e5e0b46722245e6c2f796818c","text":"Discord","translated":"Discord","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:32:38Z"} +{"cache_key":"ff9cd1150279b1783fc13d1d8deb389b0589027719aa184d39812dab44ad30c3","segment_id":"index.md:075a4a45c3999f34","source_path":"index.md","text_hash":"075a4a45c3999f340be8487cd7c0dd2ed77ced931054d75e95e5e24d5539b45b","text":" — Pi (RPC mode) with tool streaming","translated":" — Pi(RPC 模式)配合 工具 流式传输","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:29Z"} +{"cache_key":"ffc0edaae36968ae44b65f6baba8cef750ebcff415a26c7bbda8f59ed632b548","segment_id":"index.md:872887e563e75957","source_path":"index.md","text_hash":"872887e563e75957ffc20b021332504f2ddd0a8f3964cb93070863bfaf13cdad","text":"Example:","translated":"示例:","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T12:52:06Z"} +{"cache_key":"ffd04ac4efed00f848ef0d6f549a5e3f7237a0942d8d18a0ace2751a1f044099","segment_id":"index.md:0c67abfaa5415391","source_path":"index.md","text_hash":"0c67abfaa5415391a31cf3a4624746b6b212b5ae66364be28ee2d131f014e0c6","text":"🧩 ","translated":"🧩 ","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:01:09Z"} +{"cache_key":"ffd193a2ab6714302a69cbe3b1bc24f881807a3a8ce88558687554509a4c1c1c","segment_id":"index.md:7e2735e5df8f4e9f","source_path":"index.md","text_hash":"7e2735e5df8f4e9f006d10e079fe8045612aa662b02a9d1948081d1173798dec","text":"MIT — Free as a lobster in the ocean 🦞","translated":"MIT — 像大海中的龙虾一样自由 🦞","provider":"pi","model":"claude-opus-4-5","src_lang":"en","tgt_lang":"zh-CN","updated_at":"2026-02-01T13:34:07Z"} diff --git a/docs/.i18n/zh-Hans-navigation.json b/docs/.i18n/zh-Hans-navigation.json new file mode 100644 index 000000000..f82088a2a --- /dev/null +++ b/docs/.i18n/zh-Hans-navigation.json @@ -0,0 +1,615 @@ +{ + "language": "zh-Hans", + "tabs": [ + { + "tab": "快速开始", + "groups": [ + { + "group": "首页", + "pages": [ + "zh-CN/index" + ] + }, + { + "group": "概览", + "pages": [ + "zh-CN/start/showcase" + ] + }, + { + "group": "核心概念", + "pages": [ + "zh-CN/concepts/features" + ] + }, + { + "group": "第一步", + "pages": [ + "zh-CN/start/getting-started", + "zh-CN/start/wizard", + "zh-CN/start/onboarding" + ] + }, + { + "group": "指南", + "pages": [ + "zh-CN/start/openclaw" + ] + } + ] + }, + { + "tab": "安装", + "groups": [ + { + "group": "安装概览", + "pages": [ + "zh-CN/install/index", + "zh-CN/install/installer" + ] + }, + { + "group": "安装方式", + "pages": [ + "zh-CN/install/docker", + "zh-CN/install/nix", + "zh-CN/install/ansible", + "zh-CN/install/bun" + ] + }, + { + "group": "维护", + "pages": [ + "zh-CN/install/updating", + "zh-CN/install/migrating", + "zh-CN/install/uninstall" + ] + }, + { + "group": "托管与部署", + "pages": [ + "zh-CN/vps", + "zh-CN/install/fly", + "zh-CN/install/hetzner", + "zh-CN/install/gcp", + "zh-CN/install/macos-vm", + "zh-CN/install/exe-dev", + "zh-CN/install/railway", + "zh-CN/install/render", + "zh-CN/install/northflank" + ] + }, + { + "group": "高级", + "pages": [ + "zh-CN/install/development-channels" + ] + } + ] + }, + { + "tab": "消息渠道", + "groups": [ + { + "group": "概览", + "pages": [ + "zh-CN/channels/index" + ] + }, + { + "group": "消息平台", + "pages": [ + "zh-CN/channels/bluebubbles", + "zh-CN/channels/discord", + "zh-CN/channels/feishu", + "zh-CN/channels/grammy", + "zh-CN/channels/googlechat", + "zh-CN/channels/imessage", + "zh-CN/channels/line", + "zh-CN/channels/matrix", + "zh-CN/channels/mattermost", + "zh-CN/channels/msteams", + "zh-CN/channels/nextcloud-talk", + "zh-CN/channels/nostr", + "zh-CN/channels/signal", + "zh-CN/channels/slack", + "zh-CN/channels/telegram", + "zh-CN/channels/tlon", + "zh-CN/channels/twitch", + "zh-CN/channels/whatsapp", + "zh-CN/channels/zalo", + "zh-CN/channels/zalouser" + ] + }, + { + "group": "配置", + "pages": [ + "zh-CN/channels/pairing", + "zh-CN/channels/group-messages", + "zh-CN/channels/groups", + "zh-CN/channels/broadcast-groups", + "zh-CN/channels/channel-routing", + "zh-CN/channels/location", + "zh-CN/channels/troubleshooting" + ] + } + ] + }, + { + "tab": "代理", + "groups": [ + { + "group": "基础", + "pages": [ + "zh-CN/pi", + "zh-CN/concepts/architecture", + "zh-CN/concepts/agent", + "zh-CN/concepts/agent-loop", + "zh-CN/concepts/system-prompt", + "zh-CN/concepts/context", + "zh-CN/concepts/agent-workspace", + "zh-CN/concepts/oauth" + ] + }, + { + "group": "引导", + "pages": [ + "zh-CN/start/bootstrapping" + ] + }, + { + "group": "会话与记忆", + "pages": [ + "zh-CN/concepts/session", + "zh-CN/concepts/session-pruning", + "zh-CN/concepts/session-tool", + "zh-CN/concepts/memory", + "zh-CN/concepts/compaction" + ] + }, + { + "group": "多代理", + "pages": [ + "zh-CN/concepts/multi-agent", + "zh-CN/concepts/presence" + ] + }, + { + "group": "消息与投递", + "pages": [ + "zh-CN/concepts/messages", + "zh-CN/concepts/streaming", + "zh-CN/concepts/retry", + "zh-CN/concepts/queue" + ] + } + ] + }, + { + "tab": "工具", + "groups": [ + { + "group": "概览", + "pages": [ + "zh-CN/tools/index" + ] + }, + { + "group": "内置工具", + "pages": [ + "zh-CN/tools/apply-patch", + "zh-CN/brave-search", + "zh-CN/tools/elevated", + "zh-CN/tools/exec", + "zh-CN/tools/exec-approvals", + "zh-CN/tools/firecrawl", + "zh-CN/tools/llm-task", + "zh-CN/tools/lobster", + "zh-CN/perplexity", + "zh-CN/tools/reactions", + "zh-CN/tools/thinking", + "zh-CN/tools/web" + ] + }, + { + "group": "浏览器", + "pages": [ + "zh-CN/tools/browser", + "zh-CN/tools/browser-login", + "zh-CN/tools/browser-linux-troubleshooting" + ] + }, + { + "group": "代理协作", + "pages": [ + "zh-CN/tools/agent-send", + "zh-CN/tools/subagents", + "zh-CN/tools/multi-agent-sandbox-tools" + ] + }, + { + "group": "技能", + "pages": [ + "zh-CN/tools/creating-skills", + "zh-CN/tools/slash-commands", + "zh-CN/tools/skills", + "zh-CN/tools/skills-config", + "zh-CN/tools/clawhub", + "zh-CN/tools/plugin" + ] + }, + { + "group": "扩展", + "pages": [ + "zh-CN/plugins/voice-call", + "zh-CN/plugins/zalouser", + "zh-CN/plugins/manifest", + "zh-CN/plugins/agent-tools", + "zh-CN/prose" + ] + }, + { + "group": "自动化与任务", + "pages": [ + "zh-CN/automation/hooks", + "zh-CN/automation/cron-jobs" + ] + }, + { + "group": "媒体与设备", + "pages": [ + "zh-CN/nodes/index", + "zh-CN/nodes/troubleshooting", + "zh-CN/nodes/media-understanding", + "zh-CN/nodes/images", + "zh-CN/nodes/audio", + "zh-CN/nodes/camera", + "zh-CN/nodes/talk", + "zh-CN/nodes/voicewake", + "zh-CN/nodes/location-command", + "zh-CN/tts" + ] + } + ] + }, + { + "tab": "模型", + "groups": [ + { + "group": "概览", + "pages": [ + "zh-CN/providers/index", + "zh-CN/providers/models" + ] + }, + { + "group": "模型概念", + "pages": [ + "zh-CN/concepts/models" + ] + }, + { + "group": "配置", + "pages": [ + "zh-CN/concepts/model-providers", + "zh-CN/concepts/model-failover" + ] + }, + { + "group": "提供商", + "pages": [ + "zh-CN/providers/anthropic", + "zh-CN/providers/bedrock", + "zh-CN/providers/claude-max-api-proxy", + "zh-CN/providers/deepgram", + "zh-CN/providers/github-copilot", + "zh-CN/providers/glm", + "zh-CN/providers/moonshot", + "zh-CN/providers/minimax", + "zh-CN/providers/opencode", + "zh-CN/providers/ollama", + "zh-CN/providers/openai", + "zh-CN/providers/openrouter", + "zh-CN/providers/qianfan", + "zh-CN/providers/qwen", + "zh-CN/providers/synthetic", + "zh-CN/providers/venice", + "zh-CN/providers/vercel-ai-gateway", + "zh-CN/providers/xiaomi", + "zh-CN/providers/zai" + ] + } + ] + }, + { + "tab": "平台", + "groups": [ + { + "group": "平台概览", + "pages": [ + "zh-CN/platforms/index", + "zh-CN/platforms/macos", + "zh-CN/platforms/linux", + "zh-CN/platforms/windows", + "zh-CN/platforms/android", + "zh-CN/platforms/ios", + "zh-CN/platforms/digitalocean", + "zh-CN/platforms/oracle", + "zh-CN/platforms/raspberry-pi" + ] + }, + { + "group": "macOS 配套应用", + "pages": [ + "zh-CN/platforms/mac/dev-setup", + "zh-CN/platforms/mac/menu-bar", + "zh-CN/platforms/mac/voicewake", + "zh-CN/platforms/mac/voice-overlay", + "zh-CN/platforms/mac/webchat", + "zh-CN/platforms/mac/canvas", + "zh-CN/platforms/mac/child-process", + "zh-CN/platforms/mac/health", + "zh-CN/platforms/mac/icon", + "zh-CN/platforms/mac/logging", + "zh-CN/platforms/mac/permissions", + "zh-CN/platforms/mac/remote", + "zh-CN/platforms/mac/signing", + "zh-CN/platforms/mac/bundled-gateway", + "zh-CN/platforms/mac/xpc", + "zh-CN/platforms/mac/skills", + "zh-CN/platforms/mac/peekaboo" + ] + } + ] + }, + { + "tab": "网关与运维", + "groups": [ + { + "group": "网关", + "pages": [ + "zh-CN/gateway/index", + { + "group": "配置与运维", + "pages": [ + "zh-CN/gateway/configuration", + "zh-CN/gateway/configuration-examples", + "zh-CN/gateway/authentication", + "zh-CN/gateway/health", + "zh-CN/gateway/heartbeat", + "zh-CN/gateway/doctor", + "zh-CN/gateway/logging", + "zh-CN/gateway/gateway-lock", + "zh-CN/gateway/background-process", + "zh-CN/gateway/multiple-gateways", + "zh-CN/gateway/troubleshooting" + ] + }, + { + "group": "安全与沙箱", + "pages": [ + "zh-CN/gateway/security/index", + "zh-CN/gateway/sandboxing", + "zh-CN/gateway/sandbox-vs-tool-policy-vs-elevated" + ] + }, + { + "group": "协议与 API", + "pages": [ + "zh-CN/gateway/protocol", + "zh-CN/gateway/bridge-protocol", + "zh-CN/gateway/openai-http-api", + "zh-CN/gateway/openresponses-http-api", + "zh-CN/gateway/tools-invoke-http-api", + "zh-CN/gateway/cli-backends", + "zh-CN/gateway/local-models" + ] + }, + { + "group": "网络与发现", + "pages": [ + "zh-CN/gateway/network-model", + "zh-CN/gateway/pairing", + "zh-CN/gateway/discovery", + "zh-CN/gateway/bonjour" + ] + } + ] + }, + { + "group": "远程访问", + "pages": [ + "zh-CN/gateway/remote", + "zh-CN/gateway/remote-gateway-readme", + "zh-CN/gateway/tailscale" + ] + }, + { + "group": "运维专题", + "pages": [ + "zh-CN/network", + "zh-CN/logging" + ] + }, + { + "group": "安全", + "pages": [ + "zh-CN/security/formal-verification" + ] + }, + { + "group": "Web 界面", + "pages": [ + "zh-CN/web/index", + "zh-CN/web/control-ui", + "zh-CN/web/dashboard", + "zh-CN/web/webchat", + "zh-CN/web/tui" + ] + } + ] + }, + { + "tab": "参考", + "groups": [ + { + "group": "CLI 命令", + "pages": [ + "zh-CN/cli/index", + "zh-CN/cli/acp", + "zh-CN/cli/agent", + "zh-CN/cli/agents", + "zh-CN/cli/approvals", + "zh-CN/cli/browser", + "zh-CN/cli/channels", + "zh-CN/cli/config", + "zh-CN/cli/configure", + "zh-CN/cli/cron", + "zh-CN/cli/dashboard", + "zh-CN/cli/devices", + "zh-CN/cli/directory", + "zh-CN/cli/dns", + "zh-CN/cli/docs", + "zh-CN/cli/doctor", + "zh-CN/cli/gateway", + "zh-CN/cli/health", + "zh-CN/cli/hooks", + "zh-CN/cli/logs", + "zh-CN/cli/memory", + "zh-CN/cli/message", + "zh-CN/cli/models", + "zh-CN/cli/node", + "zh-CN/cli/nodes", + "zh-CN/cli/onboard", + "zh-CN/cli/pairing", + "zh-CN/cli/plugins", + "zh-CN/cli/reset", + "zh-CN/cli/sandbox", + "zh-CN/cli/security", + "zh-CN/cli/sessions", + "zh-CN/cli/setup", + "zh-CN/cli/skills", + "zh-CN/cli/status", + "zh-CN/cli/system", + "zh-CN/cli/tui", + "zh-CN/cli/uninstall", + "zh-CN/cli/update", + "zh-CN/cli/voicecall", + "zh-CN/cli/webhooks" + ] + }, + { + "group": "RPC 与 API", + "pages": [ + "zh-CN/reference/rpc", + "zh-CN/reference/device-models" + ] + }, + { + "group": "模板", + "pages": [ + "zh-CN/reference/AGENTS.default", + "zh-CN/reference/templates/AGENTS", + "zh-CN/reference/templates/BOOT", + "zh-CN/reference/templates/BOOTSTRAP", + "zh-CN/reference/templates/HEARTBEAT", + "zh-CN/reference/templates/IDENTITY", + "zh-CN/reference/templates/SOUL", + "zh-CN/reference/templates/TOOLS", + "zh-CN/reference/templates/USER" + ] + }, + { + "group": "技术参考", + "pages": [ + "zh-CN/reference/wizard", + "zh-CN/reference/token-use", + "zh-CN/reference/api-usage-costs", + "zh-CN/reference/transcript-hygiene", + "zh-CN/date-time" + ] + }, + { + "group": "概念内部机制", + "pages": [ + "zh-CN/concepts/typebox", + "zh-CN/concepts/markdown-formatting", + "zh-CN/concepts/typing-indicators", + "zh-CN/concepts/usage-tracking", + "zh-CN/concepts/timezone" + ] + }, + { + "group": "项目", + "pages": [ + "zh-CN/reference/credits" + ] + }, + { + "group": "发布策略", + "pages": [ + "zh-CN/reference/RELEASING", + "zh-CN/reference/test" + ] + } + ] + }, + { + "tab": "帮助", + "groups": [ + { + "group": "帮助", + "pages": [ + "zh-CN/help/index", + "zh-CN/help/troubleshooting", + "zh-CN/help/faq" + ] + }, + { + "group": "社区", + "pages": [ + "zh-CN/start/lore" + ] + }, + { + "group": "环境与调试", + "pages": [ + "zh-CN/help/environment", + "zh-CN/help/debugging", + "zh-CN/help/testing", + "zh-CN/help/scripts", + "zh-CN/debug/node-issue", + "zh-CN/diagnostics/flags" + ] + }, + { + "group": "Node 运行时", + "pages": [ + "zh-CN/install/node" + ] + }, + { + "group": "压缩机制内部参考", + "pages": [ + "zh-CN/reference/session-management-compaction" + ] + }, + { + "group": "开发者设置", + "pages": [ + "zh-CN/start/setup", + "zh-CN/pi-dev" + ] + }, + { + "group": "文档元信息", + "pages": [ + "zh-CN/start/hubs", + "zh-CN/start/docs-directory", + "zh-CN/AGENTS" + ] + } + ] + } + ] +} diff --git a/docs/assets/install-script.svg b/docs/assets/install-script.svg new file mode 100644 index 000000000..78a6f9756 --- /dev/null +++ b/docs/assets/install-script.svg @@ -0,0 +1 @@ +seb@ubuntu:~$curl-fsSLhttps://openclaw.ai/install.sh|bash╭─────────────────────────────────────────╮🦞OpenClawInstallerBecauseSiriwasn'tansweringat3AM.moderninstallermode╰─────────────────────────────────────────╯gumbootstrapped(temp,verified,v0.17.0)Detected:linuxInstallplanOSlinuxInstallmethodnpmRequestedversionlatest[1/3]PreparingenvironmentINFONode.jsnotfound,installingitnowINFOInstallingNode.jsviaNodeSourceConfiguringNodeSourcerepositoryConfiguringNodeSourcerepositoryConfiguringNodeSourcerepositoryConfiguringNodeSourcerepositoryConfiguringNodeSourcerepositoryConfiguringNodeSourcerepositoryConfiguringNodeSourcerepositoryConfiguringNodeSourcerepositoryInstallingNode.jsInstallingNode.jsInstallingNode.jsInstallingNode.jsInstallingNode.jsInstallingNode.jsInstallingNode.jsInstallingNode.jsNode.jsv22installed[2/3]InstallingOpenClawINFOGitnotfound,installingitnowUpdatingpackageindexInstallingGitInstallingGitInstallingGitInstallingGitInstallingGitInstallingGitInstallingGitInstallingGitGitinstalledINFOConfiguringnpmforuser-localinstallsnpmconfiguredforuserinstallsINFOInstallingOpenClawv2026.2.9InstallingOpenClawpackageInstallingOpenClawpackageInstallingOpenClawpackageInstallingOpenClawpackageInstallingOpenClawpackageInstallingOpenClawpackageInstallingOpenClawpackageInstallingOpenClawpackageOpenClawnpmpackageinstalledOpenClawinstalled[3/3]FinalizingsetupWARNPATHmissingnpmglobalbindir:/home/seb/.npm-global/binThiscanmakeopenclawshowas"commandnotfound"innewterminals.Fix(zsh:~/.zshrc,bash:~/.bashrc):exportPATH="/home/seb/.npm-global/bin:$PATH"🦞OpenClawinstalledsuccessfully(2026.2.9)!Finallyunpacked.Nowpointmeatyourproblems.INFOStartingsetup🦞OpenClaw2026.2.9(33c75cb)Thinkdifferent.Actuallythink.▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░████░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░████░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀🦞OPENCLAW🦞OpenClawonboardingSecurity──────────────────────────────────────────────────────────────────────────────╮Securitywarningpleaseread.OpenClawisahobbyprojectandstillinbeta.Expectsharpedges.Thisbotcanreadfilesandrunactionsiftoolsareenabled.Abadpromptcantrickitintodoingunsafethings.Ifyou’renotcomfortablewithbasicsecurityandaccesscontrol,don’trunOpenClaw.Asksomeoneexperiencedtohelpbeforeenablingtoolsorexposingittotheinternet.Recommendedbaseline:-Pairing/allowlists+mentiongating.-Sandbox+least-privilegetools.-Keepsecretsoutoftheagent’sreachablefilesystem.-Usethestrongestavailablemodelforanybotwithtoolsoruntrustedinboxes.Runregularly:openclawsecurityaudit--deepopenclawsecurityaudit--fixMustread:https://docs.openclaw.ai/gateway/security├─────────────────────────────────────────────────────────────────────────────────────────╯Iunderstandthisispowerfulandinherentlyrisky.Continue?Yes/NoYes/Noseb@ubuntu:~$asciinemaseb@ubuntu:~$asciinemauploadseb@ubuntu:~$asciinemauploaddemo.castseb@ubuntu:~$seb@ubuntu:~$curl -fsSL https://openclaw.ai/install.sh | bashUpdatingpackageindexUpdatingpackageindexUpdatingpackageindexUpdatingpackageindexUpdatingpackageindexUpdatingpackageindexUpdatingpackageindexAbadpromptcantrickitintodoingunsafethings.-Keepsecretsoutoftheagent’sreachablefilesystem.seb@ubuntu:~$seb@ubuntu:~$aseb@ubuntu:~$asseb@ubuntu:~$ascseb@ubuntu:~$asciseb@ubuntu:~$asciiseb@ubuntu:~$asciinseb@ubuntu:~$asciineseb@ubuntu:~$asciinemseb@ubuntu:~$asciinemauseb@ubuntu:~$asciinemaupseb@ubuntu:~$asciinemauplseb@ubuntu:~$asciinemauploseb@ubuntu:~$asciinemauploaseb@ubuntu:~$asciinemauploaddseb@ubuntu:~$asciinemauploaddeseb@ubuntu:~$asciinemauploaddemseb@ubuntu:~$asciinemauploaddemoseb@ubuntu:~$asciinemauploaddemo.seb@ubuntu:~$asciinemauploaddemo.cseb@ubuntu:~$asciinemauploaddemo.caseb@ubuntu:~$asciinemauploaddemo.cas \ No newline at end of file diff --git a/docs/assets/macos-onboarding/01-macos-warning.jpeg b/docs/assets/macos-onboarding/01-macos-warning.jpeg new file mode 100644 index 000000000..255976fe5 Binary files /dev/null and b/docs/assets/macos-onboarding/01-macos-warning.jpeg differ diff --git a/docs/assets/macos-onboarding/02-local-networks.jpeg b/docs/assets/macos-onboarding/02-local-networks.jpeg new file mode 100644 index 000000000..0135e38f6 Binary files /dev/null and b/docs/assets/macos-onboarding/02-local-networks.jpeg differ diff --git a/docs/assets/macos-onboarding/03-security-notice.png b/docs/assets/macos-onboarding/03-security-notice.png new file mode 100644 index 000000000..ca0dac968 Binary files /dev/null and b/docs/assets/macos-onboarding/03-security-notice.png differ diff --git a/docs/assets/macos-onboarding/04-choose-gateway.png b/docs/assets/macos-onboarding/04-choose-gateway.png new file mode 100644 index 000000000..4e0233c22 Binary files /dev/null and b/docs/assets/macos-onboarding/04-choose-gateway.png differ diff --git a/docs/assets/macos-onboarding/05-permissions.png b/docs/assets/macos-onboarding/05-permissions.png new file mode 100644 index 000000000..910a5f8da Binary files /dev/null and b/docs/assets/macos-onboarding/05-permissions.png differ diff --git a/docs/assets/openclaw-logo-text-dark.png b/docs/assets/openclaw-logo-text-dark.png new file mode 100644 index 000000000..b14e4233b Binary files /dev/null and b/docs/assets/openclaw-logo-text-dark.png differ diff --git a/docs/assets/openclaw-logo-text-dark.svg b/docs/assets/openclaw-logo-text-dark.svg new file mode 100644 index 000000000..317a203c8 --- /dev/null +++ b/docs/assets/openclaw-logo-text-dark.svg @@ -0,0 +1,418 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/openclaw-logo-text.png b/docs/assets/openclaw-logo-text.png new file mode 100644 index 000000000..705d2c0ba Binary files /dev/null and b/docs/assets/openclaw-logo-text.png differ diff --git a/docs/assets/openclaw-logo-text.svg b/docs/assets/openclaw-logo-text.svg new file mode 100644 index 000000000..34038af7b --- /dev/null +++ b/docs/assets/openclaw-logo-text.svg @@ -0,0 +1,418 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/pixel-lobster.svg b/docs/assets/pixel-lobster.svg new file mode 100644 index 000000000..7bfb7fc4d --- /dev/null +++ b/docs/assets/pixel-lobster.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/showcase/agents-ui.jpg b/docs/assets/showcase/agents-ui.jpg new file mode 100644 index 000000000..ae6ab6d18 Binary files /dev/null and b/docs/assets/showcase/agents-ui.jpg differ diff --git a/docs/assets/showcase/bambu-cli.png b/docs/assets/showcase/bambu-cli.png new file mode 100644 index 000000000..046f627ba Binary files /dev/null and b/docs/assets/showcase/bambu-cli.png differ diff --git a/docs/assets/showcase/codexmonitor.png b/docs/assets/showcase/codexmonitor.png new file mode 100644 index 000000000..43952b92b Binary files /dev/null and b/docs/assets/showcase/codexmonitor.png differ diff --git a/docs/assets/showcase/gohome-grafana.png b/docs/assets/showcase/gohome-grafana.png new file mode 100644 index 000000000..bd7cf0774 Binary files /dev/null and b/docs/assets/showcase/gohome-grafana.png differ diff --git a/docs/assets/showcase/ios-testflight.jpg b/docs/assets/showcase/ios-testflight.jpg new file mode 100644 index 000000000..4e19768f9 Binary files /dev/null and b/docs/assets/showcase/ios-testflight.jpg differ diff --git a/docs/assets/showcase/oura-health.png b/docs/assets/showcase/oura-health.png new file mode 100644 index 000000000..b1e9f7072 Binary files /dev/null and b/docs/assets/showcase/oura-health.png differ diff --git a/docs/assets/showcase/padel-cli.svg b/docs/assets/showcase/padel-cli.svg new file mode 100644 index 000000000..61eb6334d --- /dev/null +++ b/docs/assets/showcase/padel-cli.svg @@ -0,0 +1,11 @@ + + + + + $ padel search --location "Barcelona" --date 2026-01-08 --time 18:00-22:00 + Available courts (3): + - Vall d'Hebron 19:00 Court 2 (90m) EUR 34 + - Badalona 20:30 Court 1 (60m) EUR 28 + - Gracia 21:00 Court 4 (90m) EUR 36 + + diff --git a/docs/assets/showcase/padel-screenshot.jpg b/docs/assets/showcase/padel-screenshot.jpg new file mode 100644 index 000000000..eb1ae39ea Binary files /dev/null and b/docs/assets/showcase/padel-screenshot.jpg differ diff --git a/docs/assets/showcase/papla-tts.jpg b/docs/assets/showcase/papla-tts.jpg new file mode 100644 index 000000000..3e7af3838 Binary files /dev/null and b/docs/assets/showcase/papla-tts.jpg differ diff --git a/docs/assets/showcase/pr-review-telegram.jpg b/docs/assets/showcase/pr-review-telegram.jpg new file mode 100644 index 000000000..888a41329 Binary files /dev/null and b/docs/assets/showcase/pr-review-telegram.jpg differ diff --git a/docs/assets/showcase/roborock-screenshot.jpg b/docs/assets/showcase/roborock-screenshot.jpg new file mode 100644 index 000000000..e31ba11eb Binary files /dev/null and b/docs/assets/showcase/roborock-screenshot.jpg differ diff --git a/docs/assets/showcase/roborock-status.svg b/docs/assets/showcase/roborock-status.svg new file mode 100644 index 000000000..470840423 --- /dev/null +++ b/docs/assets/showcase/roborock-status.svg @@ -0,0 +1,13 @@ + + + + + $ gohome roborock status --device "Living Room" + Device: Roborock Q Revo + State: cleaning (zone) + Battery: 78% + Dustbin: 42% + Water tank: 61% + Last clean: 2026-01-06 19:42 + + diff --git a/docs/assets/showcase/roof-camera-sky.jpg b/docs/assets/showcase/roof-camera-sky.jpg new file mode 100644 index 000000000..3396f1405 Binary files /dev/null and b/docs/assets/showcase/roof-camera-sky.jpg differ diff --git a/docs/assets/showcase/snag.png b/docs/assets/showcase/snag.png new file mode 100644 index 000000000..c82c47acf Binary files /dev/null and b/docs/assets/showcase/snag.png differ diff --git a/docs/assets/showcase/tesco-shop.jpg b/docs/assets/showcase/tesco-shop.jpg new file mode 100644 index 000000000..66af85d3c Binary files /dev/null and b/docs/assets/showcase/tesco-shop.jpg differ diff --git a/docs/assets/showcase/wienerlinien.png b/docs/assets/showcase/wienerlinien.png new file mode 100644 index 000000000..8bdf5ae66 Binary files /dev/null and b/docs/assets/showcase/wienerlinien.png differ diff --git a/docs/assets/showcase/wine-cellar-skill.jpg b/docs/assets/showcase/wine-cellar-skill.jpg new file mode 100644 index 000000000..7cd2016cf Binary files /dev/null and b/docs/assets/showcase/wine-cellar-skill.jpg differ diff --git a/docs/assets/showcase/winix-air-purifier.jpg b/docs/assets/showcase/winix-air-purifier.jpg new file mode 100644 index 000000000..c8b99540c Binary files /dev/null and b/docs/assets/showcase/winix-air-purifier.jpg differ diff --git a/docs/assets/showcase/xuezh-pronunciation.jpeg b/docs/assets/showcase/xuezh-pronunciation.jpeg new file mode 100644 index 000000000..7f7d86a8f Binary files /dev/null and b/docs/assets/showcase/xuezh-pronunciation.jpeg differ diff --git a/docs/assets/sponsors/blacksmith-light.svg b/docs/assets/sponsors/blacksmith-light.svg new file mode 100644 index 000000000..1b808db0b --- /dev/null +++ b/docs/assets/sponsors/blacksmith-light.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/assets/sponsors/blacksmith.svg b/docs/assets/sponsors/blacksmith.svg new file mode 100644 index 000000000..5bb1bc2e7 --- /dev/null +++ b/docs/assets/sponsors/blacksmith.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/assets/sponsors/convex-light.svg b/docs/assets/sponsors/convex-light.svg new file mode 100644 index 000000000..1a64a3a63 --- /dev/null +++ b/docs/assets/sponsors/convex-light.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/assets/sponsors/convex.svg b/docs/assets/sponsors/convex.svg new file mode 100644 index 000000000..bd884e9ba --- /dev/null +++ b/docs/assets/sponsors/convex.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/assets/sponsors/github-light.svg b/docs/assets/sponsors/github-light.svg new file mode 100644 index 000000000..e01346c8e --- /dev/null +++ b/docs/assets/sponsors/github-light.svg @@ -0,0 +1,3 @@ + diff --git a/docs/assets/sponsors/github.svg b/docs/assets/sponsors/github.svg new file mode 100644 index 000000000..8dd9ef632 --- /dev/null +++ b/docs/assets/sponsors/github.svg @@ -0,0 +1,3 @@ + diff --git a/docs/assets/sponsors/nvidia-dark.svg b/docs/assets/sponsors/nvidia-dark.svg new file mode 100644 index 000000000..e890314f9 --- /dev/null +++ b/docs/assets/sponsors/nvidia-dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/assets/sponsors/nvidia.svg b/docs/assets/sponsors/nvidia.svg new file mode 100644 index 000000000..b6d82b883 --- /dev/null +++ b/docs/assets/sponsors/nvidia.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/assets/sponsors/openai-light.svg b/docs/assets/sponsors/openai-light.svg new file mode 100644 index 000000000..66021ba9b --- /dev/null +++ b/docs/assets/sponsors/openai-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/sponsors/openai.svg b/docs/assets/sponsors/openai.svg new file mode 100644 index 000000000..1c3491b9b --- /dev/null +++ b/docs/assets/sponsors/openai.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/sponsors/vercel-light.svg b/docs/assets/sponsors/vercel-light.svg new file mode 100644 index 000000000..7af4f4a1f --- /dev/null +++ b/docs/assets/sponsors/vercel-light.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/assets/sponsors/vercel.svg b/docs/assets/sponsors/vercel.svg new file mode 100644 index 000000000..d77a54487 --- /dev/null +++ b/docs/assets/sponsors/vercel.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/auth-credential-semantics.md b/docs/auth-credential-semantics.md new file mode 100644 index 000000000..4ad9d91f9 --- /dev/null +++ b/docs/auth-credential-semantics.md @@ -0,0 +1,80 @@ +--- +title: "Auth Credential Semantics" +summary: "Canonical credential eligibility and resolution semantics for auth profiles" +read_when: + - Working on auth profile resolution or credential routing + - Debugging model auth failures or profile order +--- + +# Auth Credential Semantics + +This document defines the canonical credential eligibility and resolution semantics used across: + +- `resolveAuthProfileOrder` +- `resolveApiKeyForProfile` +- `models status --probe` +- `doctor-auth` + +The goal is to keep selection-time and runtime behavior aligned. + +## Stable Probe Reason Codes + +- `ok` +- `excluded_by_auth_order` +- `missing_credential` +- `invalid_expires` +- `expired` +- `unresolved_ref` +- `no_model` + +## Token Credentials + +Token credentials (`type: "token"`) support inline `token` and/or `tokenRef`. + +### Eligibility rules + +1. A token profile is ineligible when both `token` and `tokenRef` are absent. +2. `expires` is optional. +3. If `expires` is present, it must be a finite number greater than `0`. +4. If `expires` is invalid (`NaN`, `0`, negative, non-finite, or wrong type), the profile is ineligible with `invalid_expires`. +5. If `expires` is in the past, the profile is ineligible with `expired`. +6. `tokenRef` does not bypass `expires` validation. + +### Resolution rules + +1. Resolver semantics match eligibility semantics for `expires`. +2. For eligible profiles, token material may be resolved from inline value or `tokenRef`. +3. Unresolvable refs produce `unresolved_ref` in `models status --probe` output. + +## Explicit Auth Order Filtering + +- When `auth.order.` or the auth-store order override is set for a + provider, `models status --probe` only probes profile ids that remain in the + resolved auth order for that provider. +- A stored profile for that provider that is omitted from the explicit order is + not silently tried later. Probe output reports it with + `reasonCode: excluded_by_auth_order` and the detail + `Excluded by auth.order for this provider.` + +## Probe Target Resolution + +- Probe targets can come from auth profiles, environment credentials, or + `models.json`. +- If a provider has credentials but OpenClaw cannot resolve a probeable model + candidate for it, `models status --probe` reports `status: no_model` with + `reasonCode: no_model`. + +## OAuth SecretRef Policy Guard + +- SecretRef input is for static credentials only. +- If a profile credential is `type: "oauth"`, SecretRef objects are not supported for that profile credential material. +- If `auth.profiles..mode` is `"oauth"`, SecretRef-backed `keyRef`/`tokenRef` input for that profile is rejected. +- Violations are hard failures in startup/reload auth resolution paths. + +## Legacy-Compatible Messaging + +For script compatibility, probe errors keep this first line unchanged: + +`Auth profile credentials are missing or expired.` + +Human-friendly detail and stable reason codes may be added on subsequent lines. diff --git a/docs/automation/auth-monitoring.md b/docs/automation/auth-monitoring.md new file mode 100644 index 000000000..ae07f43c4 --- /dev/null +++ b/docs/automation/auth-monitoring.md @@ -0,0 +1,8 @@ +--- +summary: "Redirect to /gateway/authentication" +title: "Auth Monitoring" +--- + +# Auth Monitoring + +This page moved to [Authentication](/gateway/authentication). See [Authentication](/gateway/authentication) for auth monitoring documentation. diff --git a/docs/automation/clawflow.md b/docs/automation/clawflow.md new file mode 100644 index 000000000..0096b6f35 --- /dev/null +++ b/docs/automation/clawflow.md @@ -0,0 +1,8 @@ +--- +summary: "Redirect to Task Flow" +title: "ClawFlow" +--- + +# ClawFlow + +ClawFlow was renamed to [Task Flow](/automation/taskflow). See [Task Flow](/automation/taskflow) for the current documentation. diff --git a/docs/automation/cron-jobs.md b/docs/automation/cron-jobs.md new file mode 100644 index 000000000..8106c21c9 --- /dev/null +++ b/docs/automation/cron-jobs.md @@ -0,0 +1,410 @@ +--- +summary: "Scheduled jobs, webhooks, and Gmail PubSub triggers for the Gateway scheduler" +read_when: + - Scheduling background jobs or wakeups + - Wiring external triggers (webhooks, Gmail) into OpenClaw + - Deciding between heartbeat and cron for scheduled tasks +title: "Scheduled Tasks" +--- + +# Scheduled Tasks (Cron) + +Cron is the Gateway's built-in scheduler. It persists jobs, wakes the agent at the right time, and can deliver output back to a chat channel or webhook endpoint. + +## Quick start + +```bash +# Add a one-shot reminder +openclaw cron add \ + --name "Reminder" \ + --at "2026-02-01T16:00:00Z" \ + --session main \ + --system-event "Reminder: check the cron docs draft" \ + --wake now \ + --delete-after-run + +# Check your jobs +openclaw cron list + +# See run history +openclaw cron runs --id +``` + +## How cron works + +- Cron runs **inside the Gateway** process (not inside the model). +- Jobs persist at `~/.openclaw/cron/jobs.json` so restarts do not lose schedules. +- All cron executions create [background task](/automation/tasks) records. +- One-shot jobs (`--at`) auto-delete after success by default. +- Isolated cron runs best-effort close tracked browser tabs/processes for their `cron:` session when the run completes, so detached browser automation does not leave orphaned processes behind. +- Isolated cron runs also guard against stale acknowledgement replies. If the + first result is just an interim status update (`on it`, `pulling everything +together`, and similar hints) and no descendant subagent run is still + responsible for the final answer, OpenClaw re-prompts once for the actual + result before delivery. + +Task reconciliation for cron is runtime-owned: an active cron task stays live while the +cron runtime still tracks that job as running, even if an old child session row still exists. +Once the runtime stops owning the job and the 5-minute grace window expires, maintenance can +mark the task `lost`. + +## Schedule types + +| Kind | CLI flag | Description | +| ------- | --------- | ------------------------------------------------------- | +| `at` | `--at` | One-shot timestamp (ISO 8601 or relative like `20m`) | +| `every` | `--every` | Fixed interval | +| `cron` | `--cron` | 5-field or 6-field cron expression with optional `--tz` | + +Timestamps without a timezone are treated as UTC. Add `--tz America/New_York` for local wall-clock scheduling. + +Recurring top-of-hour expressions are automatically staggered by up to 5 minutes to reduce load spikes. Use `--exact` to force precise timing or `--stagger 30s` for an explicit window. + +## Execution styles + +| Style | `--session` value | Runs in | Best for | +| --------------- | ------------------- | ------------------------ | ------------------------------- | +| Main session | `main` | Next heartbeat turn | Reminders, system events | +| Isolated | `isolated` | Dedicated `cron:` | Reports, background chores | +| Current session | `current` | Bound at creation time | Context-aware recurring work | +| Custom session | `session:custom-id` | Persistent named session | Workflows that build on history | + +**Main session** jobs enqueue a system event and optionally wake the heartbeat (`--wake now` or `--wake next-heartbeat`). **Isolated** jobs run a dedicated agent turn with a fresh session. **Custom sessions** (`session:xxx`) persist context across runs, enabling workflows like daily standups that build on previous summaries. + +For isolated jobs, runtime teardown now includes best-effort browser cleanup for that cron session. Cleanup failures are ignored so the actual cron result still wins. + +When isolated cron runs orchestrate subagents, delivery also prefers the final +descendant output over stale parent interim text. If descendants are still +running, OpenClaw suppresses that partial parent update instead of announcing it. + +### Payload options for isolated jobs + +- `--message`: prompt text (required for isolated) +- `--model` / `--thinking`: model and thinking level overrides +- `--light-context`: skip workspace bootstrap file injection +- `--tools exec,read`: restrict which tools the job can use + +`--model` uses the selected allowed model for that job. If the requested model +is not allowed, cron logs a warning and falls back to the job's agent/default +model selection instead. Configured fallback chains still apply, but a plain +model override with no explicit per-job fallback list no longer appends the +agent primary as a hidden extra retry target. + +Model-selection precedence for isolated jobs is: + +1. Gmail hook model override (when the run came from Gmail and that override is allowed) +2. Per-job payload `model` +3. Stored cron session model override +4. Agent/default model selection + +Fast mode follows the resolved live selection too. If the selected model config +has `params.fastMode`, isolated cron uses that by default. A stored session +`fastMode` override still wins over config in either direction. + +If an isolated run hits a live model-switch handoff, cron retries with the +switched provider/model and persists that live selection before retrying. When +the switch also carries a new auth profile, cron persists that auth profile +override too. Retries are bounded: after the initial attempt plus 2 switch +retries, cron aborts instead of looping forever. + +## Delivery and output + +| Mode | What happens | +| ---------- | -------------------------------------------------------- | +| `announce` | Deliver summary to target channel (default for isolated) | +| `webhook` | POST finished event payload to a URL | +| `none` | Internal only, no delivery | + +Use `--announce --channel telegram --to "-1001234567890"` for channel delivery. For Telegram forum topics, use `-1001234567890:topic:123`. Slack/Discord/Mattermost targets should use explicit prefixes (`channel:`, `user:`). + +For cron-owned isolated jobs, the runner owns the final delivery path. The +agent is prompted to return a plain-text summary, and that summary is then sent +through `announce`, `webhook`, or kept internal for `none`. `--no-deliver` +does not hand delivery back to the agent; it keeps the run internal. + +If the original task explicitly says to message some external recipient, the +agent should note who/where that message should go in its output instead of +trying to send it directly. + +Failure notifications follow a separate destination path: + +- `cron.failureDestination` sets a global default for failure notifications. +- `job.delivery.failureDestination` overrides that per job. +- If neither is set and the job already delivers via `announce`, failure notifications now fall back to that primary announce target. +- `delivery.failureDestination` is only supported on `sessionTarget="isolated"` jobs unless the primary delivery mode is `webhook`. + +## CLI examples + +One-shot reminder (main session): + +```bash +openclaw cron add \ + --name "Calendar check" \ + --at "20m" \ + --session main \ + --system-event "Next heartbeat: check calendar." \ + --wake now +``` + +Recurring isolated job with delivery: + +```bash +openclaw cron add \ + --name "Morning brief" \ + --cron "0 7 * * *" \ + --tz "America/Los_Angeles" \ + --session isolated \ + --message "Summarize overnight updates." \ + --announce \ + --channel slack \ + --to "channel:C1234567890" +``` + +Isolated job with model and thinking override: + +```bash +openclaw cron add \ + --name "Deep analysis" \ + --cron "0 6 * * 1" \ + --tz "America/Los_Angeles" \ + --session isolated \ + --message "Weekly deep analysis of project progress." \ + --model "opus" \ + --thinking high \ + --announce +``` + +## Webhooks + +Gateway can expose HTTP webhook endpoints for external triggers. Enable in config: + +```json5 +{ + hooks: { + enabled: true, + token: "shared-secret", + path: "/hooks", + }, +} +``` + +### Authentication + +Every request must include the hook token via header: + +- `Authorization: Bearer ` (recommended) +- `x-openclaw-token: ` + +Query-string tokens are rejected. + +### POST /hooks/wake + +Enqueue a system event for the main session: + +```bash +curl -X POST http://127.0.0.1:18789/hooks/wake \ + -H 'Authorization: Bearer SECRET' \ + -H 'Content-Type: application/json' \ + -d '{"text":"New email received","mode":"now"}' +``` + +- `text` (required): event description +- `mode` (optional): `now` (default) or `next-heartbeat` + +### POST /hooks/agent + +Run an isolated agent turn: + +```bash +curl -X POST http://127.0.0.1:18789/hooks/agent \ + -H 'Authorization: Bearer SECRET' \ + -H 'Content-Type: application/json' \ + -d '{"message":"Summarize inbox","name":"Email","model":"openai/gpt-5.4-mini"}' +``` + +Fields: `message` (required), `name`, `agentId`, `wakeMode`, `deliver`, `channel`, `to`, `model`, `thinking`, `timeoutSeconds`. + +### Mapped hooks (POST /hooks/\) + +Custom hook names are resolved via `hooks.mappings` in config. Mappings can transform arbitrary payloads into `wake` or `agent` actions with templates or code transforms. + +### Security + +- Keep hook endpoints behind loopback, tailnet, or trusted reverse proxy. +- Use a dedicated hook token; do not reuse gateway auth tokens. +- Keep `hooks.path` on a dedicated subpath; `/` is rejected. +- Set `hooks.allowedAgentIds` to limit explicit `agentId` routing. +- Keep `hooks.allowRequestSessionKey=false` unless you require caller-selected sessions. +- If you enable `hooks.allowRequestSessionKey`, also set `hooks.allowedSessionKeyPrefixes` to constrain allowed session key shapes. +- Hook payloads are wrapped with safety boundaries by default. + +## Gmail PubSub integration + +Wire Gmail inbox triggers to OpenClaw via Google PubSub. + +**Prerequisites**: `gcloud` CLI, `gog` (gogcli), OpenClaw hooks enabled, Tailscale for the public HTTPS endpoint. + +### Wizard setup (recommended) + +```bash +openclaw webhooks gmail setup --account openclaw@gmail.com +``` + +This writes `hooks.gmail` config, enables the Gmail preset, and uses Tailscale Funnel for the push endpoint. + +### Gateway auto-start + +When `hooks.enabled=true` and `hooks.gmail.account` is set, the Gateway starts `gog gmail watch serve` on boot and auto-renews the watch. Set `OPENCLAW_SKIP_GMAIL_WATCHER=1` to opt out. + +### Manual one-time setup + +1. Select the GCP project that owns the OAuth client used by `gog`: + +```bash +gcloud auth login +gcloud config set project +gcloud services enable gmail.googleapis.com pubsub.googleapis.com +``` + +2. Create topic and grant Gmail push access: + +```bash +gcloud pubsub topics create gog-gmail-watch +gcloud pubsub topics add-iam-policy-binding gog-gmail-watch \ + --member=serviceAccount:gmail-api-push@system.gserviceaccount.com \ + --role=roles/pubsub.publisher +``` + +3. Start the watch: + +```bash +gog gmail watch start \ + --account openclaw@gmail.com \ + --label INBOX \ + --topic projects//topics/gog-gmail-watch +``` + +### Gmail model override + +```json5 +{ + hooks: { + gmail: { + model: "openrouter/meta-llama/llama-3.3-70b-instruct:free", + thinking: "off", + }, + }, +} +``` + +## Managing jobs + +```bash +# List all jobs +openclaw cron list + +# Edit a job +openclaw cron edit --message "Updated prompt" --model "opus" + +# Force run a job now +openclaw cron run + +# Run only if due +openclaw cron run --due + +# View run history +openclaw cron runs --id --limit 50 + +# Delete a job +openclaw cron remove + +# Agent selection (multi-agent setups) +openclaw cron add --name "Ops sweep" --cron "0 6 * * *" --session isolated --message "Check ops queue" --agent ops +openclaw cron edit --clear-agent +``` + +Model override note: + +- `openclaw cron add|edit --model ...` changes the job's selected model. +- If the model is allowed, that exact provider/model reaches the isolated agent + run. +- If it is not allowed, cron warns and falls back to the job's agent/default + model selection. +- Configured fallback chains still apply, but a plain `--model` override with + no explicit per-job fallback list no longer falls through to the agent + primary as a silent extra retry target. + +## Configuration + +```json5 +{ + cron: { + enabled: true, + store: "~/.openclaw/cron/jobs.json", + maxConcurrentRuns: 1, + retry: { + maxAttempts: 3, + backoffMs: [60000, 120000, 300000], + retryOn: ["rate_limit", "overloaded", "network", "server_error"], + }, + webhookToken: "replace-with-dedicated-webhook-token", + sessionRetention: "24h", + runLog: { maxBytes: "2mb", keepLines: 2000 }, + }, +} +``` + +Disable cron: `cron.enabled: false` or `OPENCLAW_SKIP_CRON=1`. + +**One-shot retry**: transient errors (rate limit, overload, network, server error) retry up to 3 times with exponential backoff. Permanent errors disable immediately. + +**Recurring retry**: exponential backoff (30s to 60m) between retries. Backoff resets after the next successful run. + +**Maintenance**: `cron.sessionRetention` (default `24h`) prunes isolated run-session entries. `cron.runLog.maxBytes` / `cron.runLog.keepLines` auto-prune run-log files. + +## Troubleshooting + +### Command ladder + +```bash +openclaw status +openclaw gateway status +openclaw cron status +openclaw cron list +openclaw cron runs --id --limit 20 +openclaw system heartbeat last +openclaw logs --follow +openclaw doctor +``` + +### Cron not firing + +- Check `cron.enabled` and `OPENCLAW_SKIP_CRON` env var. +- Confirm the Gateway is running continuously. +- For `cron` schedules, verify timezone (`--tz`) vs the host timezone. +- `reason: not-due` in run output means manual run was checked with `openclaw cron run --due` and the job was not due yet. + +### Cron fired but no delivery + +- Delivery mode is `none` means no external message is expected. +- Delivery target missing/invalid (`channel`/`to`) means outbound was skipped. +- Channel auth errors (`unauthorized`, `Forbidden`) mean delivery was blocked by credentials. +- If the isolated run returns only the silent token (`NO_REPLY` / `no_reply`), + OpenClaw suppresses direct outbound delivery and also suppresses the fallback + queued summary path, so nothing is posted back to chat. +- For cron-owned isolated jobs, do not expect the agent to use the message tool + as a fallback. The runner owns final delivery; `--no-deliver` keeps it + internal instead of allowing a direct send. + +### Timezone gotchas + +- Cron without `--tz` uses the gateway host timezone. +- `at` schedules without timezone are treated as UTC. +- Heartbeat `activeHours` uses configured timezone resolution. + +## Related + +- [Automation & Tasks](/automation) — all automation mechanisms at a glance +- [Background Tasks](/automation/tasks) — task ledger for cron executions +- [Heartbeat](/gateway/heartbeat) — periodic main-session turns +- [Timezone](/concepts/timezone) — timezone configuration diff --git a/docs/automation/cron-vs-heartbeat.md b/docs/automation/cron-vs-heartbeat.md new file mode 100644 index 000000000..2e411d3fe --- /dev/null +++ b/docs/automation/cron-vs-heartbeat.md @@ -0,0 +1,8 @@ +--- +summary: "Redirect to /automation" +title: "Cron vs Heartbeat" +--- + +# Cron vs Heartbeat + +This page moved to [Automation & Tasks](/automation). See [Automation & Tasks](/automation) for the decision guide comparing cron and heartbeat. diff --git a/docs/automation/gmail-pubsub.md b/docs/automation/gmail-pubsub.md new file mode 100644 index 000000000..57dff64ea --- /dev/null +++ b/docs/automation/gmail-pubsub.md @@ -0,0 +1,8 @@ +--- +summary: "Redirect to /automation/cron-jobs" +title: "Gmail PubSub" +--- + +# Gmail PubSub + +This page moved to [Scheduled Tasks](/automation/cron-jobs#gmail-pubsub-integration). See [Scheduled Tasks](/automation/cron-jobs#gmail-pubsub-integration) for Gmail PubSub documentation. diff --git a/docs/automation/hooks.md b/docs/automation/hooks.md new file mode 100644 index 000000000..71a239eb5 --- /dev/null +++ b/docs/automation/hooks.md @@ -0,0 +1,303 @@ +--- +summary: "Hooks: event-driven automation for commands and lifecycle events" +read_when: + - You want event-driven automation for /new, /reset, /stop, and agent lifecycle events + - You want to build, install, or debug hooks +title: "Hooks" +--- + +# Hooks + +Hooks are small scripts that run when something happens inside the Gateway. They are automatically discovered from directories and can be inspected with `openclaw hooks`. + +There are two kinds of hooks in OpenClaw: + +- **Internal hooks** (this page): run inside the Gateway when agent events fire, like `/new`, `/reset`, `/stop`, or lifecycle events. +- **Webhooks**: external HTTP endpoints that let other systems trigger work in OpenClaw. See [Webhooks](/automation/cron-jobs#webhooks). + +Hooks can also be bundled inside plugins. `openclaw hooks list` shows both standalone hooks and plugin-managed hooks. + +## Quick start + +```bash +# List available hooks +openclaw hooks list + +# Enable a hook +openclaw hooks enable session-memory + +# Check hook status +openclaw hooks check + +# Get detailed information +openclaw hooks info session-memory +``` + +## Event types + +| Event | When it fires | +| ------------------------ | ------------------------------------------------ | +| `command:new` | `/new` command issued | +| `command:reset` | `/reset` command issued | +| `command:stop` | `/stop` command issued | +| `command` | Any command event (general listener) | +| `session:compact:before` | Before compaction summarizes history | +| `session:compact:after` | After compaction completes | +| `session:patch` | When session properties are modified | +| `agent:bootstrap` | Before workspace bootstrap files are injected | +| `gateway:startup` | After channels start and hooks are loaded | +| `message:received` | Inbound message from any channel | +| `message:transcribed` | After audio transcription completes | +| `message:preprocessed` | After all media and link understanding completes | +| `message:sent` | Outbound message delivered | + +## Writing hooks + +### Hook structure + +Each hook is a directory containing two files: + +``` +my-hook/ +├── HOOK.md # Metadata + documentation +└── handler.ts # Handler implementation +``` + +### HOOK.md format + +```markdown +--- +name: my-hook +description: "Short description of what this hook does" +metadata: + { "openclaw": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } } +--- + +# My Hook + +Detailed documentation goes here. +``` + +**Metadata fields** (`metadata.openclaw`): + +| Field | Description | +| ---------- | ---------------------------------------------------- | +| `emoji` | Display emoji for CLI | +| `events` | Array of events to listen for | +| `export` | Named export to use (defaults to `"default"`) | +| `os` | Required platforms (e.g., `["darwin", "linux"]`) | +| `requires` | Required `bins`, `anyBins`, `env`, or `config` paths | +| `always` | Bypass eligibility checks (boolean) | +| `install` | Installation methods | + +### Handler implementation + +```typescript +const handler = async (event) => { + if (event.type !== "command" || event.action !== "new") { + return; + } + + console.log(`[my-hook] New command triggered`); + // Your logic here + + // Optionally send message to user + event.messages.push("Hook executed!"); +}; + +export default handler; +``` + +Each event includes: `type`, `action`, `sessionKey`, `timestamp`, `messages` (push to send to user), and `context` (event-specific data). + +### Event context highlights + +**Command events** (`command:new`, `command:reset`): `context.sessionEntry`, `context.previousSessionEntry`, `context.commandSource`, `context.workspaceDir`, `context.cfg`. + +**Message events** (`message:received`): `context.from`, `context.content`, `context.channelId`, `context.metadata` (provider-specific data including `senderId`, `senderName`, `guildId`). + +**Message events** (`message:sent`): `context.to`, `context.content`, `context.success`, `context.channelId`. + +**Message events** (`message:transcribed`): `context.transcript`, `context.from`, `context.channelId`, `context.mediaPath`. + +**Message events** (`message:preprocessed`): `context.bodyForAgent` (final enriched body), `context.from`, `context.channelId`. + +**Bootstrap events** (`agent:bootstrap`): `context.bootstrapFiles` (mutable array), `context.agentId`. + +**Session patch events** (`session:patch`): `context.sessionEntry`, `context.patch` (only changed fields), `context.cfg`. Only privileged clients can trigger patch events. + +**Compaction events**: `session:compact:before` includes `messageCount`, `tokenCount`. `session:compact:after` adds `compactedCount`, `summaryLength`, `tokensBefore`, `tokensAfter`. + +## Hook discovery + +Hooks are discovered from these directories, in order of increasing override precedence: + +1. **Bundled hooks**: shipped with OpenClaw +2. **Plugin hooks**: hooks bundled inside installed plugins +3. **Managed hooks**: `~/.openclaw/hooks/` (user-installed, shared across workspaces). Extra directories from `hooks.internal.load.extraDirs` share this precedence. +4. **Workspace hooks**: `/hooks/` (per-agent, disabled by default until explicitly enabled) + +Workspace hooks can add new hook names but cannot override bundled, managed, or plugin-provided hooks with the same name. + +### Hook packs + +Hook packs are npm packages that export hooks via `openclaw.hooks` in `package.json`. Install with: + +```bash +openclaw plugins install +``` + +Npm specs are registry-only (package name + optional exact version or dist-tag). Git/URL/file specs and semver ranges are rejected. + +## Bundled hooks + +| Hook | Events | What it does | +| --------------------- | ------------------------------ | ----------------------------------------------------- | +| session-memory | `command:new`, `command:reset` | Saves session context to `/memory/` | +| bootstrap-extra-files | `agent:bootstrap` | Injects additional bootstrap files from glob patterns | +| command-logger | `command` | Logs all commands to `~/.openclaw/logs/commands.log` | +| boot-md | `gateway:startup` | Runs `BOOT.md` when the gateway starts | + +Enable any bundled hook: + +```bash +openclaw hooks enable +``` + +### session-memory details + +Extracts the last 15 user/assistant messages, generates a descriptive filename slug via LLM, and saves to `/memory/YYYY-MM-DD-slug.md`. Requires `workspace.dir` to be configured. + +### bootstrap-extra-files config + +```json +{ + "hooks": { + "internal": { + "entries": { + "bootstrap-extra-files": { + "enabled": true, + "paths": ["packages/*/AGENTS.md", "packages/*/TOOLS.md"] + } + } + } + } +} +``` + +Paths resolve relative to workspace. Only recognized bootstrap basenames are loaded (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`, `MEMORY.md`). + +## Plugin hooks + +Plugins can register hooks through the Plugin SDK for deeper integration: intercepting tool calls, modifying prompts, controlling message flow, and more. The Plugin SDK exposes 28 hooks covering model resolution, agent lifecycle, message flow, tool execution, subagent coordination, and gateway lifecycle. + +For the complete plugin hook reference including `before_tool_call`, `before_agent_reply`, `before_install`, and all other plugin hooks, see [Plugin Architecture](/plugins/architecture#provider-runtime-hooks). + +## Configuration + +```json +{ + "hooks": { + "internal": { + "enabled": true, + "entries": { + "session-memory": { "enabled": true }, + "command-logger": { "enabled": false } + } + } + } +} +``` + +Per-hook environment variables: + +```json +{ + "hooks": { + "internal": { + "entries": { + "my-hook": { + "enabled": true, + "env": { "MY_CUSTOM_VAR": "value" } + } + } + } + } +} +``` + +Extra hook directories: + +```json +{ + "hooks": { + "internal": { + "load": { + "extraDirs": ["/path/to/more/hooks"] + } + } + } +} +``` + + +The legacy `hooks.internal.handlers` array config format is still supported for backwards compatibility, but new hooks should use the discovery-based system. + + +## CLI reference + +```bash +# List all hooks (add --eligible, --verbose, or --json) +openclaw hooks list + +# Show detailed info about a hook +openclaw hooks info + +# Show eligibility summary +openclaw hooks check + +# Enable/disable +openclaw hooks enable +openclaw hooks disable +``` + +## Best practices + +- **Keep handlers fast.** Hooks run during command processing. Fire-and-forget heavy work with `void processInBackground(event)`. +- **Handle errors gracefully.** Wrap risky operations in try/catch; do not throw so other handlers can run. +- **Filter events early.** Return immediately if the event type/action is not relevant. +- **Use specific event keys.** Prefer `"events": ["command:new"]` over `"events": ["command"]` to reduce overhead. + +## Troubleshooting + +### Hook not discovered + +```bash +# Verify directory structure +ls -la ~/.openclaw/hooks/my-hook/ +# Should show: HOOK.md, handler.ts + +# List all discovered hooks +openclaw hooks list +``` + +### Hook not eligible + +```bash +openclaw hooks info my-hook +``` + +Check for missing binaries (PATH), environment variables, config values, or OS compatibility. + +### Hook not executing + +1. Verify the hook is enabled: `openclaw hooks list` +2. Restart your gateway process so hooks reload. +3. Check gateway logs: `./scripts/clawlog.sh | grep hook` + +## Related + +- [CLI Reference: hooks](/cli/hooks) +- [Webhooks](/automation/cron-jobs#webhooks) +- [Plugin Architecture](/plugins/architecture#provider-runtime-hooks) — full plugin hook reference +- [Configuration](/gateway/configuration-reference#hooks) diff --git a/docs/automation/index.md b/docs/automation/index.md new file mode 100644 index 000000000..9ae29c738 --- /dev/null +++ b/docs/automation/index.md @@ -0,0 +1,115 @@ +--- +summary: "Overview of automation mechanisms: tasks, cron, hooks, standing orders, and Task Flow" +read_when: + - Deciding how to automate work with OpenClaw + - Choosing between heartbeat, cron, hooks, and standing orders + - Looking for the right automation entry point +title: "Automation & Tasks" +--- + +# Automation & Tasks + +OpenClaw runs work in the background through tasks, scheduled jobs, event hooks, and standing instructions. This page helps you choose the right mechanism and understand how they fit together. + +## Quick decision guide + +```mermaid +flowchart TD + START([What do you need?]) --> Q1{Schedule work?} + START --> Q2{Track detached work?} + START --> Q3{Orchestrate multi-step flows?} + START --> Q4{React to lifecycle events?} + START --> Q5{Give the agent persistent instructions?} + + Q1 -->|Yes| Q1a{Exact timing or flexible?} + Q1a -->|Exact| CRON["Scheduled Tasks (Cron)"] + Q1a -->|Flexible| HEARTBEAT[Heartbeat] + + Q2 -->|Yes| TASKS[Background Tasks] + Q3 -->|Yes| FLOW[Task Flow] + Q4 -->|Yes| HOOKS[Hooks] + Q5 -->|Yes| SO[Standing Orders] +``` + +| Use case | Recommended | Why | +| --------------------------------------- | ---------------------- | ------------------------------------------------ | +| Send daily report at 9 AM sharp | Scheduled Tasks (Cron) | Exact timing, isolated execution | +| Remind me in 20 minutes | Scheduled Tasks (Cron) | One-shot with precise timing (`--at`) | +| Run weekly deep analysis | Scheduled Tasks (Cron) | Standalone task, can use different model | +| Check inbox every 30 min | Heartbeat | Batches with other checks, context-aware | +| Monitor calendar for upcoming events | Heartbeat | Natural fit for periodic awareness | +| Inspect status of a subagent or ACP run | Background Tasks | Tasks ledger tracks all detached work | +| Audit what ran and when | Background Tasks | `openclaw tasks list` and `openclaw tasks audit` | +| Multi-step research then summarize | Task Flow | Durable orchestration with revision tracking | +| Run a script on session reset | Hooks | Event-driven, fires on lifecycle events | +| Execute code on every tool call | Hooks | Hooks can filter by event type | +| Always check compliance before replying | Standing Orders | Injected into every session automatically | + +### Scheduled Tasks (Cron) vs Heartbeat + +| Dimension | Scheduled Tasks (Cron) | Heartbeat | +| --------------- | ----------------------------------- | ------------------------------------- | +| Timing | Exact (cron expressions, one-shot) | Approximate (default every 30 min) | +| Session context | Fresh (isolated) or shared | Full main-session context | +| Task records | Always created | Never created | +| Delivery | Channel, webhook, or silent | Inline in main session | +| Best for | Reports, reminders, background jobs | Inbox checks, calendar, notifications | + +Use Scheduled Tasks (Cron) when you need precise timing or isolated execution. Use Heartbeat when the work benefits from full session context and approximate timing is fine. + +## Core concepts + +### Scheduled tasks (cron) + +Cron is the Gateway's built-in scheduler for precise timing. It persists jobs, wakes the agent at the right time, and can deliver output to a chat channel or webhook endpoint. Supports one-shot reminders, recurring expressions, and inbound webhook triggers. + +See [Scheduled Tasks](/automation/cron-jobs). + +### Tasks + +The background task ledger tracks all detached work: ACP runs, subagent spawns, isolated cron executions, and CLI operations. Tasks are records, not schedulers. Use `openclaw tasks list` and `openclaw tasks audit` to inspect them. + +See [Background Tasks](/automation/tasks). + +### Task Flow + +Task Flow is the flow orchestration substrate above background tasks. It manages durable multi-step flows with managed and mirrored sync modes, revision tracking, and `openclaw tasks flow list|show|cancel` for inspection. + +See [Task Flow](/automation/taskflow). + +### Standing orders + +Standing orders grant the agent permanent operating authority for defined programs. They live in workspace files (typically `AGENTS.md`) and are injected into every session. Combine with cron for time-based enforcement. + +See [Standing Orders](/automation/standing-orders). + +### Hooks + +Hooks are event-driven scripts triggered by agent lifecycle events (`/new`, `/reset`, `/stop`), session compaction, gateway startup, message flow, and tool calls. Hooks are automatically discovered from directories and can be managed with `openclaw hooks`. + +See [Hooks](/automation/hooks). + +### Heartbeat + +Heartbeat is a periodic main-session turn (default every 30 minutes). It batches multiple checks (inbox, calendar, notifications) in one agent turn with full session context. Heartbeat turns do not create task records. Use `HEARTBEAT.md` for a small checklist, or a `tasks:` block when you want due-only periodic checks inside heartbeat itself. Empty heartbeat files skip as `empty-heartbeat-file`; due-only task mode skips as `no-tasks-due`. + +See [Heartbeat](/gateway/heartbeat). + +## How they work together + +- **Cron** handles precise schedules (daily reports, weekly reviews) and one-shot reminders. All cron executions create task records. +- **Heartbeat** handles routine monitoring (inbox, calendar, notifications) in one batched turn every 30 minutes. +- **Hooks** react to specific events (tool calls, session resets, compaction) with custom scripts. +- **Standing orders** give the agent persistent context and authority boundaries. +- **Task Flow** coordinates multi-step flows above individual tasks. +- **Tasks** automatically track all detached work so you can inspect and audit it. + +## Related + +- [Scheduled Tasks](/automation/cron-jobs) — precise scheduling and one-shot reminders +- [Background Tasks](/automation/tasks) — task ledger for all detached work +- [Task Flow](/automation/taskflow) — durable multi-step flow orchestration +- [Hooks](/automation/hooks) — event-driven lifecycle scripts +- [Standing Orders](/automation/standing-orders) — persistent agent instructions +- [Heartbeat](/gateway/heartbeat) — periodic main-session turns +- [Configuration Reference](/gateway/configuration-reference) — all config keys diff --git a/docs/automation/poll.md b/docs/automation/poll.md new file mode 100644 index 000000000..d990cffbf --- /dev/null +++ b/docs/automation/poll.md @@ -0,0 +1,8 @@ +--- +summary: "Redirect to /tools/message" +title: "Polls" +--- + +# Polls + +This page moved to [Message tool](/cli/message). See [Message tool](/cli/message) for poll documentation. diff --git a/docs/automation/standing-orders.md b/docs/automation/standing-orders.md new file mode 100644 index 000000000..3190f31ff --- /dev/null +++ b/docs/automation/standing-orders.md @@ -0,0 +1,254 @@ +--- +summary: "Define permanent operating authority for autonomous agent programs" +read_when: + - Setting up autonomous agent workflows that run without per-task prompting + - Defining what the agent can do independently vs. what needs human approval + - Structuring multi-program agents with clear boundaries and escalation rules +title: "Standing Orders" +--- + +# Standing Orders + +Standing orders grant your agent **permanent operating authority** for defined programs. Instead of giving individual task instructions each time, you define programs with clear scope, triggers, and escalation rules — and the agent executes autonomously within those boundaries. + +This is the difference between telling your assistant "send the weekly report" every Friday vs. granting standing authority: "You own the weekly report. Compile it every Friday, send it, and only escalate if something looks wrong." + +## Why Standing Orders? + +**Without standing orders:** + +- You must prompt the agent for every task +- The agent sits idle between requests +- Routine work gets forgotten or delayed +- You become the bottleneck + +**With standing orders:** + +- The agent executes autonomously within defined boundaries +- Routine work happens on schedule without prompting +- You only get involved for exceptions and approvals +- The agent fills idle time productively + +## How They Work + +Standing orders are defined in your [agent workspace](/concepts/agent-workspace) files. The recommended approach is to include them directly in `AGENTS.md` (which is auto-injected every session) so the agent always has them in context. For larger configurations, you can also place them in a dedicated file like `standing-orders.md` and reference it from `AGENTS.md`. + +Each program specifies: + +1. **Scope** — what the agent is authorized to do +2. **Triggers** — when to execute (schedule, event, or condition) +3. **Approval gates** — what requires human sign-off before acting +4. **Escalation rules** — when to stop and ask for help + +The agent loads these instructions every session via the workspace bootstrap files (see [Agent Workspace](/concepts/agent-workspace) for the full list of auto-injected files) and executes against them, combined with [cron jobs](/automation/cron-jobs) for time-based enforcement. + + +Put standing orders in `AGENTS.md` to guarantee they're loaded every session. The workspace bootstrap automatically injects `AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md`, and `MEMORY.md` — but not arbitrary files in subdirectories. + + +## Anatomy of a Standing Order + +```markdown +## Program: Weekly Status Report + +**Authority:** Compile data, generate report, deliver to stakeholders +**Trigger:** Every Friday at 4 PM (enforced via cron job) +**Approval gate:** None for standard reports. Flag anomalies for human review. +**Escalation:** If data source is unavailable or metrics look unusual (>2σ from norm) + +### Execution Steps + +1. Pull metrics from configured sources +2. Compare to prior week and targets +3. Generate report in Reports/weekly/YYYY-MM-DD.md +4. Deliver summary via configured channel +5. Log completion to Agent/Logs/ + +### What NOT to Do + +- Do not send reports to external parties +- Do not modify source data +- Do not skip delivery if metrics look bad — report accurately +``` + +## Standing Orders + Cron Jobs + +Standing orders define **what** the agent is authorized to do. [Cron jobs](/automation/cron-jobs) define **when** it happens. They work together: + +``` +Standing Order: "You own the daily inbox triage" + ↓ +Cron Job (8 AM daily): "Execute inbox triage per standing orders" + ↓ +Agent: Reads standing orders → executes steps → reports results +``` + +The cron job prompt should reference the standing order rather than duplicating it: + +```bash +openclaw cron add \ + --name daily-inbox-triage \ + --cron "0 8 * * 1-5" \ + --tz America/New_York \ + --timeout-seconds 300 \ + --announce \ + --channel bluebubbles \ + --to "+1XXXXXXXXXX" \ + --message "Execute daily inbox triage per standing orders. Check mail for new alerts. Parse, categorize, and persist each item. Report summary to owner. Escalate unknowns." +``` + +## Examples + +### Example 1: Content & Social Media (Weekly Cycle) + +```markdown +## Program: Content & Social Media + +**Authority:** Draft content, schedule posts, compile engagement reports +**Approval gate:** All posts require owner review for first 30 days, then standing approval +**Trigger:** Weekly cycle (Monday review → mid-week drafts → Friday brief) + +### Weekly Cycle + +- **Monday:** Review platform metrics and audience engagement +- **Tuesday–Thursday:** Draft social posts, create blog content +- **Friday:** Compile weekly marketing brief → deliver to owner + +### Content Rules + +- Voice must match the brand (see SOUL.md or brand voice guide) +- Never identify as AI in public-facing content +- Include metrics when available +- Focus on value to audience, not self-promotion +``` + +### Example 2: Finance Operations (Event-Triggered) + +```markdown +## Program: Financial Processing + +**Authority:** Process transaction data, generate reports, send summaries +**Approval gate:** None for analysis. Recommendations require owner approval. +**Trigger:** New data file detected OR scheduled monthly cycle + +### When New Data Arrives + +1. Detect new file in designated input directory +2. Parse and categorize all transactions +3. Compare against budget targets +4. Flag: unusual items, threshold breaches, new recurring charges +5. Generate report in designated output directory +6. Deliver summary to owner via configured channel + +### Escalation Rules + +- Single item > $500: immediate alert +- Category > budget by 20%: flag in report +- Unrecognizable transaction: ask owner for categorization +- Failed processing after 2 retries: report failure, do not guess +``` + +### Example 3: Monitoring & Alerts (Continuous) + +```markdown +## Program: System Monitoring + +**Authority:** Check system health, restart services, send alerts +**Approval gate:** Restart services automatically. Escalate if restart fails twice. +**Trigger:** Every heartbeat cycle + +### Checks + +- Service health endpoints responding +- Disk space above threshold +- Pending tasks not stale (>24 hours) +- Delivery channels operational + +### Response Matrix + +| Condition | Action | Escalate? | +| ---------------- | ------------------------ | ------------------------ | +| Service down | Restart automatically | Only if restart fails 2x | +| Disk space < 10% | Alert owner | Yes | +| Stale task > 24h | Remind owner | No | +| Channel offline | Log and retry next cycle | If offline > 2 hours | +``` + +## The Execute-Verify-Report Pattern + +Standing orders work best when combined with strict execution discipline. Every task in a standing order should follow this loop: + +1. **Execute** — Do the actual work (don't just acknowledge the instruction) +2. **Verify** — Confirm the result is correct (file exists, message delivered, data parsed) +3. **Report** — Tell the owner what was done and what was verified + +```markdown +### Execution Rules + +- Every task follows Execute-Verify-Report. No exceptions. +- "I'll do that" is not execution. Do it, then report. +- "Done" without verification is not acceptable. Prove it. +- If execution fails: retry once with adjusted approach. +- If still fails: report failure with diagnosis. Never silently fail. +- Never retry indefinitely — 3 attempts max, then escalate. +``` + +This pattern prevents the most common agent failure mode: acknowledging a task without completing it. + +## Multi-Program Architecture + +For agents managing multiple concerns, organize standing orders as separate programs with clear boundaries: + +```markdown +# Standing Orders + +## Program 1: [Domain A] (Weekly) + +... + +## Program 2: [Domain B] (Monthly + On-Demand) + +... + +## Program 3: [Domain C] (As-Needed) + +... + +## Escalation Rules (All Programs) + +- [Common escalation criteria] +- [Approval gates that apply across programs] +``` + +Each program should have: + +- Its own **trigger cadence** (weekly, monthly, event-driven, continuous) +- Its own **approval gates** (some programs need more oversight than others) +- Clear **boundaries** (the agent should know where one program ends and another begins) + +## Best Practices + +### Do + +- Start with narrow authority and expand as trust builds +- Define explicit approval gates for high-risk actions +- Include "What NOT to do" sections — boundaries matter as much as permissions +- Combine with cron jobs for reliable time-based execution +- Review agent logs weekly to verify standing orders are being followed +- Update standing orders as your needs evolve — they're living documents + +### Avoid + +- Grant broad authority on day one ("do whatever you think is best") +- Skip escalation rules — every program needs a "when to stop and ask" clause +- Assume the agent will remember verbal instructions — put everything in the file +- Mix concerns in a single program — separate programs for separate domains +- Forget to enforce with cron jobs — standing orders without triggers become suggestions + +## Related + +- [Automation & Tasks](/automation) — all automation mechanisms at a glance +- [Cron Jobs](/automation/cron-jobs) — schedule enforcement for standing orders +- [Hooks](/automation/hooks) — event-driven scripts for agent lifecycle events +- [Webhooks](/automation/cron-jobs#webhooks) — inbound HTTP event triggers +- [Agent Workspace](/concepts/agent-workspace) — where standing orders live, including the full list of auto-injected bootstrap files (AGENTS.md, SOUL.md, etc.) diff --git a/docs/automation/taskflow.md b/docs/automation/taskflow.md new file mode 100644 index 000000000..8597666cf --- /dev/null +++ b/docs/automation/taskflow.md @@ -0,0 +1,82 @@ +--- +summary: "Task Flow flow orchestration layer above background tasks" +read_when: + - You want to understand how Task Flow relates to background tasks + - You encounter Task Flow or openclaw tasks flow in release notes or docs + - You want to inspect or manage durable flow state +title: "Task Flow" +--- + +# Task Flow + +Task Flow is the flow orchestration substrate that sits above [background tasks](/automation/tasks). It manages durable multi-step flows with their own state, revision tracking, and sync semantics while individual tasks remain the unit of detached work. + +## When to use Task Flow + +Use Task Flow when work spans multiple sequential or branching steps and you need durable progress tracking across gateway restarts. For single background operations, a plain [task](/automation/tasks) is sufficient. + +| Scenario | Use | +| ------------------------------------- | -------------------- | +| Single background job | Plain task | +| Multi-step pipeline (A then B then C) | Task Flow (managed) | +| Observe externally created tasks | Task Flow (mirrored) | +| One-shot reminder | Cron job | + +## Sync modes + +### Managed mode + +Task Flow owns the lifecycle end-to-end. It creates tasks as flow steps, drives them to completion, and advances the flow state automatically. + +Example: a weekly report flow that (1) gathers data, (2) generates the report, and (3) delivers it. Task Flow creates each step as a background task, waits for completion, then moves to the next step. + +``` +Flow: weekly-report + Step 1: gather-data → task created → succeeded + Step 2: generate-report → task created → succeeded + Step 3: deliver → task created → running +``` + +### Mirrored mode + +Task Flow observes externally created tasks and keeps flow state in sync without taking ownership of task creation. This is useful when tasks originate from cron jobs, CLI commands, or other sources and you want a unified view of their progress as a flow. + +Example: three independent cron jobs that together form a "morning ops" routine. A mirrored flow tracks their collective progress without controlling when or how they run. + +## Durable state and revision tracking + +Each flow persists its own state and tracks revisions so progress survives gateway restarts. Revision tracking enables conflict detection when multiple sources attempt to advance the same flow concurrently. + +## Cancel behavior + +`openclaw tasks flow cancel` sets a sticky cancel intent on the flow. Active tasks within the flow are cancelled, and no new steps are started. The cancel intent persists across restarts, so a cancelled flow stays cancelled even if the gateway restarts before all child tasks have terminated. + +## CLI commands + +```bash +# List active and recent flows +openclaw tasks flow list + +# Show details for a specific flow +openclaw tasks flow show + +# Cancel a running flow and its active tasks +openclaw tasks flow cancel +``` + +| Command | Description | +| --------------------------------- | --------------------------------------------- | +| `openclaw tasks flow list` | Shows tracked flows with status and sync mode | +| `openclaw tasks flow show ` | Inspect one flow by flow id or lookup key | +| `openclaw tasks flow cancel ` | Cancel a running flow and its active tasks | + +## How flows relate to tasks + +Flows coordinate tasks, not replace them. A single flow may drive multiple background tasks over its lifetime. Use `openclaw tasks` to inspect individual task records and `openclaw tasks flow` to inspect the orchestrating flow. + +## Related + +- [Background Tasks](/automation/tasks) — the detached work ledger that flows coordinate +- [CLI: tasks](/cli/index#tasks) — CLI command reference for `openclaw tasks flow` +- [Automation Overview](/automation) — all automation mechanisms at a glance +- [Cron Jobs](/automation/cron-jobs) — scheduled jobs that may feed into flows diff --git a/docs/automation/tasks.md b/docs/automation/tasks.md new file mode 100644 index 000000000..d23b82245 --- /dev/null +++ b/docs/automation/tasks.md @@ -0,0 +1,323 @@ +--- +summary: "Background task tracking for ACP runs, subagents, isolated cron jobs, and CLI operations" +read_when: + - Inspecting background work in progress or recently completed + - Debugging delivery failures for detached agent runs + - Understanding how background runs relate to sessions, cron, and heartbeat +title: "Background Tasks" +--- + +# Background Tasks + +> **Looking for scheduling?** See [Automation & Tasks](/automation) for choosing the right mechanism. This page covers **tracking** background work, not scheduling it. + +Background tasks track work that runs **outside your main conversation session**: +ACP runs, subagent spawns, isolated cron job executions, and CLI-initiated operations. + +Tasks do **not** replace sessions, cron jobs, or heartbeats — they are the **activity ledger** that records what detached work happened, when, and whether it succeeded. + + +Not every agent run creates a task. Heartbeat turns and normal interactive chat do not. All cron executions, ACP spawns, subagent spawns, and CLI agent commands do. + + +## TL;DR + +- Tasks are **records**, not schedulers — cron and heartbeat decide _when_ work runs, tasks track _what happened_. +- ACP, subagents, all cron jobs, and CLI operations create tasks. Heartbeat turns do not. +- Each task moves through `queued → running → terminal` (succeeded, failed, timed_out, cancelled, or lost). +- Cron tasks stay live while the cron runtime still owns the job; chat-backed CLI tasks stay live only while their owning run context is still active. +- Completion is push-driven: detached work can notify directly or wake the + requester session/heartbeat when it finishes, so status polling loops are + usually the wrong shape. +- Isolated cron runs and subagent completions best-effort clean up tracked browser tabs/processes for their child session before final cleanup bookkeeping. +- Isolated cron delivery suppresses stale interim parent replies while + descendant subagent work is still draining, and it prefers final descendant + output when that arrives before delivery. +- Completion notifications are delivered directly to a channel or queued for the next heartbeat. +- `openclaw tasks list` shows all tasks; `openclaw tasks audit` surfaces issues. +- Terminal records are kept for 7 days, then automatically pruned. + +## Quick start + +```bash +# List all tasks (newest first) +openclaw tasks list + +# Filter by runtime or status +openclaw tasks list --runtime acp +openclaw tasks list --status running + +# Show details for a specific task (by ID, run ID, or session key) +openclaw tasks show + +# Cancel a running task (kills the child session) +openclaw tasks cancel + +# Change notification policy for a task +openclaw tasks notify state_changes + +# Run a health audit +openclaw tasks audit + +# Preview or apply maintenance +openclaw tasks maintenance +openclaw tasks maintenance --apply + +# Inspect TaskFlow state +openclaw tasks flow list +openclaw tasks flow show +openclaw tasks flow cancel +``` + +## What creates a task + +| Source | Runtime type | When a task record is created | Default notify policy | +| ---------------------- | ------------ | ------------------------------------------------------ | --------------------- | +| ACP background runs | `acp` | Spawning a child ACP session | `done_only` | +| Subagent orchestration | `subagent` | Spawning a subagent via `sessions_spawn` | `done_only` | +| Cron jobs (all types) | `cron` | Every cron execution (main-session and isolated) | `silent` | +| CLI operations | `cli` | `openclaw agent` commands that run through the gateway | `silent` | + +Main-session cron tasks use `silent` notify policy by default — they create records for tracking but do not generate notifications. Isolated cron tasks also default to `silent` but are more visible because they run in their own session. + +**What does not create tasks:** + +- Heartbeat turns — main-session; see [Heartbeat](/gateway/heartbeat) +- Normal interactive chat turns +- Direct `/command` responses + +## Task lifecycle + +```mermaid +stateDiagram-v2 + [*] --> queued + queued --> running : agent starts + running --> succeeded : completes ok + running --> failed : error + running --> timed_out : timeout exceeded + running --> cancelled : operator cancels + queued --> lost : session gone > 5 min + running --> lost : session gone > 5 min +``` + +| Status | What it means | +| ----------- | -------------------------------------------------------------------------- | +| `queued` | Created, waiting for the agent to start | +| `running` | Agent turn is actively executing | +| `succeeded` | Completed successfully | +| `failed` | Completed with an error | +| `timed_out` | Exceeded the configured timeout | +| `cancelled` | Stopped by the operator via `openclaw tasks cancel` | +| `lost` | The runtime lost authoritative backing state after a 5-minute grace period | + +Transitions happen automatically — when the associated agent run ends, the task status updates to match. + +`lost` is runtime-aware: + +- ACP tasks: backing ACP child session metadata disappeared. +- Subagent tasks: backing child session disappeared from the target agent store. +- Cron tasks: the cron runtime no longer tracks the job as active. +- CLI tasks: isolated child-session tasks use the child session; chat-backed CLI tasks use the live run context instead, so lingering channel/group/direct session rows do not keep them alive. + +## Delivery and notifications + +When a task reaches a terminal state, OpenClaw notifies you. There are two delivery paths: + +**Direct delivery** — if the task has a channel target (the `requesterOrigin`), the completion message goes straight to that channel (Telegram, Discord, Slack, etc.). For subagent completions, OpenClaw also preserves bound thread/topic routing when available and can fill a missing `to` / account from the requester session's stored route (`lastChannel` / `lastTo` / `lastAccountId`) before giving up on direct delivery. + +**Session-queued delivery** — if direct delivery fails or no origin is set, the update is queued as a system event in the requester's session and surfaces on the next heartbeat. + + +Task completion triggers an immediate heartbeat wake so you see the result quickly — you do not have to wait for the next scheduled heartbeat tick. + + +That means the usual workflow is push-based: start detached work once, then let +the runtime wake or notify you on completion. Poll task state only when you +need debugging, intervention, or an explicit audit. + +### Notification policies + +Control how much you hear about each task: + +| Policy | What is delivered | +| --------------------- | ----------------------------------------------------------------------- | +| `done_only` (default) | Only terminal state (succeeded, failed, etc.) — **this is the default** | +| `state_changes` | Every state transition and progress update | +| `silent` | Nothing at all | + +Change the policy while a task is running: + +```bash +openclaw tasks notify state_changes +``` + +## CLI reference + +### `tasks list` + +```bash +openclaw tasks list [--runtime ] [--status ] [--json] +``` + +Output columns: Task ID, Kind, Status, Delivery, Run ID, Child Session, Summary. + +### `tasks show` + +```bash +openclaw tasks show +``` + +The lookup token accepts a task ID, run ID, or session key. Shows the full record including timing, delivery state, error, and terminal summary. + +### `tasks cancel` + +```bash +openclaw tasks cancel +``` + +For ACP and subagent tasks, this kills the child session. Status transitions to `cancelled` and a delivery notification is sent. + +### `tasks notify` + +```bash +openclaw tasks notify +``` + +### `tasks audit` + +```bash +openclaw tasks audit [--json] +``` + +Surfaces operational issues. Findings also appear in `openclaw status` when issues are detected. + +| Finding | Severity | Trigger | +| ------------------------- | -------- | ----------------------------------------------------- | +| `stale_queued` | warn | Queued for more than 10 minutes | +| `stale_running` | error | Running for more than 30 minutes | +| `lost` | error | Runtime-backed task ownership disappeared | +| `delivery_failed` | warn | Delivery failed and notify policy is not `silent` | +| `missing_cleanup` | warn | Terminal task with no cleanup timestamp | +| `inconsistent_timestamps` | warn | Timeline violation (for example ended before started) | + +### `tasks maintenance` + +```bash +openclaw tasks maintenance [--json] +openclaw tasks maintenance --apply [--json] +``` + +Use this to preview or apply reconciliation, cleanup stamping, and pruning for +tasks and Task Flow state. + +Reconciliation is runtime-aware: + +- ACP/subagent tasks check their backing child session. +- Cron tasks check whether the cron runtime still owns the job. +- Chat-backed CLI tasks check the owning live run context, not just the chat session row. + +Completion cleanup is also runtime-aware: + +- Subagent completion best-effort closes tracked browser tabs/processes for the child session before announce cleanup continues. +- Isolated cron completion best-effort closes tracked browser tabs/processes for the cron session before the run fully tears down. +- Isolated cron delivery waits out descendant subagent follow-up when needed and + suppresses stale parent acknowledgement text instead of announcing it. +- Subagent completion delivery prefers the latest visible assistant text; if that is empty it falls back to sanitized latest tool/toolResult text, and timeout-only tool-call runs can collapse to a short partial-progress summary. +- Cleanup failures do not mask the real task outcome. + +### `tasks flow list|show|cancel` + +```bash +openclaw tasks flow list [--status ] [--json] +openclaw tasks flow show [--json] +openclaw tasks flow cancel +``` + +Use these when the orchestrating Task Flow is the thing you care about rather +than one individual background task record. + +## Chat task board (`/tasks`) + +Use `/tasks` in any chat session to see background tasks linked to that session. The board shows +active and recently completed tasks with runtime, status, timing, and progress or error detail. + +When the current session has no visible linked tasks, `/tasks` falls back to agent-local task counts +so you still get an overview without leaking other-session details. + +For the full operator ledger, use the CLI: `openclaw tasks list`. + +## Status integration (task pressure) + +`openclaw status` includes an at-a-glance task summary: + +``` +Tasks: 3 queued · 2 running · 1 issues +``` + +The summary reports: + +- **active** — count of `queued` + `running` +- **failures** — count of `failed` + `timed_out` + `lost` +- **byRuntime** — breakdown by `acp`, `subagent`, `cron`, `cli` + +Both `/status` and the `session_status` tool use a cleanup-aware task snapshot: active tasks are +preferred, stale completed rows are hidden, and recent failures only surface when no active work +remains. This keeps the status card focused on what matters right now. + +## Storage and maintenance + +### Where tasks live + +Task records persist in SQLite at: + +``` +$OPENCLAW_STATE_DIR/tasks/runs.sqlite +``` + +The registry loads into memory at gateway start and syncs writes to SQLite for durability across restarts. + +### Automatic maintenance + +A sweeper runs every **60 seconds** and handles three things: + +1. **Reconciliation** — checks whether active tasks still have authoritative runtime backing. ACP/subagent tasks use child-session state, cron tasks use active-job ownership, and chat-backed CLI tasks use the owning run context. If that backing state is gone for more than 5 minutes, the task is marked `lost`. +2. **Cleanup stamping** — sets a `cleanupAfter` timestamp on terminal tasks (endedAt + 7 days). +3. **Pruning** — deletes records past their `cleanupAfter` date. + +**Retention**: terminal task records are kept for **7 days**, then automatically pruned. No configuration needed. + +## How tasks relate to other systems + +### Tasks and Task Flow + +[Task Flow](/automation/taskflow) is the flow orchestration layer above background tasks. A single flow may coordinate multiple tasks over its lifetime using managed or mirrored sync modes. Use `openclaw tasks` to inspect individual task records and `openclaw tasks flow` to inspect the orchestrating flow. + +See [Task Flow](/automation/taskflow) for details. + +### Tasks and cron + +A cron job **definition** lives in `~/.openclaw/cron/jobs.json`. **Every** cron execution creates a task record — both main-session and isolated. Main-session cron tasks default to `silent` notify policy so they track without generating notifications. + +See [Cron Jobs](/automation/cron-jobs). + +### Tasks and heartbeat + +Heartbeat runs are main-session turns — they do not create task records. When a task completes, it can trigger a heartbeat wake so you see the result promptly. + +See [Heartbeat](/gateway/heartbeat). + +### Tasks and sessions + +A task may reference a `childSessionKey` (where work runs) and a `requesterSessionKey` (who started it). Sessions are conversation context; tasks are activity tracking on top of that. + +### Tasks and agent runs + +A task's `runId` links to the agent run doing the work. Agent lifecycle events (start, end, error) automatically update the task status — you do not need to manage the lifecycle manually. + +## Related + +- [Automation & Tasks](/automation) — all automation mechanisms at a glance +- [Task Flow](/automation/taskflow) — flow orchestration above tasks +- [Scheduled Tasks](/automation/cron-jobs) — scheduling background work +- [Heartbeat](/gateway/heartbeat) — periodic main-session turns +- [CLI: Tasks](/cli/index#tasks) — CLI command reference diff --git a/docs/automation/troubleshooting.md b/docs/automation/troubleshooting.md new file mode 100644 index 000000000..f9e935d23 --- /dev/null +++ b/docs/automation/troubleshooting.md @@ -0,0 +1,8 @@ +--- +summary: "Redirect to /automation/cron-jobs" +title: "Automation Troubleshooting" +--- + +# Automation Troubleshooting + +This page moved to [Scheduled Tasks](/automation/cron-jobs#troubleshooting). See [Scheduled Tasks](/automation/cron-jobs#troubleshooting) for troubleshooting documentation. diff --git a/docs/automation/webhook.md b/docs/automation/webhook.md new file mode 100644 index 000000000..7f9e16fe3 --- /dev/null +++ b/docs/automation/webhook.md @@ -0,0 +1,8 @@ +--- +summary: "Redirect to /automation/cron-jobs" +title: "Webhooks" +--- + +# Webhooks + +This page moved to [Scheduled Tasks](/automation/cron-jobs#webhooks). See [Scheduled Tasks](/automation/cron-jobs#webhooks) for webhook documentation. diff --git a/docs/brave-search.md b/docs/brave-search.md new file mode 100644 index 000000000..11fb19b28 --- /dev/null +++ b/docs/brave-search.md @@ -0,0 +1,103 @@ +--- +summary: "Brave Search API setup for web_search" +read_when: + - You want to use Brave Search for web_search + - You need a BRAVE_API_KEY or plan details +title: "Brave Search (legacy path)" +--- + +# Brave Search API + +OpenClaw supports Brave Search API as a `web_search` provider. + +## Get an API key + +1. Create a Brave Search API account at [https://brave.com/search/api/](https://brave.com/search/api/) +2. In the dashboard, choose the **Search** plan and generate an API key. +3. Store the key in config or set `BRAVE_API_KEY` in the Gateway environment. + +## Config example + +```json5 +{ + plugins: { + entries: { + brave: { + config: { + webSearch: { + apiKey: "BRAVE_API_KEY_HERE", + mode: "web", // or "llm-context" + }, + }, + }, + }, + }, + tools: { + web: { + search: { + provider: "brave", + maxResults: 5, + timeoutSeconds: 30, + }, + }, + }, +} +``` + +Provider-specific Brave search settings now live under `plugins.entries.brave.config.webSearch.*`. +Legacy `tools.web.search.apiKey` still loads through the compatibility shim, but it is no longer the canonical config path. + +`webSearch.mode` controls the Brave transport: + +- `web` (default): normal Brave web search with titles, URLs, and snippets +- `llm-context`: Brave LLM Context API with pre-extracted text chunks and sources for grounding + +## Tool parameters + +| Parameter | Description | +| ------------- | ------------------------------------------------------------------- | +| `query` | Search query (required) | +| `count` | Number of results to return (1-10, default: 5) | +| `country` | 2-letter ISO country code (e.g., "US", "DE") | +| `language` | ISO 639-1 language code for search results (e.g., "en", "de", "fr") | +| `search_lang` | Brave search-language code (e.g., `en`, `en-gb`, `zh-hans`) | +| `ui_lang` | ISO language code for UI elements | +| `freshness` | Time filter: `day` (24h), `week`, `month`, or `year` | +| `date_after` | Only results published after this date (YYYY-MM-DD) | +| `date_before` | Only results published before this date (YYYY-MM-DD) | + +**Examples:** + +```javascript +// Country and language-specific search +await web_search({ + query: "renewable energy", + country: "DE", + language: "de", +}); + +// Recent results (past week) +await web_search({ + query: "AI news", + freshness: "week", +}); + +// Date range search +await web_search({ + query: "AI developments", + date_after: "2024-01-01", + date_before: "2024-06-30", +}); +``` + +## Notes + +- OpenClaw uses the Brave **Search** plan. If you have a legacy subscription (e.g. the original Free plan with 2,000 queries/month), it remains valid but does not include newer features like LLM Context or higher rate limits. +- Each Brave plan includes **\$5/month in free credit** (renewing). The Search plan costs \$5 per 1,000 requests, so the credit covers 1,000 queries/month. Set your usage limit in the Brave dashboard to avoid unexpected charges. See the [Brave API portal](https://brave.com/search/api/) for current plans. +- The Search plan includes the LLM Context endpoint and AI inference rights. Storing results to train or tune models requires a plan with explicit storage rights. See the Brave [Terms of Service](https://api-dashboard.search.brave.com/terms-of-service). +- `llm-context` mode returns grounded source entries instead of the normal web-search snippet shape. +- `llm-context` mode does not support `ui_lang`, `freshness`, `date_after`, or `date_before`. +- `ui_lang` must include a region subtag like `en-US`. +- Results are cached for 15 minutes by default (configurable via `cacheTtlMinutes`). + +See [Web tools](/tools/web) for the full web_search configuration. diff --git a/docs/channels/bluebubbles.md b/docs/channels/bluebubbles.md new file mode 100644 index 000000000..f471622ba --- /dev/null +++ b/docs/channels/bluebubbles.md @@ -0,0 +1,435 @@ +--- +summary: "iMessage via BlueBubbles macOS server (REST send/receive, typing, reactions, pairing, advanced actions)." +read_when: + - Setting up BlueBubbles channel + - Troubleshooting webhook pairing + - Configuring iMessage on macOS +title: "BlueBubbles" +--- + +# BlueBubbles (macOS REST) + +Status: bundled plugin that talks to the BlueBubbles macOS server over HTTP. **Recommended for iMessage integration** due to its richer API and easier setup compared to the legacy imsg channel. + +## Bundled plugin + +Current OpenClaw releases bundle BlueBubbles, so normal packaged builds do not +need a separate `openclaw plugins install` step. + +## Overview + +- Runs on macOS via the BlueBubbles helper app ([bluebubbles.app](https://bluebubbles.app)). +- Recommended/tested: macOS Sequoia (15). macOS Tahoe (26) works; edit is currently broken on Tahoe, and group icon updates may report success but not sync. +- OpenClaw talks to it through its REST API (`GET /api/v1/ping`, `POST /message/text`, `POST /chat/:id/*`). +- Incoming messages arrive via webhooks; outgoing replies, typing indicators, read receipts, and tapbacks are REST calls. +- Attachments and stickers are ingested as inbound media (and surfaced to the agent when possible). +- Pairing/allowlist works the same way as other channels (`/channels/pairing` etc) with `channels.bluebubbles.allowFrom` + pairing codes. +- Reactions are surfaced as system events just like Slack/Telegram so agents can "mention" them before replying. +- Advanced features: edit, unsend, reply threading, message effects, group management. + +## Quick start + +1. Install the BlueBubbles server on your Mac (follow the instructions at [bluebubbles.app/install](https://bluebubbles.app/install)). +2. In the BlueBubbles config, enable the web API and set a password. +3. Run `openclaw onboard` and select BlueBubbles, or configure manually: + + ```json5 + { + channels: { + bluebubbles: { + enabled: true, + serverUrl: "http://192.168.1.100:1234", + password: "example-password", + webhookPath: "/bluebubbles-webhook", + }, + }, + } + ``` + +4. Point BlueBubbles webhooks to your gateway (example: `https://your-gateway-host:3000/bluebubbles-webhook?password=`). +5. Start the gateway; it will register the webhook handler and start pairing. + +Security note: + +- Always set a webhook password. +- Webhook authentication is always required. OpenClaw rejects BlueBubbles webhook requests unless they include a password/guid that matches `channels.bluebubbles.password` (for example `?password=` or `x-password`), regardless of loopback/proxy topology. +- Password authentication is checked before reading/parsing full webhook bodies. + +## Keeping Messages.app alive (VM / headless setups) + +Some macOS VM / always-on setups can end up with Messages.app going “idle” (incoming events stop until the app is opened/foregrounded). A simple workaround is to **poke Messages every 5 minutes** using an AppleScript + LaunchAgent. + +### 1) Save the AppleScript + +Save this as: + +- `~/Scripts/poke-messages.scpt` + +Example script (non-interactive; does not steal focus): + +```applescript +try + tell application "Messages" + if not running then + launch + end if + + -- Touch the scripting interface to keep the process responsive. + set _chatCount to (count of chats) + end tell +on error + -- Ignore transient failures (first-run prompts, locked session, etc). +end try +``` + +### 2) Install a LaunchAgent + +Save this as: + +- `~/Library/LaunchAgents/com.user.poke-messages.plist` + +```xml + + + + + Label + com.user.poke-messages + + ProgramArguments + + /bin/bash + -lc + /usr/bin/osascript "$HOME/Scripts/poke-messages.scpt" + + + RunAtLoad + + + StartInterval + 300 + + StandardOutPath + /tmp/poke-messages.log + StandardErrorPath + /tmp/poke-messages.err + + +``` + +Notes: + +- This runs **every 300 seconds** and **on login**. +- The first run may trigger macOS **Automation** prompts (`osascript` → Messages). Approve them in the same user session that runs the LaunchAgent. + +Load it: + +```bash +launchctl unload ~/Library/LaunchAgents/com.user.poke-messages.plist 2>/dev/null || true +launchctl load ~/Library/LaunchAgents/com.user.poke-messages.plist +``` + +## Onboarding + +BlueBubbles is available in interactive onboarding: + +``` +openclaw onboard +``` + +The wizard prompts for: + +- **Server URL** (required): BlueBubbles server address (e.g., `http://192.168.1.100:1234`) +- **Password** (required): API password from BlueBubbles Server settings +- **Webhook path** (optional): Defaults to `/bluebubbles-webhook` +- **DM policy**: pairing, allowlist, open, or disabled +- **Allow list**: Phone numbers, emails, or chat targets + +You can also add BlueBubbles via CLI: + +``` +openclaw channels add bluebubbles --http-url http://192.168.1.100:1234 --password +``` + +## Access control (DMs + groups) + +DMs: + +- Default: `channels.bluebubbles.dmPolicy = "pairing"`. +- Unknown senders receive a pairing code; messages are ignored until approved (codes expire after 1 hour). +- Approve via: + - `openclaw pairing list bluebubbles` + - `openclaw pairing approve bluebubbles ` +- Pairing is the default token exchange. Details: [Pairing](/channels/pairing) + +Groups: + +- `channels.bluebubbles.groupPolicy = open | allowlist | disabled` (default: `allowlist`). +- `channels.bluebubbles.groupAllowFrom` controls who can trigger in groups when `allowlist` is set. + +### Contact name enrichment (macOS, optional) + +BlueBubbles group webhooks often only include raw participant addresses. If you want `GroupMembers` context to show local contact names instead, you can opt in to local Contacts enrichment on macOS: + +- `channels.bluebubbles.enrichGroupParticipantsFromContacts = true` enables the lookup. Default: `false`. +- Lookups run only after group access, command authorization, and mention gating have allowed the message through. +- Only unnamed phone participants are enriched. +- Raw phone numbers remain as the fallback when no local match is found. + +```json5 +{ + channels: { + bluebubbles: { + enrichGroupParticipantsFromContacts: true, + }, + }, +} +``` + +### Mention gating (groups) + +BlueBubbles supports mention gating for group chats, matching iMessage/WhatsApp behavior: + +- Uses `agents.list[].groupChat.mentionPatterns` (or `messages.groupChat.mentionPatterns`) to detect mentions. +- When `requireMention` is enabled for a group, the agent only responds when mentioned. +- Control commands from authorized senders bypass mention gating. + +Per-group configuration: + +```json5 +{ + channels: { + bluebubbles: { + groupPolicy: "allowlist", + groupAllowFrom: ["+15555550123"], + groups: { + "*": { requireMention: true }, // default for all groups + "iMessage;-;chat123": { requireMention: false }, // override for specific group + }, + }, + }, +} +``` + +### Command gating + +- Control commands (e.g., `/config`, `/model`) require authorization. +- Uses `allowFrom` and `groupAllowFrom` to determine command authorization. +- Authorized senders can run control commands even without mentioning in groups. + +## ACP conversation bindings + +BlueBubbles chats can be turned into durable ACP workspaces without changing the transport layer. + +Fast operator flow: + +- Run `/acp spawn codex --bind here` inside the DM or allowed group chat. +- Future messages in that same BlueBubbles conversation route to the spawned ACP session. +- `/new` and `/reset` reset the same bound ACP session in place. +- `/acp close` closes the ACP session and removes the binding. + +Configured persistent bindings are also supported through top-level `bindings[]` entries with `type: "acp"` and `match.channel: "bluebubbles"`. + +`match.peer.id` can use any supported BlueBubbles target form: + +- normalized DM handle such as `+15555550123` or `user@example.com` +- `chat_id:` +- `chat_guid:` +- `chat_identifier:` + +For stable group bindings, prefer `chat_id:*` or `chat_identifier:*`. + +Example: + +```json5 +{ + agents: { + list: [ + { + id: "codex", + runtime: { + type: "acp", + acp: { agent: "codex", backend: "acpx", mode: "persistent" }, + }, + }, + ], + }, + bindings: [ + { + type: "acp", + agentId: "codex", + match: { + channel: "bluebubbles", + accountId: "default", + peer: { kind: "dm", id: "+15555550123" }, + }, + acp: { label: "codex-imessage" }, + }, + ], +} +``` + +See [ACP Agents](/tools/acp-agents) for shared ACP binding behavior. + +## Typing + read receipts + +- **Typing indicators**: Sent automatically before and during response generation. +- **Read receipts**: Controlled by `channels.bluebubbles.sendReadReceipts` (default: `true`). +- **Typing indicators**: OpenClaw sends typing start events; BlueBubbles clears typing automatically on send or timeout (manual stop via DELETE is unreliable). + +```json5 +{ + channels: { + bluebubbles: { + sendReadReceipts: false, // disable read receipts + }, + }, +} +``` + +## Advanced actions + +BlueBubbles supports advanced message actions when enabled in config: + +```json5 +{ + channels: { + bluebubbles: { + actions: { + reactions: true, // tapbacks (default: true) + edit: true, // edit sent messages (macOS 13+, broken on macOS 26 Tahoe) + unsend: true, // unsend messages (macOS 13+) + reply: true, // reply threading by message GUID + sendWithEffect: true, // message effects (slam, loud, etc.) + renameGroup: true, // rename group chats + setGroupIcon: true, // set group chat icon/photo (flaky on macOS 26 Tahoe) + addParticipant: true, // add participants to groups + removeParticipant: true, // remove participants from groups + leaveGroup: true, // leave group chats + sendAttachment: true, // send attachments/media + }, + }, + }, +} +``` + +Available actions: + +- **react**: Add/remove tapback reactions (`messageId`, `emoji`, `remove`) +- **edit**: Edit a sent message (`messageId`, `text`) +- **unsend**: Unsend a message (`messageId`) +- **reply**: Reply to a specific message (`messageId`, `text`, `to`) +- **sendWithEffect**: Send with iMessage effect (`text`, `to`, `effectId`) +- **renameGroup**: Rename a group chat (`chatGuid`, `displayName`) +- **setGroupIcon**: Set a group chat's icon/photo (`chatGuid`, `media`) — flaky on macOS 26 Tahoe (API may return success but the icon does not sync). +- **addParticipant**: Add someone to a group (`chatGuid`, `address`) +- **removeParticipant**: Remove someone from a group (`chatGuid`, `address`) +- **leaveGroup**: Leave a group chat (`chatGuid`) +- **upload-file**: Send media/files (`to`, `buffer`, `filename`, `asVoice`) + - Voice memos: set `asVoice: true` with **MP3** or **CAF** audio to send as an iMessage voice message. BlueBubbles converts MP3 → CAF when sending voice memos. +- Legacy alias: `sendAttachment` still works, but `upload-file` is the canonical action name. + +### Message IDs (short vs full) + +OpenClaw may surface _short_ message IDs (e.g., `1`, `2`) to save tokens. + +- `MessageSid` / `ReplyToId` can be short IDs. +- `MessageSidFull` / `ReplyToIdFull` contain the provider full IDs. +- Short IDs are in-memory; they can expire on restart or cache eviction. +- Actions accept short or full `messageId`, but short IDs will error if no longer available. + +Use full IDs for durable automations and storage: + +- Templates: `{{MessageSidFull}}`, `{{ReplyToIdFull}}` +- Context: `MessageSidFull` / `ReplyToIdFull` in inbound payloads + +See [Configuration](/gateway/configuration) for template variables. + +## Block streaming + +Control whether responses are sent as a single message or streamed in blocks: + +```json5 +{ + channels: { + bluebubbles: { + blockStreaming: true, // enable block streaming (off by default) + }, + }, +} +``` + +## Media + limits + +- Inbound attachments are downloaded and stored in the media cache. +- Media cap via `channels.bluebubbles.mediaMaxMb` for inbound and outbound media (default: 8 MB). +- Outbound text is chunked to `channels.bluebubbles.textChunkLimit` (default: 4000 chars). + +## Configuration reference + +Full configuration: [Configuration](/gateway/configuration) + +Provider options: + +- `channels.bluebubbles.enabled`: Enable/disable the channel. +- `channels.bluebubbles.serverUrl`: BlueBubbles REST API base URL. +- `channels.bluebubbles.password`: API password. +- `channels.bluebubbles.webhookPath`: Webhook endpoint path (default: `/bluebubbles-webhook`). +- `channels.bluebubbles.dmPolicy`: `pairing | allowlist | open | disabled` (default: `pairing`). +- `channels.bluebubbles.allowFrom`: DM allowlist (handles, emails, E.164 numbers, `chat_id:*`, `chat_guid:*`). +- `channels.bluebubbles.groupPolicy`: `open | allowlist | disabled` (default: `allowlist`). +- `channels.bluebubbles.groupAllowFrom`: Group sender allowlist. +- `channels.bluebubbles.enrichGroupParticipantsFromContacts`: On macOS, optionally enrich unnamed group participants from local Contacts after gating passes. Default: `false`. +- `channels.bluebubbles.groups`: Per-group config (`requireMention`, etc.). +- `channels.bluebubbles.sendReadReceipts`: Send read receipts (default: `true`). +- `channels.bluebubbles.blockStreaming`: Enable block streaming (default: `false`; required for streaming replies). +- `channels.bluebubbles.textChunkLimit`: Outbound chunk size in chars (default: 4000). +- `channels.bluebubbles.chunkMode`: `length` (default) splits only when exceeding `textChunkLimit`; `newline` splits on blank lines (paragraph boundaries) before length chunking. +- `channels.bluebubbles.mediaMaxMb`: Inbound/outbound media cap in MB (default: 8). +- `channels.bluebubbles.mediaLocalRoots`: Explicit allowlist of absolute local directories permitted for outbound local media paths. Local path sends are denied by default unless this is configured. Per-account override: `channels.bluebubbles.accounts..mediaLocalRoots`. +- `channels.bluebubbles.historyLimit`: Max group messages for context (0 disables). +- `channels.bluebubbles.dmHistoryLimit`: DM history limit. +- `channels.bluebubbles.actions`: Enable/disable specific actions. +- `channels.bluebubbles.accounts`: Multi-account configuration. + +Related global options: + +- `agents.list[].groupChat.mentionPatterns` (or `messages.groupChat.mentionPatterns`). +- `messages.responsePrefix`. + +## Addressing / delivery targets + +Prefer `chat_guid` for stable routing: + +- `chat_guid:iMessage;-;+15555550123` (preferred for groups) +- `chat_id:123` +- `chat_identifier:...` +- Direct handles: `+15555550123`, `user@example.com` + - If a direct handle does not have an existing DM chat, OpenClaw will create one via `POST /api/v1/chat/new`. This requires the BlueBubbles Private API to be enabled. + +## Security + +- Webhook requests are authenticated by comparing `guid`/`password` query params or headers against `channels.bluebubbles.password`. +- Keep the API password and webhook endpoint secret (treat them like credentials). +- There is no localhost bypass for BlueBubbles webhook auth. If you proxy webhook traffic, keep the BlueBubbles password on the request end-to-end. `gateway.trustedProxies` does not replace `channels.bluebubbles.password` here. See [Gateway security](/gateway/security#reverse-proxy-configuration). +- Enable HTTPS + firewall rules on the BlueBubbles server if exposing it outside your LAN. + +## Troubleshooting + +- If typing/read events stop working, check the BlueBubbles webhook logs and verify the gateway path matches `channels.bluebubbles.webhookPath`. +- Pairing codes expire after one hour; use `openclaw pairing list bluebubbles` and `openclaw pairing approve bluebubbles `. +- Reactions require the BlueBubbles private API (`POST /api/v1/message/react`); ensure the server version exposes it. +- Edit/unsend require macOS 13+ and a compatible BlueBubbles server version. On macOS 26 (Tahoe), edit is currently broken due to private API changes. +- Group icon updates can be flaky on macOS 26 (Tahoe): the API may return success but the new icon does not sync. +- OpenClaw auto-hides known-broken actions based on the BlueBubbles server's macOS version. If edit still appears on macOS 26 (Tahoe), disable it manually with `channels.bluebubbles.actions.edit=false`. +- For status/health info: `openclaw status --all` or `openclaw status --deep`. + +For general channel workflow reference, see [Channels](/channels) and the [Plugins](/tools/plugin) guide. + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/broadcast-groups.md b/docs/channels/broadcast-groups.md new file mode 100644 index 000000000..2f73c7081 --- /dev/null +++ b/docs/channels/broadcast-groups.md @@ -0,0 +1,442 @@ +--- +summary: "Broadcast a WhatsApp message to multiple agents" +read_when: + - Configuring broadcast groups + - Debugging multi-agent replies in WhatsApp +status: experimental +title: "Broadcast Groups" +--- + +# Broadcast Groups + +**Status:** Experimental +**Version:** Added in 2026.1.9 + +## Overview + +Broadcast Groups enable multiple agents to process and respond to the same message simultaneously. This allows you to create specialized agent teams that work together in a single WhatsApp group or DM — all using one phone number. + +Current scope: **WhatsApp only** (web channel). + +Broadcast groups are evaluated after channel allowlists and group activation rules. In WhatsApp groups, this means broadcasts happen when OpenClaw would normally reply (for example: on mention, depending on your group settings). + +## Use Cases + +### 1. Specialized Agent Teams + +Deploy multiple agents with atomic, focused responsibilities: + +``` +Group: "Development Team" +Agents: + - CodeReviewer (reviews code snippets) + - DocumentationBot (generates docs) + - SecurityAuditor (checks for vulnerabilities) + - TestGenerator (suggests test cases) +``` + +Each agent processes the same message and provides its specialized perspective. + +### 2. Multi-Language Support + +``` +Group: "International Support" +Agents: + - Agent_EN (responds in English) + - Agent_DE (responds in German) + - Agent_ES (responds in Spanish) +``` + +### 3. Quality Assurance Workflows + +``` +Group: "Customer Support" +Agents: + - SupportAgent (provides answer) + - QAAgent (reviews quality, only responds if issues found) +``` + +### 4. Task Automation + +``` +Group: "Project Management" +Agents: + - TaskTracker (updates task database) + - TimeLogger (logs time spent) + - ReportGenerator (creates summaries) +``` + +## Configuration + +### Basic Setup + +Add a top-level `broadcast` section (next to `bindings`). Keys are WhatsApp peer ids: + +- group chats: group JID (e.g. `120363403215116621@g.us`) +- DMs: E.164 phone number (e.g. `+15551234567`) + +```json +{ + "broadcast": { + "120363403215116621@g.us": ["alfred", "baerbel", "assistant3"] + } +} +``` + +**Result:** When OpenClaw would reply in this chat, it will run all three agents. + +### Processing Strategy + +Control how agents process messages: + +#### Parallel (Default) + +All agents process simultaneously: + +```json +{ + "broadcast": { + "strategy": "parallel", + "120363403215116621@g.us": ["alfred", "baerbel"] + } +} +``` + +#### Sequential + +Agents process in order (one waits for previous to finish): + +```json +{ + "broadcast": { + "strategy": "sequential", + "120363403215116621@g.us": ["alfred", "baerbel"] + } +} +``` + +### Complete Example + +```json +{ + "agents": { + "list": [ + { + "id": "code-reviewer", + "name": "Code Reviewer", + "workspace": "/path/to/code-reviewer", + "sandbox": { "mode": "all" } + }, + { + "id": "security-auditor", + "name": "Security Auditor", + "workspace": "/path/to/security-auditor", + "sandbox": { "mode": "all" } + }, + { + "id": "docs-generator", + "name": "Documentation Generator", + "workspace": "/path/to/docs-generator", + "sandbox": { "mode": "all" } + } + ] + }, + "broadcast": { + "strategy": "parallel", + "120363403215116621@g.us": ["code-reviewer", "security-auditor", "docs-generator"], + "120363424282127706@g.us": ["support-en", "support-de"], + "+15555550123": ["assistant", "logger"] + } +} +``` + +## How It Works + +### Message Flow + +1. **Incoming message** arrives in a WhatsApp group +2. **Broadcast check**: System checks if peer ID is in `broadcast` +3. **If in broadcast list**: + - All listed agents process the message + - Each agent has its own session key and isolated context + - Agents process in parallel (default) or sequentially +4. **If not in broadcast list**: + - Normal routing applies (first matching binding) + +Note: broadcast groups do not bypass channel allowlists or group activation rules (mentions/commands/etc). They only change _which agents run_ when a message is eligible for processing. + +### Session Isolation + +Each agent in a broadcast group maintains completely separate: + +- **Session keys** (`agent:alfred:whatsapp:group:120363...` vs `agent:baerbel:whatsapp:group:120363...`) +- **Conversation history** (agent doesn't see other agents' messages) +- **Workspace** (separate sandboxes if configured) +- **Tool access** (different allow/deny lists) +- **Memory/context** (separate IDENTITY.md, SOUL.md, etc.) +- **Group context buffer** (recent group messages used for context) is shared per peer, so all broadcast agents see the same context when triggered + +This allows each agent to have: + +- Different personalities +- Different tool access (e.g., read-only vs. read-write) +- Different models (e.g., opus vs. sonnet) +- Different skills installed + +### Example: Isolated Sessions + +In group `120363403215116621@g.us` with agents `["alfred", "baerbel"]`: + +**Alfred's context:** + +``` +Session: agent:alfred:whatsapp:group:120363403215116621@g.us +History: [user message, alfred's previous responses] +Workspace: /Users/user/openclaw-alfred/ +Tools: read, write, exec +``` + +**Bärbel's context:** + +``` +Session: agent:baerbel:whatsapp:group:120363403215116621@g.us +History: [user message, baerbel's previous responses] +Workspace: /Users/user/openclaw-baerbel/ +Tools: read only +``` + +## Best Practices + +### 1. Keep Agents Focused + +Design each agent with a single, clear responsibility: + +```json +{ + "broadcast": { + "DEV_GROUP": ["formatter", "linter", "tester"] + } +} +``` + +✅ **Good:** Each agent has one job +❌ **Bad:** One generic "dev-helper" agent + +### 2. Use Descriptive Names + +Make it clear what each agent does: + +```json +{ + "agents": { + "security-scanner": { "name": "Security Scanner" }, + "code-formatter": { "name": "Code Formatter" }, + "test-generator": { "name": "Test Generator" } + } +} +``` + +### 3. Configure Different Tool Access + +Give agents only the tools they need: + +```json +{ + "agents": { + "reviewer": { + "tools": { "allow": ["read", "exec"] } // Read-only + }, + "fixer": { + "tools": { "allow": ["read", "write", "edit", "exec"] } // Read-write + } + } +} +``` + +### 4. Monitor Performance + +With many agents, consider: + +- Using `"strategy": "parallel"` (default) for speed +- Limiting broadcast groups to 5-10 agents +- Using faster models for simpler agents + +### 5. Handle Failures Gracefully + +Agents fail independently. One agent's error doesn't block others: + +``` +Message → [Agent A ✓, Agent B ✗ error, Agent C ✓] +Result: Agent A and C respond, Agent B logs error +``` + +## Compatibility + +### Providers + +Broadcast groups currently work with: + +- ✅ WhatsApp (implemented) +- 🚧 Telegram (planned) +- 🚧 Discord (planned) +- 🚧 Slack (planned) + +### Routing + +Broadcast groups work alongside existing routing: + +```json +{ + "bindings": [ + { + "match": { "channel": "whatsapp", "peer": { "kind": "group", "id": "GROUP_A" } }, + "agentId": "alfred" + } + ], + "broadcast": { + "GROUP_B": ["agent1", "agent2"] + } +} +``` + +- `GROUP_A`: Only alfred responds (normal routing) +- `GROUP_B`: agent1 AND agent2 respond (broadcast) + +**Precedence:** `broadcast` takes priority over `bindings`. + +## Troubleshooting + +### Agents Not Responding + +**Check:** + +1. Agent IDs exist in `agents.list` +2. Peer ID format is correct (e.g., `120363403215116621@g.us`) +3. Agents are not in deny lists + +**Debug:** + +```bash +tail -f ~/.openclaw/logs/gateway.log | grep broadcast +``` + +### Only One Agent Responding + +**Cause:** Peer ID might be in `bindings` but not `broadcast`. + +**Fix:** Add to broadcast config or remove from bindings. + +### Performance Issues + +**If slow with many agents:** + +- Reduce number of agents per group +- Use lighter models (sonnet instead of opus) +- Check sandbox startup time + +## Examples + +### Example 1: Code Review Team + +```json +{ + "broadcast": { + "strategy": "parallel", + "120363403215116621@g.us": [ + "code-formatter", + "security-scanner", + "test-coverage", + "docs-checker" + ] + }, + "agents": { + "list": [ + { + "id": "code-formatter", + "workspace": "~/agents/formatter", + "tools": { "allow": ["read", "write"] } + }, + { + "id": "security-scanner", + "workspace": "~/agents/security", + "tools": { "allow": ["read", "exec"] } + }, + { + "id": "test-coverage", + "workspace": "~/agents/testing", + "tools": { "allow": ["read", "exec"] } + }, + { "id": "docs-checker", "workspace": "~/agents/docs", "tools": { "allow": ["read"] } } + ] + } +} +``` + +**User sends:** Code snippet +**Responses:** + +- code-formatter: "Fixed indentation and added type hints" +- security-scanner: "⚠️ SQL injection vulnerability in line 12" +- test-coverage: "Coverage is 45%, missing tests for error cases" +- docs-checker: "Missing docstring for function `process_data`" + +### Example 2: Multi-Language Support + +```json +{ + "broadcast": { + "strategy": "sequential", + "+15555550123": ["detect-language", "translator-en", "translator-de"] + }, + "agents": { + "list": [ + { "id": "detect-language", "workspace": "~/agents/lang-detect" }, + { "id": "translator-en", "workspace": "~/agents/translate-en" }, + { "id": "translator-de", "workspace": "~/agents/translate-de" } + ] + } +} +``` + +## API Reference + +### Config Schema + +```typescript +interface OpenClawConfig { + broadcast?: { + strategy?: "parallel" | "sequential"; + [peerId: string]: string[]; + }; +} +``` + +### Fields + +- `strategy` (optional): How to process agents + - `"parallel"` (default): All agents process simultaneously + - `"sequential"`: Agents process in array order +- `[peerId]`: WhatsApp group JID, E.164 number, or other peer ID + - Value: Array of agent IDs that should process messages + +## Limitations + +1. **Max agents:** No hard limit, but 10+ agents may be slow +2. **Shared context:** Agents don't see each other's responses (by design) +3. **Message ordering:** Parallel responses may arrive in any order +4. **Rate limits:** All agents count toward WhatsApp rate limits + +## Future Enhancements + +Planned features: + +- [ ] Shared context mode (agents see each other's responses) +- [ ] Agent coordination (agents can signal each other) +- [ ] Dynamic agent selection (choose agents based on message content) +- [ ] Agent priorities (some agents respond before others) + +## See Also + +- [Multi-Agent Configuration](/tools/multi-agent-sandbox-tools) +- [Routing Configuration](/channels/channel-routing) +- [Session Management](/concepts/session) diff --git a/docs/channels/channel-routing.md b/docs/channels/channel-routing.md new file mode 100644 index 000000000..05dfe5c54 --- /dev/null +++ b/docs/channels/channel-routing.md @@ -0,0 +1,139 @@ +--- +summary: "Routing rules per channel (WhatsApp, Telegram, Discord, Slack) and shared context" +read_when: + - Changing channel routing or inbox behavior +title: "Channel Routing" +--- + +# Channels & routing + +OpenClaw routes replies **back to the channel where a message came from**. The +model does not choose a channel; routing is deterministic and controlled by the +host configuration. + +## Key terms + +- **Channel**: `telegram`, `whatsapp`, `discord`, `irc`, `googlechat`, `slack`, `signal`, `imessage`, `line`, plus extension channels. `webchat` is the internal WebChat UI channel and is not a configurable outbound channel. +- **AccountId**: per‑channel account instance (when supported). +- Optional channel default account: `channels..defaultAccount` chooses + which account is used when an outbound path does not specify `accountId`. + - In multi-account setups, set an explicit default (`defaultAccount` or `accounts.default`) when two or more accounts are configured. Without it, fallback routing may pick the first normalized account ID. +- **AgentId**: an isolated workspace + session store (“brain”). +- **SessionKey**: the bucket key used to store context and control concurrency. + +## Session key shapes (examples) + +Direct messages collapse to the agent’s **main** session: + +- `agent::` (default: `agent:main:main`) + +Groups and channels remain isolated per channel: + +- Groups: `agent:::group:` +- Channels/rooms: `agent:::channel:` + +Threads: + +- Slack/Discord threads append `:thread:` to the base key. +- Telegram forum topics embed `:topic:` in the group key. + +Examples: + +- `agent:main:telegram:group:-1001234567890:topic:42` +- `agent:main:discord:channel:123456:thread:987654` + +## Main DM route pinning + +When `session.dmScope` is `main`, direct messages may share one main session. +To prevent the session’s `lastRoute` from being overwritten by non-owner DMs, +OpenClaw infers a pinned owner from `allowFrom` when all of these are true: + +- `allowFrom` has exactly one non-wildcard entry. +- The entry can be normalized to a concrete sender ID for that channel. +- The inbound DM sender does not match that pinned owner. + +In that mismatch case, OpenClaw still records inbound session metadata, but it +skips updating the main session `lastRoute`. + +## Routing rules (how an agent is chosen) + +Routing picks **one agent** for each inbound message: + +1. **Exact peer match** (`bindings` with `peer.kind` + `peer.id`). +2. **Parent peer match** (thread inheritance). +3. **Guild + roles match** (Discord) via `guildId` + `roles`. +4. **Guild match** (Discord) via `guildId`. +5. **Team match** (Slack) via `teamId`. +6. **Account match** (`accountId` on the channel). +7. **Channel match** (any account on that channel, `accountId: "*"`). +8. **Default agent** (`agents.list[].default`, else first list entry, fallback to `main`). + +When a binding includes multiple match fields (`peer`, `guildId`, `teamId`, `roles`), **all provided fields must match** for that binding to apply. + +The matched agent determines which workspace and session store are used. + +## Broadcast groups (run multiple agents) + +Broadcast groups let you run **multiple agents** for the same peer **when OpenClaw would normally reply** (for example: in WhatsApp groups, after mention/activation gating). + +Config: + +```json5 +{ + broadcast: { + strategy: "parallel", + "120363403215116621@g.us": ["alfred", "baerbel"], + "+15555550123": ["support", "logger"], + }, +} +``` + +See: [Broadcast Groups](/channels/broadcast-groups). + +## Config overview + +- `agents.list`: named agent definitions (workspace, model, etc.). +- `bindings`: map inbound channels/accounts/peers to agents. + +Example: + +```json5 +{ + agents: { + list: [{ id: "support", name: "Support", workspace: "~/.openclaw/workspace-support" }], + }, + bindings: [ + { match: { channel: "slack", teamId: "T123" }, agentId: "support" }, + { match: { channel: "telegram", peer: { kind: "group", id: "-100123" } }, agentId: "support" }, + ], +} +``` + +## Session storage + +Session stores live under the state directory (default `~/.openclaw`): + +- `~/.openclaw/agents//sessions/sessions.json` +- JSONL transcripts live alongside the store + +You can override the store path via `session.store` and `{agentId}` templating. + +Gateway and ACP session discovery also scans disk-backed agent stores under the +default `agents/` root and under templated `session.store` roots. Discovered +stores must stay inside that resolved agent root and use a regular +`sessions.json` file. Symlinks and out-of-root paths are ignored. + +## WebChat behavior + +WebChat attaches to the **selected agent** and defaults to the agent’s main +session. Because of this, WebChat lets you see cross‑channel context for that +agent in one place. + +## Reply context + +Inbound replies include: + +- `ReplyToId`, `ReplyToBody`, and `ReplyToSender` when available. +- Quoted context is appended to `Body` as a `[Replying to ...]` block. + +This is consistent across channels. diff --git a/docs/channels/discord.md b/docs/channels/discord.md new file mode 100644 index 000000000..195296383 --- /dev/null +++ b/docs/channels/discord.md @@ -0,0 +1,1254 @@ +--- +summary: "Discord bot support status, capabilities, and configuration" +read_when: + - Working on Discord channel features +title: "Discord" +--- + +# Discord (Bot API) + +Status: ready for DMs and guild channels via the official Discord gateway. + + + + Discord DMs default to pairing mode. + + + Native command behavior and command catalog. + + + Cross-channel diagnostics and repair flow. + + + +## Quick setup + +You will need to create a new application with a bot, add the bot to your server, and pair it to OpenClaw. We recommend adding your bot to your own private server. If you don't have one yet, [create one first](https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server) (choose **Create My Own > For me and my friends**). + + + + Go to the [Discord Developer Portal](https://discord.com/developers/applications) and click **New Application**. Name it something like "OpenClaw". + + Click **Bot** on the sidebar. Set the **Username** to whatever you call your OpenClaw agent. + + + + + Still on the **Bot** page, scroll down to **Privileged Gateway Intents** and enable: + + - **Message Content Intent** (required) + - **Server Members Intent** (recommended; required for role allowlists and name-to-ID matching) + - **Presence Intent** (optional; only needed for presence updates) + + + + + Scroll back up on the **Bot** page and click **Reset Token**. + + + Despite the name, this generates your first token — nothing is being "reset." + + + Copy the token and save it somewhere. This is your **Bot Token** and you will need it shortly. + + + + + Click **OAuth2** on the sidebar. You'll generate an invite URL with the right permissions to add the bot to your server. + + Scroll down to **OAuth2 URL Generator** and enable: + + - `bot` + - `applications.commands` + + A **Bot Permissions** section will appear below. Enable: + + - View Channels + - Send Messages + - Read Message History + - Embed Links + - Attach Files + - Add Reactions (optional) + + Copy the generated URL at the bottom, paste it into your browser, select your server, and click **Continue** to connect. You should now see your bot in the Discord server. + + + + + Back in the Discord app, you need to enable Developer Mode so you can copy internal IDs. + + 1. Click **User Settings** (gear icon next to your avatar) → **Advanced** → toggle on **Developer Mode** + 2. Right-click your **server icon** in the sidebar → **Copy Server ID** + 3. Right-click your **own avatar** → **Copy User ID** + + Save your **Server ID** and **User ID** alongside your Bot Token — you'll send all three to OpenClaw in the next step. + + + + + For pairing to work, Discord needs to allow your bot to DM you. Right-click your **server icon** → **Privacy Settings** → toggle on **Direct Messages**. + + This lets server members (including bots) send you DMs. Keep this enabled if you want to use Discord DMs with OpenClaw. If you only plan to use guild channels, you can disable DMs after pairing. + + + + + Your Discord bot token is a secret (like a password). Set it on the machine running OpenClaw before messaging your agent. + +```bash +export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN" +openclaw config set channels.discord.token --ref-provider default --ref-source env --ref-id DISCORD_BOT_TOKEN --dry-run +openclaw config set channels.discord.token --ref-provider default --ref-source env --ref-id DISCORD_BOT_TOKEN +openclaw config set channels.discord.enabled true --strict-json +openclaw gateway +``` + + If OpenClaw is already running as a background service, restart it via the OpenClaw Mac app or by stopping and restarting the `openclaw gateway run` process. + + + + + + + + Chat with your OpenClaw agent on any existing channel (e.g. Telegram) and tell it. If Discord is your first channel, use the CLI / config tab instead. + + > "I already set my Discord bot token in config. Please finish Discord setup with User ID `` and Server ID ``." + + + If you prefer file-based config, set: + +```json5 +{ + channels: { + discord: { + enabled: true, + token: { + source: "env", + provider: "default", + id: "DISCORD_BOT_TOKEN", + }, + }, + }, +} +``` + + Env fallback for the default account: + +```bash +DISCORD_BOT_TOKEN=... +``` + + Plaintext `token` values are supported. SecretRef values are also supported for `channels.discord.token` across env/file/exec providers. See [Secrets Management](/gateway/secrets). + + + + + + + + Wait until the gateway is running, then DM your bot in Discord. It will respond with a pairing code. + + + + Send the pairing code to your agent on your existing channel: + + > "Approve this Discord pairing code: ``" + + + +```bash +openclaw pairing list discord +openclaw pairing approve discord +``` + + + + + Pairing codes expire after 1 hour. + + You should now be able to chat with your agent in Discord via DM. + + + + + +Token resolution is account-aware. Config token values win over env fallback. `DISCORD_BOT_TOKEN` is only used for the default account. +For advanced outbound calls (message tool/channel actions), an explicit per-call `token` is used for that call. This applies to send and read/probe-style actions (for example read/search/fetch/thread/pins/permissions). Account policy/retry settings still come from the selected account in the active runtime snapshot. + + +## Recommended: Set up a guild workspace + +Once DMs are working, you can set up your Discord server as a full workspace where each channel gets its own agent session with its own context. This is recommended for private servers where it's just you and your bot. + + + + This enables your agent to respond in any channel on your server, not just DMs. + + + + > "Add my Discord Server ID `` to the guild allowlist" + + + +```json5 +{ + channels: { + discord: { + groupPolicy: "allowlist", + guilds: { + YOUR_SERVER_ID: { + requireMention: true, + users: ["YOUR_USER_ID"], + }, + }, + }, + }, +} +``` + + + + + + + + By default, your agent only responds in guild channels when @mentioned. For a private server, you probably want it to respond to every message. + + + + > "Allow my agent to respond on this server without having to be @mentioned" + + + Set `requireMention: false` in your guild config: + +```json5 +{ + channels: { + discord: { + guilds: { + YOUR_SERVER_ID: { + requireMention: false, + }, + }, + }, + }, +} +``` + + + + + + + + By default, long-term memory (MEMORY.md) only loads in DM sessions. Guild channels do not auto-load MEMORY.md. + + + + > "When I ask questions in Discord channels, use memory_search or memory_get if you need long-term context from MEMORY.md." + + + If you need shared context in every channel, put the stable instructions in `AGENTS.md` or `USER.md` (they are injected for every session). Keep long-term notes in `MEMORY.md` and access them on demand with memory tools. + + + + + + +Now create some channels on your Discord server and start chatting. Your agent can see the channel name, and each channel gets its own isolated session — so you can set up `#coding`, `#home`, `#research`, or whatever fits your workflow. + +## Runtime model + +- Gateway owns the Discord connection. +- Reply routing is deterministic: Discord inbound replies back to Discord. +- By default (`session.dmScope=main`), direct chats share the agent main session (`agent:main:main`). +- Guild channels are isolated session keys (`agent::discord:channel:`). +- Group DMs are ignored by default (`channels.discord.dm.groupEnabled=false`). +- Native slash commands run in isolated command sessions (`agent::discord:slash:`), while still carrying `CommandTargetSessionKey` to the routed conversation session. + +## Forum channels + +Discord forum and media channels only accept thread posts. OpenClaw supports two ways to create them: + +- Send a message to the forum parent (`channel:`) to auto-create a thread. The thread title uses the first non-empty line of your message. +- Use `openclaw message thread create` to create a thread directly. Do not pass `--message-id` for forum channels. + +Example: send to forum parent to create a thread + +```bash +openclaw message send --channel discord --target channel: \ + --message "Topic title\nBody of the post" +``` + +Example: create a forum thread explicitly + +```bash +openclaw message thread create --channel discord --target channel: \ + --thread-name "Topic title" --message "Body of the post" +``` + +Forum parents do not accept Discord components. If you need components, send to the thread itself (`channel:`). + +## Interactive components + +OpenClaw supports Discord components v2 containers for agent messages. Use the message tool with a `components` payload. Interaction results are routed back to the agent as normal inbound messages and follow the existing Discord `replyToMode` settings. + +Supported blocks: + +- `text`, `section`, `separator`, `actions`, `media-gallery`, `file` +- Action rows allow up to 5 buttons or a single select menu +- Select types: `string`, `user`, `role`, `mentionable`, `channel` + +By default, components are single use. Set `components.reusable=true` to allow buttons, selects, and forms to be used multiple times until they expire. + +To restrict who can click a button, set `allowedUsers` on that button (Discord user IDs, tags, or `*`). When configured, unmatched users receive an ephemeral denial. + +The `/model` and `/models` slash commands open an interactive model picker with provider and model dropdowns plus a Submit step. The picker reply is ephemeral and only the invoking user can use it. + +File attachments: + +- `file` blocks must point to an attachment reference (`attachment://`) +- Provide the attachment via `media`/`path`/`filePath` (single file); use `media-gallery` for multiple files +- Use `filename` to override the upload name when it should match the attachment reference + +Modal forms: + +- Add `components.modal` with up to 5 fields +- Field types: `text`, `checkbox`, `radio`, `select`, `role-select`, `user-select` +- OpenClaw adds a trigger button automatically + +Example: + +```json5 +{ + channel: "discord", + action: "send", + to: "channel:123456789012345678", + message: "Optional fallback text", + components: { + reusable: true, + text: "Choose a path", + blocks: [ + { + type: "actions", + buttons: [ + { + label: "Approve", + style: "success", + allowedUsers: ["123456789012345678"], + }, + { label: "Decline", style: "danger" }, + ], + }, + { + type: "actions", + select: { + type: "string", + placeholder: "Pick an option", + options: [ + { label: "Option A", value: "a" }, + { label: "Option B", value: "b" }, + ], + }, + }, + ], + modal: { + title: "Details", + triggerLabel: "Open form", + fields: [ + { type: "text", label: "Requester" }, + { + type: "select", + label: "Priority", + options: [ + { label: "Low", value: "low" }, + { label: "High", value: "high" }, + ], + }, + ], + }, + }, +} +``` + +## Access control and routing + + + + `channels.discord.dmPolicy` controls DM access (legacy: `channels.discord.dm.policy`): + + - `pairing` (default) + - `allowlist` + - `open` (requires `channels.discord.allowFrom` to include `"*"`; legacy: `channels.discord.dm.allowFrom`) + - `disabled` + + If DM policy is not open, unknown users are blocked (or prompted for pairing in `pairing` mode). + + Multi-account precedence: + + - `channels.discord.accounts.default.allowFrom` applies only to the `default` account. + - Named accounts inherit `channels.discord.allowFrom` when their own `allowFrom` is unset. + - Named accounts do not inherit `channels.discord.accounts.default.allowFrom`. + + DM target format for delivery: + + - `user:` + - `<@id>` mention + + Bare numeric IDs are ambiguous and rejected unless an explicit user/channel target kind is provided. + + + + + Guild handling is controlled by `channels.discord.groupPolicy`: + + - `open` + - `allowlist` + - `disabled` + + Secure baseline when `channels.discord` exists is `allowlist`. + + `allowlist` behavior: + + - guild must match `channels.discord.guilds` (`id` preferred, slug accepted) + - optional sender allowlists: `users` (stable IDs recommended) and `roles` (role IDs only); if either is configured, senders are allowed when they match `users` OR `roles` + - direct name/tag matching is disabled by default; enable `channels.discord.dangerouslyAllowNameMatching: true` only as break-glass compatibility mode + - names/tags are supported for `users`, but IDs are safer; `openclaw security audit` warns when name/tag entries are used + - if a guild has `channels` configured, non-listed channels are denied + - if a guild has no `channels` block, all channels in that allowlisted guild are allowed + + Example: + +```json5 +{ + channels: { + discord: { + groupPolicy: "allowlist", + guilds: { + "123456789012345678": { + requireMention: true, + ignoreOtherMentions: true, + users: ["987654321098765432"], + roles: ["123456789012345678"], + channels: { + general: { allow: true }, + help: { allow: true, requireMention: true }, + }, + }, + }, + }, + }, +} +``` + + If you only set `DISCORD_BOT_TOKEN` and do not create a `channels.discord` block, runtime fallback is `groupPolicy="allowlist"` (with a warning in logs), even if `channels.defaults.groupPolicy` is `open`. + + + + + Guild messages are mention-gated by default. + + Mention detection includes: + + - explicit bot mention + - configured mention patterns (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`) + - implicit reply-to-bot behavior in supported cases + + `requireMention` is configured per guild/channel (`channels.discord.guilds...`). + `ignoreOtherMentions` optionally drops messages that mention another user/role but not the bot (excluding @everyone/@here). + + Group DMs: + + - default: ignored (`dm.groupEnabled=false`) + - optional allowlist via `dm.groupChannels` (channel IDs or slugs) + + + + +### Role-based agent routing + +Use `bindings[].match.roles` to route Discord guild members to different agents by role ID. Role-based bindings accept role IDs only and are evaluated after peer or parent-peer bindings and before guild-only bindings. If a binding also sets other match fields (for example `peer` + `guildId` + `roles`), all configured fields must match. + +```json5 +{ + bindings: [ + { + agentId: "opus", + match: { + channel: "discord", + guildId: "123456789012345678", + roles: ["111111111111111111"], + }, + }, + { + agentId: "sonnet", + match: { + channel: "discord", + guildId: "123456789012345678", + }, + }, + ], +} +``` + +## Developer Portal setup + + + + + 1. Discord Developer Portal -> **Applications** -> **New Application** + 2. **Bot** -> **Add Bot** + 3. Copy bot token + + + + + In **Bot -> Privileged Gateway Intents**, enable: + + - Message Content Intent + - Server Members Intent (recommended) + + Presence intent is optional and only required if you want to receive presence updates. Setting bot presence (`setPresence`) does not require enabling presence updates for members. + + + + + OAuth URL generator: + + - scopes: `bot`, `applications.commands` + + Typical baseline permissions: + + - View Channels + - Send Messages + - Read Message History + - Embed Links + - Attach Files + - Add Reactions (optional) + + Avoid `Administrator` unless explicitly needed. + + + + + Enable Discord Developer Mode, then copy: + + - server ID + - channel ID + - user ID + + Prefer numeric IDs in OpenClaw config for reliable audits and probes. + + + + +## Native commands and command auth + +- `commands.native` defaults to `"auto"` and is enabled for Discord. +- Per-channel override: `channels.discord.commands.native`. +- `commands.native=false` explicitly clears previously registered Discord native commands. +- Native command auth uses the same Discord allowlists/policies as normal message handling. +- Commands may still be visible in Discord UI for users who are not authorized; execution still enforces OpenClaw auth and returns "not authorized". + +See [Slash commands](/tools/slash-commands) for command catalog and behavior. + +Default slash command settings: + +- `ephemeral: true` + +## Feature details + + + + Discord supports reply tags in agent output: + + - `[[reply_to_current]]` + - `[[reply_to:]]` + + Controlled by `channels.discord.replyToMode`: + + - `off` (default) + - `first` + - `all` + + Note: `off` disables implicit reply threading. Explicit `[[reply_to_*]]` tags are still honored. + + Message IDs are surfaced in context/history so agents can target specific messages. + + + + + OpenClaw can stream draft replies by sending a temporary message and editing it as text arrives. + + - `channels.discord.streaming` controls preview streaming (`off` | `partial` | `block` | `progress`, default: `off`). + - Default stays `off` because Discord preview edits can hit rate limits quickly, especially when multiple bots or gateways share the same account or guild traffic. + - `progress` is accepted for cross-channel consistency and maps to `partial` on Discord. + - `channels.discord.streamMode` is a legacy alias and is auto-migrated. + - `partial` edits a single preview message as tokens arrive. + - `block` emits draft-sized chunks (use `draftChunk` to tune size and breakpoints). + + Example: + +```json5 +{ + channels: { + discord: { + streaming: "partial", + }, + }, +} +``` + + `block` mode chunking defaults (clamped to `channels.discord.textChunkLimit`): + +```json5 +{ + channels: { + discord: { + streaming: "block", + draftChunk: { + minChars: 200, + maxChars: 800, + breakPreference: "paragraph", + }, + }, + }, +} +``` + + Preview streaming is text-only; media replies fall back to normal delivery. + + Note: preview streaming is separate from block streaming. When block streaming is explicitly + enabled for Discord, OpenClaw skips the preview stream to avoid double streaming. + + + + + Guild history context: + + - `channels.discord.historyLimit` default `20` + - fallback: `messages.groupChat.historyLimit` + - `0` disables + + DM history controls: + + - `channels.discord.dmHistoryLimit` + - `channels.discord.dms[""].historyLimit` + + Thread behavior: + + - Discord threads are routed as channel sessions + - parent thread metadata can be used for parent-session linkage + - thread config inherits parent channel config unless a thread-specific entry exists + + Channel topics are injected as **untrusted** context (not as system prompt). + Reply and quoted-message context currently stays as received. + Discord allowlists primarily gate who can trigger the agent, not a full supplemental-context redaction boundary. + + + + + Discord can bind a thread to a session target so follow-up messages in that thread keep routing to the same session (including subagent sessions). + + Commands: + + - `/focus ` bind current/new thread to a subagent/session target + - `/unfocus` remove current thread binding + - `/agents` show active runs and binding state + - `/session idle ` inspect/update inactivity auto-unfocus for focused bindings + - `/session max-age ` inspect/update hard max age for focused bindings + + Config: + +```json5 +{ + session: { + threadBindings: { + enabled: true, + idleHours: 24, + maxAgeHours: 0, + }, + }, + channels: { + discord: { + threadBindings: { + enabled: true, + idleHours: 24, + maxAgeHours: 0, + spawnSubagentSessions: false, // opt-in + }, + }, + }, +} +``` + + Notes: + + - `session.threadBindings.*` sets global defaults. + - `channels.discord.threadBindings.*` overrides Discord behavior. + - `spawnSubagentSessions` must be true to auto-create/bind threads for `sessions_spawn({ thread: true })`. + - `spawnAcpSessions` must be true to auto-create/bind threads for ACP (`/acp spawn ... --thread ...` or `sessions_spawn({ runtime: "acp", thread: true })`). + - If thread bindings are disabled for an account, `/focus` and related thread binding operations are unavailable. + + See [Sub-agents](/tools/subagents), [ACP Agents](/tools/acp-agents), and [Configuration Reference](/gateway/configuration-reference). + + + + + For stable "always-on" ACP workspaces, configure top-level typed ACP bindings targeting Discord conversations. + + Config path: + + - `bindings[]` with `type: "acp"` and `match.channel: "discord"` + + Example: + +```json5 +{ + agents: { + list: [ + { + id: "codex", + runtime: { + type: "acp", + acp: { + agent: "codex", + backend: "acpx", + mode: "persistent", + cwd: "/workspace/openclaw", + }, + }, + }, + ], + }, + bindings: [ + { + type: "acp", + agentId: "codex", + match: { + channel: "discord", + accountId: "default", + peer: { kind: "channel", id: "222222222222222222" }, + }, + acp: { label: "codex-main" }, + }, + ], + channels: { + discord: { + guilds: { + "111111111111111111": { + channels: { + "222222222222222222": { + requireMention: false, + }, + }, + }, + }, + }, + }, +} +``` + + Notes: + + - `/acp spawn codex --bind here` binds the current Discord channel or thread in place and keeps future messages routed to the same ACP session. + - That can still mean "start a fresh Codex ACP session", but it does not create a new Discord thread by itself. The existing channel stays the chat surface. + - Codex may still run in its own `cwd` or backend workspace on disk. That workspace is runtime state, not a Discord thread. + - Thread messages can inherit the parent channel ACP binding. + - In a bound channel or thread, `/new` and `/reset` reset the same ACP session in place. + - Temporary thread bindings still work and can override target resolution while active. + - `spawnAcpSessions` is only required when OpenClaw needs to create/bind a child thread via `--thread auto|here`. It is not required for `/acp spawn ... --bind here` in the current channel. + + See [ACP Agents](/tools/acp-agents) for binding behavior details. + + + + + Per-guild reaction notification mode: + + - `off` + - `own` (default) + - `all` + - `allowlist` (uses `guilds..users`) + + Reaction events are turned into system events and attached to the routed Discord session. + + + + + `ackReaction` sends an acknowledgement emoji while OpenClaw is processing an inbound message. + + Resolution order: + + - `channels.discord.accounts..ackReaction` + - `channels.discord.ackReaction` + - `messages.ackReaction` + - agent identity emoji fallback (`agents.list[].identity.emoji`, else "👀") + + Notes: + + - Discord accepts unicode emoji or custom emoji names. + - Use `""` to disable the reaction for a channel or account. + + + + + Channel-initiated config writes are enabled by default. + + This affects `/config set|unset` flows (when command features are enabled). + + Disable: + +```json5 +{ + channels: { + discord: { + configWrites: false, + }, + }, +} +``` + + + + + Route Discord gateway WebSocket traffic and startup REST lookups (application ID + allowlist resolution) through an HTTP(S) proxy with `channels.discord.proxy`. + +```json5 +{ + channels: { + discord: { + proxy: "http://proxy.example:8080", + }, + }, +} +``` + + Per-account override: + +```json5 +{ + channels: { + discord: { + accounts: { + primary: { + proxy: "http://proxy.example:8080", + }, + }, + }, + }, +} +``` + + + + + Enable PluralKit resolution to map proxied messages to system member identity: + +```json5 +{ + channels: { + discord: { + pluralkit: { + enabled: true, + token: "pk_live_...", // optional; needed for private systems + }, + }, + }, +} +``` + + Notes: + + - allowlists can use `pk:` + - member display names are matched by name/slug only when `channels.discord.dangerouslyAllowNameMatching: true` + - lookups use original message ID and are time-window constrained + - if lookup fails, proxied messages are treated as bot messages and dropped unless `allowBots=true` + + + + + Presence updates are applied when you set a status or activity field, or when you enable auto presence. + + Status only example: + +```json5 +{ + channels: { + discord: { + status: "idle", + }, + }, +} +``` + + Activity example (custom status is the default activity type): + +```json5 +{ + channels: { + discord: { + activity: "Focus time", + activityType: 4, + }, + }, +} +``` + + Streaming example: + +```json5 +{ + channels: { + discord: { + activity: "Live coding", + activityType: 1, + activityUrl: "https://twitch.tv/openclaw", + }, + }, +} +``` + + Activity type map: + + - 0: Playing + - 1: Streaming (requires `activityUrl`) + - 2: Listening + - 3: Watching + - 4: Custom (uses the activity text as the status state; emoji is optional) + - 5: Competing + + Auto presence example (runtime health signal): + +```json5 +{ + channels: { + discord: { + autoPresence: { + enabled: true, + intervalMs: 30000, + minUpdateIntervalMs: 15000, + exhaustedText: "token exhausted", + }, + }, + }, +} +``` + + Auto presence maps runtime availability to Discord status: healthy => online, degraded or unknown => idle, exhausted or unavailable => dnd. Optional text overrides: + + - `autoPresence.healthyText` + - `autoPresence.degradedText` + - `autoPresence.exhaustedText` (supports `{reason}` placeholder) + + + + + Discord supports button-based approval handling in DMs and can optionally post approval prompts in the originating channel. + + Config path: + + - `channels.discord.execApprovals.enabled` + - `channels.discord.execApprovals.approvers` (optional; falls back to `commands.ownerAllowFrom` when possible) + - `channels.discord.execApprovals.target` (`dm` | `channel` | `both`, default: `dm`) + - `agentFilter`, `sessionFilter`, `cleanupAfterResolve` + + Discord auto-enables native exec approvals when `enabled` is unset or `"auto"` and at least one approver can be resolved, either from `execApprovals.approvers` or from `commands.ownerAllowFrom`. Discord does not infer exec approvers from channel `allowFrom`, legacy `dm.allowFrom`, or direct-message `defaultTo`. Set `enabled: false` to disable Discord as a native approval client explicitly. + + When `target` is `channel` or `both`, the approval prompt is visible in the channel. Only resolved approvers can use the buttons; other users receive an ephemeral denial. Approval prompts include the command text, so only enable channel delivery in trusted channels. If the channel ID cannot be derived from the session key, OpenClaw falls back to DM delivery. + + Discord also renders the shared approval buttons used by other chat channels. The native Discord adapter mainly adds approver DM routing and channel fanout. + When those buttons are present, they are the primary approval UX; OpenClaw + should only include a manual `/approve` command when the tool result says + chat approvals are unavailable or manual approval is the only path. + + Gateway auth for this handler uses the same shared credential resolution contract as other Gateway clients: + + - env-first local auth (`OPENCLAW_GATEWAY_TOKEN` / `OPENCLAW_GATEWAY_PASSWORD` then `gateway.auth.*`) + - in local mode, `gateway.remote.*` can be used as fallback only when `gateway.auth.*` is unset; configured-but-unresolved local SecretRefs fail closed + - remote-mode support via `gateway.remote.*` when applicable + - URL overrides are override-safe: CLI overrides do not reuse implicit credentials, and env overrides use env credentials only + + Approval resolution behavior: + + - IDs prefixed with `plugin:` resolve through `plugin.approval.resolve`. + - Other IDs resolve through `exec.approval.resolve`. + - Discord does not do an extra exec-to-plugin fallback hop here; the id + prefix decides which gateway method it calls. + + Exec approvals expire after 30 minutes by default. If approvals fail with + unknown approval IDs, verify approver resolution, feature enablement, and + that the delivered approval id kind matches the pending request. + + Related docs: [Exec approvals](/tools/exec-approvals) + + + + +## Tools and action gates + +Discord message actions include messaging, channel admin, moderation, presence, and metadata actions. + +Core examples: + +- messaging: `sendMessage`, `readMessages`, `editMessage`, `deleteMessage`, `threadReply` +- reactions: `react`, `reactions`, `emojiList` +- moderation: `timeout`, `kick`, `ban` +- presence: `setPresence` + +Action gates live under `channels.discord.actions.*`. + +Default gate behavior: + +| Action group | Default | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | +| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | enabled | +| roles | disabled | +| moderation | disabled | +| presence | disabled | + +## Components v2 UI + +OpenClaw uses Discord components v2 for exec approvals and cross-context markers. Discord message actions can also accept `components` for custom UI (advanced; requires constructing a component payload via the discord tool), while legacy `embeds` remain available but are not recommended. + +- `channels.discord.ui.components.accentColor` sets the accent color used by Discord component containers (hex). +- Set per account with `channels.discord.accounts..ui.components.accentColor`. +- `embeds` are ignored when components v2 are present. + +Example: + +```json5 +{ + channels: { + discord: { + ui: { + components: { + accentColor: "#5865F2", + }, + }, + }, + }, +} +``` + +## Voice channels + +OpenClaw can join Discord voice channels for realtime, continuous conversations. This is separate from voice message attachments. + +Requirements: + +- Enable native commands (`commands.native` or `channels.discord.commands.native`). +- Configure `channels.discord.voice`. +- The bot needs Connect + Speak permissions in the target voice channel. + +Use the Discord-only native command `/vc join|leave|status` to control sessions. The command uses the account default agent and follows the same allowlist and group policy rules as other Discord commands. + +Auto-join example: + +```json5 +{ + channels: { + discord: { + voice: { + enabled: true, + autoJoin: [ + { + guildId: "123456789012345678", + channelId: "234567890123456789", + }, + ], + daveEncryption: true, + decryptionFailureTolerance: 24, + tts: { + provider: "openai", + openai: { voice: "alloy" }, + }, + }, + }, + }, +} +``` + +Notes: + +- `voice.tts` overrides `messages.tts` for voice playback only. +- Voice transcript turns derive owner status from Discord `allowFrom` (or `dm.allowFrom`); non-owner speakers cannot access owner-only tools (for example `gateway` and `cron`). +- Voice is enabled by default; set `channels.discord.voice.enabled=false` to disable it. +- `voice.daveEncryption` and `voice.decryptionFailureTolerance` pass through to `@discordjs/voice` join options. +- `@discordjs/voice` defaults are `daveEncryption=true` and `decryptionFailureTolerance=24` if unset. +- OpenClaw also watches receive decrypt failures and auto-recovers by leaving/rejoining the voice channel after repeated failures in a short window. +- If receive logs repeatedly show `DecryptionFailed(UnencryptedWhenPassthroughDisabled)`, this may be the upstream `@discordjs/voice` receive bug tracked in [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419). + +## Voice messages + +Discord voice messages show a waveform preview and require OGG/Opus audio plus metadata. OpenClaw generates the waveform automatically, but it needs `ffmpeg` and `ffprobe` available on the gateway host to inspect and convert audio files. + +Requirements and constraints: + +- Provide a **local file path** (URLs are rejected). +- Omit text content (Discord does not allow text + voice message in the same payload). +- Any audio format is accepted; OpenClaw converts to OGG/Opus when needed. + +Example: + +```bash +message(action="send", channel="discord", target="channel:123", path="/path/to/audio.mp3", asVoice=true) +``` + +## Troubleshooting + + + + + - enable Message Content Intent + - enable Server Members Intent when you depend on user/member resolution + - restart gateway after changing intents + + + + + + - verify `groupPolicy` + - verify guild allowlist under `channels.discord.guilds` + - if guild `channels` map exists, only listed channels are allowed + - verify `requireMention` behavior and mention patterns + + Useful checks: + +```bash +openclaw doctor +openclaw channels status --probe +openclaw logs --follow +``` + + + + + Common causes: + + - `groupPolicy="allowlist"` without matching guild/channel allowlist + - `requireMention` configured in the wrong place (must be under `channels.discord.guilds` or channel entry) + - sender blocked by guild/channel `users` allowlist + + + + + + Typical logs: + + - `Listener DiscordMessageListener timed out after 30000ms for event MESSAGE_CREATE` + - `Slow listener detected ...` + - `discord inbound worker timed out after ...` + + Listener budget knob: + + - single-account: `channels.discord.eventQueue.listenerTimeout` + - multi-account: `channels.discord.accounts..eventQueue.listenerTimeout` + + Worker run timeout knob: + + - single-account: `channels.discord.inboundWorker.runTimeoutMs` + - multi-account: `channels.discord.accounts..inboundWorker.runTimeoutMs` + - default: `1800000` (30 minutes); set `0` to disable + + Recommended baseline: + +```json5 +{ + channels: { + discord: { + accounts: { + default: { + eventQueue: { + listenerTimeout: 120000, + }, + inboundWorker: { + runTimeoutMs: 1800000, + }, + }, + }, + }, + }, +} +``` + + Use `eventQueue.listenerTimeout` for slow listener setup and `inboundWorker.runTimeoutMs` + only if you want a separate safety valve for queued agent turns. + + + + + `channels status --probe` permission checks only work for numeric channel IDs. + + If you use slug keys, runtime matching can still work, but probe cannot fully verify permissions. + + + + + + - DM disabled: `channels.discord.dm.enabled=false` + - DM policy disabled: `channels.discord.dmPolicy="disabled"` (legacy: `channels.discord.dm.policy`) + - awaiting pairing approval in `pairing` mode + + + + + By default bot-authored messages are ignored. + + If you set `channels.discord.allowBots=true`, use strict mention and allowlist rules to avoid loop behavior. + Prefer `channels.discord.allowBots="mentions"` to only accept bot messages that mention the bot. + + + + + + - keep OpenClaw current (`openclaw update`) so the Discord voice receive recovery logic is present + - confirm `channels.discord.voice.daveEncryption=true` (default) + - start from `channels.discord.voice.decryptionFailureTolerance=24` (upstream default) and tune only if needed + - watch logs for: + - `discord voice: DAVE decrypt failures detected` + - `discord voice: repeated decrypt failures; attempting rejoin` + - if failures continue after automatic rejoin, collect logs and compare against [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419) + + + + +## Configuration reference pointers + +Primary reference: + +- [Configuration reference - Discord](/gateway/configuration-reference#discord) + +High-signal Discord fields: + +- startup/auth: `enabled`, `token`, `accounts.*`, `allowBots` +- policy: `groupPolicy`, `dm.*`, `guilds.*`, `guilds.*.channels.*` +- command: `commands.native`, `commands.useAccessGroups`, `configWrites`, `slashCommand.*` +- event queue: `eventQueue.listenerTimeout` (listener budget), `eventQueue.maxQueueSize`, `eventQueue.maxConcurrency` +- inbound worker: `inboundWorker.runTimeoutMs` +- reply/history: `replyToMode`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit` +- delivery: `textChunkLimit`, `chunkMode`, `maxLinesPerMessage` +- streaming: `streaming` (legacy alias: `streamMode`), `draftChunk`, `blockStreaming`, `blockStreamingCoalesce` +- media/retry: `mediaMaxMb`, `retry` + - `mediaMaxMb` caps outbound Discord uploads (default: `8MB`) +- actions: `actions.*` +- presence: `activity`, `status`, `activityType`, `activityUrl` +- UI: `ui.components.accentColor` +- features: `threadBindings`, top-level `bindings[]` (`type: "acp"`), `pluralkit`, `execApprovals`, `intents`, `agentComponents`, `heartbeat`, `responsePrefix` + +## Safety and operations + +- Treat bot tokens as secrets (`DISCORD_BOT_TOKEN` preferred in supervised environments). +- Grant least-privilege Discord permissions. +- If command deploy/state is stale, restart gateway and re-check with `openclaw channels status --probe`. + +## Related + +- [Pairing](/channels/pairing) +- [Groups](/channels/groups) +- [Channel routing](/channels/channel-routing) +- [Security](/gateway/security) +- [Multi-agent routing](/concepts/multi-agent) +- [Troubleshooting](/channels/troubleshooting) +- [Slash commands](/tools/slash-commands) diff --git a/docs/channels/feishu.md b/docs/channels/feishu.md new file mode 100644 index 000000000..e706b59ad --- /dev/null +++ b/docs/channels/feishu.md @@ -0,0 +1,793 @@ +--- +summary: "Feishu bot overview, features, and configuration" +read_when: + - You want to connect a Feishu/Lark bot + - You are configuring the Feishu channel +title: Feishu +--- + +# Feishu bot + +Feishu (Lark) is a team chat platform used by companies for messaging and collaboration. This plugin connects OpenClaw to a Feishu/Lark bot using the platform’s WebSocket event subscription so messages can be received without exposing a public webhook URL. + +--- + +## Bundled plugin + +Feishu ships bundled with current OpenClaw releases, so no separate plugin install +is required. + +If you are using an older build or a custom install that does not include bundled +Feishu, install it manually: + +```bash +openclaw plugins install @openclaw/feishu +``` + +--- + +## Quickstart + +There are two ways to add the Feishu channel: + +### Method 1: onboarding (recommended) + +If you just installed OpenClaw, run onboarding: + +```bash +openclaw onboard +``` + +The wizard guides you through: + +1. Creating a Feishu app and collecting credentials +2. Configuring app credentials in OpenClaw +3. Starting the gateway + +✅ **After configuration**, check gateway status: + +- `openclaw gateway status` +- `openclaw logs --follow` + +### Method 2: CLI setup + +If you already completed initial install, add the channel via CLI: + +```bash +openclaw channels add +``` + +Choose **Feishu**, then enter the App ID and App Secret. + +✅ **After configuration**, manage the gateway: + +- `openclaw gateway status` +- `openclaw gateway restart` +- `openclaw logs --follow` + +--- + +## Step 1: Create a Feishu app + +### 1. Open Feishu Open Platform + +Visit [Feishu Open Platform](https://open.feishu.cn/app) and sign in. + +Lark (global) tenants should use [https://open.larksuite.com/app](https://open.larksuite.com/app) and set `domain: "lark"` in the Feishu config. + +### 2. Create an app + +1. Click **Create enterprise app** +2. Fill in the app name + description +3. Choose an app icon + +![Create enterprise app](/images/feishu-step2-create-app.png) + +### 3. Copy credentials + +From **Credentials & Basic Info**, copy: + +- **App ID** (format: `cli_xxx`) +- **App Secret** + +❗ **Important:** keep the App Secret private. + +![Get credentials](/images/feishu-step3-credentials.png) + +### 4. Configure permissions + +On **Permissions**, click **Batch import** and paste: + +```json +{ + "scopes": { + "tenant": [ + "aily:file:read", + "aily:file:write", + "application:application.app_message_stats.overview:readonly", + "application:application:self_manage", + "application:bot.menu:write", + "cardkit:card:read", + "cardkit:card:write", + "contact:user.employee_id:readonly", + "corehr:file:download", + "event:ip_list", + "im:chat.access_event.bot_p2p_chat:read", + "im:chat.members:bot_access", + "im:message", + "im:message.group_at_msg:readonly", + "im:message.p2p_msg:readonly", + "im:message:readonly", + "im:message:send_as_bot", + "im:resource" + ], + "user": ["aily:file:read", "aily:file:write", "im:chat.access_event.bot_p2p_chat:read"] + } +} +``` + +![Configure permissions](/images/feishu-step4-permissions.png) + +### 5. Enable bot capability + +In **App Capability** > **Bot**: + +1. Enable bot capability +2. Set the bot name + +![Enable bot capability](/images/feishu-step5-bot-capability.png) + +### 6. Configure event subscription + +⚠️ **Important:** before setting event subscription, make sure: + +1. You already ran `openclaw channels add` for Feishu +2. The gateway is running (`openclaw gateway status`) + +In **Event Subscription**: + +1. Choose **Use long connection to receive events** (WebSocket) +2. Add the event: `im.message.receive_v1` +3. (Optional) For Drive comment workflows, also add: `drive.notice.comment_add_v1` + +⚠️ If the gateway is not running, the long-connection setup may fail to save. + +![Configure event subscription](/images/feishu-step6-event-subscription.png) + +### 7. Publish the app + +1. Create a version in **Version Management & Release** +2. Submit for review and publish +3. Wait for admin approval (enterprise apps usually auto-approve) + +--- + +## Step 2: Configure OpenClaw + +### Configure with the wizard (recommended) + +```bash +openclaw channels add +``` + +Choose **Feishu** and paste your App ID + App Secret. + +### Configure via config file + +Edit `~/.openclaw/openclaw.json`: + +```json5 +{ + channels: { + feishu: { + enabled: true, + dmPolicy: "pairing", + accounts: { + main: { + appId: "cli_xxx", + appSecret: "xxx", + name: "My AI assistant", + }, + }, + }, + }, +} +``` + +If you use `connectionMode: "webhook"`, set both `verificationToken` and `encryptKey`. The Feishu webhook server binds to `127.0.0.1` by default; set `webhookHost` only if you intentionally need a different bind address. + +#### Verification Token and Encrypt Key (webhook mode) + +When using webhook mode, set both `channels.feishu.verificationToken` and `channels.feishu.encryptKey` in your config. To get the values: + +1. In Feishu Open Platform, open your app +2. Go to **Development** → **Events & Callbacks** (开发配置 → 事件与回调) +3. Open the **Encryption** tab (加密策略) +4. Copy **Verification Token** and **Encrypt Key** + +The screenshot below shows where to find the **Verification Token**. The **Encrypt Key** is listed in the same **Encryption** section. + +![Verification Token location](/images/feishu-verification-token.png) + +### Configure via environment variables + +```bash +export FEISHU_APP_ID="cli_xxx" +export FEISHU_APP_SECRET="xxx" +``` + +### Lark (global) domain + +If your tenant is on Lark (international), set the domain to `lark` (or a full domain string). You can set it at `channels.feishu.domain` or per account (`channels.feishu.accounts..domain`). + +```json5 +{ + channels: { + feishu: { + domain: "lark", + accounts: { + main: { + appId: "cli_xxx", + appSecret: "xxx", + }, + }, + }, + }, +} +``` + +### Quota optimization flags + +You can reduce Feishu API usage with two optional flags: + +- `typingIndicator` (default `true`): when `false`, skip typing reaction calls. +- `resolveSenderNames` (default `true`): when `false`, skip sender profile lookup calls. + +Set them at top level or per account: + +```json5 +{ + channels: { + feishu: { + typingIndicator: false, + resolveSenderNames: false, + accounts: { + main: { + appId: "cli_xxx", + appSecret: "xxx", + typingIndicator: true, + resolveSenderNames: false, + }, + }, + }, + }, +} +``` + +--- + +## Step 3: Start + test + +### 1. Start the gateway + +```bash +openclaw gateway +``` + +### 2. Send a test message + +In Feishu, find your bot and send a message. + +### 3. Approve pairing + +By default, the bot replies with a pairing code. Approve it: + +```bash +openclaw pairing approve feishu +``` + +After approval, you can chat normally. + +--- + +## Overview + +- **Feishu bot channel**: Feishu bot managed by the gateway +- **Deterministic routing**: replies always return to Feishu +- **Session isolation**: DMs share a main session; groups are isolated +- **WebSocket connection**: long connection via Feishu SDK, no public URL needed + +--- + +## Access control + +### Direct messages + +- **Default**: `dmPolicy: "pairing"` (unknown users get a pairing code) +- **Approve pairing**: + + ```bash + openclaw pairing list feishu + openclaw pairing approve feishu + ``` + +- **Allowlist mode**: set `channels.feishu.allowFrom` with allowed Open IDs + +### Group chats + +**1. Group policy** (`channels.feishu.groupPolicy`): + +- `"open"` = allow everyone in groups +- `"allowlist"` = only allow `groupAllowFrom` +- `"disabled"` = disable group messages + +Default: `allowlist` + +**2. Mention requirement** (`channels.feishu.requireMention`, overridable via `channels.feishu.groups..requireMention`): + +- explicit `true` = require @mention +- explicit `false` = respond without mentions +- when unset and `groupPolicy: "open"` = default to `false` +- when unset and `groupPolicy` is not `"open"` = default to `true` + +--- + +## Group configuration examples + +### Allow all groups, no @mention required (default for open groups) + +```json5 +{ + channels: { + feishu: { + groupPolicy: "open", + }, + }, +} +``` + +### Allow all groups, but still require @mention + +```json5 +{ + channels: { + feishu: { + groupPolicy: "open", + requireMention: true, + }, + }, +} +``` + +### Allow specific groups only + +```json5 +{ + channels: { + feishu: { + groupPolicy: "allowlist", + // Feishu group IDs (chat_id) look like: oc_xxx + groupAllowFrom: ["oc_xxx", "oc_yyy"], + }, + }, +} +``` + +### Restrict which senders can message in a group (sender allowlist) + +In addition to allowing the group itself, **all messages** in that group are gated by the sender open_id: only users listed in `groups..allowFrom` have their messages processed; messages from other members are ignored (this is full sender-level gating, not only for control commands like /reset or /new). + +```json5 +{ + channels: { + feishu: { + groupPolicy: "allowlist", + groupAllowFrom: ["oc_xxx"], + groups: { + oc_xxx: { + // Feishu user IDs (open_id) look like: ou_xxx + allowFrom: ["ou_user1", "ou_user2"], + }, + }, + }, + }, +} +``` + +--- + + + +## Get group/user IDs + +### Group IDs (chat_id) + +Group IDs look like `oc_xxx`. + +**Method 1 (recommended)** + +1. Start the gateway and @mention the bot in the group +2. Run `openclaw logs --follow` and look for `chat_id` + +**Method 2** + +Use the Feishu API debugger to list group chats. + +### User IDs (open_id) + +User IDs look like `ou_xxx`. + +**Method 1 (recommended)** + +1. Start the gateway and DM the bot +2. Run `openclaw logs --follow` and look for `open_id` + +**Method 2** + +Check pairing requests for user Open IDs: + +```bash +openclaw pairing list feishu +``` + +--- + +## Common commands + +| Command | Description | +| --------- | ----------------- | +| `/status` | Show bot status | +| `/reset` | Reset the session | +| `/model` | Show/switch model | + +> Note: Feishu does not support native command menus yet, so commands must be sent as text. + +## Gateway management commands + +| Command | Description | +| -------------------------- | ----------------------------- | +| `openclaw gateway status` | Show gateway status | +| `openclaw gateway install` | Install/start gateway service | +| `openclaw gateway stop` | Stop gateway service | +| `openclaw gateway restart` | Restart gateway service | +| `openclaw logs --follow` | Tail gateway logs | + +--- + +## Troubleshooting + +### Bot does not respond in group chats + +1. Ensure the bot is added to the group +2. Ensure you @mention the bot (default behavior) +3. Check `groupPolicy` is not set to `"disabled"` +4. Check logs: `openclaw logs --follow` + +### Bot does not receive messages + +1. Ensure the app is published and approved +2. Ensure event subscription includes `im.message.receive_v1` +3. Ensure **long connection** is enabled +4. Ensure app permissions are complete +5. Ensure the gateway is running: `openclaw gateway status` +6. Check logs: `openclaw logs --follow` + +### App Secret leak + +1. Reset the App Secret in Feishu Open Platform +2. Update the App Secret in your config +3. Restart the gateway + +### Message send failures + +1. Ensure the app has `im:message:send_as_bot` permission +2. Ensure the app is published +3. Check logs for detailed errors + +--- + +## Advanced configuration + +### Multiple accounts + +```json5 +{ + channels: { + feishu: { + defaultAccount: "main", + accounts: { + main: { + appId: "cli_xxx", + appSecret: "xxx", + name: "Primary bot", + }, + backup: { + appId: "cli_yyy", + appSecret: "yyy", + name: "Backup bot", + enabled: false, + }, + }, + }, + }, +} +``` + +`defaultAccount` controls which Feishu account is used when outbound APIs do not specify an `accountId` explicitly. + +### Message limits + +- `textChunkLimit`: outbound text chunk size (default: 2000 chars) +- `mediaMaxMb`: media upload/download limit (default: 30MB) + +### Streaming + +Feishu supports streaming replies via interactive cards. When enabled, the bot updates a card as it generates text. + +```json5 +{ + channels: { + feishu: { + streaming: true, // enable streaming card output (default true) + blockStreaming: true, // enable block-level streaming (default true) + }, + }, +} +``` + +Set `streaming: false` to wait for the full reply before sending. + +### ACP sessions + +Feishu supports ACP for: + +- DMs +- group topic conversations + +Feishu ACP is text-command driven. There are no native slash-command menus, so use `/acp ...` messages directly in the conversation. + +#### Persistent ACP bindings + +Use top-level typed ACP bindings to pin a Feishu DM or topic conversation to a persistent ACP session. + +```json5 +{ + agents: { + list: [ + { + id: "codex", + runtime: { + type: "acp", + acp: { + agent: "codex", + backend: "acpx", + mode: "persistent", + cwd: "/workspace/openclaw", + }, + }, + }, + ], + }, + bindings: [ + { + type: "acp", + agentId: "codex", + match: { + channel: "feishu", + accountId: "default", + peer: { kind: "direct", id: "ou_1234567890" }, + }, + }, + { + type: "acp", + agentId: "codex", + match: { + channel: "feishu", + accountId: "default", + peer: { kind: "group", id: "oc_group_chat:topic:om_topic_root" }, + }, + acp: { label: "codex-feishu-topic" }, + }, + ], +} +``` + +#### Thread-bound ACP spawn from chat + +In a Feishu DM or topic conversation, you can spawn and bind an ACP session in place: + +```text +/acp spawn codex --thread here +``` + +Notes: + +- `--thread here` works for DMs and Feishu topics. +- Follow-up messages in the bound DM/topic route directly to that ACP session. +- v1 does not target generic non-topic group chats. + +### Multi-agent routing + +Use `bindings` to route Feishu DMs or groups to different agents. + +```json5 +{ + agents: { + list: [ + { id: "main" }, + { + id: "clawd-fan", + workspace: "/home/user/clawd-fan", + agentDir: "/home/user/.openclaw/agents/clawd-fan/agent", + }, + { + id: "clawd-xi", + workspace: "/home/user/clawd-xi", + agentDir: "/home/user/.openclaw/agents/clawd-xi/agent", + }, + ], + }, + bindings: [ + { + agentId: "main", + match: { + channel: "feishu", + peer: { kind: "direct", id: "ou_xxx" }, + }, + }, + { + agentId: "clawd-fan", + match: { + channel: "feishu", + peer: { kind: "direct", id: "ou_yyy" }, + }, + }, + { + agentId: "clawd-xi", + match: { + channel: "feishu", + peer: { kind: "group", id: "oc_zzz" }, + }, + }, + ], +} +``` + +Routing fields: + +- `match.channel`: `"feishu"` +- `match.peer.kind`: `"direct"` or `"group"` +- `match.peer.id`: user Open ID (`ou_xxx`) or group ID (`oc_xxx`) + +See [Get group/user IDs](#get-groupuser-ids) for lookup tips. + +--- + +## Configuration reference + +Full configuration: [Gateway configuration](/gateway/configuration) + +Key options: + +| Setting | Description | Default | +| ------------------------------------------------- | --------------------------------------- | ---------------- | +| `channels.feishu.enabled` | Enable/disable channel | `true` | +| `channels.feishu.domain` | API domain (`feishu` or `lark`) | `feishu` | +| `channels.feishu.connectionMode` | Event transport mode | `websocket` | +| `channels.feishu.defaultAccount` | Default account ID for outbound routing | `default` | +| `channels.feishu.verificationToken` | Required for webhook mode | - | +| `channels.feishu.encryptKey` | Required for webhook mode | - | +| `channels.feishu.webhookPath` | Webhook route path | `/feishu/events` | +| `channels.feishu.webhookHost` | Webhook bind host | `127.0.0.1` | +| `channels.feishu.webhookPort` | Webhook bind port | `3000` | +| `channels.feishu.accounts..appId` | App ID | - | +| `channels.feishu.accounts..appSecret` | App Secret | - | +| `channels.feishu.accounts..domain` | Per-account API domain override | `feishu` | +| `channels.feishu.dmPolicy` | DM policy | `pairing` | +| `channels.feishu.allowFrom` | DM allowlist (open_id list) | - | +| `channels.feishu.groupPolicy` | Group policy | `allowlist` | +| `channels.feishu.groupAllowFrom` | Group allowlist | - | +| `channels.feishu.requireMention` | Default require @mention | conditional | +| `channels.feishu.groups..requireMention` | Per-group require @mention override | inherited | +| `channels.feishu.groups..enabled` | Enable group | `true` | +| `channels.feishu.textChunkLimit` | Message chunk size | `2000` | +| `channels.feishu.mediaMaxMb` | Media size limit | `30` | +| `channels.feishu.streaming` | Enable streaming card output | `true` | +| `channels.feishu.blockStreaming` | Enable block streaming | `true` | + +--- + +## dmPolicy reference + +| Value | Behavior | +| ------------- | --------------------------------------------------------------- | +| `"pairing"` | **Default.** Unknown users get a pairing code; must be approved | +| `"allowlist"` | Only users in `allowFrom` can chat | +| `"open"` | Allow all users (requires `"*"` in allowFrom) | +| `"disabled"` | Disable DMs | + +--- + +## Supported message types + +### Receive + +- ✅ Text +- ✅ Rich text (post) +- ✅ Images +- ✅ Files +- ✅ Audio +- ✅ Video/media +- ✅ Stickers + +### Send + +- ✅ Text +- ✅ Images +- ✅ Files +- ✅ Audio +- ✅ Video/media +- ✅ Interactive cards +- ⚠️ Rich text (post-style formatting and cards, not arbitrary Feishu authoring features) + +### Threads and replies + +- ✅ Inline replies +- ✅ Topic-thread replies where Feishu exposes `reply_in_thread` +- ✅ Media replies stay thread-aware when replying to a thread/topic message + +## Drive comments + +Feishu can trigger the agent when someone adds a comment on a Feishu Drive document (Docs, Sheets, +etc.). The agent receives the comment text, document context, and the comment thread so it can +respond in-thread or make document edits. + +Requirements: + +- Subscribe to `drive.notice.comment_add_v1` in your Feishu app event subscription settings + (alongside the existing `im.message.receive_v1`) +- The Drive tool is enabled by default; disable with `channels.feishu.tools.drive: false` + +The `feishu_drive` tool exposes these comment actions: + +| Action | Description | +| ---------------------- | ----------------------------------- | +| `list_comments` | List comments on a document | +| `list_comment_replies` | List replies in a comment thread | +| `add_comment` | Add a new top-level comment | +| `reply_comment` | Reply to an existing comment thread | + +When the agent handles a Drive comment event, it receives: + +- the comment text and sender +- document metadata (title, type, URL) +- the comment thread context for in-thread replies + +After making document edits, the agent is guided to use `feishu_drive.reply_comment` to notify the +commenter and then output the exact silent token `NO_REPLY` / `no_reply` to +avoid duplicate sends. + +## Runtime action surface + +Feishu currently exposes these runtime actions: + +- `send` +- `read` +- `edit` +- `thread-reply` +- `pin` +- `list-pins` +- `unpin` +- `member-info` +- `channel-info` +- `channel-list` +- `react` and `reactions` when reactions are enabled in config +- `feishu_drive` comment actions: `list_comments`, `list_comment_replies`, `add_comment`, `reply_comment` + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/googlechat.md b/docs/channels/googlechat.md new file mode 100644 index 000000000..e1c126c25 --- /dev/null +++ b/docs/channels/googlechat.md @@ -0,0 +1,270 @@ +--- +summary: "Google Chat app support status, capabilities, and configuration" +read_when: + - Working on Google Chat channel features +title: "Google Chat" +--- + +# Google Chat (Chat API) + +Status: ready for DMs + spaces via Google Chat API webhooks (HTTP only). + +## Quick setup (beginner) + +1. Create a Google Cloud project and enable the **Google Chat API**. + - Go to: [Google Chat API Credentials](https://console.cloud.google.com/apis/api/chat.googleapis.com/credentials) + - Enable the API if it is not already enabled. +2. Create a **Service Account**: + - Press **Create Credentials** > **Service Account**. + - Name it whatever you want (e.g., `openclaw-chat`). + - Leave permissions blank (press **Continue**). + - Leave principals with access blank (press **Done**). +3. Create and download the **JSON Key**: + - In the list of service accounts, click on the one you just created. + - Go to the **Keys** tab. + - Click **Add Key** > **Create new key**. + - Select **JSON** and press **Create**. +4. Store the downloaded JSON file on your gateway host (e.g., `~/.openclaw/googlechat-service-account.json`). +5. Create a Google Chat app in the [Google Cloud Console Chat Configuration](https://console.cloud.google.com/apis/api/chat.googleapis.com/hangouts-chat): + - Fill in the **Application info**: + - **App name**: (e.g. `OpenClaw`) + - **Avatar URL**: (e.g. `https://openclaw.ai/logo.png`) + - **Description**: (e.g. `Personal AI Assistant`) + - Enable **Interactive features**. + - Under **Functionality**, check **Join spaces and group conversations**. + - Under **Connection settings**, select **HTTP endpoint URL**. + - Under **Triggers**, select **Use a common HTTP endpoint URL for all triggers** and set it to your gateway's public URL followed by `/googlechat`. + - _Tip: Run `openclaw status` to find your gateway's public URL._ + - Under **Visibility**, check **Make this Chat app available to specific people and groups in <Your Domain>**. + - Enter your email address (e.g. `user@example.com`) in the text box. + - Click **Save** at the bottom. +6. **Enable the app status**: + - After saving, **refresh the page**. + - Look for the **App status** section (usually near the top or bottom after saving). + - Change the status to **Live - available to users**. + - Click **Save** again. +7. Configure OpenClaw with the service account path + webhook audience: + - Env: `GOOGLE_CHAT_SERVICE_ACCOUNT_FILE=/path/to/service-account.json` + - Or config: `channels.googlechat.serviceAccountFile: "/path/to/service-account.json"`. +8. Set the webhook audience type + value (matches your Chat app config). +9. Start the gateway. Google Chat will POST to your webhook path. + +## Add to Google Chat + +Once the gateway is running and your email is added to the visibility list: + +1. Go to [Google Chat](https://chat.google.com/). +2. Click the **+** (plus) icon next to **Direct Messages**. +3. In the search bar (where you usually add people), type the **App name** you configured in the Google Cloud Console. + - **Note**: The bot will _not_ appear in the "Marketplace" browse list because it is a private app. You must search for it by name. +4. Select your bot from the results. +5. Click **Add** or **Chat** to start a 1:1 conversation. +6. Send "Hello" to trigger the assistant! + +## Public URL (Webhook-only) + +Google Chat webhooks require a public HTTPS endpoint. For security, **only expose the `/googlechat` path** to the internet. Keep the OpenClaw dashboard and other sensitive endpoints on your private network. + +### Option A: Tailscale Funnel (Recommended) + +Use Tailscale Serve for the private dashboard and Funnel for the public webhook path. This keeps `/` private while exposing only `/googlechat`. + +1. **Check what address your gateway is bound to:** + + ```bash + ss -tlnp | grep 18789 + ``` + + Note the IP address (e.g., `127.0.0.1`, `0.0.0.0`, or your Tailscale IP like `100.x.x.x`). + +2. **Expose the dashboard to the tailnet only (port 8443):** + + ```bash + # If bound to localhost (127.0.0.1 or 0.0.0.0): + tailscale serve --bg --https 8443 http://127.0.0.1:18789 + + # If bound to Tailscale IP only (e.g., 100.106.161.80): + tailscale serve --bg --https 8443 http://100.106.161.80:18789 + ``` + +3. **Expose only the webhook path publicly:** + + ```bash + # If bound to localhost (127.0.0.1 or 0.0.0.0): + tailscale funnel --bg --set-path /googlechat http://127.0.0.1:18789/googlechat + + # If bound to Tailscale IP only (e.g., 100.106.161.80): + tailscale funnel --bg --set-path /googlechat http://100.106.161.80:18789/googlechat + ``` + +4. **Authorize the node for Funnel access:** + If prompted, visit the authorization URL shown in the output to enable Funnel for this node in your tailnet policy. + +5. **Verify the configuration:** + + ```bash + tailscale serve status + tailscale funnel status + ``` + +Your public webhook URL will be: +`https://..ts.net/googlechat` + +Your private dashboard stays tailnet-only: +`https://..ts.net:8443/` + +Use the public URL (without `:8443`) in the Google Chat app config. + +> Note: This configuration persists across reboots. To remove it later, run `tailscale funnel reset` and `tailscale serve reset`. + +### Option B: Reverse Proxy (Caddy) + +If you use a reverse proxy like Caddy, only proxy the specific path: + +```caddy +your-domain.com { + reverse_proxy /googlechat* localhost:18789 +} +``` + +With this config, any request to `your-domain.com/` will be ignored or returned as 404, while `your-domain.com/googlechat` is safely routed to OpenClaw. + +### Option C: Cloudflare Tunnel + +Configure your tunnel's ingress rules to only route the webhook path: + +- **Path**: `/googlechat` -> `http://localhost:18789/googlechat` +- **Default Rule**: HTTP 404 (Not Found) + +## How it works + +1. Google Chat sends webhook POSTs to the gateway. Each request includes an `Authorization: Bearer ` header. + - OpenClaw verifies bearer auth before reading/parsing full webhook bodies when the header is present. + - Google Workspace Add-on requests that carry `authorizationEventObject.systemIdToken` in the body are supported via a stricter pre-auth body budget. +2. OpenClaw verifies the token against the configured `audienceType` + `audience`: + - `audienceType: "app-url"` → audience is your HTTPS webhook URL. + - `audienceType: "project-number"` → audience is the Cloud project number. +3. Messages are routed by space: + - DMs use session key `agent::googlechat:direct:`. + - Spaces use session key `agent::googlechat:group:`. +4. DM access is pairing by default. Unknown senders receive a pairing code; approve with: + - `openclaw pairing approve googlechat ` +5. Group spaces require @-mention by default. Use `botUser` if mention detection needs the app’s user name. + +## Targets + +Use these identifiers for delivery and allowlists: + +- Direct messages: `users/` (recommended). +- Raw email `name@example.com` is mutable and only used for direct allowlist matching when `channels.googlechat.dangerouslyAllowNameMatching: true`. +- Deprecated: `users/` is treated as a user id, not an email allowlist. +- Spaces: `spaces/`. + +## Config highlights + +```json5 +{ + channels: { + googlechat: { + enabled: true, + serviceAccountFile: "/path/to/service-account.json", + // or serviceAccountRef: { source: "file", provider: "filemain", id: "/channels/googlechat/serviceAccount" } + audienceType: "app-url", + audience: "https://gateway.example.com/googlechat", + webhookPath: "/googlechat", + botUser: "users/1234567890", // optional; helps mention detection + dm: { + policy: "pairing", + allowFrom: ["users/1234567890"], + }, + groupPolicy: "allowlist", + groups: { + "spaces/AAAA": { + allow: true, + requireMention: true, + users: ["users/1234567890"], + systemPrompt: "Short answers only.", + }, + }, + actions: { reactions: true }, + typingIndicator: "message", + mediaMaxMb: 20, + }, + }, +} +``` + +Notes: + +- Service account credentials can also be passed inline with `serviceAccount` (JSON string). +- `serviceAccountRef` is also supported (env/file SecretRef), including per-account refs under `channels.googlechat.accounts..serviceAccountRef`. +- Default webhook path is `/googlechat` if `webhookPath` isn’t set. +- `dangerouslyAllowNameMatching` re-enables mutable email principal matching for allowlists (break-glass compatibility mode). +- Reactions are available via the `reactions` tool and `channels action` when `actions.reactions` is enabled. +- Message actions expose `send` for text and `upload-file` for explicit attachment sends. `upload-file` accepts `media` / `filePath` / `path` plus optional `message`, `filename`, and thread targeting. +- `typingIndicator` supports `none`, `message` (default), and `reaction` (reaction requires user OAuth). +- Attachments are downloaded through the Chat API and stored in the media pipeline (size capped by `mediaMaxMb`). + +Secrets reference details: [Secrets Management](/gateway/secrets). + +## Troubleshooting + +### 405 Method Not Allowed + +If Google Cloud Logs Explorer shows errors like: + +``` +status code: 405, reason phrase: HTTP error response: HTTP/1.1 405 Method Not Allowed +``` + +This means the webhook handler isn't registered. Common causes: + +1. **Channel not configured**: The `channels.googlechat` section is missing from your config. Verify with: + + ```bash + openclaw config get channels.googlechat + ``` + + If it returns "Config path not found", add the configuration (see [Config highlights](#config-highlights)). + +2. **Plugin not enabled**: Check plugin status: + + ```bash + openclaw plugins list | grep googlechat + ``` + + If it shows "disabled", add `plugins.entries.googlechat.enabled: true` to your config. + +3. **Gateway not restarted**: After adding config, restart the gateway: + + ```bash + openclaw gateway restart + ``` + +Verify the channel is running: + +```bash +openclaw channels status +# Should show: Google Chat default: enabled, configured, ... +``` + +### Other issues + +- Check `openclaw channels status --probe` for auth errors or missing audience config. +- If no messages arrive, confirm the Chat app's webhook URL + event subscriptions. +- If mention gating blocks replies, set `botUser` to the app's user resource name and verify `requireMention`. +- Use `openclaw logs --follow` while sending a test message to see if requests reach the gateway. + +Related docs: + +- [Gateway configuration](/gateway/configuration) +- [Security](/gateway/security) +- [Reactions](/tools/reactions) + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/group-messages.md b/docs/channels/group-messages.md new file mode 100644 index 000000000..f62842ab8 --- /dev/null +++ b/docs/channels/group-messages.md @@ -0,0 +1,84 @@ +--- +summary: "Behavior and config for WhatsApp group message handling (mentionPatterns are shared across surfaces)" +read_when: + - Changing group message rules or mentions +title: "Group Messages" +--- + +# Group messages (WhatsApp web channel) + +Goal: let Clawd sit in WhatsApp groups, wake up only when pinged, and keep that thread separate from the personal DM session. + +Note: `agents.list[].groupChat.mentionPatterns` is now used by Telegram/Discord/Slack/iMessage as well; this doc focuses on WhatsApp-specific behavior. For multi-agent setups, set `agents.list[].groupChat.mentionPatterns` per agent (or use `messages.groupChat.mentionPatterns` as a global fallback). + +## Current implementation (2025-12-03) + +- Activation modes: `mention` (default) or `always`. `mention` requires a ping (real WhatsApp @-mentions via `mentionedJids`, safe regex patterns, or the bot’s E.164 anywhere in the text). `always` wakes the agent on every message but it should reply only when it can add meaningful value; otherwise it returns the exact silent token `NO_REPLY` / `no_reply`. Defaults can be set in config (`channels.whatsapp.groups`) and overridden per group via `/activation`. When `channels.whatsapp.groups` is set, it also acts as a group allowlist (include `"*"` to allow all). +- Group policy: `channels.whatsapp.groupPolicy` controls whether group messages are accepted (`open|disabled|allowlist`). `allowlist` uses `channels.whatsapp.groupAllowFrom` (fallback: explicit `channels.whatsapp.allowFrom`). Default is `allowlist` (blocked until you add senders). +- Per-group sessions: session keys look like `agent::whatsapp:group:` so commands such as `/verbose on` or `/think high` (sent as standalone messages) are scoped to that group; personal DM state is untouched. Heartbeats are skipped for group threads. +- Context injection: **pending-only** group messages (default 50) that _did not_ trigger a run are prefixed under `[Chat messages since your last reply - for context]`, with the triggering line under `[Current message - respond to this]`. Messages already in the session are not re-injected. +- Sender surfacing: every group batch now ends with `[from: Sender Name (+E164)]` so Pi knows who is speaking. +- Ephemeral/view-once: we unwrap those before extracting text/mentions, so pings inside them still trigger. +- Group system prompt: on the first turn of a group session (and whenever `/activation` changes the mode) we inject a short blurb into the system prompt like `You are replying inside the WhatsApp group "". Group members: Alice (+44...), Bob (+43...), … Activation: trigger-only … Address the specific sender noted in the message context.` If metadata isn’t available we still tell the agent it’s a group chat. + +## Config example (WhatsApp) + +Add a `groupChat` block to `~/.openclaw/openclaw.json` so display-name pings work even when WhatsApp strips the visual `@` in the text body: + +```json5 +{ + channels: { + whatsapp: { + groups: { + "*": { requireMention: true }, + }, + }, + }, + agents: { + list: [ + { + id: "main", + groupChat: { + historyLimit: 50, + mentionPatterns: ["@?openclaw", "\\+?15555550123"], + }, + }, + ], + }, +} +``` + +Notes: + +- The regexes are case-insensitive and use the same safe-regex guardrails as other config regex surfaces; invalid patterns and unsafe nested repetition are ignored. +- WhatsApp still sends canonical mentions via `mentionedJids` when someone taps the contact, so the number fallback is rarely needed but is a useful safety net. + +### Activation command (owner-only) + +Use the group chat command: + +- `/activation mention` +- `/activation always` + +Only the owner number (from `channels.whatsapp.allowFrom`, or the bot’s own E.164 when unset) can change this. Send `/status` as a standalone message in the group to see the current activation mode. + +## How to use + +1. Add your WhatsApp account (the one running OpenClaw) to the group. +2. Say `@openclaw …` (or include the number). Only allowlisted senders can trigger it unless you set `groupPolicy: "open"`. +3. The agent prompt will include recent group context plus the trailing `[from: …]` marker so it can address the right person. +4. Session-level directives (`/verbose on`, `/think high`, `/new` or `/reset`, `/compact`) apply only to that group’s session; send them as standalone messages so they register. Your personal DM session remains independent. + +## Testing / verification + +- Manual smoke: + - Send an `@openclaw` ping in the group and confirm a reply that references the sender name. + - Send a second ping and verify the history block is included then cleared on the next turn. +- Check gateway logs (run with `--verbose`) to see `inbound web message` entries showing `from: ` and the `[from: …]` suffix. + +## Known considerations + +- Heartbeats are intentionally skipped for groups to avoid noisy broadcasts. +- Echo suppression uses the combined batch string; if you send identical text twice without mentions, only the first will get a response. +- Session store entries will appear as `agent::whatsapp:group:` in the session store (`~/.openclaw/agents//sessions/sessions.json` by default); a missing entry just means the group hasn’t triggered a run yet. +- Typing indicators in groups follow `agents.defaults.typingMode` (default: `message` when unmentioned). diff --git a/docs/channels/groups.md b/docs/channels/groups.md new file mode 100644 index 000000000..fd0731f93 --- /dev/null +++ b/docs/channels/groups.md @@ -0,0 +1,410 @@ +--- +summary: "Group chat behavior across surfaces (Discord/iMessage/Matrix/Microsoft Teams/Signal/Slack/Telegram/WhatsApp/Zalo)" +read_when: + - Changing group chat behavior or mention gating +title: "Groups" +--- + +# Groups + +OpenClaw treats group chats consistently across surfaces: Discord, iMessage, Matrix, Microsoft Teams, Signal, Slack, Telegram, WhatsApp, Zalo. + +## Beginner intro (2 minutes) + +OpenClaw “lives” on your own messaging accounts. There is no separate WhatsApp bot user. +If **you** are in a group, OpenClaw can see that group and respond there. + +Default behavior: + +- Groups are restricted (`groupPolicy: "allowlist"`). +- Replies require a mention unless you explicitly disable mention gating. + +Translation: allowlisted senders can trigger OpenClaw by mentioning it. + +> TL;DR +> +> - **DM access** is controlled by `*.allowFrom`. +> - **Group access** is controlled by `*.groupPolicy` + allowlists (`*.groups`, `*.groupAllowFrom`). +> - **Reply triggering** is controlled by mention gating (`requireMention`, `/activation`). + +Quick flow (what happens to a group message): + +``` +groupPolicy? disabled -> drop +groupPolicy? allowlist -> group allowed? no -> drop +requireMention? yes -> mentioned? no -> store for context only +otherwise -> reply +``` + +## Context visibility and allowlists + +Two different controls are involved in group safety: + +- **Trigger authorization**: who can trigger the agent (`groupPolicy`, `groups`, `groupAllowFrom`, channel-specific allowlists). +- **Context visibility**: what supplemental context is injected into the model (reply text, quotes, thread history, forwarded metadata). + +By default, OpenClaw prioritizes normal chat behavior and keeps context mostly as received. This means allowlists primarily decide who can trigger actions, not a universal redaction boundary for every quoted or historical snippet. + +Current behavior is channel-specific: + +- Some channels already apply sender-based filtering for supplemental context in specific paths (for example Slack thread seeding, Matrix reply/thread lookups). +- Other channels still pass quote/reply/forward context through as received. + +Hardening direction (planned): + +- `contextVisibility: "all"` (default) keeps current as-received behavior. +- `contextVisibility: "allowlist"` filters supplemental context to allowlisted senders. +- `contextVisibility: "allowlist_quote"` is `allowlist` plus one explicit quote/reply exception. + +Until this hardening model is implemented consistently across channels, expect differences by surface. + +![Group message flow](/images/groups-flow.svg) + +If you want... + +| Goal | What to set | +| -------------------------------------------- | ---------------------------------------------------------- | +| Allow all groups but only reply on @mentions | `groups: { "*": { requireMention: true } }` | +| Disable all group replies | `groupPolicy: "disabled"` | +| Only specific groups | `groups: { "": { ... } }` (no `"*"` key) | +| Only you can trigger in groups | `groupPolicy: "allowlist"`, `groupAllowFrom: ["+1555..."]` | + +## Session keys + +- Group sessions use `agent:::group:` session keys (rooms/channels use `agent:::channel:`). +- Telegram forum topics add `:topic:` to the group id so each topic has its own session. +- Direct chats use the main session (or per-sender if configured). +- Heartbeats are skipped for group sessions. + + + +## Pattern: personal DMs + public groups (single agent) + +Yes — this works well if your “personal” traffic is **DMs** and your “public” traffic is **groups**. + +Why: in single-agent mode, DMs typically land in the **main** session key (`agent:main:main`), while groups always use **non-main** session keys (`agent:main::group:`). If you enable sandboxing with `mode: "non-main"`, those group sessions run in Docker while your main DM session stays on-host. + +This gives you one agent “brain” (shared workspace + memory), but two execution postures: + +- **DMs**: full tools (host) +- **Groups**: sandbox + restricted tools (Docker) + +> If you need truly separate workspaces/personas (“personal” and “public” must never mix), use a second agent + bindings. See [Multi-Agent Routing](/concepts/multi-agent). + +Example (DMs on host, groups sandboxed + messaging-only tools): + +```json5 +{ + agents: { + defaults: { + sandbox: { + mode: "non-main", // groups/channels are non-main -> sandboxed + scope: "session", // strongest isolation (one container per group/channel) + workspaceAccess: "none", + }, + }, + }, + tools: { + sandbox: { + tools: { + // If allow is non-empty, everything else is blocked (deny still wins). + allow: ["group:messaging", "group:sessions"], + deny: ["group:runtime", "group:fs", "group:ui", "nodes", "cron", "gateway"], + }, + }, + }, +} +``` + +Want “groups can only see folder X” instead of “no host access”? Keep `workspaceAccess: "none"` and mount only allowlisted paths into the sandbox: + +```json5 +{ + agents: { + defaults: { + sandbox: { + mode: "non-main", + scope: "session", + workspaceAccess: "none", + docker: { + binds: [ + // hostPath:containerPath:mode + "/home/user/FriendsShared:/data:ro", + ], + }, + }, + }, + }, +} +``` + +Related: + +- Configuration keys and defaults: [Gateway configuration](/gateway/configuration-reference#agentsdefaultssandbox) +- Debugging why a tool is blocked: [Sandbox vs Tool Policy vs Elevated](/gateway/sandbox-vs-tool-policy-vs-elevated) +- Bind mounts details: [Sandboxing](/gateway/sandboxing#custom-bind-mounts) + +## Display labels + +- UI labels use `displayName` when available, formatted as `:`. +- `#room` is reserved for rooms/channels; group chats use `g-` (lowercase, spaces -> `-`, keep `#@+._-`). + +## Group policy + +Control how group/room messages are handled per channel: + +```json5 +{ + channels: { + whatsapp: { + groupPolicy: "disabled", // "open" | "disabled" | "allowlist" + groupAllowFrom: ["+15551234567"], + }, + telegram: { + groupPolicy: "disabled", + groupAllowFrom: ["123456789"], // numeric Telegram user id (wizard can resolve @username) + }, + signal: { + groupPolicy: "disabled", + groupAllowFrom: ["+15551234567"], + }, + imessage: { + groupPolicy: "disabled", + groupAllowFrom: ["chat_id:123"], + }, + msteams: { + groupPolicy: "disabled", + groupAllowFrom: ["user@org.com"], + }, + discord: { + groupPolicy: "allowlist", + guilds: { + GUILD_ID: { channels: { help: { allow: true } } }, + }, + }, + slack: { + groupPolicy: "allowlist", + channels: { "#general": { allow: true } }, + }, + matrix: { + groupPolicy: "allowlist", + groupAllowFrom: ["@owner:example.org"], + groups: { + "!roomId:example.org": { allow: true }, + "#alias:example.org": { allow: true }, + }, + }, + }, +} +``` + +| Policy | Behavior | +| ------------- | ------------------------------------------------------------ | +| `"open"` | Groups bypass allowlists; mention-gating still applies. | +| `"disabled"` | Block all group messages entirely. | +| `"allowlist"` | Only allow groups/rooms that match the configured allowlist. | + +Notes: + +- `groupPolicy` is separate from mention-gating (which requires @mentions). +- WhatsApp/Telegram/Signal/iMessage/Microsoft Teams/Zalo: use `groupAllowFrom` (fallback: explicit `allowFrom`). +- DM pairing approvals (`*-allowFrom` store entries) apply to DM access only; group sender authorization stays explicit to group allowlists. +- Discord: allowlist uses `channels.discord.guilds..channels`. +- Slack: allowlist uses `channels.slack.channels`. +- Matrix: allowlist uses `channels.matrix.groups`. Prefer room IDs or aliases; joined-room name lookup is best-effort, and unresolved names are ignored at runtime. Use `channels.matrix.groupAllowFrom` to restrict senders; per-room `users` allowlists are also supported. +- Group DMs are controlled separately (`channels.discord.dm.*`, `channels.slack.dm.*`). +- Telegram allowlist can match user IDs (`"123456789"`, `"telegram:123456789"`, `"tg:123456789"`) or usernames (`"@alice"` or `"alice"`); prefixes are case-insensitive. +- Default is `groupPolicy: "allowlist"`; if your group allowlist is empty, group messages are blocked. +- Runtime safety: when a provider block is completely missing (`channels.` absent), group policy falls back to a fail-closed mode (typically `allowlist`) instead of inheriting `channels.defaults.groupPolicy`. + +Quick mental model (evaluation order for group messages): + +1. `groupPolicy` (open/disabled/allowlist) +2. group allowlists (`*.groups`, `*.groupAllowFrom`, channel-specific allowlist) +3. mention gating (`requireMention`, `/activation`) + +## Mention gating (default) + +Group messages require a mention unless overridden per group. Defaults live per subsystem under `*.groups."*"`. + +Replying to a bot message counts as an implicit mention (when the channel supports reply metadata). This applies to Telegram, WhatsApp, Slack, Discord, and Microsoft Teams. + +```json5 +{ + channels: { + whatsapp: { + groups: { + "*": { requireMention: true }, + "123@g.us": { requireMention: false }, + }, + }, + telegram: { + groups: { + "*": { requireMention: true }, + "123456789": { requireMention: false }, + }, + }, + imessage: { + groups: { + "*": { requireMention: true }, + "123": { requireMention: false }, + }, + }, + }, + agents: { + list: [ + { + id: "main", + groupChat: { + mentionPatterns: ["@openclaw", "openclaw", "\\+15555550123"], + historyLimit: 50, + }, + }, + ], + }, +} +``` + +Notes: + +- `mentionPatterns` are case-insensitive safe regex patterns; invalid patterns and unsafe nested-repetition forms are ignored. +- Surfaces that provide explicit mentions still pass; patterns are a fallback. +- Per-agent override: `agents.list[].groupChat.mentionPatterns` (useful when multiple agents share a group). +- Mention gating is only enforced when mention detection is possible (native mentions or `mentionPatterns` are configured). +- Discord defaults live in `channels.discord.guilds."*"` (overridable per guild/channel). +- Group history context is wrapped uniformly across channels and is **pending-only** (messages skipped due to mention gating); use `messages.groupChat.historyLimit` for the global default and `channels..historyLimit` (or `channels..accounts.*.historyLimit`) for overrides. Set `0` to disable. + +## Group/channel tool restrictions (optional) + +Some channel configs support restricting which tools are available **inside a specific group/room/channel**. + +- `tools`: allow/deny tools for the whole group. +- `toolsBySender`: per-sender overrides within the group. + Use explicit key prefixes: + `id:`, `e164:`, `username:`, `name:`, and `"*"` wildcard. + Legacy unprefixed keys are still accepted and matched as `id:` only. + +Resolution order (most specific wins): + +1. group/channel `toolsBySender` match +2. group/channel `tools` +3. default (`"*"`) `toolsBySender` match +4. default (`"*"`) `tools` + +Example (Telegram): + +```json5 +{ + channels: { + telegram: { + groups: { + "*": { tools: { deny: ["exec"] } }, + "-1001234567890": { + tools: { deny: ["exec", "read", "write"] }, + toolsBySender: { + "id:123456789": { alsoAllow: ["exec"] }, + }, + }, + }, + }, + }, +} +``` + +Notes: + +- Group/channel tool restrictions are applied in addition to global/agent tool policy (deny still wins). +- Some channels use different nesting for rooms/channels (e.g., Discord `guilds.*.channels.*`, Slack `channels.*`, Microsoft Teams `teams.*.channels.*`). + +## Group allowlists + +When `channels.whatsapp.groups`, `channels.telegram.groups`, or `channels.imessage.groups` is configured, the keys act as a group allowlist. Use `"*"` to allow all groups while still setting default mention behavior. + +Common confusion: DM pairing approval is not the same as group authorization. +For channels that support DM pairing, the pairing store unlocks DMs only. Group commands still require explicit group sender authorization from config allowlists such as `groupAllowFrom` or the documented config fallback for that channel. + +Common intents (copy/paste): + +1. Disable all group replies + +```json5 +{ + channels: { whatsapp: { groupPolicy: "disabled" } }, +} +``` + +2. Allow only specific groups (WhatsApp) + +```json5 +{ + channels: { + whatsapp: { + groups: { + "123@g.us": { requireMention: true }, + "456@g.us": { requireMention: false }, + }, + }, + }, +} +``` + +3. Allow all groups but require mention (explicit) + +```json5 +{ + channels: { + whatsapp: { + groups: { "*": { requireMention: true } }, + }, + }, +} +``` + +4. Only the owner can trigger in groups (WhatsApp) + +```json5 +{ + channels: { + whatsapp: { + groupPolicy: "allowlist", + groupAllowFrom: ["+15551234567"], + groups: { "*": { requireMention: true } }, + }, + }, +} +``` + +## Activation (owner-only) + +Group owners can toggle per-group activation: + +- `/activation mention` +- `/activation always` + +Owner is determined by `channels.whatsapp.allowFrom` (or the bot’s self E.164 when unset). Send the command as a standalone message. Other surfaces currently ignore `/activation`. + +## Context fields + +Group inbound payloads set: + +- `ChatType=group` +- `GroupSubject` (if known) +- `GroupMembers` (if known) +- `WasMentioned` (mention gating result) +- Telegram forum topics also include `MessageThreadId` and `IsForum`. + +Channel specific notes: + +- BlueBubbles can optionally enrich unnamed macOS group participants from the local Contacts database before populating `GroupMembers`. This is off by default and only runs after normal group gating passes. + +The agent system prompt includes a group intro on the first turn of a new group session. It reminds the model to respond like a human, avoid Markdown tables, and avoid typing literal `\n` sequences. + +## iMessage specifics + +- Prefer `chat_id:` when routing or allowlisting. +- List chats: `imsg chats --limit 20`. +- Group replies always go back to the same `chat_id`. + +## WhatsApp specifics + +See [Group messages](/channels/group-messages) for WhatsApp-only behavior (history injection, mention handling details). diff --git a/docs/channels/imessage.md b/docs/channels/imessage.md new file mode 100644 index 000000000..c7f5c9378 --- /dev/null +++ b/docs/channels/imessage.md @@ -0,0 +1,427 @@ +--- +summary: "Legacy iMessage support via imsg (JSON-RPC over stdio). New setups should use BlueBubbles." +read_when: + - Setting up iMessage support + - Debugging iMessage send/receive +title: "iMessage" +--- + +# iMessage (legacy: imsg) + + +For new iMessage deployments, use BlueBubbles. + +The `imsg` integration is legacy and may be removed in a future release. + + +Status: legacy external CLI integration. Gateway spawns `imsg rpc` and communicates over JSON-RPC on stdio (no separate daemon/port). + + + + Preferred iMessage path for new setups. + + + iMessage DMs default to pairing mode. + + + Full iMessage field reference. + + + +## Quick setup + + + + + + +```bash +brew install steipete/tap/imsg +imsg rpc --help +``` + + + + + +```json5 +{ + channels: { + imessage: { + enabled: true, + cliPath: "/usr/local/bin/imsg", + dbPath: "/Users//Library/Messages/chat.db", + }, + }, +} +``` + + + + + +```bash +openclaw gateway +``` + + + + + +```bash +openclaw pairing list imessage +openclaw pairing approve imessage +``` + + Pairing requests expire after 1 hour. + + + + + + + OpenClaw only requires a stdio-compatible `cliPath`, so you can point `cliPath` at a wrapper script that SSHes to a remote Mac and runs `imsg`. + +```bash +#!/usr/bin/env bash +exec ssh -T gateway-host imsg "$@" +``` + + Recommended config when attachments are enabled: + +```json5 +{ + channels: { + imessage: { + enabled: true, + cliPath: "~/.openclaw/scripts/imsg-ssh", + remoteHost: "user@gateway-host", // used for SCP attachment fetches + includeAttachments: true, + // Optional: override allowed attachment roots. + // Defaults include /Users/*/Library/Messages/Attachments + attachmentRoots: ["/Users/*/Library/Messages/Attachments"], + remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"], + }, + }, +} +``` + + If `remoteHost` is not set, OpenClaw attempts to auto-detect it by parsing the SSH wrapper script. + `remoteHost` must be `host` or `user@host` (no spaces or SSH options). + OpenClaw uses strict host-key checking for SCP, so the relay host key must already exist in `~/.ssh/known_hosts`. + Attachment paths are validated against allowed roots (`attachmentRoots` / `remoteAttachmentRoots`). + + + + +## Requirements and permissions (macOS) + +- Messages must be signed in on the Mac running `imsg`. +- Full Disk Access is required for the process context running OpenClaw/`imsg` (Messages DB access). +- Automation permission is required to send messages through Messages.app. + + +Permissions are granted per process context. If gateway runs headless (LaunchAgent/SSH), run a one-time interactive command in that same context to trigger prompts: + +```bash +imsg chats --limit 1 +# or +imsg send "test" +``` + + + +## Access control and routing + + + + `channels.imessage.dmPolicy` controls direct messages: + + - `pairing` (default) + - `allowlist` + - `open` (requires `allowFrom` to include `"*"`) + - `disabled` + + Allowlist field: `channels.imessage.allowFrom`. + + Allowlist entries can be handles or chat targets (`chat_id:*`, `chat_guid:*`, `chat_identifier:*`). + + + + + `channels.imessage.groupPolicy` controls group handling: + + - `allowlist` (default when configured) + - `open` + - `disabled` + + Group sender allowlist: `channels.imessage.groupAllowFrom`. + + Runtime fallback: if `groupAllowFrom` is unset, iMessage group sender checks fall back to `allowFrom` when available. + Runtime note: if `channels.imessage` is completely missing, runtime falls back to `groupPolicy="allowlist"` and logs a warning (even if `channels.defaults.groupPolicy` is set). + + Mention gating for groups: + + - iMessage has no native mention metadata + - mention detection uses regex patterns (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`) + - with no configured patterns, mention gating cannot be enforced + + Control commands from authorized senders can bypass mention gating in groups. + + + + + - DMs use direct routing; groups use group routing. + - With default `session.dmScope=main`, iMessage DMs collapse into the agent main session. + - Group sessions are isolated (`agent::imessage:group:`). + - Replies route back to iMessage using originating channel/target metadata. + + Group-ish thread behavior: + + Some multi-participant iMessage threads can arrive with `is_group=false`. + If that `chat_id` is explicitly configured under `channels.imessage.groups`, OpenClaw treats it as group traffic (group gating + group session isolation). + + + + +## ACP conversation bindings + +Legacy iMessage chats can also be bound to ACP sessions. + +Fast operator flow: + +- Run `/acp spawn codex --bind here` inside the DM or allowed group chat. +- Future messages in that same iMessage conversation route to the spawned ACP session. +- `/new` and `/reset` reset the same bound ACP session in place. +- `/acp close` closes the ACP session and removes the binding. + +Configured persistent bindings are supported through top-level `bindings[]` entries with `type: "acp"` and `match.channel: "imessage"`. + +`match.peer.id` can use: + +- normalized DM handle such as `+15555550123` or `user@example.com` +- `chat_id:` (recommended for stable group bindings) +- `chat_guid:` +- `chat_identifier:` + +Example: + +```json5 +{ + agents: { + list: [ + { + id: "codex", + runtime: { + type: "acp", + acp: { agent: "codex", backend: "acpx", mode: "persistent" }, + }, + }, + ], + }, + bindings: [ + { + type: "acp", + agentId: "codex", + match: { + channel: "imessage", + accountId: "default", + peer: { kind: "group", id: "chat_id:123" }, + }, + acp: { label: "codex-group" }, + }, + ], +} +``` + +See [ACP Agents](/tools/acp-agents) for shared ACP binding behavior. + +## Deployment patterns + + + + Use a dedicated Apple ID and macOS user so bot traffic is isolated from your personal Messages profile. + + Typical flow: + + 1. Create/sign in a dedicated macOS user. + 2. Sign into Messages with the bot Apple ID in that user. + 3. Install `imsg` in that user. + 4. Create SSH wrapper so OpenClaw can run `imsg` in that user context. + 5. Point `channels.imessage.accounts..cliPath` and `.dbPath` to that user profile. + + First run may require GUI approvals (Automation + Full Disk Access) in that bot user session. + + + + + Common topology: + + - gateway runs on Linux/VM + - iMessage + `imsg` runs on a Mac in your tailnet + - `cliPath` wrapper uses SSH to run `imsg` + - `remoteHost` enables SCP attachment fetches + + Example: + +```json5 +{ + channels: { + imessage: { + enabled: true, + cliPath: "~/.openclaw/scripts/imsg-ssh", + remoteHost: "bot@mac-mini.tailnet-1234.ts.net", + includeAttachments: true, + dbPath: "/Users/bot/Library/Messages/chat.db", + }, + }, +} +``` + +```bash +#!/usr/bin/env bash +exec ssh -T bot@mac-mini.tailnet-1234.ts.net imsg "$@" +``` + + Use SSH keys so both SSH and SCP are non-interactive. + Ensure the host key is trusted first (for example `ssh bot@mac-mini.tailnet-1234.ts.net`) so `known_hosts` is populated. + + + + + iMessage supports per-account config under `channels.imessage.accounts`. + + Each account can override fields such as `cliPath`, `dbPath`, `allowFrom`, `groupPolicy`, `mediaMaxMb`, history settings, and attachment root allowlists. + + + + +## Media, chunking, and delivery targets + + + + - inbound attachment ingestion is optional: `channels.imessage.includeAttachments` + - remote attachment paths can be fetched via SCP when `remoteHost` is set + - attachment paths must match allowed roots: + - `channels.imessage.attachmentRoots` (local) + - `channels.imessage.remoteAttachmentRoots` (remote SCP mode) + - default root pattern: `/Users/*/Library/Messages/Attachments` + - SCP uses strict host-key checking (`StrictHostKeyChecking=yes`) + - outbound media size uses `channels.imessage.mediaMaxMb` (default 16 MB) + + + + - text chunk limit: `channels.imessage.textChunkLimit` (default 4000) + - chunk mode: `channels.imessage.chunkMode` + - `length` (default) + - `newline` (paragraph-first splitting) + + + + Preferred explicit targets: + + - `chat_id:123` (recommended for stable routing) + - `chat_guid:...` + - `chat_identifier:...` + + Handle targets are also supported: + + - `imessage:+1555...` + - `sms:+1555...` + - `user@example.com` + +```bash +imsg chats --limit 20 +``` + + + + +## Config writes + +iMessage allows channel-initiated config writes by default (for `/config set|unset` when `commands.config: true`). + +Disable: + +```json5 +{ + channels: { + imessage: { + configWrites: false, + }, + }, +} +``` + +## Troubleshooting + + + + Validate the binary and RPC support: + +```bash +imsg rpc --help +openclaw channels status --probe +``` + + If probe reports RPC unsupported, update `imsg`. + + + + + Check: + + - `channels.imessage.dmPolicy` + - `channels.imessage.allowFrom` + - pairing approvals (`openclaw pairing list imessage`) + + + + + Check: + + - `channels.imessage.groupPolicy` + - `channels.imessage.groupAllowFrom` + - `channels.imessage.groups` allowlist behavior + - mention pattern configuration (`agents.list[].groupChat.mentionPatterns`) + + + + + Check: + + - `channels.imessage.remoteHost` + - `channels.imessage.remoteAttachmentRoots` + - SSH/SCP key auth from the gateway host + - host key exists in `~/.ssh/known_hosts` on the gateway host + - remote path readability on the Mac running Messages + + + + + Re-run in an interactive GUI terminal in the same user/session context and approve prompts: + +```bash +imsg chats --limit 1 +imsg send "test" +``` + + Confirm Full Disk Access + Automation are granted for the process context that runs OpenClaw/`imsg`. + + + + +## Configuration reference pointers + +- [Configuration reference - iMessage](/gateway/configuration-reference#imessage) +- [Gateway configuration](/gateway/configuration) +- [Pairing](/channels/pairing) +- [BlueBubbles](/channels/bluebubbles) + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/index.md b/docs/channels/index.md new file mode 100644 index 000000000..afa0c69fd --- /dev/null +++ b/docs/channels/index.md @@ -0,0 +1,50 @@ +--- +summary: "Messaging platforms OpenClaw can connect to" +read_when: + - You want to choose a chat channel for OpenClaw + - You need a quick overview of supported messaging platforms +title: "Chat Channels" +--- + +# Chat Channels + +OpenClaw can talk to you on any chat app you already use. Each channel connects via the Gateway. +Text is supported everywhere; media and reactions vary by channel. + +## Supported channels + +- [BlueBubbles](/channels/bluebubbles) — **Recommended for iMessage**; uses the BlueBubbles macOS server REST API with full feature support (bundled plugin; edit, unsend, effects, reactions, group management — edit currently broken on macOS 26 Tahoe). +- [Discord](/channels/discord) — Discord Bot API + Gateway; supports servers, channels, and DMs. +- [Feishu](/channels/feishu) — Feishu/Lark bot via WebSocket (bundled plugin). +- [Google Chat](/channels/googlechat) — Google Chat API app via HTTP webhook. +- [iMessage (legacy)](/channels/imessage) — Legacy macOS integration via imsg CLI (deprecated, use BlueBubbles for new setups). +- [IRC](/channels/irc) — Classic IRC servers; channels + DMs with pairing/allowlist controls. +- [LINE](/channels/line) — LINE Messaging API bot (bundled plugin). +- [Matrix](/channels/matrix) — Matrix protocol (bundled plugin). +- [Mattermost](/channels/mattermost) — Bot API + WebSocket; channels, groups, DMs (bundled plugin). +- [Microsoft Teams](/channels/msteams) — Bot Framework; enterprise support (bundled plugin). +- [Nextcloud Talk](/channels/nextcloud-talk) — Self-hosted chat via Nextcloud Talk (bundled plugin). +- [Nostr](/channels/nostr) — Decentralized DMs via NIP-04 (bundled plugin). +- [QQ Bot](/channels/qqbot) — QQ Bot API; private chat, group chat, and rich media (bundled plugin). +- [Signal](/channels/signal) — signal-cli; privacy-focused. +- [Slack](/channels/slack) — Bolt SDK; workspace apps. +- [Synology Chat](/channels/synology-chat) — Synology NAS Chat via outgoing+incoming webhooks (bundled plugin). +- [Telegram](/channels/telegram) — Bot API via grammY; supports groups. +- [Tlon](/channels/tlon) — Urbit-based messenger (bundled plugin). +- [Twitch](/channels/twitch) — Twitch chat via IRC connection (bundled plugin). +- [Voice Call](/plugins/voice-call) — Telephony via Plivo or Twilio (plugin, installed separately). +- [WebChat](/web/webchat) — Gateway WebChat UI over WebSocket. +- [WeChat](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin) — Tencent iLink Bot plugin via QR login; private chats only. +- [WhatsApp](/channels/whatsapp) — Most popular; uses Baileys and requires QR pairing. +- [Zalo](/channels/zalo) — Zalo Bot API; Vietnam's popular messenger (bundled plugin). +- [Zalo Personal](/channels/zalouser) — Zalo personal account via QR login (bundled plugin). + +## Notes + +- Channels can run simultaneously; configure multiple and OpenClaw will route per chat. +- Fastest setup is usually **Telegram** (simple bot token). WhatsApp requires QR pairing and + stores more state on disk. +- Group behavior varies by channel; see [Groups](/channels/groups). +- DM pairing and allowlists are enforced for safety; see [Security](/gateway/security). +- Troubleshooting: [Channel troubleshooting](/channels/troubleshooting). +- Model providers are documented separately; see [Model Providers](/providers/models). diff --git a/docs/channels/irc.md b/docs/channels/irc.md new file mode 100644 index 000000000..2dfefeba1 --- /dev/null +++ b/docs/channels/irc.md @@ -0,0 +1,250 @@ +--- +title: IRC +summary: "IRC plugin setup, access controls, and troubleshooting" +read_when: + - You want to connect OpenClaw to IRC channels or DMs + - You are configuring IRC allowlists, group policy, or mention gating +--- + +# IRC + +Use IRC when you want OpenClaw in classic channels (`#room`) and direct messages. +IRC ships as an extension plugin, but it is configured in the main config under `channels.irc`. + +## Quick start + +1. Enable IRC config in `~/.openclaw/openclaw.json`. +2. Set at least: + +```json5 +{ + channels: { + irc: { + enabled: true, + host: "irc.libera.chat", + port: 6697, + tls: true, + nick: "openclaw-bot", + channels: ["#openclaw"], + }, + }, +} +``` + +3. Start/restart gateway: + +```bash +openclaw gateway run +``` + +## Security defaults + +- `channels.irc.dmPolicy` defaults to `"pairing"`. +- `channels.irc.groupPolicy` defaults to `"allowlist"`. +- With `groupPolicy="allowlist"`, set `channels.irc.groups` to define allowed channels. +- Use TLS (`channels.irc.tls=true`) unless you intentionally accept plaintext transport. + +## Access control + +There are two separate “gates” for IRC channels: + +1. **Channel access** (`groupPolicy` + `groups`): whether the bot accepts messages from a channel at all. +2. **Sender access** (`groupAllowFrom` / per-channel `groups["#channel"].allowFrom`): who is allowed to trigger the bot inside that channel. + +Config keys: + +- DM allowlist (DM sender access): `channels.irc.allowFrom` +- Group sender allowlist (channel sender access): `channels.irc.groupAllowFrom` +- Per-channel controls (channel + sender + mention rules): `channels.irc.groups["#channel"]` +- `channels.irc.groupPolicy="open"` allows unconfigured channels (**still mention-gated by default**) + +Allowlist entries should use stable sender identities (`nick!user@host`). +Bare nick matching is mutable and only enabled when `channels.irc.dangerouslyAllowNameMatching: true`. + +### Common gotcha: `allowFrom` is for DMs, not channels + +If you see logs like: + +- `irc: drop group sender alice!ident@host (policy=allowlist)` + +…it means the sender wasn’t allowed for **group/channel** messages. Fix it by either: + +- setting `channels.irc.groupAllowFrom` (global for all channels), or +- setting per-channel sender allowlists: `channels.irc.groups["#channel"].allowFrom` + +Example (allow anyone in `#tuirc-dev` to talk to the bot): + +```json5 +{ + channels: { + irc: { + groupPolicy: "allowlist", + groups: { + "#tuirc-dev": { allowFrom: ["*"] }, + }, + }, + }, +} +``` + +## Reply triggering (mentions) + +Even if a channel is allowed (via `groupPolicy` + `groups`) and the sender is allowed, OpenClaw defaults to **mention-gating** in group contexts. + +That means you may see logs like `drop channel … (missing-mention)` unless the message includes a mention pattern that matches the bot. + +To make the bot reply in an IRC channel **without needing a mention**, disable mention gating for that channel: + +```json5 +{ + channels: { + irc: { + groupPolicy: "allowlist", + groups: { + "#tuirc-dev": { + requireMention: false, + allowFrom: ["*"], + }, + }, + }, + }, +} +``` + +Or to allow **all** IRC channels (no per-channel allowlist) and still reply without mentions: + +```json5 +{ + channels: { + irc: { + groupPolicy: "open", + groups: { + "*": { requireMention: false, allowFrom: ["*"] }, + }, + }, + }, +} +``` + +## Security note (recommended for public channels) + +If you allow `allowFrom: ["*"]` in a public channel, anyone can prompt the bot. +To reduce risk, restrict tools for that channel. + +### Same tools for everyone in the channel + +```json5 +{ + channels: { + irc: { + groups: { + "#tuirc-dev": { + allowFrom: ["*"], + tools: { + deny: ["group:runtime", "group:fs", "gateway", "nodes", "cron", "browser"], + }, + }, + }, + }, + }, +} +``` + +### Different tools per sender (owner gets more power) + +Use `toolsBySender` to apply a stricter policy to `"*"` and a looser one to your nick: + +```json5 +{ + channels: { + irc: { + groups: { + "#tuirc-dev": { + allowFrom: ["*"], + toolsBySender: { + "*": { + deny: ["group:runtime", "group:fs", "gateway", "nodes", "cron", "browser"], + }, + "id:eigen": { + deny: ["gateway", "nodes", "cron"], + }, + }, + }, + }, + }, + }, +} +``` + +Notes: + +- `toolsBySender` keys should use `id:` for IRC sender identity values: + `id:eigen` or `id:eigen!~eigen@174.127.248.171` for stronger matching. +- Legacy unprefixed keys are still accepted and matched as `id:` only. +- The first matching sender policy wins; `"*"` is the wildcard fallback. + +For more on group access vs mention-gating (and how they interact), see: [/channels/groups](/channels/groups). + +## NickServ + +To identify with NickServ after connect: + +```json5 +{ + channels: { + irc: { + nickserv: { + enabled: true, + service: "NickServ", + password: "your-nickserv-password", + }, + }, + }, +} +``` + +Optional one-time registration on connect: + +```json5 +{ + channels: { + irc: { + nickserv: { + register: true, + registerEmail: "bot@example.com", + }, + }, + }, +} +``` + +Disable `register` after the nick is registered to avoid repeated REGISTER attempts. + +## Environment variables + +Default account supports: + +- `IRC_HOST` +- `IRC_PORT` +- `IRC_TLS` +- `IRC_NICK` +- `IRC_USERNAME` +- `IRC_REALNAME` +- `IRC_PASSWORD` +- `IRC_CHANNELS` (comma-separated) +- `IRC_NICKSERV_PASSWORD` +- `IRC_NICKSERV_REGISTER_EMAIL` + +## Troubleshooting + +- If the bot connects but never replies in channels, verify `channels.irc.groups` **and** whether mention-gating is dropping messages (`missing-mention`). If you want it to reply without pings, set `requireMention:false` for the channel. +- If login fails, verify nick availability and server password. +- If TLS fails on a custom network, verify host/port and certificate setup. + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/line.md b/docs/channels/line.md new file mode 100644 index 000000000..b0e603e98 --- /dev/null +++ b/docs/channels/line.md @@ -0,0 +1,225 @@ +--- +summary: "LINE Messaging API plugin setup, config, and usage" +read_when: + - You want to connect OpenClaw to LINE + - You need LINE webhook + credential setup + - You want LINE-specific message options +title: LINE +--- + +# LINE + +LINE connects to OpenClaw via the LINE Messaging API. The plugin runs as a webhook +receiver on the gateway and uses your channel access token + channel secret for +authentication. + +Status: bundled plugin. Direct messages, group chats, media, locations, Flex +messages, template messages, and quick replies are supported. Reactions and threads +are not supported. + +## Bundled plugin + +LINE ships as a bundled plugin in current OpenClaw releases, so normal +packaged builds do not need a separate install. + +If you are on an older build or a custom install that excludes LINE, install it +manually: + +```bash +openclaw plugins install @openclaw/line +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./path/to/local/line-plugin +``` + +## Setup + +1. Create a LINE Developers account and open the Console: + [https://developers.line.biz/console/](https://developers.line.biz/console/) +2. Create (or pick) a Provider and add a **Messaging API** channel. +3. Copy the **Channel access token** and **Channel secret** from the channel settings. +4. Enable **Use webhook** in the Messaging API settings. +5. Set the webhook URL to your gateway endpoint (HTTPS required): + +``` +https://gateway-host/line/webhook +``` + +The gateway responds to LINE’s webhook verification (GET) and inbound events (POST). +If you need a custom path, set `channels.line.webhookPath` or +`channels.line.accounts..webhookPath` and update the URL accordingly. + +Security note: + +- LINE signature verification is body-dependent (HMAC over the raw body), so OpenClaw applies strict pre-auth body limits and timeout before verification. +- OpenClaw processes webhook events from the verified raw request bytes. Upstream middleware-transformed `req.body` values are ignored for signature-integrity safety. + +## Configure + +Minimal config: + +```json5 +{ + channels: { + line: { + enabled: true, + channelAccessToken: "LINE_CHANNEL_ACCESS_TOKEN", + channelSecret: "LINE_CHANNEL_SECRET", + dmPolicy: "pairing", + }, + }, +} +``` + +Env vars (default account only): + +- `LINE_CHANNEL_ACCESS_TOKEN` +- `LINE_CHANNEL_SECRET` + +Token/secret files: + +```json5 +{ + channels: { + line: { + tokenFile: "/path/to/line-token.txt", + secretFile: "/path/to/line-secret.txt", + }, + }, +} +``` + +`tokenFile` and `secretFile` must point to regular files. Symlinks are rejected. + +Multiple accounts: + +```json5 +{ + channels: { + line: { + accounts: { + marketing: { + channelAccessToken: "...", + channelSecret: "...", + webhookPath: "/line/marketing", + }, + }, + }, + }, +} +``` + +## Access control + +Direct messages default to pairing. Unknown senders get a pairing code and their +messages are ignored until approved. + +```bash +openclaw pairing list line +openclaw pairing approve line +``` + +Allowlists and policies: + +- `channels.line.dmPolicy`: `pairing | allowlist | open | disabled` +- `channels.line.allowFrom`: allowlisted LINE user IDs for DMs +- `channels.line.groupPolicy`: `allowlist | open | disabled` +- `channels.line.groupAllowFrom`: allowlisted LINE user IDs for groups +- Per-group overrides: `channels.line.groups..allowFrom` +- Runtime note: if `channels.line` is completely missing, runtime falls back to `groupPolicy="allowlist"` for group checks (even if `channels.defaults.groupPolicy` is set). + +LINE IDs are case-sensitive. Valid IDs look like: + +- User: `U` + 32 hex chars +- Group: `C` + 32 hex chars +- Room: `R` + 32 hex chars + +## Message behavior + +- Text is chunked at 5000 characters. +- Markdown formatting is stripped; code blocks and tables are converted into Flex + cards when possible. +- Streaming responses are buffered; LINE receives full chunks with a loading + animation while the agent works. +- Media downloads are capped by `channels.line.mediaMaxMb` (default 10). + +## Channel data (rich messages) + +Use `channelData.line` to send quick replies, locations, Flex cards, or template +messages. + +```json5 +{ + text: "Here you go", + channelData: { + line: { + quickReplies: ["Status", "Help"], + location: { + title: "Office", + address: "123 Main St", + latitude: 35.681236, + longitude: 139.767125, + }, + flexMessage: { + altText: "Status card", + contents: { + /* Flex payload */ + }, + }, + templateMessage: { + type: "confirm", + text: "Proceed?", + confirmLabel: "Yes", + confirmData: "yes", + cancelLabel: "No", + cancelData: "no", + }, + }, + }, +} +``` + +The LINE plugin also ships a `/card` command for Flex message presets: + +``` +/card info "Welcome" "Thanks for joining!" +``` + +## ACP support + +LINE supports ACP (Agent Communication Protocol) conversation bindings: + +- `/acp spawn --bind here` binds the current LINE chat to an ACP session without creating a child thread. +- Configured ACP bindings and active conversation-bound ACP sessions work on LINE like other conversation channels. + +See [ACP agents](/tools/acp-agents) for details. + +## Outbound media + +The LINE plugin supports sending images, videos, and audio files through the agent message tool. Media is sent via the LINE-specific delivery path with appropriate preview and tracking handling: + +- **Images**: sent as LINE image messages with automatic preview generation. +- **Videos**: sent with explicit preview and content-type handling. +- **Audio**: sent as LINE audio messages. + +Generic media sends fall back to the existing image-only route when a LINE-specific path is not available. + +## Troubleshooting + +- **Webhook verification fails:** ensure the webhook URL is HTTPS and the + `channelSecret` matches the LINE console. +- **No inbound events:** confirm the webhook path matches `channels.line.webhookPath` + and that the gateway is reachable from LINE. +- **Media download errors:** raise `channels.line.mediaMaxMb` if media exceeds the + default limit. + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/location.md b/docs/channels/location.md new file mode 100644 index 000000000..ddfdfd5cd --- /dev/null +++ b/docs/channels/location.md @@ -0,0 +1,56 @@ +--- +summary: "Inbound channel location parsing (Telegram/WhatsApp/Matrix) and context fields" +read_when: + - Adding or modifying channel location parsing + - Using location context fields in agent prompts or tools +title: "Channel Location Parsing" +--- + +# Channel location parsing + +OpenClaw normalizes shared locations from chat channels into: + +- human-readable text appended to the inbound body, and +- structured fields in the auto-reply context payload. + +Currently supported: + +- **Telegram** (location pins + venues + live locations) +- **WhatsApp** (locationMessage + liveLocationMessage) +- **Matrix** (`m.location` with `geo_uri`) + +## Text formatting + +Locations are rendered as friendly lines without brackets: + +- Pin: + - `📍 48.858844, 2.294351 ±12m` +- Named place: + - `📍 Eiffel Tower — Champ de Mars, Paris (48.858844, 2.294351 ±12m)` +- Live share: + - `🛰 Live location: 48.858844, 2.294351 ±12m` + +If the channel includes a caption/comment, it is appended on the next line: + +``` +📍 48.858844, 2.294351 ±12m +Meet here +``` + +## Context fields + +When a location is present, these fields are added to `ctx`: + +- `LocationLat` (number) +- `LocationLon` (number) +- `LocationAccuracy` (number, meters; optional) +- `LocationName` (string; optional) +- `LocationAddress` (string; optional) +- `LocationSource` (`pin | place | live`) +- `LocationIsLive` (boolean) + +## Channel notes + +- **Telegram**: venues map to `LocationName/LocationAddress`; live locations use `live_period`. +- **WhatsApp**: `locationMessage.comment` and `liveLocationMessage.caption` are appended as the caption line. +- **Matrix**: `geo_uri` is parsed as a pin location; altitude is ignored and `LocationIsLive` is always false. diff --git a/docs/channels/matrix.md b/docs/channels/matrix.md new file mode 100644 index 000000000..7e1c98555 --- /dev/null +++ b/docs/channels/matrix.md @@ -0,0 +1,863 @@ +--- +summary: "Matrix support status, setup, and configuration examples" +read_when: + - Setting up Matrix in OpenClaw + - Configuring Matrix E2EE and verification +title: "Matrix" +--- + +# Matrix + +Matrix is the Matrix bundled channel plugin for OpenClaw. +It uses the official `matrix-js-sdk` and supports DMs, rooms, threads, media, reactions, polls, location, and E2EE. + +## Bundled plugin + +Matrix ships as a bundled plugin in current OpenClaw releases, so normal +packaged builds do not need a separate install. + +If you are on an older build or a custom install that excludes Matrix, install +it manually: + +Install from npm: + +```bash +openclaw plugins install @openclaw/matrix +``` + +Install from a local checkout: + +```bash +openclaw plugins install ./path/to/local/matrix-plugin +``` + +See [Plugins](/tools/plugin) for plugin behavior and install rules. + +## Setup + +1. Ensure the Matrix plugin is available. + - Current packaged OpenClaw releases already bundle it. + - Older/custom installs can add it manually with the commands above. +2. Create a Matrix account on your homeserver. +3. Configure `channels.matrix` with either: + - `homeserver` + `accessToken`, or + - `homeserver` + `userId` + `password`. +4. Restart the gateway. +5. Start a DM with the bot or invite it to a room. + +Interactive setup paths: + +```bash +openclaw channels add +openclaw configure --section channels +``` + +What the Matrix wizard actually asks for: + +- homeserver URL +- auth method: access token or password +- user ID only when you choose password auth +- optional device name +- whether to enable E2EE +- whether to configure Matrix room access now + +Wizard behavior that matters: + +- If Matrix auth env vars already exist for the selected account, and that account does not already have auth saved in config, the wizard offers an env shortcut and only writes `enabled: true` for that account. +- When you add another Matrix account interactively, the entered account name is normalized into the account ID used in config and env vars. For example, `Ops Bot` becomes `ops-bot`. +- DM allowlist prompts accept full `@user:server` values immediately. Display names only work when live directory lookup finds one exact match; otherwise the wizard asks you to retry with a full Matrix ID. +- Room allowlist prompts accept room IDs and aliases directly. They can also resolve joined-room names live, but unresolved names are only kept as typed during setup and are ignored later by runtime allowlist resolution. Prefer `!room:server` or `#alias:server`. +- Runtime room/session identity uses the stable Matrix room ID. Room-declared aliases are only used as lookup inputs, not as the long-term session key or stable group identity. +- To resolve room names before saving them, use `openclaw channels resolve --channel matrix "Project Room"`. + +Minimal token-based setup: + +```json5 +{ + channels: { + matrix: { + enabled: true, + homeserver: "https://matrix.example.org", + accessToken: "syt_xxx", + dm: { policy: "pairing" }, + }, + }, +} +``` + +Password-based setup (token is cached after login): + +```json5 +{ + channels: { + matrix: { + enabled: true, + homeserver: "https://matrix.example.org", + userId: "@bot:example.org", + password: "replace-me", // pragma: allowlist secret + deviceName: "OpenClaw Gateway", + }, + }, +} +``` + +Matrix stores cached credentials in `~/.openclaw/credentials/matrix/`. +The default account uses `credentials.json`; named accounts use `credentials-.json`. + +Environment variable equivalents (used when the config key is not set): + +- `MATRIX_HOMESERVER` +- `MATRIX_ACCESS_TOKEN` +- `MATRIX_USER_ID` +- `MATRIX_PASSWORD` +- `MATRIX_DEVICE_ID` +- `MATRIX_DEVICE_NAME` + +For non-default accounts, use account-scoped env vars: + +- `MATRIX__HOMESERVER` +- `MATRIX__ACCESS_TOKEN` +- `MATRIX__USER_ID` +- `MATRIX__PASSWORD` +- `MATRIX__DEVICE_ID` +- `MATRIX__DEVICE_NAME` + +Example for account `ops`: + +- `MATRIX_OPS_HOMESERVER` +- `MATRIX_OPS_ACCESS_TOKEN` + +For normalized account ID `ops-bot`, use: + +- `MATRIX_OPS_X2D_BOT_HOMESERVER` +- `MATRIX_OPS_X2D_BOT_ACCESS_TOKEN` + +Matrix escapes punctuation in account IDs to keep scoped env vars collision-free. +For example, `-` becomes `_X2D_`, so `ops-prod` maps to `MATRIX_OPS_X2D_PROD_*`. + +The interactive wizard only offers the env-var shortcut when those auth env vars are already present and the selected account does not already have Matrix auth saved in config. + +## Configuration example + +This is a practical baseline config with DM pairing, room allowlist, and E2EE enabled: + +```json5 +{ + channels: { + matrix: { + enabled: true, + homeserver: "https://matrix.example.org", + accessToken: "syt_xxx", + encryption: true, + + dm: { + policy: "pairing", + threadReplies: "off", + }, + + groupPolicy: "allowlist", + groupAllowFrom: ["@admin:example.org"], + groups: { + "!roomid:example.org": { + requireMention: true, + }, + }, + + autoJoin: "allowlist", + autoJoinAllowlist: ["!roomid:example.org"], + threadReplies: "inbound", + replyToMode: "off", + streaming: "partial", + }, + }, +} +``` + +## Streaming previews + +Matrix reply streaming is opt-in. + +Set `channels.matrix.streaming` to `"partial"` when you want OpenClaw to send a single draft reply, +edit that draft in place while the model is generating text, and then finalize it when the reply is +done: + +```json5 +{ + channels: { + matrix: { + streaming: "partial", + }, + }, +} +``` + +- `streaming: "off"` is the default. OpenClaw waits for the final reply and sends it once. +- `streaming: "partial"` creates one editable preview message for the current assistant block instead of sending multiple partial messages. +- `blockStreaming: true` enables separate Matrix progress messages. With `streaming: "partial"`, Matrix keeps the live draft for the current block and preserves completed blocks as separate messages. +- When `streaming: "partial"` and `blockStreaming` is off, Matrix only edits the live draft and sends the completed reply once that block or turn finishes. +- If the preview no longer fits in one Matrix event, OpenClaw stops preview streaming and falls back to normal final delivery. +- Media replies still send attachments normally. If a stale preview can no longer be reused safely, OpenClaw redacts it before sending the final media reply. +- Preview edits cost extra Matrix API calls. Leave streaming off if you want the most conservative rate-limit behavior. + +`blockStreaming` does not enable draft previews by itself. +Use `streaming: "partial"` for preview edits; then add `blockStreaming: true` only if you also want completed assistant blocks to remain visible as separate progress messages. + +## Encryption and verification + +In encrypted (E2EE) rooms, outbound image events use `thumbnail_file` so image previews are encrypted alongside the full attachment. Unencrypted rooms still use plain `thumbnail_url`. No configuration is needed — the plugin detects E2EE state automatically. + +### Bot to bot rooms + +By default, Matrix messages from other configured OpenClaw Matrix accounts are ignored. + +Use `allowBots` when you intentionally want inter-agent Matrix traffic: + +```json5 +{ + channels: { + matrix: { + allowBots: "mentions", // true | "mentions" + groups: { + "!roomid:example.org": { + requireMention: true, + }, + }, + }, + }, +} +``` + +- `allowBots: true` accepts messages from other configured Matrix bot accounts in allowed rooms and DMs. +- `allowBots: "mentions"` accepts those messages only when they visibly mention this bot in rooms. DMs are still allowed. +- `groups..allowBots` overrides the account-level setting for one room. +- OpenClaw still ignores messages from the same Matrix user ID to avoid self-reply loops. +- Matrix does not expose a native bot flag here; OpenClaw treats "bot-authored" as "sent by another configured Matrix account on this OpenClaw gateway". + +Use strict room allowlists and mention requirements when enabling bot-to-bot traffic in shared rooms. + +Enable encryption: + +```json5 +{ + channels: { + matrix: { + enabled: true, + homeserver: "https://matrix.example.org", + accessToken: "syt_xxx", + encryption: true, + dm: { policy: "pairing" }, + }, + }, +} +``` + +Check verification status: + +```bash +openclaw matrix verify status +``` + +Verbose status (full diagnostics): + +```bash +openclaw matrix verify status --verbose +``` + +Include the stored recovery key in machine-readable output: + +```bash +openclaw matrix verify status --include-recovery-key --json +``` + +Bootstrap cross-signing and verification state: + +```bash +openclaw matrix verify bootstrap +``` + +Multi-account support: use `channels.matrix.accounts` with per-account credentials and optional `name`. See [Configuration reference](/gateway/configuration-reference#multi-account-all-channels) for the shared pattern. + +Verbose bootstrap diagnostics: + +```bash +openclaw matrix verify bootstrap --verbose +``` + +Force a fresh cross-signing identity reset before bootstrapping: + +```bash +openclaw matrix verify bootstrap --force-reset-cross-signing +``` + +Verify this device with a recovery key: + +```bash +openclaw matrix verify device "" +``` + +Verbose device verification details: + +```bash +openclaw matrix verify device "" --verbose +``` + +Check room-key backup health: + +```bash +openclaw matrix verify backup status +``` + +Verbose backup health diagnostics: + +```bash +openclaw matrix verify backup status --verbose +``` + +Restore room keys from server backup: + +```bash +openclaw matrix verify backup restore +``` + +Verbose restore diagnostics: + +```bash +openclaw matrix verify backup restore --verbose +``` + +Delete the current server backup and create a fresh backup baseline. If the stored +backup key cannot be loaded cleanly, this reset can also recreate secret storage so +future cold starts can load the new backup key: + +```bash +openclaw matrix verify backup reset --yes +``` + +All `verify` commands are concise by default (including quiet internal SDK logging) and show detailed diagnostics only with `--verbose`. +Use `--json` for full machine-readable output when scripting. + +In multi-account setups, Matrix CLI commands use the implicit Matrix default account unless you pass `--account `. +If you configure multiple named accounts, set `channels.matrix.defaultAccount` first or those implicit CLI operations will stop and ask you to choose an account explicitly. +Use `--account` whenever you want verification or device operations to target a named account explicitly: + +```bash +openclaw matrix verify status --account assistant +openclaw matrix verify backup restore --account assistant +openclaw matrix devices list --account assistant +``` + +When encryption is disabled or unavailable for a named account, Matrix warnings and verification errors point at that account's config key, for example `channels.matrix.accounts.assistant.encryption`. + +### What "verified" means + +OpenClaw treats this Matrix device as verified only when it is verified by your own cross-signing identity. +In practice, `openclaw matrix verify status --verbose` exposes three trust signals: + +- `Locally trusted`: this device is trusted by the current client only +- `Cross-signing verified`: the SDK reports the device as verified through cross-signing +- `Signed by owner`: the device is signed by your own self-signing key + +`Verified by owner` becomes `yes` only when cross-signing verification or owner-signing is present. +Local trust by itself is not enough for OpenClaw to treat the device as fully verified. + +### What bootstrap does + +`openclaw matrix verify bootstrap` is the repair and setup command for encrypted Matrix accounts. +It does all of the following in order: + +- bootstraps secret storage, reusing an existing recovery key when possible +- bootstraps cross-signing and uploads missing public cross-signing keys +- attempts to mark and cross-sign the current device +- creates a new server-side room-key backup if one does not already exist + +If the homeserver requires interactive auth to upload cross-signing keys, OpenClaw tries the upload without auth first, then with `m.login.dummy`, then with `m.login.password` when `channels.matrix.password` is configured. + +Use `--force-reset-cross-signing` only when you intentionally want to discard the current cross-signing identity and create a new one. + +If you intentionally want to discard the current room-key backup and start a new +backup baseline for future messages, use `openclaw matrix verify backup reset --yes`. +Do this only when you accept that unrecoverable old encrypted history will stay +unavailable and that OpenClaw may recreate secret storage if the current backup +secret cannot be loaded safely. + +### Fresh backup baseline + +If you want to keep future encrypted messages working and accept losing unrecoverable old history, run these commands in order: + +```bash +openclaw matrix verify backup reset --yes +openclaw matrix verify backup status --verbose +openclaw matrix verify status +``` + +Add `--account ` to each command when you want to target a named Matrix account explicitly. + +### Startup behavior + +When `encryption: true`, Matrix defaults `startupVerification` to `"if-unverified"`. +On startup, if this device is still unverified, Matrix will request self-verification in another Matrix client, +skip duplicate requests while one is already pending, and apply a local cooldown before retrying after restarts. +Failed request attempts retry sooner than successful request creation by default. +Set `startupVerification: "off"` to disable automatic startup requests, or tune `startupVerificationCooldownHours` +if you want a shorter or longer retry window. + +Startup also performs a conservative crypto bootstrap pass automatically. +That pass tries to reuse the current secret storage and cross-signing identity first, and avoids resetting cross-signing unless you run an explicit bootstrap repair flow. + +If startup finds broken bootstrap state and `channels.matrix.password` is configured, OpenClaw can attempt a stricter repair path. +If the current device is already owner-signed, OpenClaw preserves that identity instead of resetting it automatically. + +Upgrading from the previous public Matrix plugin: + +- OpenClaw automatically reuses the same Matrix account, access token, and device identity when possible. +- Before any actionable Matrix migration changes run, OpenClaw creates or reuses a recovery snapshot under `~/Backups/openclaw-migrations/`. +- If you use multiple Matrix accounts, set `channels.matrix.defaultAccount` before upgrading from the old flat-store layout so OpenClaw knows which account should receive that shared legacy state. +- If the previous plugin stored a Matrix room-key backup decryption key locally, startup or `openclaw doctor --fix` will import it into the new recovery-key flow automatically. +- If the Matrix access token changed after migration was prepared, startup now scans sibling token-hash storage roots for pending legacy restore state before giving up on the automatic backup restore. +- If the Matrix access token changes later for the same account, homeserver, and user, OpenClaw now prefers reusing the most complete existing token-hash storage root instead of starting from an empty Matrix state directory. +- On the next gateway start, backed-up room keys are restored automatically into the new crypto store. +- If the old plugin had local-only room keys that were never backed up, OpenClaw will warn clearly. Those keys cannot be exported automatically from the previous rust crypto store, so some old encrypted history may remain unavailable until recovered manually. +- See [Matrix migration](/install/migrating-matrix) for the full upgrade flow, limits, recovery commands, and common migration messages. + +Encrypted runtime state is organized under per-account, per-user token-hash roots in +`~/.openclaw/matrix/accounts//__//`. +That directory contains the sync store (`bot-storage.json`), crypto store (`crypto/`), +recovery key file (`recovery-key.json`), IndexedDB snapshot (`crypto-idb-snapshot.json`), +thread bindings (`thread-bindings.json`), and startup verification state (`startup-verification.json`) +when those features are in use. +When the token changes but the account identity stays the same, OpenClaw reuses the best existing +root for that account/homeserver/user tuple so prior sync state, crypto state, thread bindings, +and startup verification state remain visible. + +### Node crypto store model + +Matrix E2EE in this plugin uses the official `matrix-js-sdk` Rust crypto path in Node. +That path expects IndexedDB-backed persistence when you want crypto state to survive restarts. + +OpenClaw currently provides that in Node by: + +- using `fake-indexeddb` as the IndexedDB API shim expected by the SDK +- restoring the Rust crypto IndexedDB contents from `crypto-idb-snapshot.json` before `initRustCrypto` +- persisting the updated IndexedDB contents back to `crypto-idb-snapshot.json` after init and during runtime +- serializing snapshot restore and persist against `crypto-idb-snapshot.json` with an advisory file lock so gateway runtime persistence and CLI maintenance do not race on the same snapshot file + +This is compatibility/storage plumbing, not a custom crypto implementation. +The snapshot file is sensitive runtime state and is stored with restrictive file permissions. +Under OpenClaw's security model, the gateway host and local OpenClaw state directory are already inside the trusted operator boundary, so this is primarily an operational durability concern rather than a separate remote trust boundary. + +Planned improvement: + +- add SecretRef support for persistent Matrix key material so recovery keys and related store-encryption secrets can be sourced from OpenClaw secrets providers instead of only local files + +## Profile management + +Update the Matrix self-profile for the selected account with: + +```bash +openclaw matrix profile set --name "OpenClaw Assistant" +openclaw matrix profile set --avatar-url https://cdn.example.org/avatar.png +``` + +Add `--account ` when you want to target a named Matrix account explicitly. + +Matrix accepts `mxc://` avatar URLs directly. When you pass an `http://` or `https://` avatar URL, OpenClaw uploads it to Matrix first and stores the resolved `mxc://` URL back into `channels.matrix.avatarUrl` (or the selected account override). + +## Automatic verification notices + +Matrix now posts verification lifecycle notices directly into the strict DM verification room as `m.notice` messages. +That includes: + +- verification request notices +- verification ready notices (with explicit "Verify by emoji" guidance) +- verification start and completion notices +- SAS details (emoji and decimal) when available + +Incoming verification requests from another Matrix client are tracked and auto-accepted by OpenClaw. +For self-verification flows, OpenClaw also starts the SAS flow automatically when emoji verification becomes available and confirms its own side. +For verification requests from another Matrix user/device, OpenClaw auto-accepts the request and then waits for the SAS flow to proceed normally. +You still need to compare the emoji or decimal SAS in your Matrix client and confirm "They match" there to complete the verification. + +OpenClaw does not auto-accept self-initiated duplicate flows blindly. Startup skips creating a new request when a self-verification request is already pending. + +Verification protocol/system notices are not forwarded to the agent chat pipeline, so they do not produce `NO_REPLY`. + +### Device hygiene + +Old OpenClaw-managed Matrix devices can accumulate on the account and make encrypted-room trust harder to reason about. +List them with: + +```bash +openclaw matrix devices list +``` + +Remove stale OpenClaw-managed devices with: + +```bash +openclaw matrix devices prune-stale +``` + +### Direct Room Repair + +If direct-message state gets out of sync, OpenClaw can end up with stale `m.direct` mappings that point at old solo rooms instead of the live DM. Inspect the current mapping for a peer with: + +```bash +openclaw matrix direct inspect --user-id @alice:example.org +``` + +Repair it with: + +```bash +openclaw matrix direct repair --user-id @alice:example.org +``` + +Repair keeps the Matrix-specific logic inside the plugin: + +- it prefers a strict 1:1 DM that is already mapped in `m.direct` +- otherwise it falls back to any currently joined strict 1:1 DM with that user +- if no healthy DM exists, it creates a fresh direct room and rewrites `m.direct` to point at it + +The repair flow does not delete old rooms automatically. It only picks the healthy DM and updates the mapping so new Matrix sends, verification notices, and other direct-message flows target the right room again. + +## Threads + +Matrix supports native Matrix threads for both automatic replies and message-tool sends. + +- `threadReplies: "off"` keeps replies top-level and keeps inbound threaded messages on the parent session. +- `threadReplies: "inbound"` replies inside a thread only when the inbound message was already in that thread. +- `threadReplies: "always"` keeps room replies in a thread rooted at the triggering message and routes that conversation through the matching thread-scoped session from the first triggering message. +- `dm.threadReplies` overrides the top-level setting for DMs only. For example, you can keep room threads isolated while keeping DMs flat. +- Inbound threaded messages include the thread root message as extra agent context. +- Message-tool sends now auto-inherit the current Matrix thread when the target is the same room, or the same DM user target, unless an explicit `threadId` is provided. +- Runtime thread bindings are supported for Matrix. `/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`, and thread-bound `/acp spawn` now work in Matrix rooms and DMs. +- Top-level Matrix room/DM `/focus` creates a new Matrix thread and binds it to the target session when `threadBindings.spawnSubagentSessions=true`. +- Running `/focus` or `/acp spawn --thread here` inside an existing Matrix thread binds that current thread instead. + +## ACP conversation bindings + +Matrix rooms, DMs, and existing Matrix threads can be turned into durable ACP workspaces without changing the chat surface. + +Fast operator flow: + +- Run `/acp spawn codex --bind here` inside the Matrix DM, room, or existing thread you want to keep using. +- In a top-level Matrix DM or room, the current DM/room stays the chat surface and future messages route to the spawned ACP session. +- Inside an existing Matrix thread, `--bind here` binds that current thread in place. +- `/new` and `/reset` reset the same bound ACP session in place. +- `/acp close` closes the ACP session and removes the binding. + +Notes: + +- `--bind here` does not create a child Matrix thread. +- `threadBindings.spawnAcpSessions` is only required for `/acp spawn --thread auto|here`, where OpenClaw needs to create or bind a child Matrix thread. + +### Thread Binding Config + +Matrix inherits global defaults from `session.threadBindings`, and also supports per-channel overrides: + +- `threadBindings.enabled` +- `threadBindings.idleHours` +- `threadBindings.maxAgeHours` +- `threadBindings.spawnSubagentSessions` +- `threadBindings.spawnAcpSessions` + +Matrix thread-bound spawn flags are opt-in: + +- Set `threadBindings.spawnSubagentSessions: true` to allow top-level `/focus` to create and bind new Matrix threads. +- Set `threadBindings.spawnAcpSessions: true` to allow `/acp spawn --thread auto|here` to bind ACP sessions to Matrix threads. + +## Reactions + +Matrix supports outbound reaction actions, inbound reaction notifications, and inbound ack reactions. + +- Outbound reaction tooling is gated by `channels["matrix"].actions.reactions`. +- `react` adds a reaction to a specific Matrix event. +- `reactions` lists the current reaction summary for a specific Matrix event. +- `emoji=""` removes the bot account's own reactions on that event. +- `remove: true` removes only the specified emoji reaction from the bot account. + +Ack reactions use the standard OpenClaw resolution order: + +- `channels["matrix"].accounts..ackReaction` +- `channels["matrix"].ackReaction` +- `messages.ackReaction` +- agent identity emoji fallback + +Ack reaction scope resolves in this order: + +- `channels["matrix"].accounts..ackReactionScope` +- `channels["matrix"].ackReactionScope` +- `messages.ackReactionScope` + +Reaction notification mode resolves in this order: + +- `channels["matrix"].accounts..reactionNotifications` +- `channels["matrix"].reactionNotifications` +- default: `own` + +Current behavior: + +- `reactionNotifications: "own"` forwards added `m.reaction` events when they target bot-authored Matrix messages. +- `reactionNotifications: "off"` disables reaction system events. +- Reaction removals are still not synthesized into system events because Matrix surfaces those as redactions, not as standalone `m.reaction` removals. + +## History context + +- `channels.matrix.historyLimit` controls how many recent room messages are included as `InboundHistory` when a Matrix room message triggers the agent. +- It falls back to `messages.groupChat.historyLimit`. Set `0` to disable. +- Matrix room history is room-only. DMs keep using normal session history. +- Matrix room history is pending-only: OpenClaw buffers room messages that did not trigger a reply yet, then snapshots that window when a mention or other trigger arrives. +- The current trigger message is not included in `InboundHistory`; it stays in the main inbound body for that turn. +- Retries of the same Matrix event reuse the original history snapshot instead of drifting forward to newer room messages. + +## Context visibility + +Matrix supports the shared `contextVisibility` control for supplemental room context such as fetched reply text, thread roots, and pending history. + +- `contextVisibility: "all"` is the default. Supplemental context is kept as received. +- `contextVisibility: "allowlist"` filters supplemental context to senders allowed by the active room/user allowlist checks. +- `contextVisibility: "allowlist_quote"` behaves like `allowlist`, but still keeps one explicit quoted reply. + +This setting affects supplemental context visibility, not whether the inbound message itself can trigger a reply. +Trigger authorization still comes from `groupPolicy`, `groups`, `groupAllowFrom`, and DM policy settings. + +## DM and room policy example + +```json5 +{ + channels: { + matrix: { + dm: { + policy: "allowlist", + allowFrom: ["@admin:example.org"], + threadReplies: "off", + }, + groupPolicy: "allowlist", + groupAllowFrom: ["@admin:example.org"], + groups: { + "!roomid:example.org": { + requireMention: true, + }, + }, + }, + }, +} +``` + +See [Groups](/channels/groups) for mention-gating and allowlist behavior. + +Pairing example for Matrix DMs: + +```bash +openclaw pairing list matrix +openclaw pairing approve matrix +``` + +If an unapproved Matrix user keeps messaging you before approval, OpenClaw reuses the same pending pairing code and may send a reminder reply again after a short cooldown instead of minting a new code. + +See [Pairing](/channels/pairing) for the shared DM pairing flow and storage layout. + +## Exec approvals + +Matrix can act as an exec approval client for a Matrix account. + +- `channels.matrix.execApprovals.enabled` +- `channels.matrix.execApprovals.approvers` (optional; falls back to `channels.matrix.dm.allowFrom`) +- `channels.matrix.execApprovals.target` (`dm` | `channel` | `both`, default: `dm`) +- `channels.matrix.execApprovals.agentFilter` +- `channels.matrix.execApprovals.sessionFilter` + +Approvers must be Matrix user IDs such as `@owner:example.org`. Matrix auto-enables native exec approvals when `enabled` is unset or `"auto"` and at least one approver can be resolved, either from `execApprovals.approvers` or from `channels.matrix.dm.allowFrom`. Set `enabled: false` to disable Matrix as a native approval client explicitly. Approval requests otherwise fall back to other configured approval routes or the exec approval fallback policy. + +Native Matrix routing is exec-only today: + +- `channels.matrix.execApprovals.*` controls native DM/channel routing for exec approvals only. +- Plugin approvals still use shared same-chat `/approve` plus any configured `approvals.plugin` forwarding. +- Matrix can still reuse `channels.matrix.dm.allowFrom` for plugin-approval authorization when it can infer approvers safely, but it does not expose a separate native plugin-approval DM/channel fanout path. + +Delivery rules: + +- `target: "dm"` sends approval prompts to approver DMs +- `target: "channel"` sends the prompt back to the originating Matrix room or DM +- `target: "both"` sends to approver DMs and the originating Matrix room or DM + +Matrix uses text approval prompts today. Approvers resolve them with `/approve allow-once`, `/approve allow-always`, or `/approve deny`. + +Only resolved approvers can approve or deny. Channel delivery includes the command text, so only enable `channel` or `both` in trusted rooms. + +Matrix approval prompts reuse the shared core approval planner. The Matrix-specific native surface is transport only for exec approvals: room/DM routing and message send/update/delete behavior. + +Per-account override: + +- `channels.matrix.accounts..execApprovals` + +Related docs: [Exec approvals](/tools/exec-approvals) + +## Multi-account example + +```json5 +{ + channels: { + matrix: { + enabled: true, + defaultAccount: "assistant", + dm: { policy: "pairing" }, + accounts: { + assistant: { + homeserver: "https://matrix.example.org", + accessToken: "syt_assistant_xxx", + encryption: true, + }, + alerts: { + homeserver: "https://matrix.example.org", + accessToken: "syt_alerts_xxx", + dm: { + policy: "allowlist", + allowFrom: ["@ops:example.org"], + threadReplies: "off", + }, + }, + }, + }, + }, +} +``` + +Top-level `channels.matrix` values act as defaults for named accounts unless an account overrides them. +You can scope inherited room entries to one Matrix account with `groups..account` (or legacy `rooms..account`). +Entries without `account` stay shared across all Matrix accounts, and entries with `account: "default"` still work when the default account is configured directly on top-level `channels.matrix.*`. +Partial shared auth defaults do not create a separate implicit default account by themselves. OpenClaw only synthesizes the top-level `default` account when that default has fresh auth (`homeserver` plus `accessToken`, or `homeserver` plus `userId` and `password`); named accounts can still stay discoverable from `homeserver` plus `userId` when cached credentials satisfy auth later. +If Matrix already has exactly one named account, or `defaultAccount` points at an existing named account key, single-account-to-multi-account repair/setup promotion preserves that account instead of creating a fresh `accounts.default` entry. Only Matrix auth/bootstrap keys move into that promoted account; shared delivery-policy keys stay at the top level. +Set `defaultAccount` when you want OpenClaw to prefer one named Matrix account for implicit routing, probing, and CLI operations. +If you configure multiple named accounts, set `defaultAccount` or pass `--account ` for CLI commands that rely on implicit account selection. +Pass `--account ` to `openclaw matrix verify ...` and `openclaw matrix devices ...` when you want to override that implicit selection for one command. + +## Private/LAN homeservers + +By default, OpenClaw blocks private/internal Matrix homeservers for SSRF protection unless you +explicitly opt in per account. + +If your homeserver runs on localhost, a LAN/Tailscale IP, or an internal hostname, enable +`allowPrivateNetwork` for that Matrix account: + +```json5 +{ + channels: { + matrix: { + homeserver: "http://matrix-synapse:8008", + allowPrivateNetwork: true, + accessToken: "syt_internal_xxx", + }, + }, +} +``` + +CLI setup example: + +```bash +openclaw matrix account add \ + --account ops \ + --homeserver http://matrix-synapse:8008 \ + --allow-private-network \ + --access-token syt_ops_xxx +``` + +This opt-in only allows trusted private/internal targets. Public cleartext homeservers such as +`http://matrix.example.org:8008` remain blocked. Prefer `https://` whenever possible. + +## Proxying Matrix traffic + +If your Matrix deployment needs an explicit outbound HTTP(S) proxy, set `channels.matrix.proxy`: + +```json5 +{ + channels: { + matrix: { + homeserver: "https://matrix.example.org", + accessToken: "syt_bot_xxx", + proxy: "http://127.0.0.1:7890", + }, + }, +} +``` + +Named accounts can override the top-level default with `channels.matrix.accounts..proxy`. +OpenClaw uses the same proxy setting for runtime Matrix traffic and account status probes. + +## Target resolution + +Matrix accepts these target forms anywhere OpenClaw asks you for a room or user target: + +- Users: `@user:server`, `user:@user:server`, or `matrix:user:@user:server` +- Rooms: `!room:server`, `room:!room:server`, or `matrix:room:!room:server` +- Aliases: `#alias:server`, `channel:#alias:server`, or `matrix:channel:#alias:server` + +Live directory lookup uses the logged-in Matrix account: + +- User lookups query the Matrix user directory on that homeserver. +- Room lookups accept explicit room IDs and aliases directly, then fall back to searching joined room names for that account. +- Joined-room name lookup is best-effort. If a room name cannot be resolved to an ID or alias, it is ignored by runtime allowlist resolution. + +## Configuration reference + +- `enabled`: enable or disable the channel. +- `name`: optional label for the account. +- `defaultAccount`: preferred account ID when multiple Matrix accounts are configured. +- `homeserver`: homeserver URL, for example `https://matrix.example.org`. +- `allowPrivateNetwork`: allow this Matrix account to connect to private/internal homeservers. Enable this when the homeserver resolves to `localhost`, a LAN/Tailscale IP, or an internal host such as `matrix-synapse`. +- `proxy`: optional HTTP(S) proxy URL for Matrix traffic. Named accounts can override the top-level default with their own `proxy`. +- `userId`: full Matrix user ID, for example `@bot:example.org`. +- `accessToken`: access token for token-based auth. Plaintext values and SecretRef values are supported for `channels.matrix.accessToken` and `channels.matrix.accounts..accessToken` across env/file/exec providers. See [Secrets Management](/gateway/secrets). +- `password`: password for password-based login. Plaintext values and SecretRef values are supported. +- `deviceId`: explicit Matrix device ID. +- `deviceName`: device display name for password login. +- `avatarUrl`: stored self-avatar URL for profile sync and `set-profile` updates. +- `initialSyncLimit`: startup sync event limit. +- `encryption`: enable E2EE. +- `allowlistOnly`: force allowlist-only behavior for DMs and rooms. +- `allowBots`: allow messages from other configured OpenClaw Matrix accounts (`true` or `"mentions"`). +- `groupPolicy`: `open`, `allowlist`, or `disabled`. +- `contextVisibility`: supplemental room-context visibility mode (`all`, `allowlist`, `allowlist_quote`). +- `groupAllowFrom`: allowlist of user IDs for room traffic. +- `groupAllowFrom` entries should be full Matrix user IDs. Unresolved names are ignored at runtime. +- `historyLimit`: max room messages to include as group history context. Falls back to `messages.groupChat.historyLimit`. Set `0` to disable. +- `replyToMode`: `off`, `first`, or `all`. +- `markdown`: optional Markdown rendering configuration for outbound Matrix text. +- `streaming`: `off` (default), `partial`, `true`, or `false`. `partial` and `true` enable single-message draft previews with edit-in-place updates. +- `blockStreaming`: `true` enables separate progress messages for completed assistant blocks while draft preview streaming is active. +- `threadReplies`: `off`, `inbound`, or `always`. +- `threadBindings`: per-channel overrides for thread-bound session routing and lifecycle. +- `startupVerification`: automatic self-verification request mode on startup (`if-unverified`, `off`). +- `startupVerificationCooldownHours`: cooldown before retrying automatic startup verification requests. +- `textChunkLimit`: outbound message chunk size. +- `chunkMode`: `length` or `newline`. +- `responsePrefix`: optional message prefix for outbound replies. +- `ackReaction`: optional ack reaction override for this channel/account. +- `ackReactionScope`: optional ack reaction scope override (`group-mentions`, `group-all`, `direct`, `all`, `none`, `off`). +- `reactionNotifications`: inbound reaction notification mode (`own`, `off`). +- `mediaMaxMb`: media size cap in MB for Matrix media handling. It applies to outbound sends and inbound media processing. +- `autoJoin`: invite auto-join policy (`always`, `allowlist`, `off`). Default: `off`. +- `autoJoinAllowlist`: rooms/aliases allowed when `autoJoin` is `allowlist`. Alias entries are resolved to room IDs during invite handling; OpenClaw does not trust alias state claimed by the invited room. +- `dm`: DM policy block (`enabled`, `policy`, `allowFrom`, `threadReplies`). +- `dm.allowFrom` entries should be full Matrix user IDs unless you already resolved them through live directory lookup. +- `dm.threadReplies`: DM-only thread policy override (`off`, `inbound`, `always`). It overrides the top-level `threadReplies` setting for both reply placement and session isolation in DMs. +- `execApprovals`: Matrix-native exec approval delivery (`enabled`, `approvers`, `target`, `agentFilter`, `sessionFilter`). +- `execApprovals.approvers`: Matrix user IDs allowed to approve exec requests. Optional when `dm.allowFrom` already identifies the approvers. +- `execApprovals.target`: `dm | channel | both` (default: `dm`). +- `accounts`: named per-account overrides. Top-level `channels.matrix` values act as defaults for these entries. +- `groups`: per-room policy map. Prefer room IDs or aliases; unresolved room names are ignored at runtime. Session/group identity uses the stable room ID after resolution, while human-readable labels still come from room names. +- `groups..account`: restrict one inherited room entry to a specific Matrix account in multi-account setups. +- `groups..allowBots`: room-level override for configured-bot senders (`true` or `"mentions"`). +- `groups..users`: per-room sender allowlist. +- `groups..tools`: per-room tool allow/deny overrides. +- `groups..autoReply`: room-level mention-gating override. `true` disables mention requirements for that room; `false` forces them back on. +- `groups..skills`: optional room-level skill filter. +- `groups..systemPrompt`: optional room-level system prompt snippet. +- `rooms`: legacy alias for `groups`. +- `actions`: per-action tool gating (`messages`, `reactions`, `pins`, `profile`, `memberInfo`, `channelInfo`, `verification`). + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/mattermost.md b/docs/channels/mattermost.md new file mode 100644 index 000000000..3aacf2230 --- /dev/null +++ b/docs/channels/mattermost.md @@ -0,0 +1,472 @@ +--- +summary: "Mattermost bot setup and OpenClaw config" +read_when: + - Setting up Mattermost + - Debugging Mattermost routing +title: "Mattermost" +--- + +# Mattermost + +Status: bundled plugin (bot token + WebSocket events). Channels, groups, and DMs are supported. +Mattermost is a self-hostable team messaging platform; see the official site at +[mattermost.com](https://mattermost.com) for product details and downloads. + +## Bundled plugin + +Mattermost ships as a bundled plugin in current OpenClaw releases, so normal +packaged builds do not need a separate install. + +If you are on an older build or a custom install that excludes Mattermost, +install it manually: + +Install via CLI (npm registry): + +```bash +openclaw plugins install @openclaw/mattermost +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./path/to/local/mattermost-plugin +``` + +Details: [Plugins](/tools/plugin) + +## Quick setup + +1. Ensure the Mattermost plugin is available. + - Current packaged OpenClaw releases already bundle it. + - Older/custom installs can add it manually with the commands above. +2. Create a Mattermost bot account and copy the **bot token**. +3. Copy the Mattermost **base URL** (e.g., `https://chat.example.com`). +4. Configure OpenClaw and start the gateway. + +Minimal config: + +```json5 +{ + channels: { + mattermost: { + enabled: true, + botToken: "mm-token", + baseUrl: "https://chat.example.com", + dmPolicy: "pairing", + }, + }, +} +``` + +## Native slash commands + +Native slash commands are opt-in. When enabled, OpenClaw registers `oc_*` slash commands via +the Mattermost API and receives callback POSTs on the gateway HTTP server. + +```json5 +{ + channels: { + mattermost: { + commands: { + native: true, + nativeSkills: true, + callbackPath: "/api/channels/mattermost/command", + // Use when Mattermost cannot reach the gateway directly (reverse proxy/public URL). + callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", + }, + }, + }, +} +``` + +Notes: + +- `native: "auto"` defaults to disabled for Mattermost. Set `native: true` to enable. +- If `callbackUrl` is omitted, OpenClaw derives one from gateway host/port + `callbackPath`. +- For multi-account setups, `commands` can be set at the top level or under + `channels.mattermost.accounts..commands` (account values override top-level fields). +- Command callbacks are validated with the per-command tokens returned by + Mattermost when OpenClaw registers `oc_*` commands. +- Slash callbacks fail closed when registration failed, startup was partial, or + the callback token does not match one of the registered commands. +- Reachability requirement: the callback endpoint must be reachable from the Mattermost server. + - Do not set `callbackUrl` to `localhost` unless Mattermost runs on the same host/network namespace as OpenClaw. + - Do not set `callbackUrl` to your Mattermost base URL unless that URL reverse-proxies `/api/channels/mattermost/command` to OpenClaw. + - A quick check is `curl https:///api/channels/mattermost/command`; a GET should return `405 Method Not Allowed` from OpenClaw, not `404`. +- Mattermost egress allowlist requirement: + - If your callback targets private/tailnet/internal addresses, set Mattermost + `ServiceSettings.AllowedUntrustedInternalConnections` to include the callback host/domain. + - Use host/domain entries, not full URLs. + - Good: `gateway.tailnet-name.ts.net` + - Bad: `https://gateway.tailnet-name.ts.net` + +## Environment variables (default account) + +Set these on the gateway host if you prefer env vars: + +- `MATTERMOST_BOT_TOKEN=...` +- `MATTERMOST_URL=https://chat.example.com` + +Env vars apply only to the **default** account (`default`). Other accounts must use config values. + +## Chat modes + +Mattermost responds to DMs automatically. Channel behavior is controlled by `chatmode`: + +- `oncall` (default): respond only when @mentioned in channels. +- `onmessage`: respond to every channel message. +- `onchar`: respond when a message starts with a trigger prefix. + +Config example: + +```json5 +{ + channels: { + mattermost: { + chatmode: "onchar", + oncharPrefixes: [">", "!"], + }, + }, +} +``` + +Notes: + +- `onchar` still responds to explicit @mentions. +- `channels.mattermost.requireMention` is honored for legacy configs but `chatmode` is preferred. + +## Threading and sessions + +Use `channels.mattermost.replyToMode` to control whether channel and group replies stay in the +main channel or start a thread under the triggering post. + +- `off` (default): only reply in a thread when the inbound post is already in one. +- `first`: for top-level channel/group posts, start a thread under that post and route the + conversation to a thread-scoped session. +- `all`: same behavior as `first` for Mattermost today. +- Direct messages ignore this setting and stay non-threaded. + +Config example: + +```json5 +{ + channels: { + mattermost: { + replyToMode: "all", + }, + }, +} +``` + +Notes: + +- Thread-scoped sessions use the triggering post id as the thread root. +- `first` and `all` are currently equivalent because once Mattermost has a thread root, + follow-up chunks and media continue in that same thread. + +## Access control (DMs) + +- Default: `channels.mattermost.dmPolicy = "pairing"` (unknown senders get a pairing code). +- Approve via: + - `openclaw pairing list mattermost` + - `openclaw pairing approve mattermost ` +- Public DMs: `channels.mattermost.dmPolicy="open"` plus `channels.mattermost.allowFrom=["*"]`. + +## Channels (groups) + +- Default: `channels.mattermost.groupPolicy = "allowlist"` (mention-gated). +- Allowlist senders with `channels.mattermost.groupAllowFrom` (user IDs recommended). +- Per-channel mention overrides live under `channels.mattermost.groups..requireMention` + or `channels.mattermost.groups["*"].requireMention` for a default. +- `@username` matching is mutable and only enabled when `channels.mattermost.dangerouslyAllowNameMatching: true`. +- Open channels: `channels.mattermost.groupPolicy="open"` (mention-gated). +- Runtime note: if `channels.mattermost` is completely missing, runtime falls back to `groupPolicy="allowlist"` for group checks (even if `channels.defaults.groupPolicy` is set). + +Example: + +```json5 +{ + channels: { + mattermost: { + groupPolicy: "open", + groups: { + "*": { requireMention: true }, + "team-channel-id": { requireMention: false }, + }, + }, + }, +} +``` + +## Targets for outbound delivery + +Use these target formats with `openclaw message send` or cron/webhooks: + +- `channel:` for a channel +- `user:` for a DM +- `@username` for a DM (resolved via the Mattermost API) + +Bare opaque IDs (like `64ifufp...`) are **ambiguous** in Mattermost (user ID vs channel ID). + +OpenClaw resolves them **user-first**: + +- If the ID exists as a user (`GET /api/v4/users/` succeeds), OpenClaw sends a **DM** by resolving the direct channel via `/api/v4/channels/direct`. +- Otherwise the ID is treated as a **channel ID**. + +If you need deterministic behavior, always use the explicit prefixes (`user:` / `channel:`). + +## DM channel retry + +When OpenClaw sends to a Mattermost DM target and needs to resolve the direct channel first, it +retries transient direct-channel creation failures by default. + +Use `channels.mattermost.dmChannelRetry` to tune that behavior globally for the Mattermost plugin, +or `channels.mattermost.accounts..dmChannelRetry` for one account. + +```json5 +{ + channels: { + mattermost: { + dmChannelRetry: { + maxRetries: 3, + initialDelayMs: 1000, + maxDelayMs: 10000, + timeoutMs: 30000, + }, + }, + }, +} +``` + +Notes: + +- This applies only to DM channel creation (`/api/v4/channels/direct`), not every Mattermost API call. +- Retries apply to transient failures such as rate limits, 5xx responses, and network or timeout errors. +- 4xx client errors other than `429` are treated as permanent and are not retried. + +## Reactions (message tool) + +- Use `message action=react` with `channel=mattermost`. +- `messageId` is the Mattermost post id. +- `emoji` accepts names like `thumbsup` or `:+1:` (colons are optional). +- Set `remove=true` (boolean) to remove a reaction. +- Reaction add/remove events are forwarded as system events to the routed agent session. + +Examples: + +``` +message action=react channel=mattermost target=channel: messageId= emoji=thumbsup +message action=react channel=mattermost target=channel: messageId= emoji=thumbsup remove=true +``` + +Config: + +- `channels.mattermost.actions.reactions`: enable/disable reaction actions (default true). +- Per-account override: `channels.mattermost.accounts..actions.reactions`. + +## Interactive buttons (message tool) + +Send messages with clickable buttons. When a user clicks a button, the agent receives the +selection and can respond. + +Enable buttons by adding `inlineButtons` to the channel capabilities: + +```json5 +{ + channels: { + mattermost: { + capabilities: ["inlineButtons"], + }, + }, +} +``` + +Use `message action=send` with a `buttons` parameter. Buttons are a 2D array (rows of buttons): + +``` +message action=send channel=mattermost target=channel: buttons=[[{"text":"Yes","callback_data":"yes"},{"text":"No","callback_data":"no"}]] +``` + +Button fields: + +- `text` (required): display label. +- `callback_data` (required): value sent back on click (used as the action ID). +- `style` (optional): `"default"`, `"primary"`, or `"danger"`. + +When a user clicks a button: + +1. All buttons are replaced with a confirmation line (e.g., "✓ **Yes** selected by @user"). +2. The agent receives the selection as an inbound message and responds. + +Notes: + +- Button callbacks use HMAC-SHA256 verification (automatic, no config needed). +- Mattermost strips callback data from its API responses (security feature), so all buttons + are removed on click — partial removal is not possible. +- Action IDs containing hyphens or underscores are sanitized automatically + (Mattermost routing limitation). + +Config: + +- `channels.mattermost.capabilities`: array of capability strings. Add `"inlineButtons"` to + enable the buttons tool description in the agent system prompt. +- `channels.mattermost.interactions.callbackBaseUrl`: optional external base URL for button + callbacks (for example `https://gateway.example.com`). Use this when Mattermost cannot + reach the gateway at its bind host directly. +- In multi-account setups, you can also set the same field under + `channels.mattermost.accounts..interactions.callbackBaseUrl`. +- If `interactions.callbackBaseUrl` is omitted, OpenClaw derives the callback URL from + `gateway.customBindHost` + `gateway.port`, then falls back to `http://localhost:`. +- Reachability rule: the button callback URL must be reachable from the Mattermost server. + `localhost` only works when Mattermost and OpenClaw run on the same host/network namespace. +- If your callback target is private/tailnet/internal, add its host/domain to Mattermost + `ServiceSettings.AllowedUntrustedInternalConnections`. + +### Direct API integration (external scripts) + +External scripts and webhooks can post buttons directly via the Mattermost REST API +instead of going through the agent's `message` tool. Use `buildButtonAttachments()` from +the extension when possible; if posting raw JSON, follow these rules: + +**Payload structure:** + +```json5 +{ + channel_id: "", + message: "Choose an option:", + props: { + attachments: [ + { + actions: [ + { + id: "mybutton01", // alphanumeric only — see below + type: "button", // required, or clicks are silently ignored + name: "Approve", // display label + style: "primary", // optional: "default", "primary", "danger" + integration: { + url: "https://gateway.example.com/mattermost/interactions/default", + context: { + action_id: "mybutton01", // must match button id (for name lookup) + action: "approve", + // ... any custom fields ... + _token: "", // see HMAC section below + }, + }, + }, + ], + }, + ], + }, +} +``` + +**Critical rules:** + +1. Attachments go in `props.attachments`, not top-level `attachments` (silently ignored). +2. Every action needs `type: "button"` — without it, clicks are swallowed silently. +3. Every action needs an `id` field — Mattermost ignores actions without IDs. +4. Action `id` must be **alphanumeric only** (`[a-zA-Z0-9]`). Hyphens and underscores break + Mattermost's server-side action routing (returns 404). Strip them before use. +5. `context.action_id` must match the button's `id` so the confirmation message shows the + button name (e.g., "Approve") instead of a raw ID. +6. `context.action_id` is required — the interaction handler returns 400 without it. + +**HMAC token generation:** + +The gateway verifies button clicks with HMAC-SHA256. External scripts must generate tokens +that match the gateway's verification logic: + +1. Derive the secret from the bot token: + `HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken)` +2. Build the context object with all fields **except** `_token`. +3. Serialize with **sorted keys** and **no spaces** (the gateway uses `JSON.stringify` + with sorted keys, which produces compact output). +4. Sign: `HMAC-SHA256(key=secret, data=serializedContext)` +5. Add the resulting hex digest as `_token` in the context. + +Python example: + +```python +import hmac, hashlib, json + +secret = hmac.new( + b"openclaw-mattermost-interactions", + bot_token.encode(), hashlib.sha256 +).hexdigest() + +ctx = {"action_id": "mybutton01", "action": "approve"} +payload = json.dumps(ctx, sort_keys=True, separators=(",", ":")) +token = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest() + +context = {**ctx, "_token": token} +``` + +Common HMAC pitfalls: + +- Python's `json.dumps` adds spaces by default (`{"key": "val"}`). Use + `separators=(",", ":")` to match JavaScript's compact output (`{"key":"val"}`). +- Always sign **all** context fields (minus `_token`). The gateway strips `_token` then + signs everything remaining. Signing a subset causes silent verification failure. +- Use `sort_keys=True` — the gateway sorts keys before signing, and Mattermost may + reorder context fields when storing the payload. +- Derive the secret from the bot token (deterministic), not random bytes. The secret + must be the same across the process that creates buttons and the gateway that verifies. + +## Directory adapter + +The Mattermost plugin includes a directory adapter that resolves channel and user names +via the Mattermost API. This enables `#channel-name` and `@username` targets in +`openclaw message send` and cron/webhook deliveries. + +No configuration is needed — the adapter uses the bot token from the account config. + +## Multi-account + +Mattermost supports multiple accounts under `channels.mattermost.accounts`: + +```json5 +{ + channels: { + mattermost: { + accounts: { + default: { name: "Primary", botToken: "mm-token", baseUrl: "https://chat.example.com" }, + alerts: { name: "Alerts", botToken: "mm-token-2", baseUrl: "https://alerts.example.com" }, + }, + }, + }, +} +``` + +## Troubleshooting + +- No replies in channels: ensure the bot is in the channel and mention it (oncall), use a trigger prefix (onchar), or set `chatmode: "onmessage"`. +- Auth errors: check the bot token, base URL, and whether the account is enabled. +- Multi-account issues: env vars only apply to the `default` account. +- Native slash commands return `Unauthorized: invalid command token.`: OpenClaw + did not accept the callback token. Typical causes: + - slash command registration failed or only partially completed at startup + - the callback is hitting the wrong gateway/account + - Mattermost still has old commands pointing at a previous callback target + - the gateway restarted without reactivating slash commands +- If native slash commands stop working, check logs for + `mattermost: failed to register slash commands` or + `mattermost: native slash commands enabled but no commands could be registered`. +- If `callbackUrl` is omitted and logs warn that the callback resolved to + `http://127.0.0.1:18789/...`, that URL is probably only reachable when + Mattermost runs on the same host/network namespace as OpenClaw. Set an + explicit externally reachable `commands.callbackUrl` instead. +- Buttons appear as white boxes: the agent may be sending malformed button data. Check that each button has both `text` and `callback_data` fields. +- Buttons render but clicks do nothing: verify `AllowedUntrustedInternalConnections` in Mattermost server config includes `127.0.0.1 localhost`, and that `EnablePostActionIntegration` is `true` in ServiceSettings. +- Buttons return 404 on click: the button `id` likely contains hyphens or underscores. Mattermost's action router breaks on non-alphanumeric IDs. Use `[a-zA-Z0-9]` only. +- Gateway logs `invalid _token`: HMAC mismatch. Check that you sign all context fields (not a subset), use sorted keys, and use compact JSON (no spaces). See the HMAC section above. +- Gateway logs `missing _token in context`: the `_token` field is not in the button's context. Ensure it is included when building the integration payload. +- Confirmation shows raw ID instead of button name: `context.action_id` does not match the button's `id`. Set both to the same sanitized value. +- Agent doesn't know about buttons: add `capabilities: ["inlineButtons"]` to the Mattermost channel config. + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/msteams.md b/docs/channels/msteams.md new file mode 100644 index 000000000..a178f326e --- /dev/null +++ b/docs/channels/msteams.md @@ -0,0 +1,805 @@ +--- +summary: "Microsoft Teams bot support status, capabilities, and configuration" +read_when: + - Working on Microsoft Teams channel features +title: "Microsoft Teams" +--- + +# Microsoft Teams + +> "Abandon all hope, ye who enter here." + +Updated: 2026-01-21 + +Status: text + DM attachments are supported; channel/group file sending requires `sharePointSiteId` + Graph permissions (see [Sending files in group chats](#sending-files-in-group-chats)). Polls are sent via Adaptive Cards. Message actions expose explicit `upload-file` for file-first sends. + +## Bundled plugin + +Microsoft Teams ships as a bundled plugin in current OpenClaw releases, so no +separate install is required in the normal packaged build. + +If you are on an older build or a custom install that excludes bundled Teams, +install it manually: + +```bash +openclaw plugins install @openclaw/msteams +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./path/to/local/msteams-plugin +``` + +Details: [Plugins](/tools/plugin) + +## Quick setup (beginner) + +1. Ensure the Microsoft Teams plugin is available. + - Current packaged OpenClaw releases already bundle it. + - Older/custom installs can add it manually with the commands above. +2. Create an **Azure Bot** (App ID + client secret + tenant ID). +3. Configure OpenClaw with those credentials. +4. Expose `/api/messages` (port 3978 by default) via a public URL or tunnel. +5. Install the Teams app package and start the gateway. + +Minimal config: + +```json5 +{ + channels: { + msteams: { + enabled: true, + appId: "", + appPassword: "", + tenantId: "", + webhook: { port: 3978, path: "/api/messages" }, + }, + }, +} +``` + +Note: group chats are blocked by default (`channels.msteams.groupPolicy: "allowlist"`). To allow group replies, set `channels.msteams.groupAllowFrom` (or use `groupPolicy: "open"` to allow any member, mention-gated). + +## Goals + +- Talk to OpenClaw via Teams DMs, group chats, or channels. +- Keep routing deterministic: replies always go back to the channel they arrived on. +- Default to safe channel behavior (mentions required unless configured otherwise). + +## Config writes + +By default, Microsoft Teams is allowed to write config updates triggered by `/config set|unset` (requires `commands.config: true`). + +Disable with: + +```json5 +{ + channels: { msteams: { configWrites: false } }, +} +``` + +## Access control (DMs + groups) + +**DM access** + +- Default: `channels.msteams.dmPolicy = "pairing"`. Unknown senders are ignored until approved. +- `channels.msteams.allowFrom` should use stable AAD object IDs. +- UPNs/display names are mutable; direct matching is disabled by default and only enabled with `channels.msteams.dangerouslyAllowNameMatching: true`. +- The wizard can resolve names to IDs via Microsoft Graph when credentials allow. + +**Group access** + +- Default: `channels.msteams.groupPolicy = "allowlist"` (blocked unless you add `groupAllowFrom`). Use `channels.defaults.groupPolicy` to override the default when unset. +- `channels.msteams.groupAllowFrom` controls which senders can trigger in group chats/channels (falls back to `channels.msteams.allowFrom`). +- Set `groupPolicy: "open"` to allow any member (still mention‑gated by default). +- To allow **no channels**, set `channels.msteams.groupPolicy: "disabled"`. + +Example: + +```json5 +{ + channels: { + msteams: { + groupPolicy: "allowlist", + groupAllowFrom: ["user@org.com"], + }, + }, +} +``` + +**Teams + channel allowlist** + +- Scope group/channel replies by listing teams and channels under `channels.msteams.teams`. +- Keys should use stable team IDs and channel conversation IDs. +- When `groupPolicy="allowlist"` and a teams allowlist is present, only listed teams/channels are accepted (mention‑gated). +- The configure wizard accepts `Team/Channel` entries and stores them for you. +- On startup, OpenClaw resolves team/channel and user allowlist names to IDs (when Graph permissions allow) + and logs the mapping; unresolved team/channel names are kept as typed but ignored for routing by default unless `channels.msteams.dangerouslyAllowNameMatching: true` is enabled. + +Example: + +```json5 +{ + channels: { + msteams: { + groupPolicy: "allowlist", + teams: { + "My Team": { + channels: { + General: { requireMention: true }, + }, + }, + }, + }, + }, +} +``` + +## How it works + +1. Ensure the Microsoft Teams plugin is available. + - Current packaged OpenClaw releases already bundle it. + - Older/custom installs can add it manually with the commands above. +2. Create an **Azure Bot** (App ID + secret + tenant ID). +3. Build a **Teams app package** that references the bot and includes the RSC permissions below. +4. Upload/install the Teams app into a team (or personal scope for DMs). +5. Configure `msteams` in `~/.openclaw/openclaw.json` (or env vars) and start the gateway. +6. The gateway listens for Bot Framework webhook traffic on `/api/messages` by default. + +## Azure Bot Setup (Prerequisites) + +Before configuring OpenClaw, you need to create an Azure Bot resource. + +### Step 1: Create Azure Bot + +1. Go to [Create Azure Bot](https://portal.azure.com/#create/Microsoft.AzureBot) +2. Fill in the **Basics** tab: + + | Field | Value | + | ------------------ | -------------------------------------------------------- | + | **Bot handle** | Your bot name, e.g., `openclaw-msteams` (must be unique) | + | **Subscription** | Select your Azure subscription | + | **Resource group** | Create new or use existing | + | **Pricing tier** | **Free** for dev/testing | + | **Type of App** | **Single Tenant** (recommended - see note below) | + | **Creation type** | **Create new Microsoft App ID** | + +> **Deprecation notice:** Creation of new multi-tenant bots was deprecated after 2025-07-31. Use **Single Tenant** for new bots. + +3. Click **Review + create** → **Create** (wait ~1-2 minutes) + +### Step 2: Get Credentials + +1. Go to your Azure Bot resource → **Configuration** +2. Copy **Microsoft App ID** → this is your `appId` +3. Click **Manage Password** → go to the App Registration +4. Under **Certificates & secrets** → **New client secret** → copy the **Value** → this is your `appPassword` +5. Go to **Overview** → copy **Directory (tenant) ID** → this is your `tenantId` + +### Step 3: Configure Messaging Endpoint + +1. In Azure Bot → **Configuration** +2. Set **Messaging endpoint** to your webhook URL: + - Production: `https://your-domain.com/api/messages` + - Local dev: Use a tunnel (see [Local Development](#local-development-tunneling) below) + +### Step 4: Enable Teams Channel + +1. In Azure Bot → **Channels** +2. Click **Microsoft Teams** → Configure → Save +3. Accept the Terms of Service + +## Local Development (Tunneling) + +Teams can't reach `localhost`. Use a tunnel for local development: + +**Option A: ngrok** + +```bash +ngrok http 3978 +# Copy the https URL, e.g., https://abc123.ngrok.io +# Set messaging endpoint to: https://abc123.ngrok.io/api/messages +``` + +**Option B: Tailscale Funnel** + +```bash +tailscale funnel 3978 +# Use your Tailscale funnel URL as the messaging endpoint +``` + +## Teams Developer Portal (Alternative) + +Instead of manually creating a manifest ZIP, you can use the [Teams Developer Portal](https://dev.teams.microsoft.com/apps): + +1. Click **+ New app** +2. Fill in basic info (name, description, developer info) +3. Go to **App features** → **Bot** +4. Select **Enter a bot ID manually** and paste your Azure Bot App ID +5. Check scopes: **Personal**, **Team**, **Group Chat** +6. Click **Distribute** → **Download app package** +7. In Teams: **Apps** → **Manage your apps** → **Upload a custom app** → select the ZIP + +This is often easier than hand-editing JSON manifests. + +## Testing the Bot + +**Option A: Azure Web Chat (verify webhook first)** + +1. In Azure Portal → your Azure Bot resource → **Test in Web Chat** +2. Send a message - you should see a response +3. This confirms your webhook endpoint works before Teams setup + +**Option B: Teams (after app installation)** + +1. Install the Teams app (sideload or org catalog) +2. Find the bot in Teams and send a DM +3. Check gateway logs for incoming activity + +## Setup (minimal text-only) + +1. **Ensure the Microsoft Teams plugin is available** + - Current packaged OpenClaw releases already bundle it. + - Older/custom installs can add it manually: + - From npm: `openclaw plugins install @openclaw/msteams` + - From a local checkout: `openclaw plugins install ./path/to/local/msteams-plugin` + +2. **Bot registration** + - Create an Azure Bot (see above) and note: + - App ID + - Client secret (App password) + - Tenant ID (single-tenant) + +3. **Teams app manifest** + - Include a `bot` entry with `botId = `. + - Scopes: `personal`, `team`, `groupChat`. + - `supportsFiles: true` (required for personal scope file handling). + - Add RSC permissions (below). + - Create icons: `outline.png` (32x32) and `color.png` (192x192). + - Zip all three files together: `manifest.json`, `outline.png`, `color.png`. + +4. **Configure OpenClaw** + + ```json5 + { + channels: { + msteams: { + enabled: true, + appId: "", + appPassword: "", + tenantId: "", + webhook: { port: 3978, path: "/api/messages" }, + }, + }, + } + ``` + + You can also use environment variables instead of config keys: + - `MSTEAMS_APP_ID` + - `MSTEAMS_APP_PASSWORD` + - `MSTEAMS_TENANT_ID` + +5. **Bot endpoint** + - Set the Azure Bot Messaging Endpoint to: + - `https://:3978/api/messages` (or your chosen path/port). + +6. **Run the gateway** + - The Teams channel starts automatically when the bundled or manually installed plugin is available and `msteams` config exists with credentials. + +## Member info action + +OpenClaw exposes a Graph-backed `member-info` action for Microsoft Teams so agents and automations can resolve channel member details (display name, email, role) directly from Microsoft Graph. + +Requirements: + +- `Member.Read.Group` RSC permission (already in the recommended manifest) +- For cross-team lookups: `User.Read.All` Graph Application permission with admin consent + +The action is gated by `channels.msteams.actions.memberInfo` (default: enabled when Graph credentials are available). + +## History context + +- `channels.msteams.historyLimit` controls how many recent channel/group messages are wrapped into the prompt. +- Falls back to `messages.groupChat.historyLimit`. Set `0` to disable (default 50). +- Fetched thread history is filtered by sender allowlists (`allowFrom` / `groupAllowFrom`), so thread context seeding only includes messages from allowed senders. +- Quoted attachment context (`ReplyTo*` derived from Teams reply HTML) is currently passed as received. +- In other words, allowlists gate who can trigger the agent; only specific supplemental context paths are filtered today. +- DM history can be limited with `channels.msteams.dmHistoryLimit` (user turns). Per-user overrides: `channels.msteams.dms[""].historyLimit`. + +## Current Teams RSC Permissions (Manifest) + +These are the **existing resourceSpecific permissions** in our Teams app manifest. They only apply inside the team/chat where the app is installed. + +**For channels (team scope):** + +- `ChannelMessage.Read.Group` (Application) - receive all channel messages without @mention +- `ChannelMessage.Send.Group` (Application) +- `Member.Read.Group` (Application) +- `Owner.Read.Group` (Application) +- `ChannelSettings.Read.Group` (Application) +- `TeamMember.Read.Group` (Application) +- `TeamSettings.Read.Group` (Application) + +**For group chats:** + +- `ChatMessage.Read.Chat` (Application) - receive all group chat messages without @mention + +## Example Teams Manifest (redacted) + +Minimal, valid example with the required fields. Replace IDs and URLs. + +```json5 +{ + $schema: "https://developer.microsoft.com/en-us/json-schemas/teams/v1.23/MicrosoftTeams.schema.json", + manifestVersion: "1.23", + version: "1.0.0", + id: "00000000-0000-0000-0000-000000000000", + name: { short: "OpenClaw" }, + developer: { + name: "Your Org", + websiteUrl: "https://example.com", + privacyUrl: "https://example.com/privacy", + termsOfUseUrl: "https://example.com/terms", + }, + description: { short: "OpenClaw in Teams", full: "OpenClaw in Teams" }, + icons: { outline: "outline.png", color: "color.png" }, + accentColor: "#5B6DEF", + bots: [ + { + botId: "11111111-1111-1111-1111-111111111111", + scopes: ["personal", "team", "groupChat"], + isNotificationOnly: false, + supportsCalling: false, + supportsVideo: false, + supportsFiles: true, + }, + ], + webApplicationInfo: { + id: "11111111-1111-1111-1111-111111111111", + }, + authorization: { + permissions: { + resourceSpecific: [ + { name: "ChannelMessage.Read.Group", type: "Application" }, + { name: "ChannelMessage.Send.Group", type: "Application" }, + { name: "Member.Read.Group", type: "Application" }, + { name: "Owner.Read.Group", type: "Application" }, + { name: "ChannelSettings.Read.Group", type: "Application" }, + { name: "TeamMember.Read.Group", type: "Application" }, + { name: "TeamSettings.Read.Group", type: "Application" }, + { name: "ChatMessage.Read.Chat", type: "Application" }, + ], + }, + }, +} +``` + +### Manifest caveats (must-have fields) + +- `bots[].botId` **must** match the Azure Bot App ID. +- `webApplicationInfo.id` **must** match the Azure Bot App ID. +- `bots[].scopes` must include the surfaces you plan to use (`personal`, `team`, `groupChat`). +- `bots[].supportsFiles: true` is required for file handling in personal scope. +- `authorization.permissions.resourceSpecific` must include channel read/send if you want channel traffic. + +### Updating an existing app + +To update an already-installed Teams app (e.g., to add RSC permissions): + +1. Update your `manifest.json` with the new settings +2. **Increment the `version` field** (e.g., `1.0.0` → `1.1.0`) +3. **Re-zip** the manifest with icons (`manifest.json`, `outline.png`, `color.png`) +4. Upload the new zip: + - **Option A (Teams Admin Center):** Teams Admin Center → Teams apps → Manage apps → find your app → Upload new version + - **Option B (Sideload):** In Teams → Apps → Manage your apps → Upload a custom app +5. **For team channels:** Reinstall the app in each team for new permissions to take effect +6. **Fully quit and relaunch Teams** (not just close the window) to clear cached app metadata + +## Capabilities: RSC only vs Graph + +### With **Teams RSC only** (app installed, no Graph API permissions) + +Works: + +- Read channel message **text** content. +- Send channel message **text** content. +- Receive **personal (DM)** file attachments. + +Does NOT work: + +- Channel/group **image or file contents** (payload only includes HTML stub). +- Downloading attachments stored in SharePoint/OneDrive. +- Reading message history (beyond the live webhook event). + +### With **Teams RSC + Microsoft Graph Application permissions** + +Adds: + +- Downloading hosted contents (images pasted into messages). +- Downloading file attachments stored in SharePoint/OneDrive. +- Reading channel/chat message history via Graph. + +### RSC vs Graph API + +| Capability | RSC Permissions | Graph API | +| ----------------------- | -------------------- | ----------------------------------- | +| **Real-time messages** | Yes (via webhook) | No (polling only) | +| **Historical messages** | No | Yes (can query history) | +| **Setup complexity** | App manifest only | Requires admin consent + token flow | +| **Works offline** | No (must be running) | Yes (query anytime) | + +**Bottom line:** RSC is for real-time listening; Graph API is for historical access. For catching up on missed messages while offline, you need Graph API with `ChannelMessage.Read.All` (requires admin consent). + +## Graph-enabled media + history (required for channels) + +If you need images/files in **channels** or want to fetch **message history**, you must enable Microsoft Graph permissions and grant admin consent. + +1. In Entra ID (Azure AD) **App Registration**, add Microsoft Graph **Application permissions**: + - `ChannelMessage.Read.All` (channel attachments + history) + - `Chat.Read.All` or `ChatMessage.Read.All` (group chats) +2. **Grant admin consent** for the tenant. +3. Bump the Teams app **manifest version**, re-upload, and **reinstall the app in Teams**. +4. **Fully quit and relaunch Teams** to clear cached app metadata. + +**Additional permission for user mentions:** User @mentions work out of the box for users in the conversation. However, if you want to dynamically search and mention users who are **not in the current conversation**, add `User.Read.All` (Application) permission and grant admin consent. + +## Known Limitations + +### Webhook timeouts + +Teams delivers messages via HTTP webhook. If processing takes too long (e.g., slow LLM responses), you may see: + +- Gateway timeouts +- Teams retrying the message (causing duplicates) +- Dropped replies + +OpenClaw handles this by returning quickly and sending replies proactively, but very slow responses may still cause issues. + +### Formatting + +Teams markdown is more limited than Slack or Discord: + +- Basic formatting works: **bold**, _italic_, `code`, links +- Complex markdown (tables, nested lists) may not render correctly +- Adaptive Cards are supported for polls and arbitrary card sends (see below) + +## Configuration + +Key settings (see `/gateway/configuration` for shared channel patterns): + +- `channels.msteams.enabled`: enable/disable the channel. +- `channels.msteams.appId`, `channels.msteams.appPassword`, `channels.msteams.tenantId`: bot credentials. +- `channels.msteams.webhook.port` (default `3978`) +- `channels.msteams.webhook.path` (default `/api/messages`) +- `channels.msteams.dmPolicy`: `pairing | allowlist | open | disabled` (default: pairing) +- `channels.msteams.allowFrom`: DM allowlist (AAD object IDs recommended). The wizard resolves names to IDs during setup when Graph access is available. +- `channels.msteams.dangerouslyAllowNameMatching`: break-glass toggle to re-enable mutable UPN/display-name matching and direct team/channel name routing. +- `channels.msteams.textChunkLimit`: outbound text chunk size. +- `channels.msteams.chunkMode`: `length` (default) or `newline` to split on blank lines (paragraph boundaries) before length chunking. +- `channels.msteams.mediaAllowHosts`: allowlist for inbound attachment hosts (defaults to Microsoft/Teams domains). +- `channels.msteams.mediaAuthAllowHosts`: allowlist for attaching Authorization headers on media retries (defaults to Graph + Bot Framework hosts). +- `channels.msteams.requireMention`: require @mention in channels/groups (default true). +- `channels.msteams.replyStyle`: `thread | top-level` (see [Reply Style](#reply-style-threads-vs-posts)). +- `channels.msteams.teams..replyStyle`: per-team override. +- `channels.msteams.teams..requireMention`: per-team override. +- `channels.msteams.teams..tools`: default per-team tool policy overrides (`allow`/`deny`/`alsoAllow`) used when a channel override is missing. +- `channels.msteams.teams..toolsBySender`: default per-team per-sender tool policy overrides (`"*"` wildcard supported). +- `channels.msteams.teams..channels..replyStyle`: per-channel override. +- `channels.msteams.teams..channels..requireMention`: per-channel override. +- `channels.msteams.teams..channels..tools`: per-channel tool policy overrides (`allow`/`deny`/`alsoAllow`). +- `channels.msteams.teams..channels..toolsBySender`: per-channel per-sender tool policy overrides (`"*"` wildcard supported). +- `toolsBySender` keys should use explicit prefixes: + `id:`, `e164:`, `username:`, `name:` (legacy unprefixed keys still map to `id:` only). +- `channels.msteams.actions.memberInfo`: enable or disable the Graph-backed member info action (default: enabled when Graph credentials are available). +- `channels.msteams.sharePointSiteId`: SharePoint site ID for file uploads in group chats/channels (see [Sending files in group chats](#sending-files-in-group-chats)). + +## Routing & Sessions + +- Session keys follow the standard agent format (see [/concepts/session](/concepts/session)): + - Direct messages share the main session (`agent::`). + - Channel/group messages use conversation id: + - `agent::msteams:channel:` + - `agent::msteams:group:` + +## Reply Style: Threads vs Posts + +Teams recently introduced two channel UI styles over the same underlying data model: + +| Style | Description | Recommended `replyStyle` | +| ------------------------ | --------------------------------------------------------- | ------------------------ | +| **Posts** (classic) | Messages appear as cards with threaded replies underneath | `thread` (default) | +| **Threads** (Slack-like) | Messages flow linearly, more like Slack | `top-level` | + +**The problem:** The Teams API does not expose which UI style a channel uses. If you use the wrong `replyStyle`: + +- `thread` in a Threads-style channel → replies appear nested awkwardly +- `top-level` in a Posts-style channel → replies appear as separate top-level posts instead of in-thread + +**Solution:** Configure `replyStyle` per-channel based on how the channel is set up: + +```json5 +{ + channels: { + msteams: { + replyStyle: "thread", + teams: { + "19:abc...@thread.tacv2": { + channels: { + "19:xyz...@thread.tacv2": { + replyStyle: "top-level", + }, + }, + }, + }, + }, + }, +} +``` + +## Attachments & Images + +**Current limitations:** + +- **DMs:** Images and file attachments work via Teams bot file APIs. +- **Channels/groups:** Attachments live in M365 storage (SharePoint/OneDrive). The webhook payload only includes an HTML stub, not the actual file bytes. **Graph API permissions are required** to download channel attachments. +- For explicit file-first sends, use `action=upload-file` with `media` / `filePath` / `path`; optional `message` becomes the accompanying text/comment, and `filename` overrides the uploaded name. + +Without Graph permissions, channel messages with images will be received as text-only (the image content is not accessible to the bot). +By default, OpenClaw only downloads media from Microsoft/Teams hostnames. Override with `channels.msteams.mediaAllowHosts` (use `["*"]` to allow any host). +Authorization headers are only attached for hosts in `channels.msteams.mediaAuthAllowHosts` (defaults to Graph + Bot Framework hosts). Keep this list strict (avoid multi-tenant suffixes). + +## Sending files in group chats + +Bots can send files in DMs using the FileConsentCard flow (built-in). However, **sending files in group chats/channels** requires additional setup: + +| Context | How files are sent | Setup needed | +| ------------------------ | -------------------------------------------- | ----------------------------------------------- | +| **DMs** | FileConsentCard → user accepts → bot uploads | Works out of the box | +| **Group chats/channels** | Upload to SharePoint → share link | Requires `sharePointSiteId` + Graph permissions | +| **Images (any context)** | Base64-encoded inline | Works out of the box | + +### Why group chats need SharePoint + +Bots don't have a personal OneDrive drive (the `/me/drive` Graph API endpoint doesn't work for application identities). To send files in group chats/channels, the bot uploads to a **SharePoint site** and creates a sharing link. + +### Setup + +1. **Add Graph API permissions** in Entra ID (Azure AD) → App Registration: + - `Sites.ReadWrite.All` (Application) - upload files to SharePoint + - `Chat.Read.All` (Application) - optional, enables per-user sharing links + +2. **Grant admin consent** for the tenant. + +3. **Get your SharePoint site ID:** + + ```bash + # Via Graph Explorer or curl with a valid token: + curl -H "Authorization: Bearer $TOKEN" \ + "https://graph.microsoft.com/v1.0/sites/{hostname}:/{site-path}" + + # Example: for a site at "contoso.sharepoint.com/sites/BotFiles" + curl -H "Authorization: Bearer $TOKEN" \ + "https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/BotFiles" + + # Response includes: "id": "contoso.sharepoint.com,guid1,guid2" + ``` + +4. **Configure OpenClaw:** + + ```json5 + { + channels: { + msteams: { + // ... other config ... + sharePointSiteId: "contoso.sharepoint.com,guid1,guid2", + }, + }, + } + ``` + +### Sharing behavior + +| Permission | Sharing behavior | +| --------------------------------------- | --------------------------------------------------------- | +| `Sites.ReadWrite.All` only | Organization-wide sharing link (anyone in org can access) | +| `Sites.ReadWrite.All` + `Chat.Read.All` | Per-user sharing link (only chat members can access) | + +Per-user sharing is more secure as only the chat participants can access the file. If `Chat.Read.All` permission is missing, the bot falls back to organization-wide sharing. + +### Fallback behavior + +| Scenario | Result | +| ------------------------------------------------- | -------------------------------------------------- | +| Group chat + file + `sharePointSiteId` configured | Upload to SharePoint, send sharing link | +| Group chat + file + no `sharePointSiteId` | Attempt OneDrive upload (may fail), send text only | +| Personal chat + file | FileConsentCard flow (works without SharePoint) | +| Any context + image | Base64-encoded inline (works without SharePoint) | + +### Files stored location + +Uploaded files are stored in a `/OpenClawShared/` folder in the configured SharePoint site's default document library. + +## Polls (Adaptive Cards) + +OpenClaw sends Teams polls as Adaptive Cards (there is no native Teams poll API). + +- CLI: `openclaw message poll --channel msteams --target conversation: ...` +- Votes are recorded by the gateway in `~/.openclaw/msteams-polls.json`. +- The gateway must stay online to record votes. +- Polls do not auto-post result summaries yet (inspect the store file if needed). + +## Adaptive Cards (arbitrary) + +Send any Adaptive Card JSON to Teams users or conversations using the `message` tool or CLI. + +The `card` parameter accepts an Adaptive Card JSON object. When `card` is provided, the message text is optional. + +**Agent tool:** + +```json5 +{ + action: "send", + channel: "msteams", + target: "user:", + card: { + type: "AdaptiveCard", + version: "1.5", + body: [{ type: "TextBlock", text: "Hello!" }], + }, +} +``` + +**CLI:** + +```bash +openclaw message send --channel msteams \ + --target "conversation:19:abc...@thread.tacv2" \ + --card '{"type":"AdaptiveCard","version":"1.5","body":[{"type":"TextBlock","text":"Hello!"}]}' +``` + +See [Adaptive Cards documentation](https://adaptivecards.io/) for card schema and examples. For target format details, see [Target formats](#target-formats) below. + +## Target formats + +MSTeams targets use prefixes to distinguish between users and conversations: + +| Target type | Format | Example | +| ------------------- | -------------------------------- | --------------------------------------------------- | +| User (by ID) | `user:` | `user:40a1a0ed-4ff2-4164-a219-55518990c197` | +| User (by name) | `user:` | `user:John Smith` (requires Graph API) | +| Group/channel | `conversation:` | `conversation:19:abc123...@thread.tacv2` | +| Group/channel (raw) | `` | `19:abc123...@thread.tacv2` (if contains `@thread`) | + +**CLI examples:** + +```bash +# Send to a user by ID +openclaw message send --channel msteams --target "user:40a1a0ed-..." --message "Hello" + +# Send to a user by display name (triggers Graph API lookup) +openclaw message send --channel msteams --target "user:John Smith" --message "Hello" + +# Send to a group chat or channel +openclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" --message "Hello" + +# Send an Adaptive Card to a conversation +openclaw message send --channel msteams --target "conversation:19:abc...@thread.tacv2" \ + --card '{"type":"AdaptiveCard","version":"1.5","body":[{"type":"TextBlock","text":"Hello"}]}' +``` + +**Agent tool examples:** + +```json5 +{ + action: "send", + channel: "msteams", + target: "user:John Smith", + message: "Hello!", +} +``` + +```json5 +{ + action: "send", + channel: "msteams", + target: "conversation:19:abc...@thread.tacv2", + card: { + type: "AdaptiveCard", + version: "1.5", + body: [{ type: "TextBlock", text: "Hello" }], + }, +} +``` + +Note: Without the `user:` prefix, names default to group/team resolution. Always use `user:` when targeting people by display name. + +## Proactive messaging + +- Proactive messages are only possible **after** a user has interacted, because we store conversation references at that point. +- See `/gateway/configuration` for `dmPolicy` and allowlist gating. + +## Team and Channel IDs (Common Gotcha) + +The `groupId` query parameter in Teams URLs is **NOT** the team ID used for configuration. Extract IDs from the URL path instead: + +**Team URL:** + +``` +https://teams.microsoft.com/l/team/19%3ABk4j...%40thread.tacv2/conversations?groupId=... + └────────────────────────────┘ + Team ID (URL-decode this) +``` + +**Channel URL:** + +``` +https://teams.microsoft.com/l/channel/19%3A15bc...%40thread.tacv2/ChannelName?groupId=... + └─────────────────────────┘ + Channel ID (URL-decode this) +``` + +**For config:** + +- Team ID = path segment after `/team/` (URL-decoded, e.g., `19:Bk4j...@thread.tacv2`) +- Channel ID = path segment after `/channel/` (URL-decoded) +- **Ignore** the `groupId` query parameter + +## Private Channels + +Bots have limited support in private channels: + +| Feature | Standard Channels | Private Channels | +| ---------------------------- | ----------------- | ---------------------- | +| Bot installation | Yes | Limited | +| Real-time messages (webhook) | Yes | May not work | +| RSC permissions | Yes | May behave differently | +| @mentions | Yes | If bot is accessible | +| Graph API history | Yes | Yes (with permissions) | + +**Workarounds if private channels don't work:** + +1. Use standard channels for bot interactions +2. Use DMs - users can always message the bot directly +3. Use Graph API for historical access (requires `ChannelMessage.Read.All`) + +## Troubleshooting + +### Common issues + +- **Images not showing in channels:** Graph permissions or admin consent missing. Reinstall the Teams app and fully quit/reopen Teams. +- **No responses in channel:** mentions are required by default; set `channels.msteams.requireMention=false` or configure per team/channel. +- **Version mismatch (Teams still shows old manifest):** remove + re-add the app and fully quit Teams to refresh. +- **401 Unauthorized from webhook:** Expected when testing manually without Azure JWT - means endpoint is reachable but auth failed. Use Azure Web Chat to test properly. + +### Manifest upload errors + +- **"Icon file cannot be empty":** The manifest references icon files that are 0 bytes. Create valid PNG icons (32x32 for `outline.png`, 192x192 for `color.png`). +- **"webApplicationInfo.Id already in use":** The app is still installed in another team/chat. Find and uninstall it first, or wait 5-10 minutes for propagation. +- **"Something went wrong" on upload:** Upload via [https://admin.teams.microsoft.com](https://admin.teams.microsoft.com) instead, open browser DevTools (F12) → Network tab, and check the response body for the actual error. +- **Sideload failing:** Try "Upload an app to your org's app catalog" instead of "Upload a custom app" - this often bypasses sideload restrictions. + +### RSC permissions not working + +1. Verify `webApplicationInfo.id` matches your bot's App ID exactly +2. Re-upload the app and reinstall in the team/chat +3. Check if your org admin has blocked RSC permissions +4. Confirm you're using the right scope: `ChannelMessage.Read.Group` for teams, `ChatMessage.Read.Chat` for group chats + +## References + +- [Create Azure Bot](https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration) - Azure Bot setup guide +- [Teams Developer Portal](https://dev.teams.microsoft.com/apps) - create/manage Teams apps +- [Teams app manifest schema](https://learn.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema) +- [Receive channel messages with RSC](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/channel-messages-with-rsc) +- [RSC permissions reference](https://learn.microsoft.com/en-us/microsoftteams/platform/graph-api/rsc/resource-specific-consent) +- [Teams bot file handling](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/bots-filesv4) (channel/group requires Graph) +- [Proactive messaging](https://learn.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages) + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/nextcloud-talk.md b/docs/channels/nextcloud-talk.md new file mode 100644 index 000000000..8a93e4461 --- /dev/null +++ b/docs/channels/nextcloud-talk.md @@ -0,0 +1,149 @@ +--- +summary: "Nextcloud Talk support status, capabilities, and configuration" +read_when: + - Working on Nextcloud Talk channel features +title: "Nextcloud Talk" +--- + +# Nextcloud Talk + +Status: bundled plugin (webhook bot). Direct messages, rooms, reactions, and markdown messages are supported. + +## Bundled plugin + +Nextcloud Talk ships as a bundled plugin in current OpenClaw releases, so +normal packaged builds do not need a separate install. + +If you are on an older build or a custom install that excludes Nextcloud Talk, +install it manually: + +Install via CLI (npm registry): + +```bash +openclaw plugins install @openclaw/nextcloud-talk +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./path/to/local/nextcloud-talk-plugin +``` + +Details: [Plugins](/tools/plugin) + +## Quick setup (beginner) + +1. Ensure the Nextcloud Talk plugin is available. + - Current packaged OpenClaw releases already bundle it. + - Older/custom installs can add it manually with the commands above. +2. On your Nextcloud server, create a bot: + + ```bash + ./occ talk:bot:install "OpenClaw" "" "" --feature reaction + ``` + +3. Enable the bot in the target room settings. +4. Configure OpenClaw: + - Config: `channels.nextcloud-talk.baseUrl` + `channels.nextcloud-talk.botSecret` + - Or env: `NEXTCLOUD_TALK_BOT_SECRET` (default account only) +5. Restart the gateway (or finish setup). + +Minimal config: + +```json5 +{ + channels: { + "nextcloud-talk": { + enabled: true, + baseUrl: "https://cloud.example.com", + botSecret: "shared-secret", + dmPolicy: "pairing", + }, + }, +} +``` + +## Notes + +- Bots cannot initiate DMs. The user must message the bot first. +- Webhook URL must be reachable by the Gateway; set `webhookPublicUrl` if behind a proxy. +- Media uploads are not supported by the bot API; media is sent as URLs. +- The webhook payload does not distinguish DMs vs rooms; set `apiUser` + `apiPassword` to enable room-type lookups (otherwise DMs are treated as rooms). + +## Access control (DMs) + +- Default: `channels.nextcloud-talk.dmPolicy = "pairing"`. Unknown senders get a pairing code. +- Approve via: + - `openclaw pairing list nextcloud-talk` + - `openclaw pairing approve nextcloud-talk ` +- Public DMs: `channels.nextcloud-talk.dmPolicy="open"` plus `channels.nextcloud-talk.allowFrom=["*"]`. +- `allowFrom` matches Nextcloud user IDs only; display names are ignored. + +## Rooms (groups) + +- Default: `channels.nextcloud-talk.groupPolicy = "allowlist"` (mention-gated). +- Allowlist rooms with `channels.nextcloud-talk.rooms`: + +```json5 +{ + channels: { + "nextcloud-talk": { + rooms: { + "room-token": { requireMention: true }, + }, + }, + }, +} +``` + +- To allow no rooms, keep the allowlist empty or set `channels.nextcloud-talk.groupPolicy="disabled"`. + +## Capabilities + +| Feature | Status | +| --------------- | ------------- | +| Direct messages | Supported | +| Rooms | Supported | +| Threads | Not supported | +| Media | URL-only | +| Reactions | Supported | +| Native commands | Not supported | + +## Configuration reference (Nextcloud Talk) + +Full configuration: [Configuration](/gateway/configuration) + +Provider options: + +- `channels.nextcloud-talk.enabled`: enable/disable channel startup. +- `channels.nextcloud-talk.baseUrl`: Nextcloud instance URL. +- `channels.nextcloud-talk.botSecret`: bot shared secret. +- `channels.nextcloud-talk.botSecretFile`: regular-file secret path. Symlinks are rejected. +- `channels.nextcloud-talk.apiUser`: API user for room lookups (DM detection). +- `channels.nextcloud-talk.apiPassword`: API/app password for room lookups. +- `channels.nextcloud-talk.apiPasswordFile`: API password file path. +- `channels.nextcloud-talk.webhookPort`: webhook listener port (default: 8788). +- `channels.nextcloud-talk.webhookHost`: webhook host (default: 0.0.0.0). +- `channels.nextcloud-talk.webhookPath`: webhook path (default: /nextcloud-talk-webhook). +- `channels.nextcloud-talk.webhookPublicUrl`: externally reachable webhook URL. +- `channels.nextcloud-talk.dmPolicy`: `pairing | allowlist | open | disabled`. +- `channels.nextcloud-talk.allowFrom`: DM allowlist (user IDs). `open` requires `"*"`. +- `channels.nextcloud-talk.groupPolicy`: `allowlist | open | disabled`. +- `channels.nextcloud-talk.groupAllowFrom`: group allowlist (user IDs). +- `channels.nextcloud-talk.rooms`: per-room settings and allowlist. +- `channels.nextcloud-talk.historyLimit`: group history limit (0 disables). +- `channels.nextcloud-talk.dmHistoryLimit`: DM history limit (0 disables). +- `channels.nextcloud-talk.dms`: per-DM overrides (historyLimit). +- `channels.nextcloud-talk.textChunkLimit`: outbound text chunk size (chars). +- `channels.nextcloud-talk.chunkMode`: `length` (default) or `newline` to split on blank lines (paragraph boundaries) before length chunking. +- `channels.nextcloud-talk.blockStreaming`: disable block streaming for this channel. +- `channels.nextcloud-talk.blockStreamingCoalesce`: block streaming coalesce tuning. +- `channels.nextcloud-talk.mediaMaxMb`: inbound media cap (MB). + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/nostr.md b/docs/channels/nostr.md new file mode 100644 index 000000000..4b1d0dcd1 --- /dev/null +++ b/docs/channels/nostr.md @@ -0,0 +1,252 @@ +--- +summary: "Nostr DM channel via NIP-04 encrypted messages" +read_when: + - You want OpenClaw to receive DMs via Nostr + - You're setting up decentralized messaging +title: "Nostr" +--- + +# Nostr + +**Status:** Optional bundled plugin (disabled by default until configured). + +Nostr is a decentralized protocol for social networking. This channel enables OpenClaw to receive and respond to encrypted direct messages (DMs) via NIP-04. + +## Bundled plugin + +Current OpenClaw releases ship Nostr as a bundled plugin, so normal packaged +builds do not need a separate install. + +### Older/custom installs + +- Onboarding (`openclaw onboard`) and `openclaw channels add` still surface + Nostr from the shared channel catalog. +- If your build excludes bundled Nostr, install it manually. + +```bash +openclaw plugins install @openclaw/nostr +``` + +Use a local checkout (dev workflows): + +```bash +openclaw plugins install --link +``` + +Restart the Gateway after installing or enabling plugins. + +### Non-interactive setup + +```bash +openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY" +openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY" --relay-urls "wss://relay.damus.io,wss://relay.primal.net" +``` + +Use `--use-env` to keep `NOSTR_PRIVATE_KEY` in the environment instead of storing the key in config. + +## Quick setup + +1. Generate a Nostr keypair (if needed): + +```bash +# Using nak +nak key generate +``` + +2. Add to config: + +```json5 +{ + channels: { + nostr: { + privateKey: "${NOSTR_PRIVATE_KEY}", + }, + }, +} +``` + +3. Export the key: + +```bash +export NOSTR_PRIVATE_KEY="nsec1..." +``` + +4. Restart the Gateway. + +## Configuration reference + +| Key | Type | Default | Description | +| ------------ | -------- | ------------------------------------------- | ----------------------------------- | +| `privateKey` | string | required | Private key in `nsec` or hex format | +| `relays` | string[] | `['wss://relay.damus.io', 'wss://nos.lol']` | Relay URLs (WebSocket) | +| `dmPolicy` | string | `pairing` | DM access policy | +| `allowFrom` | string[] | `[]` | Allowed sender pubkeys | +| `enabled` | boolean | `true` | Enable/disable channel | +| `name` | string | - | Display name | +| `profile` | object | - | NIP-01 profile metadata | + +## Profile metadata + +Profile data is published as a NIP-01 `kind:0` event. You can manage it from the Control UI (Channels -> Nostr -> Profile) or set it directly in config. + +Example: + +```json5 +{ + channels: { + nostr: { + privateKey: "${NOSTR_PRIVATE_KEY}", + profile: { + name: "openclaw", + displayName: "OpenClaw", + about: "Personal assistant DM bot", + picture: "https://example.com/avatar.png", + banner: "https://example.com/banner.png", + website: "https://example.com", + nip05: "openclaw@example.com", + lud16: "openclaw@example.com", + }, + }, + }, +} +``` + +Notes: + +- Profile URLs must use `https://`. +- Importing from relays merges fields and preserves local overrides. + +## Access control + +### DM policies + +- **pairing** (default): unknown senders get a pairing code. +- **allowlist**: only pubkeys in `allowFrom` can DM. +- **open**: public inbound DMs (requires `allowFrom: ["*"]`). +- **disabled**: ignore inbound DMs. + +Enforcement notes: + +- Inbound event signatures are verified before sender policy and NIP-04 decryption, so forged events are rejected early. +- Pairing replies are sent without processing the original DM body. +- Inbound DMs are rate-limited and oversized payloads are dropped before decrypt. + +### Allowlist example + +```json5 +{ + channels: { + nostr: { + privateKey: "${NOSTR_PRIVATE_KEY}", + dmPolicy: "allowlist", + allowFrom: ["npub1abc...", "npub1xyz..."], + }, + }, +} +``` + +## Key formats + +Accepted formats: + +- **Private key:** `nsec...` or 64-char hex +- **Pubkeys (`allowFrom`):** `npub...` or hex + +## Relays + +Defaults: `relay.damus.io` and `nos.lol`. + +```json5 +{ + channels: { + nostr: { + privateKey: "${NOSTR_PRIVATE_KEY}", + relays: ["wss://relay.damus.io", "wss://relay.primal.net", "wss://nostr.wine"], + }, + }, +} +``` + +Tips: + +- Use 2-3 relays for redundancy. +- Avoid too many relays (latency, duplication). +- Paid relays can improve reliability. +- Local relays are fine for testing (`ws://localhost:7777`). + +## Protocol support + +| NIP | Status | Description | +| ------ | --------- | ------------------------------------- | +| NIP-01 | Supported | Basic event format + profile metadata | +| NIP-04 | Supported | Encrypted DMs (`kind:4`) | +| NIP-17 | Planned | Gift-wrapped DMs | +| NIP-44 | Planned | Versioned encryption | + +## Testing + +### Local relay + +```bash +# Start strfry +docker run -p 7777:7777 ghcr.io/hoytech/strfry +``` + +```json5 +{ + channels: { + nostr: { + privateKey: "${NOSTR_PRIVATE_KEY}", + relays: ["ws://localhost:7777"], + }, + }, +} +``` + +### Manual test + +1. Note the bot pubkey (npub) from logs. +2. Open a Nostr client (Damus, Amethyst, etc.). +3. DM the bot pubkey. +4. Verify the response. + +## Troubleshooting + +### Not receiving messages + +- Verify the private key is valid. +- Ensure relay URLs are reachable and use `wss://` (or `ws://` for local). +- Confirm `enabled` is not `false`. +- Check Gateway logs for relay connection errors. + +### Not sending responses + +- Check relay accepts writes. +- Verify outbound connectivity. +- Watch for relay rate limits. + +### Duplicate responses + +- Expected when using multiple relays. +- Messages are deduplicated by event ID; only the first delivery triggers a response. + +## Security + +- Never commit private keys. +- Use environment variables for keys. +- Consider `allowlist` for production bots. +- Signatures are verified before sender policy, and sender policy is enforced before decrypt, so forged events are rejected early and unknown senders cannot force full crypto work. + +## Limitations (MVP) + +- Direct messages only (no group chats). +- No media attachments. +- NIP-04 only (NIP-17 gift-wrap planned). + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/pairing.md b/docs/channels/pairing.md new file mode 100644 index 000000000..dd768686d --- /dev/null +++ b/docs/channels/pairing.md @@ -0,0 +1,129 @@ +--- +summary: "Pairing overview: approve who can DM you + which nodes can join" +read_when: + - Setting up DM access control + - Pairing a new iOS/Android node + - Reviewing OpenClaw security posture +title: "Pairing" +--- + +# Pairing + +“Pairing” is OpenClaw’s explicit **owner approval** step. +It is used in two places: + +1. **DM pairing** (who is allowed to talk to the bot) +2. **Node pairing** (which devices/nodes are allowed to join the gateway network) + +Security context: [Security](/gateway/security) + +## 1) DM pairing (inbound chat access) + +When a channel is configured with DM policy `pairing`, unknown senders get a short code and their message is **not processed** until you approve. + +Default DM policies are documented in: [Security](/gateway/security) + +Pairing codes: + +- 8 characters, uppercase, no ambiguous chars (`0O1I`). +- **Expire after 1 hour**. The bot only sends the pairing message when a new request is created (roughly once per hour per sender). +- Pending DM pairing requests are capped at **3 per channel** by default; additional requests are ignored until one expires or is approved. + +### Approve a sender + +```bash +openclaw pairing list telegram +openclaw pairing approve telegram +``` + +Supported channels: `bluebubbles`, `discord`, `feishu`, `googlechat`, `imessage`, `irc`, `line`, `matrix`, `mattermost`, `msteams`, `nextcloud-talk`, `nostr`, `openclaw-weixin`, `signal`, `slack`, `synology-chat`, `telegram`, `twitch`, `whatsapp`, `zalo`, `zalouser`. + +### Where the state lives + +Stored under `~/.openclaw/credentials/`: + +- Pending requests: `-pairing.json` +- Approved allowlist store: + - Default account: `-allowFrom.json` + - Non-default account: `--allowFrom.json` + +Account scoping behavior: + +- Non-default accounts read/write only their scoped allowlist file. +- Default account uses the channel-scoped unscoped allowlist file. + +Treat these as sensitive (they gate access to your assistant). + +Important: this store is for DM access. Group authorization is separate. +Approving a DM pairing code does not automatically allow that sender to run group commands or control the bot in groups. For group access, configure the channel's explicit group allowlists (for example `groupAllowFrom`, `groups`, or per-group/per-topic overrides depending on the channel). + +## 2) Node device pairing (iOS/Android/macOS/headless nodes) + +Nodes connect to the Gateway as **devices** with `role: node`. The Gateway +creates a device pairing request that must be approved. + +### Pair via Telegram (recommended for iOS) + +If you use the `device-pair` plugin, you can do first-time device pairing entirely from Telegram: + +1. In Telegram, message your bot: `/pair` +2. The bot replies with two messages: an instruction message and a separate **setup code** message (easy to copy/paste in Telegram). +3. On your phone, open the OpenClaw iOS app → Settings → Gateway. +4. Paste the setup code and connect. +5. Back in Telegram: `/pair pending` (review request IDs, role, and scopes), then approve. + +The setup code is a base64-encoded JSON payload that contains: + +- `url`: the Gateway WebSocket URL (`ws://...` or `wss://...`) +- `bootstrapToken`: a short-lived single-device bootstrap token used for the initial pairing handshake + +That bootstrap token carries the built-in pairing bootstrap profile: + +- primary handed-off `node` token stays `scopes: []` +- any handed-off `operator` token stays bounded to the bootstrap allowlist: + `operator.approvals`, `operator.read`, `operator.talk.secrets`, `operator.write` +- bootstrap scope checks are role-prefixed, not one flat scope pool: + operator scope entries only satisfy operator requests, and non-operator roles + must still request scopes under their own role prefix + +Treat the setup code like a password while it is valid. + +### Approve a node device + +```bash +openclaw devices list +openclaw devices approve +openclaw devices reject +``` + +If the same device retries with different auth details (for example different +role/scopes/public key), the previous pending request is superseded and a new +`requestId` is created. + +### Node pairing state storage + +Stored under `~/.openclaw/devices/`: + +- `pending.json` (short-lived; pending requests expire) +- `paired.json` (paired devices + tokens) + +### Notes + +- The legacy `node.pair.*` API (CLI: `openclaw nodes pending|approve|reject|rename`) is a + separate gateway-owned pairing store. WS nodes still require device pairing. +- The pairing record is the durable source of truth for approved roles. Active + device tokens stay bounded to that approved role set; a stray token entry + outside the approved roles does not create new access. + +## Related docs + +- Security model + prompt injection: [Security](/gateway/security) +- Updating safely (run doctor): [Updating](/install/updating) +- Channel configs: + - Telegram: [Telegram](/channels/telegram) + - WhatsApp: [WhatsApp](/channels/whatsapp) + - Signal: [Signal](/channels/signal) + - BlueBubbles (iMessage): [BlueBubbles](/channels/bluebubbles) + - iMessage (legacy): [iMessage](/channels/imessage) + - Discord: [Discord](/channels/discord) + - Slack: [Slack](/channels/slack) diff --git a/docs/channels/qqbot.md b/docs/channels/qqbot.md new file mode 100644 index 000000000..7bea5c9d6 --- /dev/null +++ b/docs/channels/qqbot.md @@ -0,0 +1,193 @@ +--- +summary: "QQ Bot setup, config, and usage" +read_when: + - You want to connect OpenClaw to QQ + - You need QQ Bot credential setup + - You want QQ Bot group or private chat support +title: QQ Bot +--- + +# QQ Bot + +QQ Bot connects to OpenClaw via the official QQ Bot API (WebSocket gateway). The +plugin supports C2C private chat, group @messages, and guild channel messages with +rich media (images, voice, video, files). + +Status: bundled plugin. Direct messages, group chats, guild channels, and +media are supported. Reactions and threads are not supported. + +## Bundled plugin + +Current OpenClaw releases bundle QQ Bot, so normal packaged builds do not need +a separate `openclaw plugins install` step. + +## Setup + +1. Go to the [QQ Open Platform](https://q.qq.com/) and scan the QR code with your + phone QQ to register / log in. +2. Click **Create Bot** to create a new QQ bot. +3. Find **AppID** and **AppSecret** on the bot's settings page and copy them. + +> AppSecret is not stored in plaintext — if you leave the page without saving it, +> you'll have to regenerate a new one. + +4. Add the channel: + +```bash +openclaw channels add --channel qqbot --token "AppID:AppSecret" +``` + +5. Restart the Gateway. + +Interactive setup paths: + +```bash +openclaw channels add +openclaw configure --section channels +``` + +## Configure + +Minimal config: + +```json5 +{ + channels: { + qqbot: { + enabled: true, + appId: "YOUR_APP_ID", + clientSecret: "YOUR_APP_SECRET", + }, + }, +} +``` + +Default-account env vars: + +- `QQBOT_APP_ID` +- `QQBOT_CLIENT_SECRET` + +File-backed AppSecret: + +```json5 +{ + channels: { + qqbot: { + enabled: true, + appId: "YOUR_APP_ID", + clientSecretFile: "/path/to/qqbot-secret.txt", + }, + }, +} +``` + +Notes: + +- Env fallback applies to the default QQ Bot account only. +- `openclaw channels add --channel qqbot --token-file ...` provides the + AppSecret only; the AppID must already be set in config or `QQBOT_APP_ID`. +- `clientSecret` also accepts SecretRef input, not just a plaintext string. + +### Multi-account setup + +Run multiple QQ bots under a single OpenClaw instance: + +```json5 +{ + channels: { + qqbot: { + enabled: true, + appId: "111111111", + clientSecret: "secret-of-bot-1", + accounts: { + bot2: { + enabled: true, + appId: "222222222", + clientSecret: "secret-of-bot-2", + }, + }, + }, + }, +} +``` + +Each account launches its own WebSocket connection and maintains an independent +token cache (isolated by `appId`). + +Add a second bot via CLI: + +```bash +openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-of-bot-2" +``` + +### Voice (STT / TTS) + +STT and TTS support two-level configuration with priority fallback: + +| Setting | Plugin-specific | Framework fallback | +| ------- | -------------------- | ----------------------------- | +| STT | `channels.qqbot.stt` | `tools.media.audio.models[0]` | +| TTS | `channels.qqbot.tts` | `messages.tts` | + +```json5 +{ + channels: { + qqbot: { + stt: { + provider: "your-provider", + model: "your-stt-model", + }, + tts: { + provider: "your-provider", + model: "your-tts-model", + voice: "your-voice", + }, + }, + }, +} +``` + +Set `enabled: false` on either to disable. + +Outbound audio upload/transcode behavior can also be tuned with +`channels.qqbot.audioFormatPolicy`: + +- `sttDirectFormats` +- `uploadDirectFormats` +- `transcodeEnabled` + +## Target formats + +| Format | Description | +| -------------------------- | ------------------ | +| `qqbot:c2c:OPENID` | Private chat (C2C) | +| `qqbot:group:GROUP_OPENID` | Group chat | +| `qqbot:channel:CHANNEL_ID` | Guild channel | + +> Each bot has its own set of user OpenIDs. An OpenID received by Bot A **cannot** +> be used to send messages via Bot B. + +## Slash commands + +Built-in commands intercepted before the AI queue: + +| Command | Description | +| -------------- | ------------------------------------ | +| `/bot-ping` | Latency test | +| `/bot-version` | Show the OpenClaw framework version | +| `/bot-help` | List all commands | +| `/bot-upgrade` | Show the QQBot upgrade guide link | +| `/bot-logs` | Export recent gateway logs as a file | + +Append `?` to any command for usage help (for example `/bot-upgrade ?`). + +## Troubleshooting + +- **Bot replies "gone to Mars":** credentials not configured or Gateway not started. +- **No inbound messages:** verify `appId` and `clientSecret` are correct, and the + bot is enabled on the QQ Open Platform. +- **Setup with `--token-file` still shows unconfigured:** `--token-file` only sets + the AppSecret. You still need `appId` in config or `QQBOT_APP_ID`. +- **Proactive messages not arriving:** QQ may intercept bot-initiated messages if + the user hasn't interacted recently. +- **Voice not transcribed:** ensure STT is configured and the provider is reachable. diff --git a/docs/channels/signal.md b/docs/channels/signal.md new file mode 100644 index 000000000..82157c680 --- /dev/null +++ b/docs/channels/signal.md @@ -0,0 +1,337 @@ +--- +summary: "Signal support via signal-cli (JSON-RPC + SSE), setup paths, and number model" +read_when: + - Setting up Signal support + - Debugging Signal send/receive +title: "Signal" +--- + +# Signal (signal-cli) + +Status: external CLI integration. Gateway talks to `signal-cli` over HTTP JSON-RPC + SSE. + +## Prerequisites + +- OpenClaw installed on your server (Linux flow below tested on Ubuntu 24). +- `signal-cli` available on the host where the gateway runs. +- A phone number that can receive one verification SMS (for SMS registration path). +- Browser access for Signal captcha (`signalcaptchas.org`) during registration. + +## Quick setup (beginner) + +1. Use a **separate Signal number** for the bot (recommended). +2. Install `signal-cli` (Java required if you use the JVM build). +3. Choose one setup path: + - **Path A (QR link):** `signal-cli link -n "OpenClaw"` and scan with Signal. + - **Path B (SMS register):** register a dedicated number with captcha + SMS verification. +4. Configure OpenClaw and restart the gateway. +5. Send a first DM and approve pairing (`openclaw pairing approve signal `). + +Minimal config: + +```json5 +{ + channels: { + signal: { + enabled: true, + account: "+15551234567", + cliPath: "signal-cli", + dmPolicy: "pairing", + allowFrom: ["+15557654321"], + }, + }, +} +``` + +Field reference: + +| Field | Description | +| ----------- | ------------------------------------------------- | +| `account` | Bot phone number in E.164 format (`+15551234567`) | +| `cliPath` | Path to `signal-cli` (`signal-cli` if on `PATH`) | +| `dmPolicy` | DM access policy (`pairing` recommended) | +| `allowFrom` | Phone numbers or `uuid:` values allowed to DM | + +## What it is + +- Signal channel via `signal-cli` (not embedded libsignal). +- Deterministic routing: replies always go back to Signal. +- DMs share the agent's main session; groups are isolated (`agent::signal:group:`). + +## Config writes + +By default, Signal is allowed to write config updates triggered by `/config set|unset` (requires `commands.config: true`). + +Disable with: + +```json5 +{ + channels: { signal: { configWrites: false } }, +} +``` + +## The number model (important) + +- The gateway connects to a **Signal device** (the `signal-cli` account). +- If you run the bot on **your personal Signal account**, it will ignore your own messages (loop protection). +- For "I text the bot and it replies," use a **separate bot number**. + +## Setup path A: link existing Signal account (QR) + +1. Install `signal-cli` (JVM or native build). +2. Link a bot account: + - `signal-cli link -n "OpenClaw"` then scan the QR in Signal. +3. Configure Signal and start the gateway. + +Example: + +```json5 +{ + channels: { + signal: { + enabled: true, + account: "+15551234567", + cliPath: "signal-cli", + dmPolicy: "pairing", + allowFrom: ["+15557654321"], + }, + }, +} +``` + +Multi-account support: use `channels.signal.accounts` with per-account config and optional `name`. See [`gateway/configuration`](/gateway/configuration-reference#multi-account-all-channels) for the shared pattern. + +## Setup path B: register dedicated bot number (SMS, Linux) + +Use this when you want a dedicated bot number instead of linking an existing Signal app account. + +1. Get a number that can receive SMS (or voice verification for landlines). + - Use a dedicated bot number to avoid account/session conflicts. +2. Install `signal-cli` on the gateway host: + +```bash +VERSION=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/AsamK/signal-cli/releases/latest | sed -e 's/^.*\/v//') +curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}-Linux-native.tar.gz" +sudo tar xf "signal-cli-${VERSION}-Linux-native.tar.gz" -C /opt +sudo ln -sf /opt/signal-cli /usr/local/bin/ +signal-cli --version +``` + +If you use the JVM build (`signal-cli-${VERSION}.tar.gz`), install JRE 25+ first. +Keep `signal-cli` updated; upstream notes that old releases can break as Signal server APIs change. + +3. Register and verify the number: + +```bash +signal-cli -a + register +``` + +If captcha is required: + +1. Open `https://signalcaptchas.org/registration/generate.html`. +2. Complete captcha, copy the `signalcaptcha://...` link target from "Open Signal". +3. Run from the same external IP as the browser session when possible. +4. Run registration again immediately (captcha tokens expire quickly): + +```bash +signal-cli -a + register --captcha '' +signal-cli -a + verify +``` + +4. Configure OpenClaw, restart gateway, verify channel: + +```bash +# If you run the gateway as a user systemd service: +systemctl --user restart openclaw-gateway.service + +# Then verify: +openclaw doctor +openclaw channels status --probe +``` + +5. Pair your DM sender: + - Send any message to the bot number. + - Approve code on the server: `openclaw pairing approve signal `. + - Save the bot number as a contact on your phone to avoid "Unknown contact". + +Important: registering a phone number account with `signal-cli` can de-authenticate the main Signal app session for that number. Prefer a dedicated bot number, or use QR link mode if you need to keep your existing phone app setup. + +Upstream references: + +- `signal-cli` README: `https://github.com/AsamK/signal-cli` +- Captcha flow: `https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha` +- Linking flow: `https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)` + +## External daemon mode (httpUrl) + +If you want to manage `signal-cli` yourself (slow JVM cold starts, container init, or shared CPUs), run the daemon separately and point OpenClaw at it: + +```json5 +{ + channels: { + signal: { + httpUrl: "http://127.0.0.1:8080", + autoStart: false, + }, + }, +} +``` + +This skips auto-spawn and the startup wait inside OpenClaw. For slow starts when auto-spawning, set `channels.signal.startupTimeoutMs`. + +## Access control (DMs + groups) + +DMs: + +- Default: `channels.signal.dmPolicy = "pairing"`. +- Unknown senders receive a pairing code; messages are ignored until approved (codes expire after 1 hour). +- Approve via: + - `openclaw pairing list signal` + - `openclaw pairing approve signal ` +- Pairing is the default token exchange for Signal DMs. Details: [Pairing](/channels/pairing) +- UUID-only senders (from `sourceUuid`) are stored as `uuid:` in `channels.signal.allowFrom`. + +Groups: + +- `channels.signal.groupPolicy = open | allowlist | disabled`. +- `channels.signal.groupAllowFrom` controls who can trigger in groups when `allowlist` is set. +- `channels.signal.groups["" | "*"]` can override group behavior with `requireMention`, `tools`, and `toolsBySender`. +- Use `channels.signal.accounts..groups` for per-account overrides in multi-account setups. +- Runtime note: if `channels.signal` is completely missing, runtime falls back to `groupPolicy="allowlist"` for group checks (even if `channels.defaults.groupPolicy` is set). + +## How it works (behavior) + +- `signal-cli` runs as a daemon; the gateway reads events via SSE. +- Inbound messages are normalized into the shared channel envelope. +- Replies always route back to the same number or group. + +## Media + limits + +- Outbound text is chunked to `channels.signal.textChunkLimit` (default 4000). +- Optional newline chunking: set `channels.signal.chunkMode="newline"` to split on blank lines (paragraph boundaries) before length chunking. +- Attachments supported (base64 fetched from `signal-cli`). +- Default media cap: `channels.signal.mediaMaxMb` (default 8). +- Use `channels.signal.ignoreAttachments` to skip downloading media. +- Group history context uses `channels.signal.historyLimit` (or `channels.signal.accounts.*.historyLimit`), falling back to `messages.groupChat.historyLimit`. Set `0` to disable (default 50). + +## Typing + read receipts + +- **Typing indicators**: OpenClaw sends typing signals via `signal-cli sendTyping` and refreshes them while a reply is running. +- **Read receipts**: when `channels.signal.sendReadReceipts` is true, OpenClaw forwards read receipts for allowed DMs. +- Signal-cli does not expose read receipts for groups. + +## Reactions (message tool) + +- Use `message action=react` with `channel=signal`. +- Targets: sender E.164 or UUID (use `uuid:` from pairing output; bare UUID works too). +- `messageId` is the Signal timestamp for the message you’re reacting to. +- Group reactions require `targetAuthor` or `targetAuthorUuid`. + +Examples: + +``` +message action=react channel=signal target=uuid:123e4567-e89b-12d3-a456-426614174000 messageId=1737630212345 emoji=🔥 +message action=react channel=signal target=+15551234567 messageId=1737630212345 emoji=🔥 remove=true +message action=react channel=signal target=signal:group: targetAuthor=uuid: messageId=1737630212345 emoji=✅ +``` + +Config: + +- `channels.signal.actions.reactions`: enable/disable reaction actions (default true). +- `channels.signal.reactionLevel`: `off | ack | minimal | extensive`. + - `off`/`ack` disables agent reactions (message tool `react` will error). + - `minimal`/`extensive` enables agent reactions and sets the guidance level. +- Per-account overrides: `channels.signal.accounts..actions.reactions`, `channels.signal.accounts..reactionLevel`. + +## Delivery targets (CLI/cron) + +- DMs: `signal:+15551234567` (or plain E.164). +- UUID DMs: `uuid:` (or bare UUID). +- Groups: `signal:group:`. +- Usernames: `username:` (if supported by your Signal account). + +## Troubleshooting + +Run this ladder first: + +```bash +openclaw status +openclaw gateway status +openclaw logs --follow +openclaw doctor +openclaw channels status --probe +``` + +Then confirm DM pairing state if needed: + +```bash +openclaw pairing list signal +``` + +Common failures: + +- Daemon reachable but no replies: verify account/daemon settings (`httpUrl`, `account`) and receive mode. +- DMs ignored: sender is pending pairing approval. +- Group messages ignored: group sender/mention gating blocks delivery. +- Config validation errors after edits: run `openclaw doctor --fix`. +- Signal missing from diagnostics: confirm `channels.signal.enabled: true`. + +Extra checks: + +```bash +openclaw pairing list signal +pgrep -af signal-cli +grep -i "signal" "/tmp/openclaw/openclaw-$(date +%Y-%m-%d).log" | tail -20 +``` + +For triage flow: [/channels/troubleshooting](/channels/troubleshooting). + +## Security notes + +- `signal-cli` stores account keys locally (typically `~/.local/share/signal-cli/data/`). +- Back up Signal account state before server migration or rebuild. +- Keep `channels.signal.dmPolicy: "pairing"` unless you explicitly want broader DM access. +- SMS verification is only needed for registration or recovery flows, but losing control of the number/account can complicate re-registration. + +## Configuration reference (Signal) + +Full configuration: [Configuration](/gateway/configuration) + +Provider options: + +- `channels.signal.enabled`: enable/disable channel startup. +- `channels.signal.account`: E.164 for the bot account. +- `channels.signal.cliPath`: path to `signal-cli`. +- `channels.signal.httpUrl`: full daemon URL (overrides host/port). +- `channels.signal.httpHost`, `channels.signal.httpPort`: daemon bind (default 127.0.0.1:8080). +- `channels.signal.autoStart`: auto-spawn daemon (default true if `httpUrl` unset). +- `channels.signal.startupTimeoutMs`: startup wait timeout in ms (cap 120000). +- `channels.signal.receiveMode`: `on-start | manual`. +- `channels.signal.ignoreAttachments`: skip attachment downloads. +- `channels.signal.ignoreStories`: ignore stories from the daemon. +- `channels.signal.sendReadReceipts`: forward read receipts. +- `channels.signal.dmPolicy`: `pairing | allowlist | open | disabled` (default: pairing). +- `channels.signal.allowFrom`: DM allowlist (E.164 or `uuid:`). `open` requires `"*"`. Signal has no usernames; use phone/UUID ids. +- `channels.signal.groupPolicy`: `open | allowlist | disabled` (default: allowlist). +- `channels.signal.groupAllowFrom`: group sender allowlist. +- `channels.signal.groups`: per-group overrides keyed by Signal group id (or `"*"`). Supported fields: `requireMention`, `tools`, `toolsBySender`. +- `channels.signal.accounts..groups`: per-account version of `channels.signal.groups` for multi-account setups. +- `channels.signal.historyLimit`: max group messages to include as context (0 disables). +- `channels.signal.dmHistoryLimit`: DM history limit in user turns. Per-user overrides: `channels.signal.dms[""].historyLimit`. +- `channels.signal.textChunkLimit`: outbound chunk size (chars). +- `channels.signal.chunkMode`: `length` (default) or `newline` to split on blank lines (paragraph boundaries) before length chunking. +- `channels.signal.mediaMaxMb`: inbound/outbound media cap (MB). + +Related global options: + +- `agents.list[].groupChat.mentionPatterns` (Signal does not support native mentions). +- `messages.groupChat.mentionPatterns` (global fallback). +- `messages.responsePrefix`. + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/slack.md b/docs/channels/slack.md new file mode 100644 index 000000000..b7a814e37 --- /dev/null +++ b/docs/channels/slack.md @@ -0,0 +1,681 @@ +--- +summary: "Slack setup and runtime behavior (Socket Mode + HTTP Events API)" +read_when: + - Setting up Slack or debugging Slack socket/HTTP mode +title: "Slack" +--- + +# Slack + +Status: production-ready for DMs + channels via Slack app integrations. Default mode is Socket Mode; HTTP Events API mode is also supported. + + + + Slack DMs default to pairing mode. + + + Native command behavior and command catalog. + + + Cross-channel diagnostics and repair playbooks. + + + +## Quick setup + + + + + + In Slack app settings: + + - enable **Socket Mode** + - create **App Token** (`xapp-...`) with `connections:write` + - install app and copy **Bot Token** (`xoxb-...`) + + + + +```json5 +{ + channels: { + slack: { + enabled: true, + mode: "socket", + appToken: "xapp-...", + botToken: "xoxb-...", + }, + }, +} +``` + + Env fallback (default account only): + +```bash +SLACK_APP_TOKEN=xapp-... +SLACK_BOT_TOKEN=xoxb-... +``` + + + + + Subscribe bot events for: + + - `app_mention` + - `message.channels`, `message.groups`, `message.im`, `message.mpim` + - `reaction_added`, `reaction_removed` + - `member_joined_channel`, `member_left_channel` + - `channel_rename` + - `pin_added`, `pin_removed` + + Also enable App Home **Messages Tab** for DMs. + + + + +```bash +openclaw gateway +``` + + + + + + + + + + + - set mode to HTTP (`channels.slack.mode="http"`) + - copy Slack **Signing Secret** + - set Event Subscriptions + Interactivity + Slash command Request URL to the same webhook path (default `/slack/events`) + + + + + +```json5 +{ + channels: { + slack: { + enabled: true, + mode: "http", + botToken: "xoxb-...", + signingSecret: "your-signing-secret", + webhookPath: "/slack/events", + }, + }, +} +``` + + + + + Per-account HTTP mode is supported. + + Give each account a distinct `webhookPath` so registrations do not collide. + + + + + + +## Manifest and scope checklist + + + + +```json +{ + "display_information": { + "name": "OpenClaw", + "description": "Slack connector for OpenClaw" + }, + "features": { + "bot_user": { + "display_name": "OpenClaw", + "always_online": true + }, + "app_home": { + "messages_tab_enabled": true, + "messages_tab_read_only_enabled": false + }, + "slash_commands": [ + { + "command": "/openclaw", + "description": "Send a message to OpenClaw", + "should_escape": false + } + ] + }, + "oauth_config": { + "scopes": { + "bot": [ + "app_mentions:read", + "assistant:write", + "channels:history", + "channels:read", + "chat:write", + "commands", + "emoji:read", + "files:read", + "files:write", + "groups:history", + "groups:read", + "im:history", + "im:read", + "im:write", + "mpim:history", + "mpim:read", + "mpim:write", + "pins:read", + "pins:write", + "reactions:read", + "reactions:write", + "users:read" + ] + } + }, + "settings": { + "socket_mode_enabled": true, + "event_subscriptions": { + "bot_events": [ + "app_mention", + "channel_rename", + "member_joined_channel", + "member_left_channel", + "message.channels", + "message.groups", + "message.im", + "message.mpim", + "pin_added", + "pin_removed", + "reaction_added", + "reaction_removed" + ] + } + } +} +``` + + + + + If you configure `channels.slack.userToken`, typical read scopes are: + + - `channels:history`, `groups:history`, `im:history`, `mpim:history` + - `channels:read`, `groups:read`, `im:read`, `mpim:read` + - `users:read` + - `reactions:read` + - `pins:read` + - `emoji:read` + - `search:read` (if you depend on Slack search reads) + + + + +## Token model + +- `botToken` + `appToken` are required for Socket Mode. +- HTTP mode requires `botToken` + `signingSecret`. +- `botToken`, `appToken`, `signingSecret`, and `userToken` accept plaintext + strings or SecretRef objects. +- Config tokens override env fallback. +- `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` env fallback applies only to the default account. +- `userToken` (`xoxp-...`) is config-only (no env fallback) and defaults to read-only behavior (`userTokenReadOnly: true`). +- Optional: add `chat:write.customize` if you want outgoing messages to use the active agent identity (custom `username` and icon). `icon_emoji` uses `:emoji_name:` syntax. + +Status snapshot behavior: + +- Slack account inspection tracks per-credential `*Source` and `*Status` + fields (`botToken`, `appToken`, `signingSecret`, `userToken`). +- Status is `available`, `configured_unavailable`, or `missing`. +- `configured_unavailable` means the account is configured through SecretRef + or another non-inline secret source, but the current command/runtime path + could not resolve the actual value. +- In HTTP mode, `signingSecretStatus` is included; in Socket Mode, the + required pair is `botTokenStatus` + `appTokenStatus`. + + +For actions/directory reads, user token can be preferred when configured. For writes, bot token remains preferred; user-token writes are only allowed when `userTokenReadOnly: false` and bot token is unavailable. + + +## Actions and gates + +Slack actions are controlled by `channels.slack.actions.*`. + +Available action groups in current Slack tooling: + +| Group | Default | +| ---------- | ------- | +| messages | enabled | +| reactions | enabled | +| pins | enabled | +| memberInfo | enabled | +| emojiList | enabled | + +Current Slack message actions include `send`, `upload-file`, `download-file`, `read`, `edit`, `delete`, `pin`, `unpin`, `list-pins`, `member-info`, and `emoji-list`. + +## Access control and routing + + + + `channels.slack.dmPolicy` controls DM access (legacy: `channels.slack.dm.policy`): + + - `pairing` (default) + - `allowlist` + - `open` (requires `channels.slack.allowFrom` to include `"*"`; legacy: `channels.slack.dm.allowFrom`) + - `disabled` + + DM flags: + + - `dm.enabled` (default true) + - `channels.slack.allowFrom` (preferred) + - `dm.allowFrom` (legacy) + - `dm.groupEnabled` (group DMs default false) + - `dm.groupChannels` (optional MPIM allowlist) + + Multi-account precedence: + + - `channels.slack.accounts.default.allowFrom` applies only to the `default` account. + - Named accounts inherit `channels.slack.allowFrom` when their own `allowFrom` is unset. + - Named accounts do not inherit `channels.slack.accounts.default.allowFrom`. + + Pairing in DMs uses `openclaw pairing approve slack `. + + + + + `channels.slack.groupPolicy` controls channel handling: + + - `open` + - `allowlist` + - `disabled` + + Channel allowlist lives under `channels.slack.channels` and should use stable channel IDs. + + Runtime note: if `channels.slack` is completely missing (env-only setup), runtime falls back to `groupPolicy="allowlist"` and logs a warning (even if `channels.defaults.groupPolicy` is set). + + Name/ID resolution: + + - channel allowlist entries and DM allowlist entries are resolved at startup when token access allows + - unresolved channel-name entries are kept as configured but ignored for routing by default + - inbound authorization and channel routing are ID-first by default; direct username/slug matching requires `channels.slack.dangerouslyAllowNameMatching: true` + + + + + Channel messages are mention-gated by default. + + Mention sources: + + - explicit app mention (`<@botId>`) + - mention regex patterns (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`) + - implicit reply-to-bot thread behavior + + Per-channel controls (`channels.slack.channels.`; names only via startup resolution or `dangerouslyAllowNameMatching`): + + - `requireMention` + - `users` (allowlist) + - `allowBots` + - `skills` + - `systemPrompt` + - `tools`, `toolsBySender` + - `toolsBySender` key format: `id:`, `e164:`, `username:`, `name:`, or `"*"` wildcard + (legacy unprefixed keys still map to `id:` only) + + + + +## Threading, sessions, and reply tags + +- DMs route as `direct`; channels as `channel`; MPIMs as `group`. +- With default `session.dmScope=main`, Slack DMs collapse to agent main session. +- Channel sessions: `agent::slack:channel:`. +- Thread replies can create thread session suffixes (`:thread:`) when applicable. +- `channels.slack.thread.historyScope` default is `thread`; `thread.inheritParent` default is `false`. +- `channels.slack.thread.initialHistoryLimit` controls how many existing thread messages are fetched when a new thread session starts (default `20`; set `0` to disable). + +Reply threading controls: + +- `channels.slack.replyToMode`: `off|first|all` (default `off`) +- `channels.slack.replyToModeByChatType`: per `direct|group|channel` +- legacy fallback for direct chats: `channels.slack.dm.replyToMode` + +Manual reply tags are supported: + +- `[[reply_to_current]]` +- `[[reply_to:]]` + +Note: `replyToMode="off"` disables **all** reply threading in Slack, including explicit `[[reply_to_*]]` tags. This differs from Telegram, where explicit tags are still honored in `"off"` mode. The difference reflects the platform threading models: Slack threads hide messages from the channel, while Telegram replies remain visible in the main chat flow. + +## Ack reactions + +`ackReaction` sends an acknowledgement emoji while OpenClaw is processing an inbound message. + +Resolution order: + +- `channels.slack.accounts..ackReaction` +- `channels.slack.ackReaction` +- `messages.ackReaction` +- agent identity emoji fallback (`agents.list[].identity.emoji`, else "👀") + +Notes: + +- Slack expects shortcodes (for example `"eyes"`). +- Use `""` to disable the reaction for the Slack account or globally. + +## Text streaming + +`channels.slack.streaming` controls live preview behavior: + +- `off`: disable live preview streaming. +- `partial` (default): replace preview text with the latest partial output. +- `block`: append chunked preview updates. +- `progress`: show progress status text while generating, then send final text. + +`channels.slack.nativeStreaming` controls Slack native text streaming when `streaming` is `partial` (default: `true`). + +- A reply thread must be available for native text streaming to appear. Thread selection still follows `replyToMode`. Without one, the normal draft preview is used. +- Media and non-text payloads fall back to normal delivery. +- If streaming fails mid-reply, OpenClaw falls back to normal delivery for remaining payloads. + +Use draft preview instead of Slack native text streaming: + +```json5 +{ + channels: { + slack: { + streaming: "partial", + nativeStreaming: false, + }, + }, +} +``` + +Legacy keys: + +- `channels.slack.streamMode` (`replace | status_final | append`) is auto-migrated to `channels.slack.streaming`. +- boolean `channels.slack.streaming` is auto-migrated to `channels.slack.nativeStreaming`. + +## Typing reaction fallback + +`typingReaction` adds a temporary reaction to the inbound Slack message while OpenClaw is processing a reply, then removes it when the run finishes. This is most useful outside of thread replies, which use a default "is typing..." status indicator. + +Resolution order: + +- `channels.slack.accounts..typingReaction` +- `channels.slack.typingReaction` + +Notes: + +- Slack expects shortcodes (for example `"hourglass_flowing_sand"`). +- The reaction is best-effort and cleanup is attempted automatically after the reply or failure path completes. + +## Media, chunking, and delivery + + + + Slack file attachments are downloaded from Slack-hosted private URLs (token-authenticated request flow) and written to the media store when fetch succeeds and size limits permit. + + Runtime inbound size cap defaults to `20MB` unless overridden by `channels.slack.mediaMaxMb`. + + + + + - text chunks use `channels.slack.textChunkLimit` (default 4000) + - `channels.slack.chunkMode="newline"` enables paragraph-first splitting + - file sends use Slack upload APIs and can include thread replies (`thread_ts`) + - outbound media cap follows `channels.slack.mediaMaxMb` when configured; otherwise channel sends use MIME-kind defaults from media pipeline + + + + Preferred explicit targets: + + - `user:` for DMs + - `channel:` for channels + + Slack DMs are opened via Slack conversation APIs when sending to user targets. + + + + +## Commands and slash behavior + +- Native command auto-mode is **off** for Slack (`commands.native: "auto"` does not enable Slack native commands). +- Enable native Slack command handlers with `channels.slack.commands.native: true` (or global `commands.native: true`). +- When native commands are enabled, register matching slash commands in Slack (`/` names), with one exception: + - register `/agentstatus` for the status command (Slack reserves `/status`) +- If native commands are not enabled, you can run a single configured slash command via `channels.slack.slashCommand`. +- Native arg menus now adapt their rendering strategy: + - up to 5 options: button blocks + - 6-100 options: static select menu + - more than 100 options: external select with async option filtering when interactivity options handlers are available + - if encoded option values exceed Slack limits, the flow falls back to buttons +- For long option payloads, Slash command argument menus use a confirm dialog before dispatching a selected value. + +Default slash command settings: + +- `enabled: false` +- `name: "openclaw"` +- `sessionPrefix: "slack:slash"` +- `ephemeral: true` + +Slash sessions use isolated keys: + +- `agent::slack:slash:` + +and still route command execution against the target conversation session (`CommandTargetSessionKey`). + +## Interactive replies + +Slack can render agent-authored interactive reply controls, but this feature is disabled by default. + +Enable it globally: + +```json5 +{ + channels: { + slack: { + capabilities: { + interactiveReplies: true, + }, + }, + }, +} +``` + +Or enable it for one Slack account only: + +```json5 +{ + channels: { + slack: { + accounts: { + ops: { + capabilities: { + interactiveReplies: true, + }, + }, + }, + }, + }, +} +``` + +When enabled, agents can emit Slack-only reply directives: + +- `[[slack_buttons: Approve:approve, Reject:reject]]` +- `[[slack_select: Choose a target | Canary:canary, Production:production]]` + +These directives compile into Slack Block Kit and route clicks or selections back through the existing Slack interaction event path. + +Notes: + +- This is Slack-specific UI. Other channels do not translate Slack Block Kit directives into their own button systems. +- The interactive callback values are OpenClaw-generated opaque tokens, not raw agent-authored values. +- If generated interactive blocks would exceed Slack Block Kit limits, OpenClaw falls back to the original text reply instead of sending an invalid blocks payload. + +## Exec approvals in Slack + +Slack can act as a native approval client with interactive buttons and interactions, instead of falling back to the Web UI or terminal. + +- Exec approvals use `channels.slack.execApprovals.*` for native DM/channel routing. +- Plugin approvals can still resolve through the same Slack-native button surface when the request already lands in Slack and the approval id kind is `plugin:`. +- Approver authorization is still enforced: only users identified as approvers can approve or deny requests through Slack. + +This uses the same shared approval button surface as other channels. When `interactivity` is enabled in your Slack app settings, approval prompts render as Block Kit buttons directly in the conversation. +When those buttons are present, they are the primary approval UX; OpenClaw +should only include a manual `/approve` command when the tool result says chat +approvals are unavailable or manual approval is the only path. + +Config path: + +- `channels.slack.execApprovals.enabled` +- `channels.slack.execApprovals.approvers` (optional; falls back to `commands.ownerAllowFrom` when possible) +- `channels.slack.execApprovals.target` (`dm` | `channel` | `both`, default: `dm`) +- `agentFilter`, `sessionFilter` + +Slack auto-enables native exec approvals when `enabled` is unset or `"auto"` and at least one +approver resolves. Set `enabled: false` to disable Slack as a native approval client explicitly. +Set `enabled: true` to force native approvals on when approvers resolve. + +Default behavior with no explicit Slack exec approval config: + +```json5 +{ + commands: { + ownerAllowFrom: ["slack:U12345678"], + }, +} +``` + +Explicit Slack-native config is only needed when you want to override approvers, add filters, or +opt into origin-chat delivery: + +```json5 +{ + channels: { + slack: { + execApprovals: { + enabled: true, + approvers: ["U12345678"], + target: "both", + }, + }, + }, +} +``` + +Shared `approvals.exec` forwarding is separate. Use it only when exec approval prompts must also +route to other chats or explicit out-of-band targets. Shared `approvals.plugin` forwarding is also +separate; Slack-native buttons can still resolve plugin approvals when those requests already land +in Slack. + +Same-chat `/approve` also works in Slack channels and DMs that already support commands. See [Exec approvals](/tools/exec-approvals) for the full approval forwarding model. + +## Events and operational behavior + +- Message edits/deletes/thread broadcasts are mapped into system events. +- Reaction add/remove events are mapped into system events. +- Member join/leave, channel created/renamed, and pin add/remove events are mapped into system events. +- `channel_id_changed` can migrate channel config keys when `configWrites` is enabled. +- Channel topic/purpose metadata is treated as untrusted context and can be injected into routing context. +- Thread starter and initial thread-history context seeding are filtered by configured sender allowlists when applicable. +- Block actions and modal interactions emit structured `Slack interaction: ...` system events with rich payload fields: + - block actions: selected values, labels, picker values, and `workflow_*` metadata + - modal `view_submission` and `view_closed` events with routed channel metadata and form inputs + +## Configuration reference pointers + +Primary reference: + +- [Configuration reference - Slack](/gateway/configuration-reference#slack) + + High-signal Slack fields: + - mode/auth: `mode`, `botToken`, `appToken`, `signingSecret`, `webhookPath`, `accounts.*` + - DM access: `dm.enabled`, `dmPolicy`, `allowFrom` (legacy: `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels` + - compatibility toggle: `dangerouslyAllowNameMatching` (break-glass; keep off unless needed) + - channel access: `groupPolicy`, `channels.*`, `channels.*.users`, `channels.*.requireMention` + - threading/history: `replyToMode`, `replyToModeByChatType`, `thread.*`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit` + - delivery: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `nativeStreaming` + - ops/features: `configWrites`, `commands.native`, `slashCommand.*`, `actions.*`, `userToken`, `userTokenReadOnly` + +## Troubleshooting + + + + Check, in order: + + - `groupPolicy` + - channel allowlist (`channels.slack.channels`) + - `requireMention` + - per-channel `users` allowlist + + Useful commands: + +```bash +openclaw channels status --probe +openclaw logs --follow +openclaw doctor +``` + + + + + Check: + + - `channels.slack.dm.enabled` + - `channels.slack.dmPolicy` (or legacy `channels.slack.dm.policy`) + - pairing approvals / allowlist entries + +```bash +openclaw pairing list slack +``` + + + + + Validate bot + app tokens and Socket Mode enablement in Slack app settings. + + If `openclaw channels status --probe --json` shows `botTokenStatus` or + `appTokenStatus: "configured_unavailable"`, the Slack account is + configured but the current runtime could not resolve the SecretRef-backed + value. + + + + + Validate: + + - signing secret + - webhook path + - Slack Request URLs (Events + Interactivity + Slash Commands) + - unique `webhookPath` per HTTP account + + If `signingSecretStatus: "configured_unavailable"` appears in account + snapshots, the HTTP account is configured but the current runtime could not + resolve the SecretRef-backed signing secret. + + + + + Verify whether you intended: + + - native command mode (`channels.slack.commands.native: true`) with matching slash commands registered in Slack + - or single slash command mode (`channels.slack.slashCommand.enabled: true`) + + Also check `commands.useAccessGroups` and channel/user allowlists. + + + + +## Related + +- [Pairing](/channels/pairing) +- [Groups](/channels/groups) +- [Security](/gateway/security) +- [Channel routing](/channels/channel-routing) +- [Troubleshooting](/channels/troubleshooting) +- [Configuration](/gateway/configuration) +- [Slash commands](/tools/slash-commands) diff --git a/docs/channels/synology-chat.md b/docs/channels/synology-chat.md new file mode 100644 index 000000000..a7a8774f7 --- /dev/null +++ b/docs/channels/synology-chat.md @@ -0,0 +1,185 @@ +--- +summary: "Synology Chat webhook setup and OpenClaw config" +read_when: + - Setting up Synology Chat with OpenClaw + - Debugging Synology Chat webhook routing +title: "Synology Chat" +--- + +# Synology Chat + +Status: bundled plugin direct-message channel using Synology Chat webhooks. +The plugin accepts inbound messages from Synology Chat outgoing webhooks and sends replies +through a Synology Chat incoming webhook. + +## Bundled plugin + +Synology Chat ships as a bundled plugin in current OpenClaw releases, so normal +packaged builds do not need a separate install. + +If you are on an older build or a custom install that excludes Synology Chat, +install it manually: + +Install from a local checkout: + +```bash +openclaw plugins install ./path/to/local/synology-chat-plugin +``` + +Details: [Plugins](/tools/plugin) + +## Quick setup + +1. Ensure the Synology Chat plugin is available. + - Current packaged OpenClaw releases already bundle it. + - Older/custom installs can add it manually from a source checkout with the command above. + - `openclaw onboard` now shows Synology Chat in the same channel setup list as `openclaw channels add`. + - Non-interactive setup: `openclaw channels add --channel synology-chat --token --url ` +2. In Synology Chat integrations: + - Create an incoming webhook and copy its URL. + - Create an outgoing webhook with your secret token. +3. Point the outgoing webhook URL to your OpenClaw gateway: + - `https://gateway-host/webhook/synology` by default. + - Or your custom `channels.synology-chat.webhookPath`. +4. Finish setup in OpenClaw. + - Guided: `openclaw onboard` + - Direct: `openclaw channels add --channel synology-chat --token --url ` +5. Restart gateway and send a DM to the Synology Chat bot. + +Webhook auth details: + +- OpenClaw accepts the outgoing webhook token from `body.token`, then + `?token=...`, then headers. +- Accepted header forms: + - `x-synology-token` + - `x-webhook-token` + - `x-openclaw-token` + - `Authorization: Bearer ` +- Empty or missing tokens fail closed. + +Minimal config: + +```json5 +{ + channels: { + "synology-chat": { + enabled: true, + token: "synology-outgoing-token", + incomingUrl: "https://nas.example.com/webapi/entry.cgi?api=SYNO.Chat.External&method=incoming&version=2&token=...", + webhookPath: "/webhook/synology", + dmPolicy: "allowlist", + allowedUserIds: ["123456"], + rateLimitPerMinute: 30, + allowInsecureSsl: false, + }, + }, +} +``` + +## Environment variables + +For the default account, you can use env vars: + +- `SYNOLOGY_CHAT_TOKEN` +- `SYNOLOGY_CHAT_INCOMING_URL` +- `SYNOLOGY_NAS_HOST` +- `SYNOLOGY_ALLOWED_USER_IDS` (comma-separated) +- `SYNOLOGY_RATE_LIMIT` +- `OPENCLAW_BOT_NAME` + +Config values override env vars. + +## DM policy and access control + +- `dmPolicy: "allowlist"` is the recommended default. +- `allowedUserIds` accepts a list (or comma-separated string) of Synology user IDs. +- In `allowlist` mode, an empty `allowedUserIds` list is treated as misconfiguration and the webhook route will not start (use `dmPolicy: "open"` for allow-all). +- `dmPolicy: "open"` allows any sender. +- `dmPolicy: "disabled"` blocks DMs. +- Reply recipient binding stays on stable numeric `user_id` by default. `channels.synology-chat.dangerouslyAllowNameMatching: true` is break-glass compatibility mode that re-enables mutable username/nickname lookup for reply delivery. +- Pairing approvals work with: + - `openclaw pairing list synology-chat` + - `openclaw pairing approve synology-chat ` + +## Outbound delivery + +Use numeric Synology Chat user IDs as targets. + +Examples: + +```bash +openclaw message send --channel synology-chat --target 123456 --text "Hello from OpenClaw" +openclaw message send --channel synology-chat --target synology-chat:123456 --text "Hello again" +``` + +Media sends are supported by URL-based file delivery. + +## Multi-account + +Multiple Synology Chat accounts are supported under `channels.synology-chat.accounts`. +Each account can override token, incoming URL, webhook path, DM policy, and limits. +Direct-message sessions are isolated per account and user, so the same numeric `user_id` +on two different Synology accounts does not share transcript state. +Give each enabled account a distinct `webhookPath`. OpenClaw now rejects duplicate exact paths +and refuses to start named accounts that only inherit a shared webhook path in multi-account setups. +If you intentionally need legacy inheritance for a named account, set +`dangerouslyAllowInheritedWebhookPath: true` on that account or at `channels.synology-chat`, +but duplicate exact paths are still rejected fail-closed. Prefer explicit per-account paths. + +```json5 +{ + channels: { + "synology-chat": { + enabled: true, + accounts: { + default: { + token: "token-a", + incomingUrl: "https://nas-a.example.com/...token=...", + }, + alerts: { + token: "token-b", + incomingUrl: "https://nas-b.example.com/...token=...", + webhookPath: "/webhook/synology-alerts", + dmPolicy: "allowlist", + allowedUserIds: ["987654"], + }, + }, + }, + }, +} +``` + +## Security notes + +- Keep `token` secret and rotate it if leaked. +- Keep `allowInsecureSsl: false` unless you explicitly trust a self-signed local NAS cert. +- Inbound webhook requests are token-verified and rate-limited per sender. +- Invalid token checks use constant-time secret comparison and fail closed. +- Prefer `dmPolicy: "allowlist"` for production. +- Keep `dangerouslyAllowNameMatching` off unless you explicitly need legacy username-based reply delivery. +- Keep `dangerouslyAllowInheritedWebhookPath` off unless you explicitly accept shared-path routing risk in a multi-account setup. + +## Troubleshooting + +- `Missing required fields (token, user_id, text)`: + - the outgoing webhook payload is missing one of the required fields + - if Synology sends the token in headers, make sure the gateway/proxy preserves those headers +- `Invalid token`: + - the outgoing webhook secret does not match `channels.synology-chat.token` + - the request is hitting the wrong account/webhook path + - a reverse proxy stripped the token header before the request reached OpenClaw +- `Rate limit exceeded`: + - too many invalid token attempts from the same source can temporarily lock that source out + - authenticated senders also have a separate per-user message rate limit +- `Allowlist is empty. Configure allowedUserIds or use dmPolicy=open.`: + - `dmPolicy="allowlist"` is enabled but no users are configured +- `User not authorized`: + - the sender's numeric `user_id` is not in `allowedUserIds` + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/telegram.md b/docs/channels/telegram.md new file mode 100644 index 000000000..f7ade62ae --- /dev/null +++ b/docs/channels/telegram.md @@ -0,0 +1,1072 @@ +--- +summary: "Telegram bot support status, capabilities, and configuration" +read_when: + - Working on Telegram features or webhooks +title: "Telegram" +--- + +# Telegram (Bot API) + +Status: production-ready for bot DMs + groups via grammY. Long polling is the default mode; webhook mode is optional. + + + + Default DM policy for Telegram is pairing. + + + Cross-channel diagnostics and repair playbooks. + + + Full channel config patterns and examples. + + + +## Quick setup + + + + Open Telegram and chat with **@BotFather** (confirm the handle is exactly `@BotFather`). + + Run `/newbot`, follow prompts, and save the token. + + + + + +```json5 +{ + channels: { + telegram: { + enabled: true, + botToken: "123:abc", + dmPolicy: "pairing", + groups: { "*": { requireMention: true } }, + }, + }, +} +``` + + Env fallback: `TELEGRAM_BOT_TOKEN=...` (default account only). + Telegram does **not** use `openclaw channels login telegram`; configure token in config/env, then start gateway. + + + + + +```bash +openclaw gateway +openclaw pairing list telegram +openclaw pairing approve telegram +``` + + Pairing codes expire after 1 hour. + + + + + Add the bot to your group, then set `channels.telegram.groups` and `groupPolicy` to match your access model. + + + + +Token resolution order is account-aware. In practice, config values win over env fallback, and `TELEGRAM_BOT_TOKEN` only applies to the default account. + + +## Telegram side settings + + + + Telegram bots default to **Privacy Mode**, which limits what group messages they receive. + + If the bot must see all group messages, either: + + - disable privacy mode via `/setprivacy`, or + - make the bot a group admin. + + When toggling privacy mode, remove + re-add the bot in each group so Telegram applies the change. + + + + + Admin status is controlled in Telegram group settings. + + Admin bots receive all group messages, which is useful for always-on group behavior. + + + + + + - `/setjoingroups` to allow/deny group adds + - `/setprivacy` for group visibility behavior + + + + +## Access control and activation + + + + `channels.telegram.dmPolicy` controls direct message access: + + - `pairing` (default) + - `allowlist` (requires at least one sender ID in `allowFrom`) + - `open` (requires `allowFrom` to include `"*"`) + - `disabled` + + `channels.telegram.allowFrom` accepts numeric Telegram user IDs. `telegram:` / `tg:` prefixes are accepted and normalized. + `dmPolicy: "allowlist"` with empty `allowFrom` blocks all DMs and is rejected by config validation. + Onboarding accepts `@username` input and resolves it to numeric IDs. + If you upgraded and your config contains `@username` allowlist entries, run `openclaw doctor --fix` to resolve them (best-effort; requires a Telegram bot token). + If you previously relied on pairing-store allowlist files, `openclaw doctor --fix` can recover entries into `channels.telegram.allowFrom` in allowlist flows (for example when `dmPolicy: "allowlist"` has no explicit IDs yet). + + For one-owner bots, prefer `dmPolicy: "allowlist"` with explicit numeric `allowFrom` IDs to keep access policy durable in config (instead of depending on previous pairing approvals). + + Common confusion: DM pairing approval does not mean "this sender is authorized everywhere". + Pairing grants DM access only. Group sender authorization still comes from explicit config allowlists. + If you want "I am authorized once and both DMs and group commands work", put your numeric Telegram user ID in `channels.telegram.allowFrom`. + + ### Finding your Telegram user ID + + Safer (no third-party bot): + + 1. DM your bot. + 2. Run `openclaw logs --follow`. + 3. Read `from.id`. + + Official Bot API method: + +```bash +curl "https://api.telegram.org/bot/getUpdates" +``` + + Third-party method (less private): `@userinfobot` or `@getidsbot`. + + + + + Two controls apply together: + + 1. **Which groups are allowed** (`channels.telegram.groups`) + - no `groups` config: + - with `groupPolicy: "open"`: any group can pass group-ID checks + - with `groupPolicy: "allowlist"` (default): groups are blocked until you add `groups` entries (or `"*"`) + - `groups` configured: acts as allowlist (explicit IDs or `"*"`) + + 2. **Which senders are allowed in groups** (`channels.telegram.groupPolicy`) + - `open` + - `allowlist` (default) + - `disabled` + + `groupAllowFrom` is used for group sender filtering. If not set, Telegram falls back to `allowFrom`. + `groupAllowFrom` entries should be numeric Telegram user IDs (`telegram:` / `tg:` prefixes are normalized). + Do not put Telegram group or supergroup chat IDs in `groupAllowFrom`. Negative chat IDs belong under `channels.telegram.groups`. + Non-numeric entries are ignored for sender authorization. + Security boundary (`2026.2.25+`): group sender auth does **not** inherit DM pairing-store approvals. + Pairing stays DM-only. For groups, set `groupAllowFrom` or per-group/per-topic `allowFrom`. + If `groupAllowFrom` is unset, Telegram falls back to config `allowFrom`, not the pairing store. + Practical pattern for one-owner bots: set your user ID in `channels.telegram.allowFrom`, leave `groupAllowFrom` unset, and allow the target groups under `channels.telegram.groups`. + Runtime note: if `channels.telegram` is completely missing, runtime defaults to fail-closed `groupPolicy="allowlist"` unless `channels.defaults.groupPolicy` is explicitly set. + + Example: allow any member in one specific group: + +```json5 +{ + channels: { + telegram: { + groups: { + "-1001234567890": { + groupPolicy: "open", + requireMention: false, + }, + }, + }, + }, +} +``` + + Example: allow only specific users inside one specific group: + +```json5 +{ + channels: { + telegram: { + groups: { + "-1001234567890": { + requireMention: true, + allowFrom: ["8734062810", "745123456"], + }, + }, + }, + }, +} +``` + + + Common mistake: `groupAllowFrom` is not a Telegram group allowlist. + + - Put negative Telegram group or supergroup chat IDs like `-1001234567890` under `channels.telegram.groups`. + - Put Telegram user IDs like `8734062810` under `groupAllowFrom` when you want to limit which people inside an allowed group can trigger the bot. + - Use `groupAllowFrom: ["*"]` only when you want any member of an allowed group to be able to talk to the bot. + + + + + + Group replies require mention by default. + + Mention can come from: + + - native `@botusername` mention, or + - mention patterns in: + - `agents.list[].groupChat.mentionPatterns` + - `messages.groupChat.mentionPatterns` + + Session-level command toggles: + + - `/activation always` + - `/activation mention` + + These update session state only. Use config for persistence. + + Persistent config example: + +```json5 +{ + channels: { + telegram: { + groups: { + "*": { requireMention: false }, + }, + }, + }, +} +``` + + Getting the group chat ID: + + - forward a group message to `@userinfobot` / `@getidsbot` + - or read `chat.id` from `openclaw logs --follow` + - or inspect Bot API `getUpdates` + + + + +## Runtime behavior + +- Telegram is owned by the gateway process. +- Routing is deterministic: Telegram inbound replies back to Telegram (the model does not pick channels). +- Inbound messages normalize into the shared channel envelope with reply metadata and media placeholders. +- Group sessions are isolated by group ID. Forum topics append `:topic:` to keep topics isolated. +- DM messages can carry `message_thread_id`; OpenClaw routes them with thread-aware session keys and preserves thread ID for replies. +- Long polling uses grammY runner with per-chat/per-thread sequencing. Overall runner sink concurrency uses `agents.defaults.maxConcurrent`. +- Telegram Bot API has no read-receipt support (`sendReadReceipts` does not apply). + +## Feature reference + + + + OpenClaw can stream partial replies in real time: + + - direct chats: preview message + `editMessageText` + - groups/topics: preview message + `editMessageText` + + Requirement: + + - `channels.telegram.streaming` is `off | partial | block | progress` (default: `partial`) + - `progress` maps to `partial` on Telegram (compat with cross-channel naming) + - legacy `channels.telegram.streamMode` and boolean `streaming` values are auto-mapped + + For text-only replies: + + - DM: OpenClaw keeps the same preview message and performs a final edit in place (no second message) + - group/topic: OpenClaw keeps the same preview message and performs a final edit in place (no second message) + + For complex replies (for example media payloads), OpenClaw falls back to normal final delivery and then cleans up the preview message. + + Preview streaming is separate from block streaming. When block streaming is explicitly enabled for Telegram, OpenClaw skips the preview stream to avoid double-streaming. + + If native draft transport is unavailable/rejected, OpenClaw automatically falls back to `sendMessage` + `editMessageText`. + + Telegram-only reasoning stream: + + - `/reasoning stream` sends reasoning to the live preview while generating + - final answer is sent without reasoning text + + + + + Outbound text uses Telegram `parse_mode: "HTML"`. + + - Markdown-ish text is rendered to Telegram-safe HTML. + - Raw model HTML is escaped to reduce Telegram parse failures. + - If Telegram rejects parsed HTML, OpenClaw retries as plain text. + + Link previews are enabled by default and can be disabled with `channels.telegram.linkPreview: false`. + + + + + Telegram command menu registration is handled at startup with `setMyCommands`. + + Native command defaults: + + - `commands.native: "auto"` enables native commands for Telegram + + Add custom command menu entries: + +```json5 +{ + channels: { + telegram: { + customCommands: [ + { command: "backup", description: "Git backup" }, + { command: "generate", description: "Create an image" }, + ], + }, + }, +} +``` + + Rules: + + - names are normalized (strip leading `/`, lowercase) + - valid pattern: `a-z`, `0-9`, `_`, length `1..32` + - custom commands cannot override native commands + - conflicts/duplicates are skipped and logged + + Notes: + + - custom commands are menu entries only; they do not auto-implement behavior + - plugin/skill commands can still work when typed even if not shown in Telegram menu + + If native commands are disabled, built-ins are removed. Custom/plugin commands may still register if configured. + + Common setup failures: + + - `setMyCommands failed` with `BOT_COMMANDS_TOO_MUCH` means the Telegram menu still overflowed after trimming; reduce plugin/skill/custom commands or disable `channels.telegram.commands.native`. + - `setMyCommands failed` with network/fetch errors usually means outbound DNS/HTTPS to `api.telegram.org` is blocked. + + ### Device pairing commands (`device-pair` plugin) + + When the `device-pair` plugin is installed: + + 1. `/pair` generates setup code + 2. paste code in iOS app + 3. `/pair pending` lists pending requests (including role/scopes) + 4. approve the request: + - `/pair approve ` for explicit approval + - `/pair approve` when there is only one pending request + - `/pair approve latest` for most recent + + The setup code carries a short-lived bootstrap token. Built-in bootstrap handoff keeps the primary node token at `scopes: []`; any handed-off operator token stays bounded to `operator.approvals`, `operator.read`, `operator.talk.secrets`, and `operator.write`. Bootstrap scope checks are role-prefixed, so that operator allowlist only satisfies operator requests; non-operator roles still need scopes under their own role prefix. + + If a device retries with changed auth details (for example role/scopes/public key), the previous pending request is superseded and the new request uses a different `requestId`. Re-run `/pair pending` before approving. + + More details: [Pairing](/channels/pairing#pair-via-telegram-recommended-for-ios). + + + + + Configure inline keyboard scope: + +```json5 +{ + channels: { + telegram: { + capabilities: { + inlineButtons: "allowlist", + }, + }, + }, +} +``` + + Per-account override: + +```json5 +{ + channels: { + telegram: { + accounts: { + main: { + capabilities: { + inlineButtons: "allowlist", + }, + }, + }, + }, + }, +} +``` + + Scopes: + + - `off` + - `dm` + - `group` + - `all` + - `allowlist` (default) + + Legacy `capabilities: ["inlineButtons"]` maps to `inlineButtons: "all"`. + + Message action example: + +```json5 +{ + action: "send", + channel: "telegram", + to: "123456789", + message: "Choose an option:", + buttons: [ + [ + { text: "Yes", callback_data: "yes" }, + { text: "No", callback_data: "no" }, + ], + [{ text: "Cancel", callback_data: "cancel" }], + ], +} +``` + + Callback clicks are passed to the agent as text: + `callback_data: ` + + + + + Telegram tool actions include: + + - `sendMessage` (`to`, `content`, optional `mediaUrl`, `replyToMessageId`, `messageThreadId`) + - `react` (`chatId`, `messageId`, `emoji`) + - `deleteMessage` (`chatId`, `messageId`) + - `editMessage` (`chatId`, `messageId`, `content`) + - `createForumTopic` (`chatId`, `name`, optional `iconColor`, `iconCustomEmojiId`) + + Channel message actions expose ergonomic aliases (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`). + + Gating controls: + + - `channels.telegram.actions.sendMessage` + - `channels.telegram.actions.deleteMessage` + - `channels.telegram.actions.reactions` + - `channels.telegram.actions.sticker` (default: disabled) + + Note: `edit` and `topic-create` are currently enabled by default and do not have separate `channels.telegram.actions.*` toggles. + Runtime sends use the active config/secrets snapshot (startup/reload), so action paths do not perform ad-hoc SecretRef re-resolution per send. + + Reaction removal semantics: [/tools/reactions](/tools/reactions) + + + + + Telegram supports explicit reply threading tags in generated output: + + - `[[reply_to_current]]` replies to the triggering message + - `[[reply_to:]]` replies to a specific Telegram message ID + + `channels.telegram.replyToMode` controls handling: + + - `off` (default) + - `first` + - `all` + + Note: `off` disables implicit reply threading. Explicit `[[reply_to_*]]` tags are still honored. + + + + + Forum supergroups: + + - topic session keys append `:topic:` + - replies and typing target the topic thread + - topic config path: + `channels.telegram.groups..topics.` + + General topic (`threadId=1`) special-case: + + - message sends omit `message_thread_id` (Telegram rejects `sendMessage(...thread_id=1)`) + - typing actions still include `message_thread_id` + + Topic inheritance: topic entries inherit group settings unless overridden (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`). + `agentId` is topic-only and does not inherit from group defaults. + + **Per-topic agent routing**: Each topic can route to a different agent by setting `agentId` in the topic config. This gives each topic its own isolated workspace, memory, and session. Example: + + ```json5 + { + channels: { + telegram: { + groups: { + "-1001234567890": { + topics: { + "1": { agentId: "main" }, // General topic → main agent + "3": { agentId: "zu" }, // Dev topic → zu agent + "5": { agentId: "coder" } // Code review → coder agent + } + } + } + } + } + } + ``` + + Each topic then has its own session key: `agent:zu:telegram:group:-1001234567890:topic:3` + + **Persistent ACP topic binding**: Forum topics can pin ACP harness sessions through top-level typed ACP bindings: + + - `bindings[]` with `type: "acp"` and `match.channel: "telegram"` + + Example: + + ```json5 + { + agents: { + list: [ + { + id: "codex", + runtime: { + type: "acp", + acp: { + agent: "codex", + backend: "acpx", + mode: "persistent", + cwd: "/workspace/openclaw", + }, + }, + }, + ], + }, + bindings: [ + { + type: "acp", + agentId: "codex", + match: { + channel: "telegram", + accountId: "default", + peer: { kind: "group", id: "-1001234567890:topic:42" }, + }, + }, + ], + channels: { + telegram: { + groups: { + "-1001234567890": { + topics: { + "42": { + requireMention: false, + }, + }, + }, + }, + }, + }, + } + ``` + + This is currently scoped to forum topics in groups and supergroups. + + **Thread-bound ACP spawn from chat**: + + - `/acp spawn --thread here|auto` can bind the current Telegram topic to a new ACP session. + - Follow-up topic messages route to the bound ACP session directly (no `/acp steer` required). + - OpenClaw pins the spawn confirmation message in-topic after a successful bind. + - Requires `channels.telegram.threadBindings.spawnAcpSessions=true`. + + Template context includes: + + - `MessageThreadId` + - `IsForum` + + DM thread behavior: + + - private chats with `message_thread_id` keep DM routing but use thread-aware session keys/reply targets. + + + + + ### Audio messages + + Telegram distinguishes voice notes vs audio files. + + - default: audio file behavior + - tag `[[audio_as_voice]]` in agent reply to force voice-note send + + Message action example: + +```json5 +{ + action: "send", + channel: "telegram", + to: "123456789", + media: "https://example.com/voice.ogg", + asVoice: true, +} +``` + + ### Video messages + + Telegram distinguishes video files vs video notes. + + Message action example: + +```json5 +{ + action: "send", + channel: "telegram", + to: "123456789", + media: "https://example.com/video.mp4", + asVideoNote: true, +} +``` + + Video notes do not support captions; provided message text is sent separately. + + ### Stickers + + Inbound sticker handling: + + - static WEBP: downloaded and processed (placeholder ``) + - animated TGS: skipped + - video WEBM: skipped + + Sticker context fields: + + - `Sticker.emoji` + - `Sticker.setName` + - `Sticker.fileId` + - `Sticker.fileUniqueId` + - `Sticker.cachedDescription` + + Sticker cache file: + + - `~/.openclaw/telegram/sticker-cache.json` + + Stickers are described once (when possible) and cached to reduce repeated vision calls. + + Enable sticker actions: + +```json5 +{ + channels: { + telegram: { + actions: { + sticker: true, + }, + }, + }, +} +``` + + Send sticker action: + +```json5 +{ + action: "sticker", + channel: "telegram", + to: "123456789", + fileId: "CAACAgIAAxkBAAI...", +} +``` + + Search cached stickers: + +```json5 +{ + action: "sticker-search", + channel: "telegram", + query: "cat waving", + limit: 5, +} +``` + + + + + Telegram reactions arrive as `message_reaction` updates (separate from message payloads). + + When enabled, OpenClaw enqueues system events like: + + - `Telegram reaction added: 👍 by Alice (@alice) on msg 42` + + Config: + + - `channels.telegram.reactionNotifications`: `off | own | all` (default: `own`) + - `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` (default: `minimal`) + + Notes: + + - `own` means user reactions to bot-sent messages only (best-effort via sent-message cache). + - Reaction events still respect Telegram access controls (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`); unauthorized senders are dropped. + - Telegram does not provide thread IDs in reaction updates. + - non-forum groups route to group chat session + - forum groups route to the group general-topic session (`:topic:1`), not the exact originating topic + + `allowed_updates` for polling/webhook include `message_reaction` automatically. + + + + + `ackReaction` sends an acknowledgement emoji while OpenClaw is processing an inbound message. + + Resolution order: + + - `channels.telegram.accounts..ackReaction` + - `channels.telegram.ackReaction` + - `messages.ackReaction` + - agent identity emoji fallback (`agents.list[].identity.emoji`, else "👀") + + Notes: + + - Telegram expects unicode emoji (for example "👀"). + - Use `""` to disable the reaction for a channel or account. + + + + + Channel config writes are enabled by default (`configWrites !== false`). + + Telegram-triggered writes include: + + - group migration events (`migrate_to_chat_id`) to update `channels.telegram.groups` + - `/config set` and `/config unset` (requires command enablement) + + Disable: + +```json5 +{ + channels: { + telegram: { + configWrites: false, + }, + }, +} +``` + + + + + Default: long polling. + + Webhook mode: + + - set `channels.telegram.webhookUrl` + - set `channels.telegram.webhookSecret` (required when webhook URL is set) + - optional `channels.telegram.webhookPath` (default `/telegram-webhook`) + - optional `channels.telegram.webhookHost` (default `127.0.0.1`) + - optional `channels.telegram.webhookPort` (default `8787`) + + Default local listener for webhook mode binds to `127.0.0.1:8787`. + + If your public endpoint differs, place a reverse proxy in front and point `webhookUrl` at the public URL. + Set `webhookHost` (for example `0.0.0.0`) when you intentionally need external ingress. + + + + + - `channels.telegram.textChunkLimit` default is 4000. + - `channels.telegram.chunkMode="newline"` prefers paragraph boundaries (blank lines) before length splitting. + - `channels.telegram.mediaMaxMb` (default 100) caps inbound and outbound Telegram media size. + - `channels.telegram.timeoutSeconds` overrides Telegram API client timeout (if unset, grammY default applies). + - group context history uses `channels.telegram.historyLimit` or `messages.groupChat.historyLimit` (default 50); `0` disables. + - reply/quote/forward supplemental context is currently passed as received. + - Telegram allowlists primarily gate who can trigger the agent, not a full supplemental-context redaction boundary. + - DM history controls: + - `channels.telegram.dmHistoryLimit` + - `channels.telegram.dms[""].historyLimit` + - `channels.telegram.retry` config applies to Telegram send helpers (CLI/tools/actions) for recoverable outbound API errors. + + CLI send target can be numeric chat ID or username: + +```bash +openclaw message send --channel telegram --target 123456789 --message "hi" +openclaw message send --channel telegram --target @name --message "hi" +``` + + Telegram polls use `openclaw message poll` and support forum topics: + +```bash +openclaw message poll --channel telegram --target 123456789 \ + --poll-question "Ship it?" --poll-option "Yes" --poll-option "No" +openclaw message poll --channel telegram --target -1001234567890:topic:42 \ + --poll-question "Pick a time" --poll-option "10am" --poll-option "2pm" \ + --poll-duration-seconds 300 --poll-public +``` + + Telegram-only poll flags: + + - `--poll-duration-seconds` (5-600) + - `--poll-anonymous` + - `--poll-public` + - `--thread-id` for forum topics (or use a `:topic:` target) + + Telegram send also supports: + + - `--buttons` for inline keyboards when `channels.telegram.capabilities.inlineButtons` allows it + - `--force-document` to send outbound images and GIFs as documents instead of compressed photo or animated-media uploads + + Action gating: + + - `channels.telegram.actions.sendMessage=false` disables outbound Telegram messages, including polls + - `channels.telegram.actions.poll=false` disables Telegram poll creation while leaving regular sends enabled + + + + + Telegram supports exec approvals in approver DMs and can optionally post approval prompts in the originating chat or topic. + + Config path: + + - `channels.telegram.execApprovals.enabled` + - `channels.telegram.execApprovals.approvers` (optional; falls back to numeric owner IDs inferred from `allowFrom` and direct `defaultTo` when possible) + - `channels.telegram.execApprovals.target` (`dm` | `channel` | `both`, default: `dm`) + - `agentFilter`, `sessionFilter` + + Approvers must be numeric Telegram user IDs. Telegram auto-enables native exec approvals when `enabled` is unset or `"auto"` and at least one approver can be resolved, either from `execApprovals.approvers` or from the account's numeric owner config (`allowFrom` and direct-message `defaultTo`). Set `enabled: false` to disable Telegram as a native approval client explicitly. Approval requests otherwise fall back to other configured approval routes or the exec approval fallback policy. + + Telegram also renders the shared approval buttons used by other chat channels. The native Telegram adapter mainly adds approver DM routing, channel/topic fanout, and typing hints before delivery. + When those buttons are present, they are the primary approval UX; OpenClaw + should only include a manual `/approve` command when the tool result says + chat approvals are unavailable or manual approval is the only path. + + Delivery rules: + + - `target: "dm"` sends approval prompts only to resolved approver DMs + - `target: "channel"` sends the prompt back to the originating Telegram chat/topic + - `target: "both"` sends to approver DMs and the originating chat/topic + + Only resolved approvers can approve or deny. Non-approvers cannot use `/approve` and cannot use Telegram approval buttons. + + Approval resolution behavior: + + - IDs prefixed with `plugin:` always resolve through plugin approvals. + - Other approval IDs try `exec.approval.resolve` first. + - If Telegram is also authorized for plugin approvals and the gateway says + the exec approval is unknown/expired, Telegram retries once through + `plugin.approval.resolve`. + - Real exec approval denials/errors do not silently fall through to plugin + approval resolution. + + Channel delivery shows the command text in the chat, so only enable `channel` or `both` in trusted groups/topics. When the prompt lands in a forum topic, OpenClaw preserves the topic for both the approval prompt and the post-approval follow-up. Exec approvals expire after 30 minutes by default. + + Inline approval buttons also depend on `channels.telegram.capabilities.inlineButtons` allowing the target surface (`dm`, `group`, or `all`). + + Related docs: [Exec approvals](/tools/exec-approvals) + + + + +## Error reply controls + +When the agent encounters a delivery or provider error, Telegram can either reply with the error text or suppress it. Two config keys control this behavior: + +| Key | Values | Default | Description | +| ----------------------------------- | ----------------- | ------- | ----------------------------------------------------------------------------------------------- | +| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` sends a friendly error message to the chat. `silent` suppresses error replies entirely. | +| `channels.telegram.errorCooldownMs` | number (ms) | `60000` | Minimum time between error replies to the same chat. Prevents error spam during outages. | + +Per-account, per-group, and per-topic overrides are supported (same inheritance as other Telegram config keys). + +```json5 +{ + channels: { + telegram: { + errorPolicy: "reply", + errorCooldownMs: 120000, + groups: { + "-1001234567890": { + errorPolicy: "silent", // suppress errors in this group + }, + }, + }, + }, +} +``` + +## Troubleshooting + + + + + - If `requireMention=false`, Telegram privacy mode must allow full visibility. + - BotFather: `/setprivacy` -> Disable + - then remove + re-add bot to group + - `openclaw channels status` warns when config expects unmentioned group messages. + - `openclaw channels status --probe` can check explicit numeric group IDs; wildcard `"*"` cannot be membership-probed. + - quick session test: `/activation always`. + + + + + + - when `channels.telegram.groups` exists, group must be listed (or include `"*"`) + - verify bot membership in group + - review logs: `openclaw logs --follow` for skip reasons + + + + + + - authorize your sender identity (pairing and/or numeric `allowFrom`) + - command authorization still applies even when group policy is `open` + - `setMyCommands failed` with `BOT_COMMANDS_TOO_MUCH` means the native menu has too many entries; reduce plugin/skill/custom commands or disable native menus + - `setMyCommands failed` with network/fetch errors usually indicates DNS/HTTPS reachability issues to `api.telegram.org` + + + + + + - Node 22+ + custom fetch/proxy can trigger immediate abort behavior if AbortSignal types mismatch. + - Some hosts resolve `api.telegram.org` to IPv6 first; broken IPv6 egress can cause intermittent Telegram API failures. + - If logs include `TypeError: fetch failed` or `Network request for 'getUpdates' failed!`, OpenClaw now retries these as recoverable network errors. + - On VPS hosts with unstable direct egress/TLS, route Telegram API calls through `channels.telegram.proxy`: + +```yaml +channels: + telegram: + proxy: socks5://:@proxy-host:1080 +``` + + - Node 22+ defaults to `autoSelectFamily=true` (except WSL2) and `dnsResultOrder=ipv4first`. + - If your host is WSL2 or explicitly works better with IPv4-only behavior, force family selection: + +```yaml +channels: + telegram: + network: + autoSelectFamily: false +``` + + - RFC 2544 benchmark-range answers (`198.18.0.0/15`) are already allowed + for Telegram media downloads by default. If a trusted fake-IP or + transparent proxy rewrites `api.telegram.org` to some other + private/internal/special-use address during media downloads, you can opt + in to the Telegram-only bypass: + +```yaml +channels: + telegram: + network: + dangerouslyAllowPrivateNetwork: true +``` + + - The same opt-in is available per account at + `channels.telegram.accounts..network.dangerouslyAllowPrivateNetwork`. + - If your proxy resolves Telegram media hosts into `198.18.x.x`, leave the + dangerous flag off first. Telegram media already allows the RFC 2544 + benchmark range by default. + + + `channels.telegram.network.dangerouslyAllowPrivateNetwork` weakens Telegram + media SSRF protections. Use it only for trusted operator-controlled proxy + environments such as Clash, Mihomo, or Surge fake-IP routing when they + synthesize private or special-use answers outside the RFC 2544 benchmark + range. Leave it off for normal public internet Telegram access. + + + - Environment overrides (temporary): + - `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1` + - `OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1` + - `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first` + - Validate DNS answers: + +```bash +dig +short api.telegram.org A +dig +short api.telegram.org AAAA +``` + + + + +More help: [Channel troubleshooting](/channels/troubleshooting). + +## Telegram config reference pointers + +Primary reference: + +- `channels.telegram.enabled`: enable/disable channel startup. +- `channels.telegram.botToken`: bot token (BotFather). +- `channels.telegram.tokenFile`: read token from a regular file path. Symlinks are rejected. +- `channels.telegram.dmPolicy`: `pairing | allowlist | open | disabled` (default: pairing). +- `channels.telegram.allowFrom`: DM allowlist (numeric Telegram user IDs). `allowlist` requires at least one sender ID. `open` requires `"*"`. `openclaw doctor --fix` can resolve legacy `@username` entries to IDs and can recover allowlist entries from pairing-store files in allowlist migration flows. +- `channels.telegram.actions.poll`: enable or disable Telegram poll creation (default: enabled; still requires `sendMessage`). +- `channels.telegram.defaultTo`: default Telegram target used by CLI `--deliver` when no explicit `--reply-to` is provided. +- `channels.telegram.groupPolicy`: `open | allowlist | disabled` (default: allowlist). +- `channels.telegram.groupAllowFrom`: group sender allowlist (numeric Telegram user IDs). `openclaw doctor --fix` can resolve legacy `@username` entries to IDs. Non-numeric entries are ignored at auth time. Group auth does not use DM pairing-store fallback (`2026.2.25+`). +- Multi-account precedence: + - When two or more account IDs are configured, set `channels.telegram.defaultAccount` (or include `channels.telegram.accounts.default`) to make default routing explicit. + - If neither is set, OpenClaw falls back to the first normalized account ID and `openclaw doctor` warns. + - `channels.telegram.accounts.default.allowFrom` and `channels.telegram.accounts.default.groupAllowFrom` apply only to the `default` account. + - Named accounts inherit `channels.telegram.allowFrom` and `channels.telegram.groupAllowFrom` when account-level values are unset. + - Named accounts do not inherit `channels.telegram.accounts.default.allowFrom` / `groupAllowFrom`. +- `channels.telegram.groups`: per-group defaults + allowlist (use `"*"` for global defaults). + - `channels.telegram.groups..groupPolicy`: per-group override for groupPolicy (`open | allowlist | disabled`). + - `channels.telegram.groups..requireMention`: mention gating default. + - `channels.telegram.groups..skills`: skill filter (omit = all skills, empty = none). + - `channels.telegram.groups..allowFrom`: per-group sender allowlist override. + - `channels.telegram.groups..systemPrompt`: extra system prompt for the group. + - `channels.telegram.groups..enabled`: disable the group when `false`. + - `channels.telegram.groups..topics..*`: per-topic overrides (group fields + topic-only `agentId`). + - `channels.telegram.groups..topics..agentId`: route this topic to a specific agent (overrides group-level and binding routing). +- `channels.telegram.groups..topics..groupPolicy`: per-topic override for groupPolicy (`open | allowlist | disabled`). +- `channels.telegram.groups..topics..requireMention`: per-topic mention gating override. +- top-level `bindings[]` with `type: "acp"` and canonical topic id `chatId:topic:topicId` in `match.peer.id`: persistent ACP topic binding fields (see [ACP Agents](/tools/acp-agents#channel-specific-settings)). +- `channels.telegram.direct..topics..agentId`: route DM topics to a specific agent (same behavior as forum topics). +- `channels.telegram.execApprovals.enabled`: enable Telegram as a chat-based exec approval client for this account. +- `channels.telegram.execApprovals.approvers`: Telegram user IDs allowed to approve or deny exec requests. Optional when `channels.telegram.allowFrom` or a direct `channels.telegram.defaultTo` already identifies the owner. +- `channels.telegram.execApprovals.target`: `dm | channel | both` (default: `dm`). `channel` and `both` preserve the originating Telegram topic when present. +- `channels.telegram.execApprovals.agentFilter`: optional agent ID filter for forwarded approval prompts. +- `channels.telegram.execApprovals.sessionFilter`: optional session key filter (substring or regex) for forwarded approval prompts. +- `channels.telegram.accounts..execApprovals`: per-account override for Telegram exec approval routing and approver authorization. +- `channels.telegram.capabilities.inlineButtons`: `off | dm | group | all | allowlist` (default: allowlist). +- `channels.telegram.accounts..capabilities.inlineButtons`: per-account override. +- `channels.telegram.commands.nativeSkills`: enable/disable Telegram native skills commands. +- `channels.telegram.replyToMode`: `off | first | all` (default: `off`). +- `channels.telegram.textChunkLimit`: outbound chunk size (chars). +- `channels.telegram.chunkMode`: `length` (default) or `newline` to split on blank lines (paragraph boundaries) before length chunking. +- `channels.telegram.linkPreview`: toggle link previews for outbound messages (default: true). +- `channels.telegram.streaming`: `off | partial | block | progress` (live stream preview; default: `partial`; `progress` maps to `partial`; `block` is legacy preview mode compatibility). Telegram preview streaming uses a single preview message that is edited in place. +- `channels.telegram.mediaMaxMb`: inbound/outbound Telegram media cap (MB, default: 100). +- `channels.telegram.retry`: retry policy for Telegram send helpers (CLI/tools/actions) on recoverable outbound API errors (attempts, minDelayMs, maxDelayMs, jitter). +- `channels.telegram.network.autoSelectFamily`: override Node autoSelectFamily (true=enable, false=disable). Defaults to enabled on Node 22+, with WSL2 defaulting to disabled. +- `channels.telegram.network.dnsResultOrder`: override DNS result order (`ipv4first` or `verbatim`). Defaults to `ipv4first` on Node 22+. +- `channels.telegram.network.dangerouslyAllowPrivateNetwork`: dangerous opt-in for trusted fake-IP or transparent-proxy environments where Telegram media downloads resolve `api.telegram.org` to private/internal/special-use addresses outside the default RFC 2544 benchmark-range allowance. +- `channels.telegram.proxy`: proxy URL for Bot API calls (SOCKS/HTTP). +- `channels.telegram.webhookUrl`: enable webhook mode (requires `channels.telegram.webhookSecret`). +- `channels.telegram.webhookSecret`: webhook secret (required when webhookUrl is set). +- `channels.telegram.webhookPath`: local webhook path (default `/telegram-webhook`). +- `channels.telegram.webhookHost`: local webhook bind host (default `127.0.0.1`). +- `channels.telegram.webhookPort`: local webhook bind port (default `8787`). +- `channels.telegram.actions.reactions`: gate Telegram tool reactions. +- `channels.telegram.actions.sendMessage`: gate Telegram tool message sends. +- `channels.telegram.actions.deleteMessage`: gate Telegram tool message deletes. +- `channels.telegram.actions.sticker`: gate Telegram sticker actions — send and search (default: false). +- `channels.telegram.reactionNotifications`: `off | own | all` — control which reactions trigger system events (default: `own` when not set). +- `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` — control agent's reaction capability (default: `minimal` when not set). +- `channels.telegram.errorPolicy`: `reply | silent` — control error reply behavior (default: `reply`). Per-account/group/topic overrides supported. +- `channels.telegram.errorCooldownMs`: minimum ms between error replies to the same chat (default: `60000`). Prevents error spam during outages. + +- [Configuration reference - Telegram](/gateway/configuration-reference#telegram) + +Telegram-specific high-signal fields: + +- startup/auth: `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` must point to a regular file; symlinks are rejected) +- access control: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*`, top-level `bindings[]` (`type: "acp"`) +- exec approvals: `execApprovals`, `accounts.*.execApprovals` +- command/menu: `commands.native`, `commands.nativeSkills`, `customCommands` +- threading/replies: `replyToMode` +- streaming: `streaming` (preview), `blockStreaming` +- formatting/delivery: `textChunkLimit`, `chunkMode`, `linkPreview`, `responsePrefix` +- media/network: `mediaMaxMb`, `timeoutSeconds`, `retry`, `network.autoSelectFamily`, `network.dangerouslyAllowPrivateNetwork`, `proxy` +- webhook: `webhookUrl`, `webhookSecret`, `webhookPath`, `webhookHost` +- actions/capabilities: `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker` +- reactions: `reactionNotifications`, `reactionLevel` +- errors: `errorPolicy`, `errorCooldownMs` +- writes/history: `configWrites`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit` + +## Related + +- [Pairing](/channels/pairing) +- [Groups](/channels/groups) +- [Security](/gateway/security) +- [Channel routing](/channels/channel-routing) +- [Multi-agent routing](/concepts/multi-agent) +- [Troubleshooting](/channels/troubleshooting) diff --git a/docs/channels/tlon.md b/docs/channels/tlon.md new file mode 100644 index 000000000..9ed57f3ad --- /dev/null +++ b/docs/channels/tlon.md @@ -0,0 +1,290 @@ +--- +summary: "Tlon/Urbit support status, capabilities, and configuration" +read_when: + - Working on Tlon/Urbit channel features +title: "Tlon" +--- + +# Tlon + +Tlon is a decentralized messenger built on Urbit. OpenClaw connects to your Urbit ship and can +respond to DMs and group chat messages. Group replies require an @ mention by default and can +be further restricted via allowlists. + +Status: bundled plugin. DMs, group mentions, thread replies, rich text formatting, and +image uploads are supported. Reactions and polls are not yet supported. + +## Bundled plugin + +Tlon ships as a bundled plugin in current OpenClaw releases, so normal packaged +builds do not need a separate install. + +If you are on an older build or a custom install that excludes Tlon, install it +manually: + +Install via CLI (npm registry): + +```bash +openclaw plugins install @openclaw/tlon +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./path/to/local/tlon-plugin +``` + +Details: [Plugins](/tools/plugin) + +## Setup + +1. Ensure the Tlon plugin is available. + - Current packaged OpenClaw releases already bundle it. + - Older/custom installs can add it manually with the commands above. +2. Gather your ship URL and login code. +3. Configure `channels.tlon`. +4. Restart the gateway. +5. DM the bot or mention it in a group channel. + +Minimal config (single account): + +```json5 +{ + channels: { + tlon: { + enabled: true, + ship: "~sampel-palnet", + url: "https://your-ship-host", + code: "lidlut-tabwed-pillex-ridrup", + ownerShip: "~your-main-ship", // recommended: your ship, always allowed + }, + }, +} +``` + +## Private/LAN ships + +By default, OpenClaw blocks private/internal hostnames and IP ranges for SSRF protection. +If your ship is running on a private network (localhost, LAN IP, or internal hostname), +you must explicitly opt in: + +```json5 +{ + channels: { + tlon: { + url: "http://localhost:8080", + allowPrivateNetwork: true, + }, + }, +} +``` + +This applies to URLs like: + +- `http://localhost:8080` +- `http://192.168.x.x:8080` +- `http://my-ship.local:8080` + +⚠️ Only enable this if you trust your local network. This setting disables SSRF protections +for requests to your ship URL. + +## Group channels + +Auto-discovery is enabled by default. You can also pin channels manually: + +```json5 +{ + channels: { + tlon: { + groupChannels: ["chat/~host-ship/general", "chat/~host-ship/support"], + }, + }, +} +``` + +Disable auto-discovery: + +```json5 +{ + channels: { + tlon: { + autoDiscoverChannels: false, + }, + }, +} +``` + +## Access control + +DM allowlist (empty = no DMs allowed, use `ownerShip` for approval flow): + +```json5 +{ + channels: { + tlon: { + dmAllowlist: ["~zod", "~nec"], + }, + }, +} +``` + +Group authorization (restricted by default): + +```json5 +{ + channels: { + tlon: { + defaultAuthorizedShips: ["~zod"], + authorization: { + channelRules: { + "chat/~host-ship/general": { + mode: "restricted", + allowedShips: ["~zod", "~nec"], + }, + "chat/~host-ship/announcements": { + mode: "open", + }, + }, + }, + }, + }, +} +``` + +## Owner and approval system + +Set an owner ship to receive approval requests when unauthorized users try to interact: + +```json5 +{ + channels: { + tlon: { + ownerShip: "~your-main-ship", + }, + }, +} +``` + +The owner ship is **automatically authorized everywhere** — DM invites are auto-accepted and +channel messages are always allowed. You don't need to add the owner to `dmAllowlist` or +`defaultAuthorizedShips`. + +When set, the owner receives DM notifications for: + +- DM requests from ships not in the allowlist +- Mentions in channels without authorization +- Group invite requests + +## Auto-accept settings + +Auto-accept DM invites (for ships in dmAllowlist): + +```json5 +{ + channels: { + tlon: { + autoAcceptDmInvites: true, + }, + }, +} +``` + +Auto-accept group invites: + +```json5 +{ + channels: { + tlon: { + autoAcceptGroupInvites: true, + }, + }, +} +``` + +## Delivery targets (CLI/cron) + +Use these with `openclaw message send` or cron delivery: + +- DM: `~sampel-palnet` or `dm/~sampel-palnet` +- Group: `chat/~host-ship/channel` or `group:~host-ship/channel` + +## Bundled skill + +The Tlon plugin includes a bundled skill ([`@tloncorp/tlon-skill`](https://github.com/tloncorp/tlon-skill)) +that provides CLI access to Tlon operations: + +- **Contacts**: get/update profiles, list contacts +- **Channels**: list, create, post messages, fetch history +- **Groups**: list, create, manage members +- **DMs**: send messages, react to messages +- **Reactions**: add/remove emoji reactions to posts and DMs +- **Settings**: manage plugin permissions via slash commands + +The skill is automatically available when the plugin is installed. + +## Capabilities + +| Feature | Status | +| --------------- | --------------------------------------- | +| Direct messages | ✅ Supported | +| Groups/channels | ✅ Supported (mention-gated by default) | +| Threads | ✅ Supported (auto-replies in thread) | +| Rich text | ✅ Markdown converted to Tlon format | +| Images | ✅ Uploaded to Tlon storage | +| Reactions | ✅ Via [bundled skill](#bundled-skill) | +| Polls | ❌ Not yet supported | +| Native commands | ✅ Supported (owner-only by default) | + +## Troubleshooting + +Run this ladder first: + +```bash +openclaw status +openclaw gateway status +openclaw logs --follow +openclaw doctor +``` + +Common failures: + +- **DMs ignored**: sender not in `dmAllowlist` and no `ownerShip` configured for approval flow. +- **Group messages ignored**: channel not discovered or sender not authorized. +- **Connection errors**: check ship URL is reachable; enable `allowPrivateNetwork` for local ships. +- **Auth errors**: verify login code is current (codes rotate). + +## Configuration reference + +Full configuration: [Configuration](/gateway/configuration) + +Provider options: + +- `channels.tlon.enabled`: enable/disable channel startup. +- `channels.tlon.ship`: bot's Urbit ship name (e.g. `~sampel-palnet`). +- `channels.tlon.url`: ship URL (e.g. `https://sampel-palnet.tlon.network`). +- `channels.tlon.code`: ship login code. +- `channels.tlon.allowPrivateNetwork`: allow localhost/LAN URLs (SSRF bypass). +- `channels.tlon.ownerShip`: owner ship for approval system (always authorized). +- `channels.tlon.dmAllowlist`: ships allowed to DM (empty = none). +- `channels.tlon.autoAcceptDmInvites`: auto-accept DMs from allowlisted ships. +- `channels.tlon.autoAcceptGroupInvites`: auto-accept all group invites. +- `channels.tlon.autoDiscoverChannels`: auto-discover group channels (default: true). +- `channels.tlon.groupChannels`: manually pinned channel nests. +- `channels.tlon.defaultAuthorizedShips`: ships authorized for all channels. +- `channels.tlon.authorization.channelRules`: per-channel auth rules. +- `channels.tlon.showModelSignature`: append model name to messages. + +## Notes + +- Group replies require a mention (e.g. `~your-bot-ship`) to respond. +- Thread replies: if the inbound message is in a thread, OpenClaw replies in-thread. +- Rich text: Markdown formatting (bold, italic, code, headers, lists) is converted to Tlon's native format. +- Images: URLs are uploaded to Tlon storage and embedded as image blocks. + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/troubleshooting.md b/docs/channels/troubleshooting.md new file mode 100644 index 000000000..9c22d4b60 --- /dev/null +++ b/docs/channels/troubleshooting.md @@ -0,0 +1,133 @@ +--- +summary: "Fast channel level troubleshooting with per channel failure signatures and fixes" +read_when: + - Channel transport says connected but replies fail + - You need channel specific checks before deep provider docs +title: "Channel Troubleshooting" +--- + +# Channel troubleshooting + +Use this page when a channel connects but behavior is wrong. + +## Command ladder + +Run these in order first: + +```bash +openclaw status +openclaw gateway status +openclaw logs --follow +openclaw doctor +openclaw channels status --probe +``` + +Healthy baseline: + +- `Runtime: running` +- `RPC probe: ok` +- Channel probe shows transport connected and, where supported, `works` or `audit ok` + +## WhatsApp + +### WhatsApp failure signatures + +| Symptom | Fastest check | Fix | +| ------------------------------- | --------------------------------------------------- | ------------------------------------------------------- | +| Connected but no DM replies | `openclaw pairing list whatsapp` | Approve sender or switch DM policy/allowlist. | +| Group messages ignored | Check `requireMention` + mention patterns in config | Mention the bot or relax mention policy for that group. | +| Random disconnect/relogin loops | `openclaw channels status --probe` + logs | Re-login and verify credentials directory is healthy. | + +Full troubleshooting: [/channels/whatsapp#troubleshooting](/channels/whatsapp#troubleshooting) + +## Telegram + +### Telegram failure signatures + +| Symptom | Fastest check | Fix | +| ----------------------------------- | ----------------------------------------------- | --------------------------------------------------------------------------- | +| `/start` but no usable reply flow | `openclaw pairing list telegram` | Approve pairing or change DM policy. | +| Bot online but group stays silent | Verify mention requirement and bot privacy mode | Disable privacy mode for group visibility or mention bot. | +| Send failures with network errors | Inspect logs for Telegram API call failures | Fix DNS/IPv6/proxy routing to `api.telegram.org`. | +| `setMyCommands` rejected at startup | Inspect logs for `BOT_COMMANDS_TOO_MUCH` | Reduce plugin/skill/custom Telegram commands or disable native menus. | +| Upgraded and allowlist blocks you | `openclaw security audit` and config allowlists | Run `openclaw doctor --fix` or replace `@username` with numeric sender IDs. | + +Full troubleshooting: [/channels/telegram#troubleshooting](/channels/telegram#troubleshooting) + +## Discord + +### Discord failure signatures + +| Symptom | Fastest check | Fix | +| ------------------------------- | ----------------------------------- | --------------------------------------------------------- | +| Bot online but no guild replies | `openclaw channels status --probe` | Allow guild/channel and verify message content intent. | +| Group messages ignored | Check logs for mention gating drops | Mention bot or set guild/channel `requireMention: false`. | +| DM replies missing | `openclaw pairing list discord` | Approve DM pairing or adjust DM policy. | + +Full troubleshooting: [/channels/discord#troubleshooting](/channels/discord#troubleshooting) + +## Slack + +### Slack failure signatures + +| Symptom | Fastest check | Fix | +| -------------------------------------- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| Socket mode connected but no responses | `openclaw channels status --probe` | Verify app token + bot token and required scopes; watch for `botTokenStatus` / `appTokenStatus = configured_unavailable` on SecretRef-backed setups. | +| DMs blocked | `openclaw pairing list slack` | Approve pairing or relax DM policy. | +| Channel message ignored | Check `groupPolicy` and channel allowlist | Allow the channel or switch policy to `open`. | + +Full troubleshooting: [/channels/slack#troubleshooting](/channels/slack#troubleshooting) + +## iMessage and BlueBubbles + +### iMessage and BlueBubbles failure signatures + +| Symptom | Fastest check | Fix | +| -------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------- | +| No inbound events | Verify webhook/server reachability and app permissions | Fix webhook URL or BlueBubbles server state. | +| Can send but no receive on macOS | Check macOS privacy permissions for Messages automation | Re-grant TCC permissions and restart channel process. | +| DM sender blocked | `openclaw pairing list imessage` or `openclaw pairing list bluebubbles` | Approve pairing or update allowlist. | + +Full troubleshooting: + +- [/channels/imessage#troubleshooting](/channels/imessage#troubleshooting) +- [/channels/bluebubbles#troubleshooting](/channels/bluebubbles#troubleshooting) + +## Signal + +### Signal failure signatures + +| Symptom | Fastest check | Fix | +| ------------------------------- | ------------------------------------------ | -------------------------------------------------------- | +| Daemon reachable but bot silent | `openclaw channels status --probe` | Verify `signal-cli` daemon URL/account and receive mode. | +| DM blocked | `openclaw pairing list signal` | Approve sender or adjust DM policy. | +| Group replies do not trigger | Check group allowlist and mention patterns | Add sender/group or loosen gating. | + +Full troubleshooting: [/channels/signal#troubleshooting](/channels/signal#troubleshooting) + +## QQ Bot + +### QQ Bot failure signatures + +| Symptom | Fastest check | Fix | +| ------------------------------- | ------------------------------------------- | --------------------------------------------------------------- | +| Bot replies "gone to Mars" | Verify `appId` and `clientSecret` in config | Set credentials or restart the gateway. | +| No inbound messages | `openclaw channels status --probe` | Verify credentials on the QQ Open Platform. | +| Voice not transcribed | Check STT provider config | Configure `channels.qqbot.stt` or `tools.media.audio`. | +| Proactive messages not arriving | Check QQ platform interaction requirements | QQ may block bot-initiated messages without recent interaction. | + +Full troubleshooting: [/channels/qqbot#troubleshooting](/channels/qqbot#troubleshooting) + +## Matrix + +### Matrix failure signatures + +| Symptom | Fastest check | Fix | +| ----------------------------------- | -------------------------------------- | ------------------------------------------------------------------------- | +| Logged in but ignores room messages | `openclaw channels status --probe` | Check `groupPolicy`, room allowlist, and mention gating. | +| DMs do not process | `openclaw pairing list matrix` | Approve sender or adjust DM policy. | +| Encrypted rooms fail | `openclaw matrix verify status` | Re-verify the device, then check `openclaw matrix verify backup status`. | +| Backup restore is pending/broken | `openclaw matrix verify backup status` | Run `openclaw matrix verify backup restore` or rerun with a recovery key. | +| Cross-signing/bootstrap looks wrong | `openclaw matrix verify bootstrap` | Repair secret storage, cross-signing, and backup state in one pass. | + +Full setup and config: [Matrix](/channels/matrix) diff --git a/docs/channels/twitch.md b/docs/channels/twitch.md new file mode 100644 index 000000000..528088f62 --- /dev/null +++ b/docs/channels/twitch.md @@ -0,0 +1,394 @@ +--- +summary: "Twitch chat bot configuration and setup" +read_when: + - Setting up Twitch chat integration for OpenClaw +title: "Twitch" +--- + +# Twitch + +Twitch chat support via IRC connection. OpenClaw connects as a Twitch user (bot account) to receive and send messages in channels. + +## Bundled plugin + +Twitch ships as a bundled plugin in current OpenClaw releases, so normal +packaged builds do not need a separate install. + +If you are on an older build or a custom install that excludes Twitch, install +it manually: + +Install via CLI (npm registry): + +```bash +openclaw plugins install @openclaw/twitch +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./path/to/local/twitch-plugin +``` + +Details: [Plugins](/tools/plugin) + +## Quick setup (beginner) + +1. Ensure the Twitch plugin is available. + - Current packaged OpenClaw releases already bundle it. + - Older/custom installs can add it manually with the commands above. +2. Create a dedicated Twitch account for the bot (or use an existing account). +3. Generate credentials: [Twitch Token Generator](https://twitchtokengenerator.com/) + - Select **Bot Token** + - Verify scopes `chat:read` and `chat:write` are selected + - Copy the **Client ID** and **Access Token** +4. Find your Twitch user ID: [https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/](https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/) +5. Configure the token: + - Env: `OPENCLAW_TWITCH_ACCESS_TOKEN=...` (default account only) + - Or config: `channels.twitch.accessToken` + - If both are set, config takes precedence (env fallback is default-account only). +6. Start the gateway. + +**⚠️ Important:** Add access control (`allowFrom` or `allowedRoles`) to prevent unauthorized users from triggering the bot. `requireMention` defaults to `true`. + +Minimal config: + +```json5 +{ + channels: { + twitch: { + enabled: true, + username: "openclaw", // Bot's Twitch account + accessToken: "oauth:abc123...", // OAuth Access Token (or use OPENCLAW_TWITCH_ACCESS_TOKEN env var) + clientId: "xyz789...", // Client ID from Token Generator + channel: "vevisk", // Which Twitch channel's chat to join (required) + allowFrom: ["123456789"], // (recommended) Your Twitch user ID only - get it from https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/ + }, + }, +} +``` + +## What it is + +- A Twitch channel owned by the Gateway. +- Deterministic routing: replies always go back to Twitch. +- Each account maps to an isolated session key `agent::twitch:`. +- `username` is the bot's account (who authenticates), `channel` is which chat room to join. + +## Setup (detailed) + +### Generate credentials + +Use [Twitch Token Generator](https://twitchtokengenerator.com/): + +- Select **Bot Token** +- Verify scopes `chat:read` and `chat:write` are selected +- Copy the **Client ID** and **Access Token** + +No manual app registration needed. Tokens expire after several hours. + +### Configure the bot + +**Env var (default account only):** + +```bash +OPENCLAW_TWITCH_ACCESS_TOKEN=oauth:abc123... +``` + +**Or config:** + +```json5 +{ + channels: { + twitch: { + enabled: true, + username: "openclaw", + accessToken: "oauth:abc123...", + clientId: "xyz789...", + channel: "vevisk", + }, + }, +} +``` + +If both env and config are set, config takes precedence. + +### Access control (recommended) + +```json5 +{ + channels: { + twitch: { + allowFrom: ["123456789"], // (recommended) Your Twitch user ID only + }, + }, +} +``` + +Prefer `allowFrom` for a hard allowlist. Use `allowedRoles` instead if you want role-based access. + +**Available roles:** `"moderator"`, `"owner"`, `"vip"`, `"subscriber"`, `"all"`. + +**Why user IDs?** Usernames can change, allowing impersonation. User IDs are permanent. + +Find your Twitch user ID: [https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/](https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/) (Convert your Twitch username to ID) + +## Token refresh (optional) + +Tokens from [Twitch Token Generator](https://twitchtokengenerator.com/) cannot be automatically refreshed - regenerate when expired. + +For automatic token refresh, create your own Twitch application at [Twitch Developer Console](https://dev.twitch.tv/console) and add to config: + +```json5 +{ + channels: { + twitch: { + clientSecret: "your_client_secret", + refreshToken: "your_refresh_token", + }, + }, +} +``` + +The bot automatically refreshes tokens before expiration and logs refresh events. + +## Multi-account support + +Use `channels.twitch.accounts` with per-account tokens. See [`gateway/configuration`](/gateway/configuration) for the shared pattern. + +Example (one bot account in two channels): + +```json5 +{ + channels: { + twitch: { + accounts: { + channel1: { + username: "openclaw", + accessToken: "oauth:abc123...", + clientId: "xyz789...", + channel: "vevisk", + }, + channel2: { + username: "openclaw", + accessToken: "oauth:def456...", + clientId: "uvw012...", + channel: "secondchannel", + }, + }, + }, + }, +} +``` + +**Note:** Each account needs its own token (one token per channel). + +## Access control + +### Role-based restrictions + +```json5 +{ + channels: { + twitch: { + accounts: { + default: { + allowedRoles: ["moderator", "vip"], + }, + }, + }, + }, +} +``` + +### Allowlist by User ID (most secure) + +```json5 +{ + channels: { + twitch: { + accounts: { + default: { + allowFrom: ["123456789", "987654321"], + }, + }, + }, + }, +} +``` + +### Role-based access (alternative) + +`allowFrom` is a hard allowlist. When set, only those user IDs are allowed. +If you want role-based access, leave `allowFrom` unset and configure `allowedRoles` instead: + +```json5 +{ + channels: { + twitch: { + accounts: { + default: { + allowedRoles: ["moderator"], + }, + }, + }, + }, +} +``` + +### Disable @mention requirement + +By default, `requireMention` is `true`. To disable and respond to all messages: + +```json5 +{ + channels: { + twitch: { + accounts: { + default: { + requireMention: false, + }, + }, + }, + }, +} +``` + +## Troubleshooting + +First, run diagnostic commands: + +```bash +openclaw doctor +openclaw channels status --probe +``` + +### Bot does not respond to messages + +**Check access control:** Ensure your user ID is in `allowFrom`, or temporarily remove +`allowFrom` and set `allowedRoles: ["all"]` to test. + +**Check the bot is in the channel:** The bot must join the channel specified in `channel`. + +### Token issues + +**"Failed to connect" or authentication errors:** + +- Verify `accessToken` is the OAuth access token value (typically starts with `oauth:` prefix) +- Check token has `chat:read` and `chat:write` scopes +- If using token refresh, verify `clientSecret` and `refreshToken` are set + +### Token refresh not working + +**Check logs for refresh events:** + +``` +Using env token source for mybot +Access token refreshed for user 123456 (expires in 14400s) +``` + +If you see "token refresh disabled (no refresh token)": + +- Ensure `clientSecret` is provided +- Ensure `refreshToken` is provided + +## Config + +**Account config:** + +- `username` - Bot username +- `accessToken` - OAuth access token with `chat:read` and `chat:write` +- `clientId` - Twitch Client ID (from Token Generator or your app) +- `channel` - Channel to join (required) +- `enabled` - Enable this account (default: `true`) +- `clientSecret` - Optional: For automatic token refresh +- `refreshToken` - Optional: For automatic token refresh +- `expiresIn` - Token expiry in seconds +- `obtainmentTimestamp` - Token obtained timestamp +- `allowFrom` - User ID allowlist +- `allowedRoles` - Role-based access control (`"moderator" | "owner" | "vip" | "subscriber" | "all"`) +- `requireMention` - Require @mention (default: `true`) + +**Provider options:** + +- `channels.twitch.enabled` - Enable/disable channel startup +- `channels.twitch.username` - Bot username (simplified single-account config) +- `channels.twitch.accessToken` - OAuth access token (simplified single-account config) +- `channels.twitch.clientId` - Twitch Client ID (simplified single-account config) +- `channels.twitch.channel` - Channel to join (simplified single-account config) +- `channels.twitch.accounts.` - Multi-account config (all account fields above) + +Full example: + +```json5 +{ + channels: { + twitch: { + enabled: true, + username: "openclaw", + accessToken: "oauth:abc123...", + clientId: "xyz789...", + channel: "vevisk", + clientSecret: "secret123...", + refreshToken: "refresh456...", + allowFrom: ["123456789"], + allowedRoles: ["moderator", "vip"], + accounts: { + default: { + username: "mybot", + accessToken: "oauth:abc123...", + clientId: "xyz789...", + channel: "your_channel", + enabled: true, + clientSecret: "secret123...", + refreshToken: "refresh456...", + expiresIn: 14400, + obtainmentTimestamp: 1706092800000, + allowFrom: ["123456789", "987654321"], + allowedRoles: ["moderator"], + }, + }, + }, + }, +} +``` + +## Tool actions + +The agent can call `twitch` with action: + +- `send` - Send a message to a channel + +Example: + +```json5 +{ + action: "twitch", + params: { + message: "Hello Twitch!", + to: "#mychannel", + }, +} +``` + +## Safety & ops + +- **Treat tokens like passwords** - Never commit tokens to git +- **Use automatic token refresh** for long-running bots +- **Use user ID allowlists** instead of usernames for access control +- **Monitor logs** for token refresh events and connection status +- **Scope tokens minimally** - Only request `chat:read` and `chat:write` +- **If stuck**: Restart the gateway after confirming no other process owns the session + +## Limits + +- **500 characters** per message (auto-chunked at word boundaries) +- Markdown is stripped before chunking +- No rate limiting (uses Twitch's built-in rate limits) + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/whatsapp.md b/docs/channels/whatsapp.md new file mode 100644 index 000000000..0c238bfe7 --- /dev/null +++ b/docs/channels/whatsapp.md @@ -0,0 +1,488 @@ +--- +summary: "WhatsApp channel support, access controls, delivery behavior, and operations" +read_when: + - Working on WhatsApp/web channel behavior or inbox routing +title: "WhatsApp" +--- + +# WhatsApp (Web channel) + +Status: production-ready via WhatsApp Web (Baileys). Gateway owns linked session(s). + +## Install (on demand) + +- Onboarding (`openclaw onboard`) and `openclaw channels add --channel whatsapp` + prompt to install the WhatsApp plugin the first time you select it. +- `openclaw channels login --channel whatsapp` also offers the install flow when + the plugin is not present yet. +- Dev channel + git checkout: defaults to the local plugin path. +- Stable/Beta: defaults to the npm package `@openclaw/whatsapp`. + +Manual install stays available: + +```bash +openclaw plugins install @openclaw/whatsapp +``` + + + + Default DM policy is pairing for unknown senders. + + + Cross-channel diagnostics and repair playbooks. + + + Full channel config patterns and examples. + + + +## Quick setup + + + + +```json5 +{ + channels: { + whatsapp: { + dmPolicy: "pairing", + allowFrom: ["+15551234567"], + groupPolicy: "allowlist", + groupAllowFrom: ["+15551234567"], + }, + }, +} +``` + + + + + +```bash +openclaw channels login --channel whatsapp +``` + + For a specific account: + +```bash +openclaw channels login --channel whatsapp --account work +``` + + + + + +```bash +openclaw gateway +``` + + + + + +```bash +openclaw pairing list whatsapp +openclaw pairing approve whatsapp +``` + + Pairing requests expire after 1 hour. Pending requests are capped at 3 per channel. + + + + + +OpenClaw recommends running WhatsApp on a separate number when possible. (The channel metadata and setup flow are optimized for that setup, but personal-number setups are also supported.) + + +## Deployment patterns + + + + This is the cleanest operational mode: + + - separate WhatsApp identity for OpenClaw + - clearer DM allowlists and routing boundaries + - lower chance of self-chat confusion + + Minimal policy pattern: + + ```json5 + { + channels: { + whatsapp: { + dmPolicy: "allowlist", + allowFrom: ["+15551234567"], + }, + }, + } + ``` + + + + + Onboarding supports personal-number mode and writes a self-chat-friendly baseline: + + - `dmPolicy: "allowlist"` + - `allowFrom` includes your personal number + - `selfChatMode: true` + + In runtime, self-chat protections key off the linked self number and `allowFrom`. + + + + + The messaging platform channel is WhatsApp Web-based (`Baileys`) in current OpenClaw channel architecture. + + There is no separate Twilio WhatsApp messaging channel in the built-in chat-channel registry. + + + + +## Runtime model + +- Gateway owns the WhatsApp socket and reconnect loop. +- Outbound sends require an active WhatsApp listener for the target account. +- Status and broadcast chats are ignored (`@status`, `@broadcast`). +- Direct chats use DM session rules (`session.dmScope`; default `main` collapses DMs to the agent main session). +- Group sessions are isolated (`agent::whatsapp:group:`). + +## Access control and activation + + + + `channels.whatsapp.dmPolicy` controls direct chat access: + + - `pairing` (default) + - `allowlist` + - `open` (requires `allowFrom` to include `"*"`) + - `disabled` + + `allowFrom` accepts E.164-style numbers (normalized internally). + + Multi-account override: `channels.whatsapp.accounts..dmPolicy` (and `allowFrom`) take precedence over channel-level defaults for that account. + + Runtime behavior details: + + - pairings are persisted in channel allow-store and merged with configured `allowFrom` + - if no allowlist is configured, the linked self number is allowed by default + - outbound `fromMe` DMs are never auto-paired + + + + + Group access has two layers: + + 1. **Group membership allowlist** (`channels.whatsapp.groups`) + - if `groups` is omitted, all groups are eligible + - if `groups` is present, it acts as a group allowlist (`"*"` allowed) + + 2. **Group sender policy** (`channels.whatsapp.groupPolicy` + `groupAllowFrom`) + - `open`: sender allowlist bypassed + - `allowlist`: sender must match `groupAllowFrom` (or `*`) + - `disabled`: block all group inbound + + Sender allowlist fallback: + + - if `groupAllowFrom` is unset, runtime falls back to `allowFrom` when available + - sender allowlists are evaluated before mention/reply activation + + Note: if no `channels.whatsapp` block exists at all, runtime group-policy fallback is `allowlist` (with a warning log), even if `channels.defaults.groupPolicy` is set. + + + + + Group replies require mention by default. + + Mention detection includes: + + - explicit WhatsApp mentions of the bot identity + - configured mention regex patterns (`agents.list[].groupChat.mentionPatterns`, fallback `messages.groupChat.mentionPatterns`) + - implicit reply-to-bot detection (reply sender matches bot identity) + + Security note: + + - quote/reply only satisfies mention gating; it does **not** grant sender authorization + - with `groupPolicy: "allowlist"`, non-allowlisted senders are still blocked even if they reply to an allowlisted user's message + + Session-level activation command: + + - `/activation mention` + - `/activation always` + + `activation` updates session state (not global config). It is owner-gated. + + + + +## Personal-number and self-chat behavior + +When the linked self number is also present in `allowFrom`, WhatsApp self-chat safeguards activate: + +- skip read receipts for self-chat turns +- ignore mention-JID auto-trigger behavior that would otherwise ping yourself +- if `messages.responsePrefix` is unset, self-chat replies default to `[{identity.name}]` or `[openclaw]` + +## Message normalization and context + + + + Incoming WhatsApp messages are wrapped in the shared inbound envelope. + + If a quoted reply exists, context is appended in this form: + + ```text + [Replying to id:] + + [/Replying] + ``` + + Reply metadata fields are also populated when available (`ReplyToId`, `ReplyToBody`, `ReplyToSender`, sender JID/E.164). + + + + + Media-only inbound messages are normalized with placeholders such as: + + - `` + - `` + - `` + - `` + - `` + + Location and contact payloads are normalized into textual context before routing. + + + + + For groups, unprocessed messages can be buffered and injected as context when the bot is finally triggered. + + - default limit: `50` + - config: `channels.whatsapp.historyLimit` + - fallback: `messages.groupChat.historyLimit` + - `0` disables + + Injection markers: + + - `[Chat messages since your last reply - for context]` + - `[Current message - respond to this]` + + + + + Read receipts are enabled by default for accepted inbound WhatsApp messages. + + Disable globally: + + ```json5 + { + channels: { + whatsapp: { + sendReadReceipts: false, + }, + }, + } + ``` + + Per-account override: + + ```json5 + { + channels: { + whatsapp: { + accounts: { + work: { + sendReadReceipts: false, + }, + }, + }, + }, + } + ``` + + Self-chat turns skip read receipts even when globally enabled. + + + + +## Delivery, chunking, and media + + + + - default chunk limit: `channels.whatsapp.textChunkLimit = 4000` + - `channels.whatsapp.chunkMode = "length" | "newline"` + - `newline` mode prefers paragraph boundaries (blank lines), then falls back to length-safe chunking + + + + - supports image, video, audio (PTT voice-note), and document payloads + - `audio/ogg` is rewritten to `audio/ogg; codecs=opus` for voice-note compatibility + - animated GIF playback is supported via `gifPlayback: true` on video sends + - captions are applied to the first media item when sending multi-media reply payloads + - media source can be HTTP(S), `file://`, or local paths + + + + - inbound media save cap: `channels.whatsapp.mediaMaxMb` (default `50`) + - outbound media send cap: `channels.whatsapp.mediaMaxMb` (default `50`) + - per-account overrides use `channels.whatsapp.accounts..mediaMaxMb` + - images are auto-optimized (resize/quality sweep) to fit limits + - on media send failure, first-item fallback sends text warning instead of dropping the response silently + + + +## Reaction level + +`channels.whatsapp.reactionLevel` controls how broadly the agent uses emoji reactions on WhatsApp: + +| Level | Ack reactions | Agent-initiated reactions | Description | +| ------------- | ------------- | ------------------------- | ------------------------------------------------ | +| `"off"` | No | No | No reactions at all | +| `"ack"` | Yes | No | Ack reactions only (pre-reply receipt) | +| `"minimal"` | Yes | Yes (conservative) | Ack + agent reactions with conservative guidance | +| `"extensive"` | Yes | Yes (encouraged) | Ack + agent reactions with encouraged guidance | + +Default: `"minimal"`. + +Per-account overrides use `channels.whatsapp.accounts..reactionLevel`. + +```json5 +{ + channels: { + whatsapp: { + reactionLevel: "ack", + }, + }, +} +``` + +## Acknowledgment reactions + +WhatsApp supports immediate ack reactions on inbound receipt via `channels.whatsapp.ackReaction`. +Ack reactions are gated by `reactionLevel` — they are suppressed when `reactionLevel` is `"off"`. + +```json5 +{ + channels: { + whatsapp: { + ackReaction: { + emoji: "👀", + direct: true, + group: "mentions", // always | mentions | never + }, + }, + }, +} +``` + +Behavior notes: + +- sent immediately after inbound is accepted (pre-reply) +- failures are logged but do not block normal reply delivery +- group mode `mentions` reacts on mention-triggered turns; group activation `always` acts as bypass for this check +- WhatsApp uses `channels.whatsapp.ackReaction` (legacy `messages.ackReaction` is not used here) + +## Multi-account and credentials + + + + - account ids come from `channels.whatsapp.accounts` + - default account selection: `default` if present, otherwise first configured account id (sorted) + - account ids are normalized internally for lookup + + + + - current auth path: `~/.openclaw/credentials/whatsapp//creds.json` + - backup file: `creds.json.bak` + - legacy default auth in `~/.openclaw/credentials/` is still recognized/migrated for default-account flows + + + + `openclaw channels logout --channel whatsapp [--account ]` clears WhatsApp auth state for that account. + + In legacy auth directories, `oauth.json` is preserved while Baileys auth files are removed. + + + + +## Tools, actions, and config writes + +- Agent tool support includes WhatsApp reaction action (`react`). +- Action gates: + - `channels.whatsapp.actions.reactions` + - `channels.whatsapp.actions.polls` +- Channel-initiated config writes are enabled by default (disable via `channels.whatsapp.configWrites=false`). + +## Troubleshooting + + + + Symptom: channel status reports not linked. + + Fix: + + ```bash + openclaw channels login --channel whatsapp + openclaw channels status + ``` + + + + + Symptom: linked account with repeated disconnects or reconnect attempts. + + Fix: + + ```bash + openclaw doctor + openclaw logs --follow + ``` + + If needed, re-link with `channels login`. + + + + + Outbound sends fail fast when no active gateway listener exists for the target account. + + Make sure gateway is running and the account is linked. + + + + + Check in this order: + + - `groupPolicy` + - `groupAllowFrom` / `allowFrom` + - `groups` allowlist entries + - mention gating (`requireMention` + mention patterns) + - duplicate keys in `openclaw.json` (JSON5): later entries override earlier ones, so keep a single `groupPolicy` per scope + + + + + WhatsApp gateway runtime should use Node. Bun is flagged as incompatible for stable WhatsApp/Telegram gateway operation. + + + +## Configuration reference pointers + +Primary reference: + +- [Configuration reference - WhatsApp](/gateway/configuration-reference#whatsapp) + +High-signal WhatsApp fields: + +- access: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups` +- delivery: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `sendReadReceipts`, `ackReaction`, `reactionLevel` +- multi-account: `accounts..enabled`, `accounts..authDir`, account-level overrides +- operations: `configWrites`, `debounceMs`, `web.enabled`, `web.heartbeatSeconds`, `web.reconnect.*` +- session behavior: `session.dmScope`, `historyLimit`, `dmHistoryLimit`, `dms..historyLimit` + +## Related + +- [Pairing](/channels/pairing) +- [Groups](/channels/groups) +- [Security](/gateway/security) +- [Channel routing](/channels/channel-routing) +- [Multi-agent routing](/concepts/multi-agent) +- [Troubleshooting](/channels/troubleshooting) diff --git a/docs/channels/zalo.md b/docs/channels/zalo.md new file mode 100644 index 000000000..a64355290 --- /dev/null +++ b/docs/channels/zalo.md @@ -0,0 +1,254 @@ +--- +summary: "Zalo bot support status, capabilities, and configuration" +read_when: + - Working on Zalo features or webhooks +title: "Zalo" +--- + +# Zalo (Bot API) + +Status: experimental. DMs are supported. The [Capabilities](#capabilities) section below reflects current Marketplace-bot behavior. + +## Bundled plugin + +Zalo ships as a bundled plugin in current OpenClaw releases, so normal packaged +builds do not need a separate install. + +If you are on an older build or a custom install that excludes Zalo, install it +manually: + +- Install via CLI: `openclaw plugins install @openclaw/zalo` +- Or from a source checkout: `openclaw plugins install ./path/to/local/zalo-plugin` +- Details: [Plugins](/tools/plugin) + +## Quick setup (beginner) + +1. Ensure the Zalo plugin is available. + - Current packaged OpenClaw releases already bundle it. + - Older/custom installs can add it manually with the commands above. +2. Set the token: + - Env: `ZALO_BOT_TOKEN=...` + - Or config: `channels.zalo.accounts.default.botToken: "..."`. +3. Restart the gateway (or finish setup). +4. DM access is pairing by default; approve the pairing code on first contact. + +Minimal config: + +```json5 +{ + channels: { + zalo: { + enabled: true, + accounts: { + default: { + botToken: "12345689:abc-xyz", + dmPolicy: "pairing", + }, + }, + }, + }, +} +``` + +## What it is + +Zalo is a Vietnam-focused messaging app; its Bot API lets the Gateway run a bot for 1:1 conversations. +It is a good fit for support or notifications where you want deterministic routing back to Zalo. + +This page reflects current OpenClaw behavior for **Zalo Bot Creator / Marketplace bots**. +**Zalo Official Account (OA) bots** are a different Zalo product surface and may behave differently. + +- A Zalo Bot API channel owned by the Gateway. +- Deterministic routing: replies go back to Zalo; the model never chooses channels. +- DMs share the agent's main session. +- The [Capabilities](#capabilities) section below shows current Marketplace-bot support. + +## Setup (fast path) + +### 1) Create a bot token (Zalo Bot Platform) + +1. Go to [https://bot.zaloplatforms.com](https://bot.zaloplatforms.com) and sign in. +2. Create a new bot and configure its settings. +3. Copy the full bot token (typically `numeric_id:secret`). For Marketplace bots, the usable runtime token may appear in the bot's welcome message after creation. + +### 2) Configure the token (env or config) + +Example: + +```json5 +{ + channels: { + zalo: { + enabled: true, + accounts: { + default: { + botToken: "12345689:abc-xyz", + dmPolicy: "pairing", + }, + }, + }, + }, +} +``` + +If you later move to a Zalo bot surface where groups are available, you can add group-specific config such as `groupPolicy` and `groupAllowFrom` explicitly. For current Marketplace-bot behavior, see [Capabilities](#capabilities). + +Env option: `ZALO_BOT_TOKEN=...` (works for the default account only). + +Multi-account support: use `channels.zalo.accounts` with per-account tokens and optional `name`. + +3. Restart the gateway. Zalo starts when a token is resolved (env or config). +4. DM access defaults to pairing. Approve the code when the bot is first contacted. + +## How it works (behavior) + +- Inbound messages are normalized into the shared channel envelope with media placeholders. +- Replies always route back to the same Zalo chat. +- Long-polling by default; webhook mode available with `channels.zalo.webhookUrl`. + +## Limits + +- Outbound text is chunked to 2000 characters (Zalo API limit). +- Media downloads/uploads are capped by `channels.zalo.mediaMaxMb` (default 5). +- Streaming is blocked by default due to the 2000 char limit making streaming less useful. + +## Access control (DMs) + +### DM access + +- Default: `channels.zalo.dmPolicy = "pairing"`. Unknown senders receive a pairing code; messages are ignored until approved (codes expire after 1 hour). +- Approve via: + - `openclaw pairing list zalo` + - `openclaw pairing approve zalo ` +- Pairing is the default token exchange. Details: [Pairing](/channels/pairing) +- `channels.zalo.allowFrom` accepts numeric user IDs (no username lookup available). + +## Access control (Groups) + +For **Zalo Bot Creator / Marketplace bots**, group support was not available in practice because the bot could not be added to a group at all. + +That means the group-related config keys below exist in the schema, but were not usable for Marketplace bots: + +- `channels.zalo.groupPolicy` controls group inbound handling: `open | allowlist | disabled`. +- `channels.zalo.groupAllowFrom` restricts which sender IDs can trigger the bot in groups. +- If `groupAllowFrom` is unset, Zalo falls back to `allowFrom` for sender checks. +- Runtime note: if `channels.zalo` is missing entirely, runtime still falls back to `groupPolicy="allowlist"` for safety. + +The group policy values (when group access is available on your bot surface) are: + +- `groupPolicy: "disabled"` — blocks all group messages. +- `groupPolicy: "open"` — allows any group member (mention-gated). +- `groupPolicy: "allowlist"` — fail-closed default; only allowed senders are accepted. + +If you are using a different Zalo bot product surface and have verified working group behavior, document that separately rather than assuming it matches the Marketplace-bot flow. + +## Long-polling vs webhook + +- Default: long-polling (no public URL required). +- Webhook mode: set `channels.zalo.webhookUrl` and `channels.zalo.webhookSecret`. + - The webhook secret must be 8-256 characters. + - Webhook URL must use HTTPS. + - Zalo sends events with `X-Bot-Api-Secret-Token` header for verification. + - Gateway HTTP handles webhook requests at `channels.zalo.webhookPath` (defaults to the webhook URL path). + - Requests must use `Content-Type: application/json` (or `+json` media types). + - Duplicate events (`event_name + message_id`) are ignored for a short replay window. + - Burst traffic is rate-limited per path/source and may return HTTP 429. + +**Note:** getUpdates (polling) and webhook are mutually exclusive per Zalo API docs. + +## Supported message types + +For a quick support snapshot, see [Capabilities](#capabilities). The notes below add detail where the behavior needs extra context. + +- **Text messages**: Full support with 2000 character chunking. +- **Plain URLs in text**: Behave like normal text input. +- **Link previews / rich link cards**: See the Marketplace-bot status in [Capabilities](#capabilities); they did not reliably trigger a reply. +- **Image messages**: See the Marketplace-bot status in [Capabilities](#capabilities); inbound image handling was unreliable (typing indicator without a final reply). +- **Stickers**: See the Marketplace-bot status in [Capabilities](#capabilities). +- **Voice notes / audio files / video / generic file attachments**: See the Marketplace-bot status in [Capabilities](#capabilities). +- **Unsupported types**: Logged (for example, messages from protected users). + +## Capabilities + +This table summarizes current **Zalo Bot Creator / Marketplace bot** behavior in OpenClaw. + +| Feature | Status | +| --------------------------- | --------------------------------------- | +| Direct messages | ✅ Supported | +| Groups | ❌ Not available for Marketplace bots | +| Media (inbound images) | ⚠️ Limited / verify in your environment | +| Media (outbound images) | ⚠️ Not re-tested for Marketplace bots | +| Plain URLs in text | ✅ Supported | +| Link previews | ⚠️ Unreliable for Marketplace bots | +| Reactions | ❌ Not supported | +| Stickers | ⚠️ No agent reply for Marketplace bots | +| Voice notes / audio / video | ⚠️ No agent reply for Marketplace bots | +| File attachments | ⚠️ No agent reply for Marketplace bots | +| Threads | ❌ Not supported | +| Polls | ❌ Not supported | +| Native commands | ❌ Not supported | +| Streaming | ⚠️ Blocked (2000 char limit) | + +## Delivery targets (CLI/cron) + +- Use a chat id as the target. +- Example: `openclaw message send --channel zalo --target 123456789 --message "hi"`. + +## Troubleshooting + +**Bot doesn't respond:** + +- Check that the token is valid: `openclaw channels status --probe` +- Verify the sender is approved (pairing or allowFrom) +- Check gateway logs: `openclaw logs --follow` + +**Webhook not receiving events:** + +- Ensure webhook URL uses HTTPS +- Verify secret token is 8-256 characters +- Confirm the gateway HTTP endpoint is reachable on the configured path +- Check that getUpdates polling is not running (they're mutually exclusive) + +## Configuration reference (Zalo) + +Full configuration: [Configuration](/gateway/configuration) + +The flat top-level keys (`channels.zalo.botToken`, `channels.zalo.dmPolicy`, and similar) are a legacy single-account shorthand. Prefer `channels.zalo.accounts..*` for new configs. Both forms are still documented here because they exist in the schema. + +Provider options: + +- `channels.zalo.enabled`: enable/disable channel startup. +- `channels.zalo.botToken`: bot token from Zalo Bot Platform. +- `channels.zalo.tokenFile`: read token from a regular file path. Symlinks are rejected. +- `channels.zalo.dmPolicy`: `pairing | allowlist | open | disabled` (default: pairing). +- `channels.zalo.allowFrom`: DM allowlist (user IDs). `open` requires `"*"`. The wizard will ask for numeric IDs. +- `channels.zalo.groupPolicy`: `open | allowlist | disabled` (default: allowlist). Present in config; see [Capabilities](#capabilities) and [Access control (Groups)](#access-control-groups) for current Marketplace-bot behavior. +- `channels.zalo.groupAllowFrom`: group sender allowlist (user IDs). Falls back to `allowFrom` when unset. +- `channels.zalo.mediaMaxMb`: inbound/outbound media cap (MB, default 5). +- `channels.zalo.webhookUrl`: enable webhook mode (HTTPS required). +- `channels.zalo.webhookSecret`: webhook secret (8-256 chars). +- `channels.zalo.webhookPath`: webhook path on the gateway HTTP server. +- `channels.zalo.proxy`: proxy URL for API requests. + +Multi-account options: + +- `channels.zalo.accounts..botToken`: per-account token. +- `channels.zalo.accounts..tokenFile`: per-account regular token file. Symlinks are rejected. +- `channels.zalo.accounts..name`: display name. +- `channels.zalo.accounts..enabled`: enable/disable account. +- `channels.zalo.accounts..dmPolicy`: per-account DM policy. +- `channels.zalo.accounts..allowFrom`: per-account allowlist. +- `channels.zalo.accounts..groupPolicy`: per-account group policy. Present in config; see [Capabilities](#capabilities) and [Access control (Groups)](#access-control-groups) for current Marketplace-bot behavior. +- `channels.zalo.accounts..groupAllowFrom`: per-account group sender allowlist. +- `channels.zalo.accounts..webhookUrl`: per-account webhook URL. +- `channels.zalo.accounts..webhookSecret`: per-account webhook secret. +- `channels.zalo.accounts..webhookPath`: per-account webhook path. +- `channels.zalo.accounts..proxy`: per-account proxy URL. + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/channels/zalouser.md b/docs/channels/zalouser.md new file mode 100644 index 000000000..9ef4a99a1 --- /dev/null +++ b/docs/channels/zalouser.md @@ -0,0 +1,195 @@ +--- +summary: "Zalo personal account support via native zca-js (QR login), capabilities, and configuration" +read_when: + - Setting up Zalo Personal for OpenClaw + - Debugging Zalo Personal login or message flow +title: "Zalo Personal" +--- + +# Zalo Personal (unofficial) + +Status: experimental. This integration automates a **personal Zalo account** via native `zca-js` inside OpenClaw. + +> **Warning:** This is an unofficial integration and may result in account suspension/ban. Use at your own risk. + +## Bundled plugin + +Zalo Personal ships as a bundled plugin in current OpenClaw releases, so normal +packaged builds do not need a separate install. + +If you are on an older build or a custom install that excludes Zalo Personal, +install it manually: + +- Install via CLI: `openclaw plugins install @openclaw/zalouser` +- Or from a source checkout: `openclaw plugins install ./path/to/local/zalouser-plugin` +- Details: [Plugins](/tools/plugin) + +No external `zca`/`openzca` CLI binary is required. + +## Quick setup (beginner) + +1. Ensure the Zalo Personal plugin is available. + - Current packaged OpenClaw releases already bundle it. + - Older/custom installs can add it manually with the commands above. +2. Login (QR, on the Gateway machine): + - `openclaw channels login --channel zalouser` + - Scan the QR code with the Zalo mobile app. +3. Enable the channel: + +```json5 +{ + channels: { + zalouser: { + enabled: true, + dmPolicy: "pairing", + }, + }, +} +``` + +4. Restart the Gateway (or finish setup). +5. DM access defaults to pairing; approve the pairing code on first contact. + +## What it is + +- Runs entirely in-process via `zca-js`. +- Uses native event listeners to receive inbound messages. +- Sends replies directly through the JS API (text/media/link). +- Designed for “personal account” use cases where Zalo Bot API is not available. + +## Naming + +Channel id is `zalouser` to make it explicit this automates a **personal Zalo user account** (unofficial). We keep `zalo` reserved for a potential future official Zalo API integration. + +## Finding IDs (directory) + +Use the directory CLI to discover peers/groups and their IDs: + +```bash +openclaw directory self --channel zalouser +openclaw directory peers list --channel zalouser --query "name" +openclaw directory groups list --channel zalouser --query "work" +``` + +## Limits + +- Outbound text is chunked to ~2000 characters (Zalo client limits). +- Streaming is blocked by default. + +## Access control (DMs) + +`channels.zalouser.dmPolicy` supports: `pairing | allowlist | open | disabled` (default: `pairing`). + +`channels.zalouser.allowFrom` accepts user IDs or names. During setup, names are resolved to IDs using the plugin's in-process contact lookup. + +Approve via: + +- `openclaw pairing list zalouser` +- `openclaw pairing approve zalouser ` + +## Group access (optional) + +- Default: `channels.zalouser.groupPolicy = "open"` (groups allowed). Use `channels.defaults.groupPolicy` to override the default when unset. +- Restrict to an allowlist with: + - `channels.zalouser.groupPolicy = "allowlist"` + - `channels.zalouser.groups` (keys should be stable group IDs; names are resolved to IDs on startup when possible) + - `channels.zalouser.groupAllowFrom` (controls which senders in allowed groups can trigger the bot) +- Block all groups: `channels.zalouser.groupPolicy = "disabled"`. +- The configure wizard can prompt for group allowlists. +- On startup, OpenClaw resolves group/user names in allowlists to IDs and logs the mapping. +- Group allowlist matching is ID-only by default. Unresolved names are ignored for auth unless `channels.zalouser.dangerouslyAllowNameMatching: true` is enabled. +- `channels.zalouser.dangerouslyAllowNameMatching: true` is a break-glass compatibility mode that re-enables mutable group-name matching. +- If `groupAllowFrom` is unset, runtime falls back to `allowFrom` for group sender checks. +- Sender checks apply to both normal group messages and control commands (for example `/new`, `/reset`). + +Example: + +```json5 +{ + channels: { + zalouser: { + groupPolicy: "allowlist", + groupAllowFrom: ["1471383327500481391"], + groups: { + "123456789": { allow: true }, + "Work Chat": { allow: true }, + }, + }, + }, +} +``` + +### Group mention gating + +- `channels.zalouser.groups..requireMention` controls whether group replies require a mention. +- Resolution order: exact group id/name -> normalized group slug -> `*` -> default (`true`). +- This applies both to allowlisted groups and open group mode. +- Authorized control commands (for example `/new`) can bypass mention gating. +- When a group message is skipped because mention is required, OpenClaw stores it as pending group history and includes it on the next processed group message. +- Group history limit defaults to `messages.groupChat.historyLimit` (fallback `50`). You can override per account with `channels.zalouser.historyLimit`. + +Example: + +```json5 +{ + channels: { + zalouser: { + groupPolicy: "allowlist", + groups: { + "*": { allow: true, requireMention: true }, + "Work Chat": { allow: true, requireMention: false }, + }, + }, + }, +} +``` + +## Multi-account + +Accounts map to `zalouser` profiles in OpenClaw state. Example: + +```json5 +{ + channels: { + zalouser: { + enabled: true, + defaultAccount: "default", + accounts: { + work: { enabled: true, profile: "work" }, + }, + }, + }, +} +``` + +## Typing, reactions, and delivery acknowledgements + +- OpenClaw sends a typing event before dispatching a reply (best-effort). +- Message reaction action `react` is supported for `zalouser` in channel actions. + - Use `remove: true` to remove a specific reaction emoji from a message. + - Reaction semantics: [Reactions](/tools/reactions) +- For inbound messages that include event metadata, OpenClaw sends delivered + seen acknowledgements (best-effort). + +## Troubleshooting + +**Login doesn't stick:** + +- `openclaw channels status --probe` +- Re-login: `openclaw channels logout --channel zalouser && openclaw channels login --channel zalouser` + +**Allowlist/group name didn't resolve:** + +- Use numeric IDs in `allowFrom`/`groupAllowFrom`/`groups`, or exact friend/group names. + +**Upgraded from old CLI-based setup:** + +- Remove any old external `zca` process assumptions. +- The channel now runs fully in OpenClaw without external CLI binaries. + +## Related + +- [Channels Overview](/channels) — all supported channels +- [Pairing](/channels/pairing) — DM authentication and pairing flow +- [Groups](/channels/groups) — group chat behavior and mention gating +- [Channel Routing](/channels/channel-routing) — session routing for messages +- [Security](/gateway/security) — access model and hardening diff --git a/docs/ci.md b/docs/ci.md new file mode 100644 index 000000000..7f9925770 --- /dev/null +++ b/docs/ci.md @@ -0,0 +1,66 @@ +--- +title: CI Pipeline +summary: "CI job graph, scope gates, and local command equivalents" +read_when: + - You need to understand why a CI job did or did not run + - You are debugging failing GitHub Actions checks +--- + +# CI Pipeline + +The CI runs on every push to `main` and every pull request. It uses smart scoping to skip expensive jobs when only unrelated areas changed. + +## Job Overview + +| Job | Purpose | When it runs | +| ------------------------ | ---------------------------------------------------------------------------------------- | ----------------------------------- | +| `preflight` | Detect docs-only changes, changed scopes, changed extensions, and build the CI manifest | Always on non-draft pushes and PRs | +| `security-fast` | Private key detection, workflow audit via `zizmor`, production dependency audit | Always on non-draft pushes and PRs | +| `build-artifacts` | Build `dist/` and the Control UI once, upload reusable artifacts for downstream jobs | Node-relevant changes | +| `checks-fast-core` | Fast Linux correctness lanes such as bundled/plugin-contract/protocol checks | Node-relevant changes | +| `checks-fast-extensions` | Aggregate the extension shard lanes after `checks-fast-extensions-shard` completes | Node-relevant changes | +| `extension-fast` | Focused tests for only the changed bundled plugins | When extension changes are detected | +| `check` | Main local gate in CI: `pnpm check` plus `pnpm build:strict-smoke` | Node-relevant changes | +| `check-additional` | Architecture and boundary guards plus the gateway watch regression harness | Node-relevant changes | +| `build-smoke` | Built-CLI smoke tests and startup-memory smoke | Node-relevant changes | +| `checks` | Heavier Linux Node lanes: full tests, channel tests, and push-only Node 22 compatibility | Node-relevant changes | +| `check-docs` | Docs formatting, lint, and broken-link checks | Docs changed | +| `skills-python` | Ruff + pytest for Python-backed skills | Python-skill-relevant changes | +| `checks-windows` | Windows-specific test lanes | Windows-relevant changes | +| `macos-node` | macOS TypeScript test lane using the shared built artifacts | macOS-relevant changes | +| `macos-swift` | Swift lint, build, and tests for the macOS app | macOS-relevant changes | +| `android` | Android build and test matrix | Android-relevant changes | + +## Fail-Fast Order + +Jobs are ordered so cheap checks fail before expensive ones run: + +1. `preflight` decides which lanes exist at all. The `docs-scope` and `changed-scope` logic are steps inside this job, not standalone jobs. +2. `security-fast`, `check`, `check-additional`, `check-docs`, and `skills-python` fail quickly without waiting on the heavier artifact and platform matrix jobs. +3. `build-artifacts` overlaps with the fast Linux lanes so downstream consumers can start as soon as the shared build is ready. +4. Heavier platform and runtime lanes fan out after that: `checks-fast-core`, `checks-fast-extensions`, `extension-fast`, `checks`, `checks-windows`, `macos-node`, `macos-swift`, and `android`. + +Scope logic lives in `scripts/ci-changed-scope.mjs` and is covered by unit tests in `src/scripts/ci-changed-scope.test.ts`. +The separate `install-smoke` workflow reuses the same scope script through its own `preflight` job. It computes `run_install_smoke` from the narrower changed-smoke signal, so Docker/install smoke only runs for install, packaging, and container-relevant changes. + +On pushes, the `checks` matrix adds the push-only `compat-node22` lane. On pull requests, that lane is skipped and the matrix stays focused on the normal test/channel lanes. + +## Runners + +| Runner | Jobs | +| -------------------------------- | ---------------------------------------------------------------------------------------------------- | +| `blacksmith-16vcpu-ubuntu-2404` | `preflight`, `security-fast`, `build-artifacts`, Linux checks, docs checks, Python skills, `android` | +| `blacksmith-32vcpu-windows-2025` | `checks-windows` | +| `macos-latest` | `macos-node`, `macos-swift` | + +## Local Equivalents + +```bash +pnpm check # types + lint + format +pnpm build:strict-smoke +pnpm test:gateway:watch-regression +pnpm test # vitest tests +pnpm test:channels +pnpm check:docs # docs format + lint + broken links +pnpm build # build dist when CI artifact/build-smoke lanes matter +``` diff --git a/docs/cli/acp.md b/docs/cli/acp.md new file mode 100644 index 000000000..8b754417d --- /dev/null +++ b/docs/cli/acp.md @@ -0,0 +1,316 @@ +--- +summary: "Run the ACP bridge for IDE integrations" +read_when: + - Setting up ACP-based IDE integrations + - Debugging ACP session routing to the Gateway +title: "acp" +--- + +# acp + +Run the [Agent Client Protocol (ACP)](https://agentclientprotocol.com/) bridge that talks to an OpenClaw Gateway. + +This command speaks ACP over stdio for IDEs and forwards prompts to the Gateway +over WebSocket. It keeps ACP sessions mapped to Gateway session keys. + +`openclaw acp` is a Gateway-backed ACP bridge, not a full ACP-native editor +runtime. It focuses on session routing, prompt delivery, and basic streaming +updates. + +If you want an external MCP client to talk directly to OpenClaw channel +conversations instead of hosting an ACP harness session, use +[`openclaw mcp serve`](/cli/mcp) instead. + +## What this is not + +This page is often confused with ACP harness sessions. + +`openclaw acp` means: + +- OpenClaw acts as an ACP server +- an IDE or ACP client connects to OpenClaw +- OpenClaw forwards that work into a Gateway session + +This is different from [ACP Agents](/tools/acp-agents), where OpenClaw runs an +external harness such as Codex or Claude Code through `acpx`. + +Quick rule: + +- editor/client wants to talk ACP to OpenClaw: use `openclaw acp` +- OpenClaw should launch Codex/Claude/Gemini as an ACP harness: use `/acp spawn` and [ACP Agents](/tools/acp-agents) + +## Compatibility Matrix + +| ACP area | Status | Notes | +| --------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `initialize`, `newSession`, `prompt`, `cancel` | Implemented | Core bridge flow over stdio to Gateway chat/send + abort. | +| `listSessions`, slash commands | Implemented | Session list works against Gateway session state; commands are advertised via `available_commands_update`. | +| `loadSession` | Partial | Rebinds the ACP session to a Gateway session key and replays stored user/assistant text history. Tool/system history is not reconstructed yet. | +| Prompt content (`text`, embedded `resource`, images) | Partial | Text/resources are flattened into chat input; images become Gateway attachments. | +| Session modes | Partial | `session/set_mode` is supported and the bridge exposes initial Gateway-backed session controls for thought level, tool verbosity, reasoning, usage detail, and elevated actions. Broader ACP-native mode/config surfaces are still out of scope. | +| Session info and usage updates | Partial | The bridge emits `session_info_update` and best-effort `usage_update` notifications from cached Gateway session snapshots. Usage is approximate and only sent when Gateway token totals are marked fresh. | +| Tool streaming | Partial | `tool_call` / `tool_call_update` events include raw I/O, text content, and best-effort file locations when Gateway tool args/results expose them. Embedded terminals and richer diff-native output are still not exposed. | +| Per-session MCP servers (`mcpServers`) | Unsupported | Bridge mode rejects per-session MCP server requests. Configure MCP on the OpenClaw gateway or agent instead. | +| Client filesystem methods (`fs/read_text_file`, `fs/write_text_file`) | Unsupported | The bridge does not call ACP client filesystem methods. | +| Client terminal methods (`terminal/*`) | Unsupported | The bridge does not create ACP client terminals or stream terminal ids through tool calls. | +| Session plans / thought streaming | Unsupported | The bridge currently emits output text and tool status, not ACP plan or thought updates. | + +## Known Limitations + +- `loadSession` replays stored user and assistant text history, but it does not + reconstruct historic tool calls, system notices, or richer ACP-native event + types. +- If multiple ACP clients share the same Gateway session key, event and cancel + routing are best-effort rather than strictly isolated per client. Prefer the + default isolated `acp:` sessions when you need clean editor-local + turns. +- Gateway stop states are translated into ACP stop reasons, but that mapping is + less expressive than a fully ACP-native runtime. +- Initial session controls currently surface a focused subset of Gateway knobs: + thought level, tool verbosity, reasoning, usage detail, and elevated + actions. Model selection and exec-host controls are not yet exposed as ACP + config options. +- `session_info_update` and `usage_update` are derived from Gateway session + snapshots, not live ACP-native runtime accounting. Usage is approximate, + carries no cost data, and is only emitted when the Gateway marks total token + data as fresh. +- Tool follow-along data is best-effort. The bridge can surface file paths that + appear in known tool args/results, but it does not yet emit ACP terminals or + structured file diffs. + +## Usage + +```bash +openclaw acp + +# Remote Gateway +openclaw acp --url wss://gateway-host:18789 --token + +# Remote Gateway (token from file) +openclaw acp --url wss://gateway-host:18789 --token-file ~/.openclaw/gateway.token + +# Attach to an existing session key +openclaw acp --session agent:main:main + +# Attach by label (must already exist) +openclaw acp --session-label "support inbox" + +# Reset the session key before the first prompt +openclaw acp --session agent:main:main --reset-session +``` + +## ACP client (debug) + +Use the built-in ACP client to sanity-check the bridge without an IDE. +It spawns the ACP bridge and lets you type prompts interactively. + +```bash +openclaw acp client + +# Point the spawned bridge at a remote Gateway +openclaw acp client --server-args --url wss://gateway-host:18789 --token-file ~/.openclaw/gateway.token + +# Override the server command (default: openclaw) +openclaw acp client --server "node" --server-args openclaw.mjs acp --url ws://127.0.0.1:19001 +``` + +Permission model (client debug mode): + +- Auto-approval is allowlist-based and only applies to trusted core tool IDs. +- `read` auto-approval is scoped to the current working directory (`--cwd` when set). +- ACP only auto-approves narrow readonly classes: scoped `read` calls under the active cwd plus readonly search tools (`search`, `web_search`, `memory_search`). Unknown/non-core tools, out-of-scope reads, exec-capable tools, control-plane tools, mutating tools, and interactive flows always require explicit prompt approval. +- Server-provided `toolCall.kind` is treated as untrusted metadata (not an authorization source). +- This ACP bridge policy is separate from ACPX harness permissions. If you run OpenClaw through the `acpx` backend, `plugins.entries.acpx.config.permissionMode=approve-all` is the break-glass “yolo” switch for that harness session. + +## How to use this + +Use ACP when an IDE (or other client) speaks Agent Client Protocol and you want +it to drive an OpenClaw Gateway session. + +1. Ensure the Gateway is running (local or remote). +2. Configure the Gateway target (config or flags). +3. Point your IDE to run `openclaw acp` over stdio. + +Example config (persisted): + +```bash +openclaw config set gateway.remote.url wss://gateway-host:18789 +openclaw config set gateway.remote.token +``` + +Example direct run (no config write): + +```bash +openclaw acp --url wss://gateway-host:18789 --token +# preferred for local process safety +openclaw acp --url wss://gateway-host:18789 --token-file ~/.openclaw/gateway.token +``` + +## Selecting agents + +ACP does not pick agents directly. It routes by the Gateway session key. + +Use agent-scoped session keys to target a specific agent: + +```bash +openclaw acp --session agent:main:main +openclaw acp --session agent:design:main +openclaw acp --session agent:qa:bug-123 +``` + +Each ACP session maps to a single Gateway session key. One agent can have many +sessions; ACP defaults to an isolated `acp:` session unless you override +the key or label. + +Per-session `mcpServers` are not supported in bridge mode. If an ACP client +sends them during `newSession` or `loadSession`, the bridge returns a clear +error instead of silently ignoring them. + +If you want ACPX-backed sessions to see OpenClaw plugin tools, enable the +gateway-side ACPX plugin bridge instead of trying to pass per-session +`mcpServers`. See [ACP Agents](/tools/acp-agents#plugin-tools-mcp-bridge). + +## Use from `acpx` (Codex, Claude, other ACP clients) + +If you want a coding agent such as Codex or Claude Code to talk to your +OpenClaw bot over ACP, use `acpx` with its built-in `openclaw` target. + +Typical flow: + +1. Run the Gateway and make sure the ACP bridge can reach it. +2. Point `acpx openclaw` at `openclaw acp`. +3. Target the OpenClaw session key you want the coding agent to use. + +Examples: + +```bash +# One-shot request into your default OpenClaw ACP session +acpx openclaw exec "Summarize the active OpenClaw session state." + +# Persistent named session for follow-up turns +acpx openclaw sessions ensure --name codex-bridge +acpx openclaw -s codex-bridge --cwd /path/to/repo \ + "Ask my OpenClaw work agent for recent context relevant to this repo." +``` + +If you want `acpx openclaw` to target a specific Gateway and session key every +time, override the `openclaw` agent command in `~/.acpx/config.json`: + +```json +{ + "agents": { + "openclaw": { + "command": "env OPENCLAW_HIDE_BANNER=1 OPENCLAW_SUPPRESS_NOTES=1 openclaw acp --url ws://127.0.0.1:18789 --token-file ~/.openclaw/gateway.token --session agent:main:main" + } + } +} +``` + +For a repo-local OpenClaw checkout, use the direct CLI entrypoint instead of the +dev runner so the ACP stream stays clean. For example: + +```bash +env OPENCLAW_HIDE_BANNER=1 OPENCLAW_SUPPRESS_NOTES=1 node openclaw.mjs acp ... +``` + +This is the easiest way to let Codex, Claude Code, or another ACP-aware client +pull contextual information from an OpenClaw agent without scraping a terminal. + +## Zed editor setup + +Add a custom ACP agent in `~/.config/zed/settings.json` (or use Zed’s Settings UI): + +```json +{ + "agent_servers": { + "OpenClaw ACP": { + "type": "custom", + "command": "openclaw", + "args": ["acp"], + "env": {} + } + } +} +``` + +To target a specific Gateway or agent: + +```json +{ + "agent_servers": { + "OpenClaw ACP": { + "type": "custom", + "command": "openclaw", + "args": [ + "acp", + "--url", + "wss://gateway-host:18789", + "--token", + "", + "--session", + "agent:design:main" + ], + "env": {} + } + } +} +``` + +In Zed, open the Agent panel and select “OpenClaw ACP” to start a thread. + +## Session mapping + +By default, ACP sessions get an isolated Gateway session key with an `acp:` prefix. +To reuse a known session, pass a session key or label: + +- `--session `: use a specific Gateway session key. +- `--session-label