diff --git a/.detect-secrets.cfg b/.detect-secrets.cfg new file mode 100644 index 0000000..3891256 --- /dev/null +++ b/.detect-secrets.cfg @@ -0,0 +1,30 @@ +# detect-secrets exclusion patterns (regex) +# +# Note: detect-secrets does not read this file by default. If you want these +# applied, wire them into your scan command (e.g. translate to --exclude-files +# / --exclude-lines) or into a baseline's filters_used. + +[exclude-files] +# pnpm lockfiles contain lots of high-entropy package integrity blobs. +pattern = (^|/)pnpm-lock\.yaml$ +# Generated output and vendored assets. +pattern = (^|/)(dist|vendor)/ +# Local config file with allowlist patterns. +pattern = (^|/)\.detect-secrets\.cfg$ + +[exclude-lines] +# Fastlane checks for private key marker; not a real key. +pattern = key_content\.include\?\("BEGIN PRIVATE KEY"\) +# UI label string for Anthropic auth mode. +pattern = case \.apiKeyEnv: "API key \(env var\)" +# CodingKeys mapping uses apiKey literal. +pattern = case apikey = "apiKey" +# Schema labels referencing password fields (not actual secrets). +pattern = "gateway\.remote\.password" +pattern = "gateway\.auth\.password" +# Schema label for talk API key (label text only). +pattern = "talk\.apiKey" +# checking for typeof is not something we care about. +pattern = === "string" +# specific optional-chaining password check that didn't match the line above. +pattern = typeof remote\?\.password === "string" diff --git a/.devcontainer.json b/.devcontainer.json index 112d011..580f423 100644 --- a/.devcontainer.json +++ b/.devcontainer.json @@ -1,7 +1,25 @@ { "name": "cortex", - "image": "mcr.microsoft.com/devcontainers/python:3", + // Pinned to 3.12 to match services/fastembed/Dockerfile (Phase 0: FastEmbed scaffold) + "image": "mcr.microsoft.com/devcontainers/python:3.12", "features": { + // Phase 0: "Verify remaining TypeScript compiles" — package.json requires node >=22.12.0 + "ghcr.io/devcontainers/features/node:1": { + "version": "22" + }, + // Phase 0 exit criteria: "docker compose up → gateway starts" + // moby:false required — python:3.12 is Debian trixie which dropped moby-cli packages + "ghcr.io/devcontainers/features/docker-in-docker:2": { + "version": "latest", + "moby": false, + "dockerDashComposeVersion": "v2" + }, + // Pre-existing; not required by Phase 0 — left unchanged "ghcr.io/rio/features/chezmoi:1": {} - } + }, + // Phase 0: package.json declares "packageManager": "pnpm@10.23.0"; + // corepack must be enabled for pnpm to resolve, then install deps. + "postCreateCommand": "corepack enable && pnpm install", + // Phase 0 exit criteria: allow testing gateway (18789) and fastembed (8000) from the devcontainer + "forwardPorts": [18789, 8000] } diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..73d00ff --- /dev/null +++ b/.dockerignore @@ -0,0 +1,60 @@ +.git +.worktrees +.bun-cache +.bun +.tmp +**/.tmp +.DS_Store +**/.DS_Store +*.png +*.jpg +*.jpeg +*.webp +*.gif +*.mp4 +*.mov +*.wav +*.mp3 +node_modules +**/node_modules +.pnpm-store +**/.pnpm-store +.turbo +**/.turbo +.cache +**/.cache +.next +**/.next +coverage +**/coverage +*.log +tmp +**/tmp + +# build artifacts +dist +**/dist +apps/macos/.build +apps/ios/build +**/*.trace + +# large app trees not needed for CLI build +apps/ +assets/ +Peekaboo/ +Swabble/ +Core/ +Users/ +vendor/ + +# Needed for building the Canvas A2UI bundle during Docker image builds. +# Keep the rest of apps/ and vendor/ excluded to avoid a large build context. +!apps/shared/ +!apps/shared/OpenClawKit/ +!apps/shared/OpenClawKit/Tools/ +!apps/shared/OpenClawKit/Tools/CanvasA2UI/ +!apps/shared/OpenClawKit/Tools/CanvasA2UI/** +!vendor/a2ui/ +!vendor/a2ui/renderers/ +!vendor/a2ui/renderers/lit/ +!vendor/a2ui/renderers/lit/** diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5eb4233 --- /dev/null +++ b/.env.example @@ -0,0 +1,82 @@ +# Cortex .env example +# +# Quick start: +# 1) Copy this file to `.env` +# 2) Fill in the required values +# 3) Keep real secrets out of git +# + +# ----------------------------------------------------------------------------- +# Gateway Configuration +# ----------------------------------------------------------------------------- +CORTEX_GATEWAY_TOKEN=change-me-to-a-long-random-token +# Example generator: openssl rand -hex 32 + +# Optional path overrides (defaults shown) +# CORTEX_CONFIG_DIR=./data/config +# CORTEX_WORKSPACE_DIR=./data/workspace + +# ----------------------------------------------------------------------------- +# Ollama Configuration (Mac Mini) +# ----------------------------------------------------------------------------- +OLLAMA_BASE_URL=http://mac-mini:11434 +# Or use Tailscale hostname/IP +# OLLAMA_BASE_URL=http://100.x.x.x:11434 + +# ----------------------------------------------------------------------------- +# Matrix Configuration +# ----------------------------------------------------------------------------- +MATRIX_HOMESERVER=https://matrix.example.com +MATRIX_USER_ID=@bot:example.com +MATRIX_ACCESS_TOKEN= + +# Optional: Matrix device ID for E2EE +# MATRIX_DEVICE_ID= + +# ----------------------------------------------------------------------------- +# FastEmbed Service +# ----------------------------------------------------------------------------- +FASTEMBED_PORT=8000 +# Internal URL for gateway (defaults to http://fastembed:8000 in compose) +# FASTEMBED_URL=http://fastembed:8000 + +# ----------------------------------------------------------------------------- +# Development +# ----------------------------------------------------------------------------- +NODE_ENV=development +# NODE_ENV=production + +# Gateway port +CORTEX_GATEWAY_PORT=18789 + + +# Optional additional providers +# ZAI_API_KEY=... +# AI_GATEWAY_API_KEY=... +# MINIMAX_API_KEY=... +# SYNTHETIC_API_KEY=... + +# ----------------------------------------------------------------------------- +# Channels (only set what you enable) +# ----------------------------------------------------------------------------- +# TELEGRAM_BOT_TOKEN=123456:ABCDEF... +# DISCORD_BOT_TOKEN=... +# SLACK_BOT_TOKEN=xoxb-... +# SLACK_APP_TOKEN=xapp-... + +# Optional channel env fallbacks +# MATTERMOST_BOT_TOKEN=... +# MATTERMOST_URL=https://chat.example.com +# ZALO_BOT_TOKEN=... +# OPENCLAW_TWITCH_ACCESS_TOKEN=oauth:... + +# ----------------------------------------------------------------------------- +# Tools + voice/media (optional) +# ----------------------------------------------------------------------------- +# BRAVE_API_KEY=... +# PERPLEXITY_API_KEY=pplx-... +# FIRECRAWL_API_KEY=... + +# ELEVENLABS_API_KEY=... +# XI_API_KEY=... # alias for ElevenLabs +# DEEPGRAM_API_KEY=... diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..082086e --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: ["https://github.com/sponsors/steipete"] diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..927aa70 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,95 @@ +name: Bug report +description: Report a defect or unexpected behavior in OpenClaw. +title: "[Bug]: " +labels: + - bug +body: + - type: markdown + attributes: + value: | + Thanks for filing this report. Keep it concise, reproducible, and evidence-based. + - type: textarea + id: summary + attributes: + label: Summary + description: One-sentence statement of what is broken. + placeholder: After upgrading to , behavior regressed from . + validations: + required: true + - type: textarea + id: repro + attributes: + label: Steps to reproduce + description: Provide the shortest deterministic repro path. + placeholder: | + 1. Configure channel X. + 2. Send message Y. + 3. Run command Z. + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What should happen if the bug does not exist. + placeholder: Agent posts a reply in the same thread. + validations: + required: true + - type: textarea + id: actual + attributes: + label: Actual behavior + description: What happened instead, including user-visible errors. + placeholder: No reply is posted; gateway logs "reply target not found". + validations: + required: true + - type: input + id: version + attributes: + label: OpenClaw version + description: Exact version/build tested. + placeholder: + validations: + required: true + - type: input + id: os + attributes: + label: Operating system + description: OS and version where this occurs. + placeholder: macOS 15.4 / Ubuntu 24.04 / Windows 11 + validations: + required: true + - type: input + id: install_method + attributes: + label: Install method + description: How OpenClaw was installed or launched. + placeholder: npm global / pnpm dev / docker / mac app + - type: textarea + id: logs + attributes: + label: Logs, screenshots, and evidence + description: Include redacted logs/screenshots/recordings that prove the behavior. + render: shell + - type: textarea + id: impact + attributes: + label: Impact and severity + description: | + Explain who is affected, how severe it is, how often it happens, and the practical consequence. + Include: + - Affected users/systems/channels + - Severity (annoying, blocks workflow, data risk, etc.) + - Frequency (always/intermittent/edge case) + - Consequence (missed messages, failed onboarding, extra cost, etc.) + placeholder: | + Affected: Telegram group users on + Severity: High (blocks replies) + Frequency: 100% repro + Consequence: Agents cannot respond in threads + - type: textarea + id: additional_information + attributes: + label: Additional information + description: Add any context that helps triage but does not fit above. + placeholder: Regression started after upgrade from ; temporary workaround is ... diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..4c1b977 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Onboarding + url: https://discord.gg/clawd + about: "New to OpenClaw? Join Discord for setup guidance in #help." + - name: Support + url: https://discord.gg/clawd + about: "Get help from the OpenClaw community on Discord in #help." diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..a08b456 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,70 @@ +name: Feature request +description: Propose a new capability or product improvement. +title: "[Feature]: " +labels: + - enhancement +body: + - type: markdown + attributes: + value: | + Help us evaluate this request with concrete use cases and tradeoffs. + - type: textarea + id: summary + attributes: + label: Summary + description: One-line statement of the requested capability. + placeholder: Add per-channel default response prefix. + validations: + required: true + - type: textarea + id: problem + attributes: + label: Problem to solve + description: What user pain this solves and why current behavior is insufficient. + placeholder: Agents cannot distinguish persona context in mixed channels, causing misrouted follow-ups. + validations: + required: true + - type: textarea + id: proposed_solution + attributes: + label: Proposed solution + description: Desired behavior/API/UX with as much specificity as possible. + placeholder: Support channels..responsePrefix with default fallback and account-level override. + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: Other approaches considered and why they are weaker. + placeholder: Manual prefixing in prompts is inconsistent and hard to enforce. + - type: textarea + id: impact + attributes: + label: Impact + description: | + Explain who is affected, severity/urgency, how often this pain occurs, and practical consequences. + Include: + - Affected users/systems/channels + - Severity (annoying, blocks workflow, etc.) + - Frequency (always/intermittent/edge case) + - Consequence (delays, errors, extra manual work, etc.) + placeholder: | + Affected: Multi-team shared channels + Severity: Medium + Frequency: Daily + Consequence: +20 minutes/day/operator and delayed alerts + validations: + required: true + - type: textarea + id: evidence + attributes: + label: Evidence/examples + description: Prior art, links, screenshots, logs, or metrics. + placeholder: Comparable behavior in X, sample config, and screenshot of current limitation. + - type: textarea + id: additional_information + attributes: + label: Additional information + description: Extra context, constraints, or references not covered above. + placeholder: Must remain backward-compatible with existing config keys. diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml new file mode 100644 index 0000000..f02fbdd --- /dev/null +++ b/.github/actionlint.yaml @@ -0,0 +1,22 @@ +# actionlint configuration +# https://github.com/rhysd/actionlint/blob/main/docs/config.md + +self-hosted-runner: + labels: + # Blacksmith CI runners + - blacksmith-8vcpu-ubuntu-2404 + - blacksmith-8vcpu-windows-2025 + - blacksmith-16vcpu-ubuntu-2404 + - blacksmith-16vcpu-windows-2025 + - blacksmith-16vcpu-ubuntu-2404-arm + +# Ignore patterns for known issues +paths: + .github/workflows/**/*.yml: + ignore: + # Ignore shellcheck warnings (we run shellcheck separately) + - "shellcheck reported issue.+" + # Ignore intentional if: false for disabled jobs + - 'constant expression "false" in condition' + # actionlint's built-in runner label allowlist lags Blacksmith additions. + - 'label "blacksmith-16vcpu-[^"]+" is unknown\.' diff --git a/.github/actions/detect-docs-changes/action.yml b/.github/actions/detect-docs-changes/action.yml new file mode 100644 index 0000000..853442a --- /dev/null +++ b/.github/actions/detect-docs-changes/action.yml @@ -0,0 +1,53 @@ +name: Detect docs-only changes +description: > + Outputs docs_only=true when all changed files are under docs/ or are + markdown (.md/.mdx). Fail-safe: if detection fails, outputs false (run + everything). Uses git diff — no API calls, no extra permissions needed. + +outputs: + docs_only: + description: "'true' if all changes are docs/markdown, 'false' otherwise" + value: ${{ steps.check.outputs.docs_only }} + docs_changed: + description: "'true' if any changed file is under docs/ or is markdown" + value: ${{ steps.check.outputs.docs_changed }} + +runs: + using: composite + steps: + - name: Detect docs-only changes + id: check + shell: bash + run: | + if [ "${{ github.event_name }}" = "push" ]; then + BASE="${{ github.event.before }}" + else + # Use the exact base SHA from the event payload — stable regardless + # of base branch movement (avoids origin/ drift). + BASE="${{ github.event.pull_request.base.sha }}" + fi + + # Fail-safe: if we can't diff, assume non-docs (run everything) + CHANGED=$(git diff --name-only "$BASE" HEAD 2>/dev/null || echo "UNKNOWN") + if [ "$CHANGED" = "UNKNOWN" ] || [ -z "$CHANGED" ]; then + echo "docs_only=false" >> "$GITHUB_OUTPUT" + echo "docs_changed=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + # Check if any changed file is a doc + DOCS=$(echo "$CHANGED" | grep -E '^docs/|\.md$|\.mdx$' || true) + if [ -n "$DOCS" ]; then + echo "docs_changed=true" >> "$GITHUB_OUTPUT" + else + echo "docs_changed=false" >> "$GITHUB_OUTPUT" + fi + + # Check if all changed files are docs or markdown + NON_DOCS=$(echo "$CHANGED" | grep -vE '^docs/|\.md$|\.mdx$' || true) + if [ -z "$NON_DOCS" ]; then + echo "docs_only=true" >> "$GITHUB_OUTPUT" + echo "Docs-only change detected — skipping heavy jobs" + else + echo "docs_only=false" >> "$GITHUB_OUTPUT" + fi diff --git a/.github/actions/setup-node-env/action.yml b/.github/actions/setup-node-env/action.yml new file mode 100644 index 0000000..334cd3c --- /dev/null +++ b/.github/actions/setup-node-env/action.yml @@ -0,0 +1,98 @@ +name: Setup Node environment +description: > + Initialize submodules with retry, install Node 22, pnpm, optionally Bun, + and run pnpm install. Requires actions/checkout to run first. +inputs: + node-version: + description: Node.js version to install. + required: false + default: "22.x" + pnpm-version: + description: pnpm version for corepack. + required: false + default: "10.23.0" + install-bun: + description: Whether to install Bun alongside Node. + required: false + default: "true" + frozen-lockfile: + description: Whether to use --frozen-lockfile for install. + required: false + default: "true" +runs: + using: composite + steps: + - name: Checkout submodules (retry) + shell: bash + run: | + set -euo pipefail + git submodule sync --recursive + for attempt in 1 2 3 4 5; do + if git -c protocol.version=2 submodule update --init --force --depth=1 --recursive; then + exit 0 + fi + echo "Submodule update failed (attempt $attempt/5). Retrying…" + sleep $((attempt * 10)) + done + exit 1 + + - name: Setup Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: ${{ inputs.node-version }} + check-latest: true + + - name: Setup pnpm + cache store + uses: ./.github/actions/setup-pnpm-store-cache + with: + pnpm-version: ${{ inputs.pnpm-version }} + cache-key-suffix: "node22" + + - name: Setup Bun + if: inputs.install-bun == 'true' + uses: oven-sh/setup-bun@v2 + with: + bun-version: "1.3.9+cf6cdbbba" + + - name: Runtime versions + shell: bash + run: | + node -v + npm -v + pnpm -v + if command -v bun &>/dev/null; then bun -v; fi + + - name: Capture node path + shell: bash + run: echo "NODE_BIN=$(dirname "$(node -p "process.execPath")")" >> "$GITHUB_ENV" + + - name: Install dependencies + shell: bash + env: + CI: "true" + FROZEN_LOCKFILE: ${{ inputs.frozen-lockfile }} + run: | + set -euo pipefail + export PATH="$NODE_BIN:$PATH" + which node + node -v + pnpm -v + case "$FROZEN_LOCKFILE" in + true) LOCKFILE_FLAG="--frozen-lockfile" ;; + false) LOCKFILE_FLAG="" ;; + *) + echo "::error::Invalid frozen-lockfile input: '$FROZEN_LOCKFILE' (expected true or false)" + exit 2 + ;; + esac + + install_args=( + install + --ignore-scripts=false + --config.engine-strict=false + --config.enable-pre-post-scripts=true + ) + if [ -n "$LOCKFILE_FLAG" ]; then + install_args+=("$LOCKFILE_FLAG") + fi + pnpm "${install_args[@]}" || pnpm "${install_args[@]}" diff --git a/.github/actions/setup-pnpm-store-cache/action.yml b/.github/actions/setup-pnpm-store-cache/action.yml new file mode 100644 index 0000000..8e25492 --- /dev/null +++ b/.github/actions/setup-pnpm-store-cache/action.yml @@ -0,0 +1,47 @@ +name: Setup pnpm + store cache +description: Prepare pnpm via corepack and restore pnpm store cache. +inputs: + pnpm-version: + description: pnpm version to activate via corepack. + required: false + default: "10.23.0" + cache-key-suffix: + description: Suffix appended to the cache key. + required: false + default: "node22" +runs: + using: composite + steps: + - name: Setup pnpm (corepack retry) + shell: bash + env: + PNPM_VERSION: ${{ inputs.pnpm-version }} + run: | + set -euo pipefail + if [[ ! "$PNPM_VERSION" =~ ^[0-9]+(\.[0-9]+){1,2}([.-][0-9A-Za-z.-]+)?$ ]]; then + echo "::error::Invalid pnpm-version input: '$PNPM_VERSION'" + exit 2 + fi + corepack enable + for attempt in 1 2 3; do + if corepack prepare "pnpm@$PNPM_VERSION" --activate; then + pnpm -v + exit 0 + fi + echo "corepack prepare failed (attempt $attempt/3). Retrying..." + sleep $((attempt * 10)) + done + exit 1 + + - name: Resolve pnpm store path + id: pnpm-store + shell: bash + run: echo "path=$(pnpm store path --silent)" >> "$GITHUB_OUTPUT" + + - name: Restore pnpm store cache + uses: actions/cache@v4 + with: + path: ${{ steps.pnpm-store.outputs.path }} + key: ${{ runner.os }}-pnpm-store-${{ inputs.cache-key-suffix }}-${{ hashFiles('pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store-${{ inputs.cache-key-suffix }}- diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..0a965fe --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,126 @@ +# Dependabot configuration +# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 + +registries: + npm-npmjs: + type: npm-registry + url: https://registry.npmjs.org + replaces-base: true + +updates: + # npm dependencies (root) + - package-ecosystem: npm + directory: / + schedule: + interval: weekly + cooldown: + default-days: 7 + groups: + production: + dependency-type: production + update-types: + - minor + - patch + development: + dependency-type: development + update-types: + - minor + - patch + open-pull-requests-limit: 10 + registries: + - npm-npmjs + + # GitHub Actions + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + cooldown: + default-days: 7 + groups: + actions: + patterns: + - "*" + update-types: + - minor + - patch + open-pull-requests-limit: 5 + + # Swift Package Manager - macOS app + - package-ecosystem: swift + directory: /apps/macos + schedule: + interval: weekly + cooldown: + default-days: 7 + groups: + swift-deps: + patterns: + - "*" + update-types: + - minor + - patch + open-pull-requests-limit: 5 + + # Swift Package Manager - shared MoltbotKit + - package-ecosystem: swift + directory: /apps/shared/MoltbotKit + schedule: + interval: weekly + cooldown: + default-days: 7 + groups: + swift-deps: + patterns: + - "*" + update-types: + - minor + - patch + open-pull-requests-limit: 5 + + # Swift Package Manager - Swabble + - package-ecosystem: swift + directory: /Swabble + schedule: + interval: weekly + cooldown: + default-days: 7 + groups: + swift-deps: + patterns: + - "*" + update-types: + - minor + - patch + open-pull-requests-limit: 5 + + # Gradle - Android app + - package-ecosystem: gradle + directory: /apps/android + schedule: + interval: weekly + cooldown: + default-days: 7 + groups: + android-deps: + patterns: + - "*" + update-types: + - minor + - patch + open-pull-requests-limit: 5 + + # Docker base images + - package-ecosystem: docker + directory: / + schedule: + interval: weekly + cooldown: + default-days: 7 + groups: + docker-images: + patterns: + - "*" + open-pull-requests-limit: 5 diff --git a/.github/instructions/copilot.instructions.md b/.github/instructions/copilot.instructions.md new file mode 100644 index 0000000..8686521 --- /dev/null +++ b/.github/instructions/copilot.instructions.md @@ -0,0 +1,64 @@ +# OpenClaw Codebase Patterns + +**Always reuse existing code - no redundancy!** + +## Tech Stack + +- **Runtime**: Node 22+ (Bun also supported for dev/scripts) +- **Language**: TypeScript (ESM, strict mode) +- **Package Manager**: pnpm (keep `pnpm-lock.yaml` in sync) +- **Lint/Format**: Oxlint, Oxfmt (`pnpm check`) +- **Tests**: Vitest with V8 coverage +- **CLI Framework**: Commander + clack/prompts +- **Build**: tsdown (outputs to `dist/`) + +## Anti-Redundancy Rules + +- Avoid files that just re-export from another file. Import directly from the original source. +- If a function already exists, import it - do NOT create a duplicate in another file. +- Before creating any formatter, utility, or helper, search for existing implementations first. + +## Source of Truth Locations + +### Formatting Utilities (`src/infra/`) + +- **Time formatting**: `src\infra\format-time` + +**NEVER create local `formatAge`, `formatDuration`, `formatElapsedTime` functions - import from centralized modules.** + +### Terminal Output (`src/terminal/`) + +- Tables: `src/terminal/table.ts` (`renderTable`) +- Themes/colors: `src/terminal/theme.ts` (`theme.success`, `theme.muted`, etc.) +- Progress: `src/cli/progress.ts` (spinners, progress bars) + +### CLI Patterns + +- CLI option wiring: `src/cli/` +- Commands: `src/commands/` +- Dependency injection via `createDefaultDeps` + +## Import Conventions + +- Use `.js` extension for cross-package imports (ESM) +- Direct imports only - no re-export wrapper files +- Types: `import type { X }` for type-only imports + +## Code Quality + +- TypeScript (ESM), strict typing, avoid `any` +- Keep files under ~700 LOC - extract helpers when larger +- Colocated tests: `*.test.ts` next to source files +- Run `pnpm check` before commits (lint + format) +- Run `pnpm tsgo` for type checking + +## Stack & Commands + +- **Package manager**: pnpm (`pnpm install`) +- **Dev**: `pnpm openclaw ...` or `pnpm dev` +- **Type-check**: `pnpm tsgo` +- **Lint/format**: `pnpm check` +- **Tests**: `pnpm test` +- **Build**: `pnpm build` + +If you are coding together with a human, do NOT use scripts/committer, but git directly and run the above commands manually to ensure quality. diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 0000000..78366fb --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,254 @@ +"channel: bluebubbles": + - changed-files: + - any-glob-to-any-file: + - "extensions/bluebubbles/**" + - "docs/channels/bluebubbles.md" +"channel: discord": + - changed-files: + - any-glob-to-any-file: + - "src/discord/**" + - "extensions/discord/**" + - "docs/channels/discord.md" +"channel: irc": + - changed-files: + - any-glob-to-any-file: + - "extensions/irc/**" + - "docs/channels/irc.md" +"channel: feishu": + - changed-files: + - any-glob-to-any-file: + - "src/feishu/**" + - "extensions/feishu/**" + - "docs/channels/feishu.md" +"channel: googlechat": + - changed-files: + - any-glob-to-any-file: + - "extensions/googlechat/**" + - "docs/channels/googlechat.md" +"channel: imessage": + - changed-files: + - any-glob-to-any-file: + - "src/imessage/**" + - "extensions/imessage/**" + - "docs/channels/imessage.md" +"channel: line": + - changed-files: + - any-glob-to-any-file: + - "extensions/line/**" + - "docs/channels/line.md" +"channel: matrix": + - changed-files: + - any-glob-to-any-file: + - "extensions/matrix/**" + - "docs/channels/matrix.md" +"channel: mattermost": + - changed-files: + - any-glob-to-any-file: + - "extensions/mattermost/**" + - "docs/channels/mattermost.md" +"channel: msteams": + - changed-files: + - any-glob-to-any-file: + - "extensions/msteams/**" + - "docs/channels/msteams.md" +"channel: nextcloud-talk": + - changed-files: + - any-glob-to-any-file: + - "extensions/nextcloud-talk/**" + - "docs/channels/nextcloud-talk.md" +"channel: nostr": + - changed-files: + - any-glob-to-any-file: + - "extensions/nostr/**" + - "docs/channels/nostr.md" +"channel: signal": + - changed-files: + - any-glob-to-any-file: + - "src/signal/**" + - "extensions/signal/**" + - "docs/channels/signal.md" +"channel: slack": + - changed-files: + - any-glob-to-any-file: + - "src/slack/**" + - "extensions/slack/**" + - "docs/channels/slack.md" +"channel: telegram": + - changed-files: + - any-glob-to-any-file: + - "src/telegram/**" + - "extensions/telegram/**" + - "docs/channels/telegram.md" +"channel: tlon": + - changed-files: + - any-glob-to-any-file: + - "extensions/tlon/**" + - "docs/channels/tlon.md" +"channel: twitch": + - changed-files: + - any-glob-to-any-file: + - "extensions/twitch/**" + - "docs/channels/twitch.md" +"channel: voice-call": + - changed-files: + - any-glob-to-any-file: + - "extensions/voice-call/**" +"channel: whatsapp-web": + - changed-files: + - any-glob-to-any-file: + - "src/web/**" + - "extensions/whatsapp/**" + - "docs/channels/whatsapp.md" +"channel: zalo": + - changed-files: + - any-glob-to-any-file: + - "extensions/zalo/**" + - "docs/channels/zalo.md" +"channel: zalouser": + - changed-files: + - any-glob-to-any-file: + - "extensions/zalouser/**" + - "docs/channels/zalouser.md" + +"app: android": + - changed-files: + - any-glob-to-any-file: + - "apps/android/**" + - "docs/platforms/android.md" +"app: ios": + - changed-files: + - any-glob-to-any-file: + - "apps/ios/**" + - "docs/platforms/ios.md" +"app: macos": + - changed-files: + - any-glob-to-any-file: + - "apps/macos/**" + - "docs/platforms/macos.md" + - "docs/platforms/mac/**" +"app: web-ui": + - changed-files: + - any-glob-to-any-file: + - "ui/**" + - "src/gateway/control-ui.ts" + - "src/gateway/control-ui-shared.ts" + - "src/gateway/protocol/**" + - "src/gateway/server-methods/chat.ts" + - "src/infra/control-ui-assets.ts" + +"gateway": + - changed-files: + - any-glob-to-any-file: + - "src/gateway/**" + - "src/daemon/**" + - "docs/gateway/**" + +"docs": + - changed-files: + - any-glob-to-any-file: + - "docs/**" + - "docs.acp.md" + +"cli": + - changed-files: + - any-glob-to-any-file: + - "src/cli/**" + +"commands": + - changed-files: + - any-glob-to-any-file: + - "src/commands/**" + +"scripts": + - changed-files: + - any-glob-to-any-file: + - "scripts/**" + +"docker": + - changed-files: + - any-glob-to-any-file: + - "Dockerfile" + - "Dockerfile.*" + - "docker-compose.yml" + - "docker-setup.sh" + - ".dockerignore" + - "scripts/**/*docker*" + - "scripts/**/Dockerfile*" + - "scripts/sandbox-*.sh" + - "src/agents/sandbox*.ts" + - "src/commands/sandbox*.ts" + - "src/cli/sandbox-cli.ts" + - "src/docker-setup.test.ts" + - "src/config/**/*sandbox*" + - "docs/cli/sandbox.md" + - "docs/gateway/sandbox*.md" + - "docs/install/docker.md" + - "docs/multi-agent-sandbox-tools.md" + +"agents": + - changed-files: + - any-glob-to-any-file: + - "src/agents/**" + +"security": + - changed-files: + - any-glob-to-any-file: + - "docs/cli/security.md" + - "docs/gateway/security.md" + +"extensions: copilot-proxy": + - changed-files: + - any-glob-to-any-file: + - "extensions/copilot-proxy/**" +"extensions: diagnostics-otel": + - changed-files: + - any-glob-to-any-file: + - "extensions/diagnostics-otel/**" +"extensions: google-antigravity-auth": + - changed-files: + - any-glob-to-any-file: + - "extensions/google-antigravity-auth/**" +"extensions: google-gemini-cli-auth": + - changed-files: + - any-glob-to-any-file: + - "extensions/google-gemini-cli-auth/**" +"extensions: llm-task": + - changed-files: + - any-glob-to-any-file: + - "extensions/llm-task/**" +"extensions: lobster": + - changed-files: + - any-glob-to-any-file: + - "extensions/lobster/**" +"extensions: memory-core": + - changed-files: + - any-glob-to-any-file: + - "extensions/memory-core/**" +"extensions: memory-lancedb": + - changed-files: + - any-glob-to-any-file: + - "extensions/memory-lancedb/**" +"extensions: open-prose": + - changed-files: + - any-glob-to-any-file: + - "extensions/open-prose/**" +"extensions: qwen-portal-auth": + - changed-files: + - any-glob-to-any-file: + - "extensions/qwen-portal-auth/**" +"extensions: device-pair": + - changed-files: + - any-glob-to-any-file: + - "extensions/device-pair/**" +"extensions: minimax-portal-auth": + - changed-files: + - any-glob-to-any-file: + - "extensions/minimax-portal-auth/**" +"extensions: phone-control": + - changed-files: + - any-glob-to-any-file: + - "extensions/phone-control/**" +"extensions: talk-voice": + - changed-files: + - any-glob-to-any-file: + - "extensions/talk-voice/**" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..9b0e7f8 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,108 @@ +## Summary + +Describe the problem and fix in 2–5 bullets: + +- Problem: +- Why it matters: +- What changed: +- What did NOT change (scope boundary): + +## Change Type (select all) + +- [ ] Bug fix +- [ ] Feature +- [ ] Refactor +- [ ] Docs +- [ ] Security hardening +- [ ] Chore/infra + +## Scope (select all touched areas) + +- [ ] Gateway / orchestration +- [ ] Skills / tool execution +- [ ] Auth / tokens +- [ ] Memory / storage +- [ ] Integrations +- [ ] API / contracts +- [ ] UI / DX +- [ ] CI/CD / infra + +## Linked Issue/PR + +- Closes # +- Related # + +## User-visible / Behavior Changes + +List user-visible changes (including defaults/config). +If none, write `None`. + +## Security Impact (required) + +- New permissions/capabilities? (`Yes/No`) +- Secrets/tokens handling changed? (`Yes/No`) +- New/changed network calls? (`Yes/No`) +- Command/tool execution surface changed? (`Yes/No`) +- Data access scope changed? (`Yes/No`) +- If any `Yes`, explain risk + mitigation: + +## Repro + Verification + +### Environment + +- OS: +- Runtime/container: +- Model/provider: +- Integration/channel (if any): +- Relevant config (redacted): + +### Steps + +1. +2. +3. + +### Expected + +- + +### Actual + +- + +## Evidence + +Attach at least one: + +- [ ] Failing test/log before + passing after +- [ ] Trace/log snippets +- [ ] Screenshot/recording +- [ ] Perf numbers (if relevant) + +## Human Verification (required) + +What you personally verified (not just CI), and how: + +- Verified scenarios: +- Edge cases checked: +- What you did **not** verify: + +## Compatibility / Migration + +- Backward compatible? (`Yes/No`) +- Config/env changes? (`Yes/No`) +- Migration needed? (`Yes/No`) +- If yes, exact upgrade steps: + +## Failure Recovery (if this breaks) + +- How to disable/revert this change quickly: +- Files/config to restore: +- Known bad symptoms reviewers should watch for: + +## Risks and Mitigations + +List only real risks for this PR. Add/remove entries as needed. If none, write `None`. + +- Risk: + - Mitigation: diff --git a/.github/workflows/auto-response.yml b/.github/workflows/auto-response.yml new file mode 100644 index 0000000..1502456 --- /dev/null +++ b/.github/workflows/auto-response.yml @@ -0,0 +1,224 @@ +name: Auto response + +on: + issues: + types: [opened, edited, labeled] + pull_request_target: + types: [labeled] + +permissions: {} + +jobs: + auto-response: + permissions: + issues: write + pull-requests: write + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1 + id: app-token + with: + app-id: "2729701" + private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} + - name: Handle labeled items + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7 + with: + github-token: ${{ steps.app-token.outputs.token }} + script: | + // Labels prefixed with "r:" are auto-response triggers. + const rules = [ + { + label: "r: skill", + close: true, + message: + "Thanks for the contribution! New skills should be published to [Clawhub](https://clawhub.ai) for everyone to use. We’re keeping the core lean on skills, so I’m closing this out.", + }, + { + label: "r: support", + close: true, + message: + "Please use [our support server](https://discord.gg/clawd) and ask in #help or #users-helping-users to resolve this, or follow the stuck FAQ at https://docs.openclaw.ai/help/faq#im-stuck-whats-the-fastest-way-to-get-unstuck.", + }, + { + label: "r: testflight", + close: true, + message: "Not available, build from source.", + }, + { + label: "r: third-party-extension", + close: true, + message: + "Please make this as a third-party plugin that you maintain yourself in your own repo. Docs: https://docs.openclaw.ai/plugin. Feel free to open a PR after to add it to our community plugins page: https://docs.openclaw.ai/plugins/community", + }, + { + label: "r: moltbook", + close: true, + lock: true, + lockReason: "off-topic", + message: + "OpenClaw is not affiliated with Moltbook, and issues related to Moltbook should not be submitted here.", + }, + ]; + + const triggerLabel = "trigger-response"; + const target = context.payload.issue ?? context.payload.pull_request; + if (!target) { + return; + } + + const labelSet = new Set( + (target.labels ?? []) + .map((label) => (typeof label === "string" ? label : label?.name)) + .filter((name) => typeof name === "string"), + ); + + const hasTriggerLabel = labelSet.has(triggerLabel); + if (hasTriggerLabel) { + labelSet.delete(triggerLabel); + try { + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: target.number, + name: triggerLabel, + }); + } catch (error) { + if (error?.status !== 404) { + throw error; + } + } + } + + const isLabelEvent = context.payload.action === "labeled"; + if (!hasTriggerLabel && !isLabelEvent) { + return; + } + + const issue = context.payload.issue; + if (issue) { + const title = issue.title ?? ""; + const body = issue.body ?? ""; + const haystack = `${title}\n${body}`.toLowerCase(); + const hasMoltbookLabel = labelSet.has("r: moltbook"); + const hasTestflightLabel = labelSet.has("r: testflight"); + const hasSecurityLabel = labelSet.has("security"); + if (title.toLowerCase().includes("security") && !hasSecurityLabel) { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + labels: ["security"], + }); + labelSet.add("security"); + } + if (title.toLowerCase().includes("testflight") && !hasTestflightLabel) { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + labels: ["r: testflight"], + }); + labelSet.add("r: testflight"); + } + if (haystack.includes("moltbook") && !hasMoltbookLabel) { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + labels: ["r: moltbook"], + }); + labelSet.add("r: moltbook"); + } + } + + const invalidLabel = "invalid"; + const dirtyLabel = "dirty"; + const noisyPrMessage = + "Closing this PR because it looks dirty (too many unrelated or unexpected changes). This usually happens when a branch picks up unrelated commits or a merge went sideways. Please recreate the PR from a clean branch."; + + const pullRequest = context.payload.pull_request; + if (pullRequest) { + if (labelSet.has(dirtyLabel)) { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequest.number, + body: noisyPrMessage, + }); + await github.rest.issues.update({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequest.number, + state: "closed", + }); + return; + } + const labelCount = labelSet.size; + if (labelCount > 20) { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequest.number, + body: noisyPrMessage, + }); + await github.rest.issues.update({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequest.number, + state: "closed", + }); + return; + } + if (labelSet.has(invalidLabel)) { + await github.rest.issues.update({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequest.number, + state: "closed", + }); + return; + } + } + + if (issue && labelSet.has(invalidLabel)) { + await github.rest.issues.update({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue.number, + state: "closed", + state_reason: "not_planned", + }); + return; + } + + const rule = rules.find((item) => labelSet.has(item.label)); + if (!rule) { + return; + } + + const issueNumber = target.number; + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issueNumber, + body: rule.message, + }); + + if (rule.close) { + await github.rest.issues.update({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issueNumber, + state: "closed", + }); + } + + if (rule.lock) { + await github.rest.issues.lock({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issueNumber, + lock_reason: rule.lockReason ?? "resolved", + }); + } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..abb5b50 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,744 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +concurrency: + group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + # Detect docs-only changes to skip heavy jobs (test, build, Windows, macOS, Android). + # Lint and format always run. Fail-safe: if detection fails, run everything. + docs-scope: + runs-on: blacksmith-16vcpu-ubuntu-2404 + outputs: + docs_only: ${{ steps.check.outputs.docs_only }} + docs_changed: ${{ steps.check.outputs.docs_changed }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: false + + - name: Detect docs-only changes + id: check + uses: ./.github/actions/detect-docs-changes + + # Detect which heavy areas are touched so PRs can skip unrelated expensive jobs. + # Push to main keeps broad coverage. + changed-scope: + needs: [docs-scope] + if: needs.docs-scope.outputs.docs_only != 'true' + runs-on: blacksmith-16vcpu-ubuntu-2404 + outputs: + run_node: ${{ steps.scope.outputs.run_node }} + run_macos: ${{ steps.scope.outputs.run_macos }} + run_android: ${{ steps.scope.outputs.run_android }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: false + + - name: Detect changed scopes + id: scope + shell: bash + run: | + set -euo pipefail + + if [ "${{ github.event_name }}" = "push" ]; then + BASE="${{ github.event.before }}" + else + BASE="${{ github.event.pull_request.base.sha }}" + fi + + CHANGED="$(git diff --name-only "$BASE" HEAD 2>/dev/null || echo "UNKNOWN")" + if [ "$CHANGED" = "UNKNOWN" ] || [ -z "$CHANGED" ]; then + # Fail-safe: run broad checks if detection fails. + echo "run_node=true" >> "$GITHUB_OUTPUT" + echo "run_macos=true" >> "$GITHUB_OUTPUT" + echo "run_android=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + + run_node=false + run_macos=false + run_android=false + has_non_docs=false + has_non_native_non_docs=false + + while IFS= read -r path; do + [ -z "$path" ] && continue + case "$path" in + docs/*|*.md|*.mdx) + continue + ;; + *) + has_non_docs=true + ;; + esac + + case "$path" in + # Generated protocol models are already covered by protocol:check and + # should not force the full native macOS lane. + apps/macos/Sources/OpenClawProtocol/*|apps/shared/OpenClawKit/Sources/OpenClawProtocol/*) + ;; + apps/macos/*|apps/ios/*|apps/shared/*|Swabble/*) + run_macos=true + ;; + esac + + case "$path" in + apps/android/*|apps/shared/*) + run_android=true + ;; + esac + + case "$path" in + src/*|test/*|extensions/*|packages/*|scripts/*|ui/*|.github/*|openclaw.mjs|package.json|pnpm-lock.yaml|pnpm-workspace.yaml|tsconfig*.json|vitest*.ts|tsdown.config.ts|.oxlintrc.json|.oxfmtrc.jsonc) + run_node=true + ;; + esac + + case "$path" in + apps/android/*|apps/ios/*|apps/macos/*|apps/shared/*|Swabble/*|appcast.xml) + ;; + *) + has_non_native_non_docs=true + ;; + esac + done <<< "$CHANGED" + + # If there are non-doc files outside native app trees, keep Node checks enabled. + if [ "$run_node" = false ] && [ "$has_non_docs" = true ] && [ "$has_non_native_non_docs" = true ]; then + run_node=true + fi + + echo "run_node=${run_node}" >> "$GITHUB_OUTPUT" + echo "run_macos=${run_macos}" >> "$GITHUB_OUTPUT" + echo "run_android=${run_android}" >> "$GITHUB_OUTPUT" + + # Build dist once for Node-relevant changes and share it with downstream jobs. + build-artifacts: + needs: [docs-scope, changed-scope, check] + if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true') + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Setup Node environment + uses: ./.github/actions/setup-node-env + with: + install-bun: "false" + + - name: Build dist + run: pnpm build + + - name: Upload dist artifact + uses: actions/upload-artifact@v4 + with: + name: dist-build + path: dist/ + retention-days: 1 + + # Validate npm pack contents after build (only on push to main, not PRs). + release-check: + needs: [docs-scope, build-artifacts] + if: github.event_name == 'push' && needs.docs-scope.outputs.docs_only != 'true' + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Setup Node environment + uses: ./.github/actions/setup-node-env + with: + install-bun: "false" + + - name: Download dist artifact + uses: actions/download-artifact@v4 + with: + name: dist-build + path: dist/ + + - name: Check release contents + run: pnpm release:check + + checks: + needs: [docs-scope, changed-scope, check] + if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true') + runs-on: blacksmith-16vcpu-ubuntu-2404 + strategy: + fail-fast: false + matrix: + include: + - runtime: node + task: test + command: pnpm canvas:a2ui:bundle && pnpm test + - runtime: node + task: protocol + command: pnpm protocol:check + - runtime: bun + task: test + command: pnpm canvas:a2ui:bundle && bunx vitest run --config vitest.unit.config.ts + steps: + - name: Skip bun lane on push + if: github.event_name == 'push' && matrix.runtime == 'bun' + run: echo "Skipping bun test lane on push events." + + - name: Checkout + if: github.event_name != 'push' || matrix.runtime != 'bun' + uses: actions/checkout@v4 + with: + submodules: false + + - name: Setup Node environment + if: matrix.runtime != 'bun' || github.event_name != 'push' + uses: ./.github/actions/setup-node-env + with: + install-bun: "${{ matrix.runtime == 'bun' }}" + + - name: Configure vitest JSON reports + if: (github.event_name != 'push' || matrix.runtime != 'bun') && matrix.task == 'test' && matrix.runtime == 'node' + run: echo "OPENCLAW_VITEST_REPORT_DIR=$RUNNER_TEMP/vitest-reports" >> "$GITHUB_ENV" + + - name: Configure Node test resources + if: (github.event_name != 'push' || matrix.runtime != 'bun') && matrix.task == 'test' && matrix.runtime == 'node' + run: | + # `pnpm test` runs `scripts/test-parallel.mjs`, which spawns multiple Node processes. + # Default heap limits have been too low on Linux CI (V8 OOM near 4GB). + echo "OPENCLAW_TEST_WORKERS=2" >> "$GITHUB_ENV" + echo "OPENCLAW_TEST_MAX_OLD_SPACE_SIZE_MB=6144" >> "$GITHUB_ENV" + + - name: Run ${{ matrix.task }} (${{ matrix.runtime }}) + if: matrix.runtime != 'bun' || github.event_name != 'push' + run: ${{ matrix.command }} + + - name: Summarize slowest tests + if: (github.event_name != 'push' || matrix.runtime != 'bun') && matrix.task == 'test' && matrix.runtime == 'node' + run: | + node scripts/vitest-slowest.mjs --dir "$OPENCLAW_VITEST_REPORT_DIR" --top 50 --out "$RUNNER_TEMP/vitest-slowest.md" > /dev/null + echo "Slowest test summary written to $RUNNER_TEMP/vitest-slowest.md" + + - name: Upload vitest reports + if: (github.event_name != 'push' || matrix.runtime != 'bun') && matrix.task == 'test' && matrix.runtime == 'node' + uses: actions/upload-artifact@v4 + with: + name: vitest-reports-${{ runner.os }}-${{ matrix.runtime }} + path: | + ${{ env.OPENCLAW_VITEST_REPORT_DIR }} + ${{ runner.temp }}/vitest-slowest.md + + # Types, lint, and format check. + check: + name: "check" + needs: [docs-scope] + if: needs.docs-scope.outputs.docs_only != 'true' + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Setup Node environment + uses: ./.github/actions/setup-node-env + with: + install-bun: "false" + + - name: Check types and lint and oxfmt + run: pnpm check + + # Report-only dead-code scans. Runs after scope detection and stores machine-readable + # results as artifacts for later triage before we enable hard gates. + # Temporarily disabled in CI while we process initial findings. + deadcode: + name: dead-code report + needs: [docs-scope, changed-scope] + # if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true') + if: false + runs-on: blacksmith-16vcpu-ubuntu-2404 + strategy: + fail-fast: false + matrix: + include: + - tool: knip + command: pnpm deadcode:report:ci:knip + - tool: ts-prune + command: pnpm deadcode:report:ci:ts-prune + - tool: ts-unused-exports + command: pnpm deadcode:report:ci:ts-unused + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Setup Node environment + uses: ./.github/actions/setup-node-env + with: + install-bun: "false" + + - name: Run ${{ matrix.tool }} dead-code scan + run: ${{ matrix.command }} + + - name: Upload dead-code results + uses: actions/upload-artifact@v4 + with: + name: dead-code-${{ matrix.tool }}-${{ github.run_id }} + path: .artifacts/deadcode + + # Validate docs (format, lint, broken links) only when docs files changed. + check-docs: + needs: [docs-scope] + if: needs.docs-scope.outputs.docs_changed == 'true' + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Setup Node environment + uses: ./.github/actions/setup-node-env + with: + install-bun: "false" + + - name: Check docs + run: pnpm check:docs + + secrets: + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install detect-secrets + run: | + python -m pip install --upgrade pip + python -m pip install detect-secrets==1.5.0 + + - name: Detect secrets + run: | + if ! detect-secrets scan --baseline .secrets.baseline; then + echo "::error::Secret scanning failed. See docs/gateway/security.md#secret-scanning-detect-secrets" + exit 1 + fi + + checks-windows: + needs: [docs-scope, changed-scope, build-artifacts, check] + if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true') + runs-on: blacksmith-16vcpu-windows-2025 + env: + NODE_OPTIONS: --max-old-space-size=4096 + # Keep total concurrency predictable on the 16 vCPU runner: + # `scripts/test-parallel.mjs` runs some vitest suites in parallel processes. + OPENCLAW_TEST_WORKERS: 2 + defaults: + run: + shell: bash + strategy: + fail-fast: false + matrix: + include: + - runtime: node + task: lint + command: pnpm lint + - runtime: node + task: test + command: pnpm canvas:a2ui:bundle && pnpm test + - runtime: node + task: protocol + command: pnpm protocol:check + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Try to exclude workspace from Windows Defender (best-effort) + shell: pwsh + run: | + $cmd = Get-Command Add-MpPreference -ErrorAction SilentlyContinue + if (-not $cmd) { + Write-Host "Add-MpPreference not available, skipping Defender exclusions." + exit 0 + } + + try { + # Defender sometimes intercepts process spawning (vitest workers). If this fails + # (eg hardened images), keep going and rely on worker limiting above. + Add-MpPreference -ExclusionPath "$env:GITHUB_WORKSPACE" -ErrorAction Stop + Add-MpPreference -ExclusionProcess "node.exe" -ErrorAction Stop + Write-Host "Defender exclusions applied." + } catch { + Write-Warning "Failed to apply Defender exclusions, continuing. $($_.Exception.Message)" + } + + - name: Download dist artifact (lint lane) + if: matrix.task == 'lint' + uses: actions/download-artifact@v4 + with: + name: dist-build + path: dist/ + + - name: Verify dist artifact (lint lane) + if: matrix.task == 'lint' + run: | + set -euo pipefail + test -s dist/index.js + test -s dist/plugin-sdk/index.js + + - name: Setup Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: 22.x + check-latest: true + + - name: Setup pnpm + cache store + uses: ./.github/actions/setup-pnpm-store-cache + with: + pnpm-version: "10.23.0" + cache-key-suffix: "node22" + + - name: Runtime versions + run: | + node -v + npm -v + pnpm -v + + - name: Capture node path + run: echo "NODE_BIN=$(dirname \"$(node -p \"process.execPath\")\")" >> "$GITHUB_ENV" + + - name: Install dependencies + env: + CI: true + run: | + export PATH="$NODE_BIN:$PATH" + which node + node -v + pnpm -v + pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true || pnpm install --frozen-lockfile --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true + + - name: Configure vitest JSON reports + if: matrix.task == 'test' + run: echo "OPENCLAW_VITEST_REPORT_DIR=$RUNNER_TEMP/vitest-reports" >> "$GITHUB_ENV" + + - name: Run ${{ matrix.task }} (${{ matrix.runtime }}) + run: ${{ matrix.command }} + + - name: Summarize slowest tests + if: matrix.task == 'test' + run: | + node scripts/vitest-slowest.mjs --dir "$OPENCLAW_VITEST_REPORT_DIR" --top 50 --out "$RUNNER_TEMP/vitest-slowest.md" > /dev/null + echo "Slowest test summary written to $RUNNER_TEMP/vitest-slowest.md" + + - name: Upload vitest reports + if: matrix.task == 'test' + uses: actions/upload-artifact@v4 + with: + name: vitest-reports-${{ runner.os }}-${{ matrix.runtime }} + path: | + ${{ env.OPENCLAW_VITEST_REPORT_DIR }} + ${{ runner.temp }}/vitest-slowest.md + + # Consolidated macOS job: runs TS tests + Swift lint/build/test sequentially + # on a single runner. GitHub limits macOS concurrent jobs to 5 per org; + # running 4 separate jobs per PR (as before) starved the queue. One job + # per PR allows 5 PRs to run macOS checks simultaneously. + macos: + needs: [docs-scope, changed-scope, check] + if: github.event_name == 'pull_request' && needs.docs-scope.outputs.docs_only != 'true' && needs.changed-scope.outputs.run_macos == 'true' + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Setup Node environment + uses: ./.github/actions/setup-node-env + with: + install-bun: "false" + + # --- Run all checks sequentially (fast gates first) --- + - name: TS tests (macOS) + env: + NODE_OPTIONS: --max-old-space-size=4096 + run: pnpm test + + # --- Xcode/Swift setup --- + - name: Select Xcode 26.1 + run: | + sudo xcode-select -s /Applications/Xcode_26.1.app + xcodebuild -version + + - name: Install XcodeGen / SwiftLint / SwiftFormat + run: brew install xcodegen swiftlint swiftformat + + - name: Show toolchain + run: | + sw_vers + xcodebuild -version + swift --version + + - name: Swift lint + run: | + swiftlint --config .swiftlint.yml + swiftformat --lint apps/macos/Sources --config .swiftformat + + - name: Cache SwiftPM + uses: actions/cache@v4 + with: + path: ~/Library/Caches/org.swift.swiftpm + key: ${{ runner.os }}-swiftpm-${{ hashFiles('apps/macos/Package.resolved') }} + restore-keys: | + ${{ runner.os }}-swiftpm- + + - name: Swift build (release) + run: | + set -euo pipefail + for attempt in 1 2 3; do + if swift build --package-path apps/macos --configuration release; then + exit 0 + fi + echo "swift build failed (attempt $attempt/3). Retrying…" + sleep $((attempt * 20)) + done + exit 1 + + - name: Swift test + run: | + set -euo pipefail + for attempt in 1 2 3; do + if swift test --package-path apps/macos --parallel --enable-code-coverage --show-codecov-path; then + exit 0 + fi + echo "swift test failed (attempt $attempt/3). Retrying…" + sleep $((attempt * 20)) + done + exit 1 + + ios: + if: false # ignore iOS in CI for now + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Select Xcode 26.1 + run: | + sudo xcode-select -s /Applications/Xcode_26.1.app + xcodebuild -version + + - name: Install XcodeGen + run: brew install xcodegen + + - name: Install SwiftLint / SwiftFormat + run: brew install swiftlint swiftformat + + - name: Show toolchain + run: | + sw_vers + xcodebuild -version + swift --version + + - name: Generate iOS project + run: | + cd apps/ios + xcodegen generate + + - name: iOS tests + run: | + set -euo pipefail + RESULT_BUNDLE_PATH="$RUNNER_TEMP/Clawdis-iOS.xcresult" + DEST_ID="$( + python3 - <<'PY' + import json + import subprocess + import sys + import uuid + + def sh(args: list[str]) -> str: + return subprocess.check_output(args, text=True).strip() + + # Prefer an already-created iPhone simulator if it exists. + devices = json.loads(sh(["xcrun", "simctl", "list", "devices", "-j"])) + candidates: list[tuple[str, str]] = [] + for runtime, devs in (devices.get("devices") or {}).items(): + for dev in devs or []: + if not dev.get("isAvailable"): + continue + name = str(dev.get("name") or "") + udid = str(dev.get("udid") or "") + if not udid or not name.startswith("iPhone"): + continue + candidates.append((name, udid)) + + candidates.sort(key=lambda it: (0 if "iPhone 16" in it[0] else 1, it[0])) + if candidates: + print(candidates[0][1]) + sys.exit(0) + + # Otherwise, create one from the newest available iOS runtime. + runtimes = json.loads(sh(["xcrun", "simctl", "list", "runtimes", "-j"])).get("runtimes") or [] + ios = [rt for rt in runtimes if rt.get("platform") == "iOS" and rt.get("isAvailable")] + if not ios: + print("No available iOS runtimes found.", file=sys.stderr) + sys.exit(1) + + def version_key(rt: dict) -> tuple[int, ...]: + parts: list[int] = [] + for p in str(rt.get("version") or "0").split("."): + try: + parts.append(int(p)) + except ValueError: + parts.append(0) + return tuple(parts) + + ios.sort(key=version_key, reverse=True) + runtime = ios[0] + runtime_id = str(runtime.get("identifier") or "") + if not runtime_id: + print("Missing iOS runtime identifier.", file=sys.stderr) + sys.exit(1) + + supported = runtime.get("supportedDeviceTypes") or [] + iphones = [dt for dt in supported if dt.get("productFamily") == "iPhone"] + if not iphones: + print("No iPhone device types for iOS runtime.", file=sys.stderr) + sys.exit(1) + + iphones.sort( + key=lambda dt: ( + 0 if "iPhone 16" in str(dt.get("name") or "") else 1, + str(dt.get("name") or ""), + ) + ) + device_type_id = str(iphones[0].get("identifier") or "") + if not device_type_id: + print("Missing iPhone device type identifier.", file=sys.stderr) + sys.exit(1) + + sim_name = f"CI iPhone {uuid.uuid4().hex[:8]}" + udid = sh(["xcrun", "simctl", "create", sim_name, device_type_id, runtime_id]) + if not udid: + print("Failed to create iPhone simulator.", file=sys.stderr) + sys.exit(1) + print(udid) + PY + )" + echo "Using iOS Simulator id: $DEST_ID" + xcodebuild test \ + -project apps/ios/Clawdis.xcodeproj \ + -scheme Clawdis \ + -destination "platform=iOS Simulator,id=$DEST_ID" \ + -resultBundlePath "$RESULT_BUNDLE_PATH" \ + -enableCodeCoverage YES + + - name: iOS coverage summary + run: | + set -euo pipefail + RESULT_BUNDLE_PATH="$RUNNER_TEMP/Clawdis-iOS.xcresult" + xcrun xccov view --report --only-targets "$RESULT_BUNDLE_PATH" + + - name: iOS coverage gate (43%) + run: | + set -euo pipefail + RESULT_BUNDLE_PATH="$RUNNER_TEMP/Clawdis-iOS.xcresult" + RESULT_BUNDLE_PATH="$RESULT_BUNDLE_PATH" python3 - <<'PY' + import json + import os + import subprocess + import sys + + target_name = "Clawdis.app" + minimum = 0.43 + + report = json.loads( + subprocess.check_output( + ["xcrun", "xccov", "view", "--report", "--json", os.environ["RESULT_BUNDLE_PATH"]], + text=True, + ) + ) + + target_coverage = None + for target in report.get("targets", []): + if target.get("name") == target_name: + target_coverage = float(target["lineCoverage"]) + break + + if target_coverage is None: + print(f"Could not find coverage for target: {target_name}") + sys.exit(1) + + print(f"{target_name} line coverage: {target_coverage * 100:.2f}% (min {minimum * 100:.2f}%)") + if target_coverage + 1e-12 < minimum: + sys.exit(1) + PY + + android: + needs: [docs-scope, changed-scope, check] + if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_android == 'true') + runs-on: blacksmith-16vcpu-ubuntu-2404 + strategy: + fail-fast: false + matrix: + include: + - task: test + command: ./gradlew --no-daemon :app:testDebugUnitTest + - task: build + command: ./gradlew --no-daemon :app:assembleDebug + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: temurin + # setup-android's sdkmanager currently crashes on JDK 21 in CI. + java-version: 17 + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + with: + accept-android-sdk-licenses: false + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + with: + gradle-version: 8.11.1 + + - name: Install Android SDK packages + run: | + yes | sdkmanager --licenses >/dev/null + sdkmanager --install \ + "platform-tools" \ + "platforms;android-36" \ + "build-tools;36.0.0" + + - name: Run Android ${{ matrix.task }} + working-directory: apps/android + run: ${{ matrix.command }} diff --git a/.github/workflows/cortex-ci.yml b/.github/workflows/cortex-ci.yml new file mode 100644 index 0000000..281d4de --- /dev/null +++ b/.github/workflows/cortex-ci.yml @@ -0,0 +1,103 @@ +name: Cortex CI + +on: + push: + branches: + - cortex-rebuild + - phase-* + pull_request: + branches: + - cortex-rebuild + +jobs: + lint: + name: Lint and Format Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: Enable Corepack + run: corepack enable + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Format check + run: pnpm format:check + + - name: Lint + run: pnpm lint + + typecheck: + name: TypeScript Type Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: Enable Corepack + run: corepack enable + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + test: + name: Unit Tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: Enable Corepack + run: corepack enable + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run tests + run: pnpm test + + docker: + name: Docker Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build Gateway Image + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile + push: false + tags: cortex-gateway:test + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Build FastEmbed Image + uses: docker/build-push-action@v6 + with: + context: ./services/fastembed + file: ./services/fastembed/Dockerfile + push: false + tags: cortex-fastembed:test + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml new file mode 100644 index 0000000..fc0d97d --- /dev/null +++ b/.github/workflows/docker-release.yml @@ -0,0 +1,198 @@ +name: Docker Release + +on: + push: + branches: + - main + tags: + - "v*" + paths-ignore: + - "docs/**" + - "**/*.md" + - "**/*.mdx" + - ".agents/**" + - "skills/**" + +concurrency: + group: docker-release-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: false + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + # Build amd64 image + build-amd64: + runs-on: blacksmith-16vcpu-ubuntu-2404 + permissions: + packages: write + contents: read + outputs: + image-digest: ${{ steps.build.outputs.digest }} + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Resolve image tags (amd64) + id: tags + shell: bash + env: + IMAGE: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + run: | + set -euo pipefail + tags=() + if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then + tags+=("${IMAGE}:main-amd64") + fi + if [[ "${GITHUB_REF}" == refs/tags/v* ]]; then + version="${GITHUB_REF#refs/tags/v}" + tags+=("${IMAGE}:${version}-amd64") + fi + if [[ ${#tags[@]} -eq 0 ]]; then + echo "::error::No amd64 tags resolved for ref ${GITHUB_REF}" + exit 1 + fi + { + echo "value<> "$GITHUB_OUTPUT" + + - name: Build and push amd64 image + id: build + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/amd64 + tags: ${{ steps.tags.outputs.value }} + cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-cache:amd64 + cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-cache:amd64,mode=max + provenance: false + push: true + + # Build arm64 image + build-arm64: + runs-on: blacksmith-16vcpu-ubuntu-2404-arm + permissions: + packages: write + contents: read + outputs: + image-digest: ${{ steps.build.outputs.digest }} + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Resolve image tags (arm64) + id: tags + shell: bash + env: + IMAGE: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + run: | + set -euo pipefail + tags=() + if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then + tags+=("${IMAGE}:main-arm64") + fi + if [[ "${GITHUB_REF}" == refs/tags/v* ]]; then + version="${GITHUB_REF#refs/tags/v}" + tags+=("${IMAGE}:${version}-arm64") + fi + if [[ ${#tags[@]} -eq 0 ]]; then + echo "::error::No arm64 tags resolved for ref ${GITHUB_REF}" + exit 1 + fi + { + echo "value<> "$GITHUB_OUTPUT" + + - name: Build and push arm64 image + id: build + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/arm64 + tags: ${{ steps.tags.outputs.value }} + cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-cache:arm64 + cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-cache:arm64,mode=max + provenance: false + push: true + + # Create multi-platform manifest + create-manifest: + runs-on: blacksmith-16vcpu-ubuntu-2404 + permissions: + packages: write + contents: read + needs: [build-amd64, build-arm64] + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Resolve manifest tags + id: tags + shell: bash + env: + IMAGE: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + run: | + set -euo pipefail + tags=() + if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then + tags+=("${IMAGE}:main") + fi + if [[ "${GITHUB_REF}" == refs/tags/v* ]]; then + version="${GITHUB_REF#refs/tags/v}" + tags+=("${IMAGE}:${version}") + fi + if [[ ${#tags[@]} -eq 0 ]]; then + echo "::error::No manifest tags resolved for ref ${GITHUB_REF}" + exit 1 + fi + { + echo "value<> "$GITHUB_OUTPUT" + + - name: Create and push manifest + shell: bash + run: | + set -euo pipefail + mapfile -t tags <<< "${{ steps.tags.outputs.value }}" + args=() + for tag in "${tags[@]}"; do + [ -z "$tag" ] && continue + args+=("-t" "$tag") + done + docker buildx imagetools create "${args[@]}" \ + ${{ needs.build-amd64.outputs.image-digest }} \ + ${{ needs.build-arm64.outputs.image-digest }} diff --git a/.github/workflows/install-smoke.yml b/.github/workflows/install-smoke.yml new file mode 100644 index 0000000..03e87db --- /dev/null +++ b/.github/workflows/install-smoke.yml @@ -0,0 +1,59 @@ +name: Install Smoke + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +concurrency: + group: install-smoke-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + docs-scope: + runs-on: blacksmith-16vcpu-ubuntu-2404 + outputs: + docs_only: ${{ steps.check.outputs.docs_only }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Detect docs-only changes + id: check + uses: ./.github/actions/detect-docs-changes + + install-smoke: + needs: [docs-scope] + if: needs.docs-scope.outputs.docs_only != 'true' + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - name: Checkout CLI + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: 22.x + check-latest: true + + - name: Setup pnpm + cache store + uses: ./.github/actions/setup-pnpm-store-cache + with: + pnpm-version: "10.23.0" + cache-key-suffix: "node22" + + - name: Install pnpm deps (minimal) + run: pnpm install --ignore-scripts --frozen-lockfile + + - name: Run installer docker tests + env: + CLAWDBOT_INSTALL_URL: https://openclaw.ai/install.sh + CLAWDBOT_INSTALL_CLI_URL: https://openclaw.ai/install-cli.sh + CLAWDBOT_NO_ONBOARD: "1" + CLAWDBOT_INSTALL_SMOKE_SKIP_CLI: "1" + CLAWDBOT_INSTALL_SMOKE_SKIP_NONROOT: ${{ github.event_name == 'pull_request' && '1' || '0' }} + CLAWDBOT_INSTALL_SMOKE_SKIP_PREVIOUS: "1" + run: pnpm test:install:smoke diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 0000000..9ac44df --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,519 @@ +name: Labeler + +on: + pull_request_target: + types: [opened, synchronize, reopened] + issues: + types: [opened] + workflow_dispatch: + inputs: + max_prs: + description: "Maximum number of open PRs to process (0 = all)" + required: false + default: "200" + per_page: + description: "PRs per page (1-100)" + required: false + default: "50" + +permissions: {} + +jobs: + label: + permissions: + contents: read + pull-requests: write + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1 + id: app-token + with: + app-id: "2729701" + private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} + - uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 # v5 + with: + configuration-path: .github/labeler.yml + repo-token: ${{ steps.app-token.outputs.token }} + sync-labels: true + - name: Apply PR size label + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7 + with: + github-token: ${{ steps.app-token.outputs.token }} + script: | + const pullRequest = context.payload.pull_request; + if (!pullRequest) { + return; + } + + const sizeLabels = ["size: XS", "size: S", "size: M", "size: L", "size: XL"]; + const labelColor = "b76e79"; + + for (const label of sizeLabels) { + try { + await github.rest.issues.getLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + name: label, + }); + } catch (error) { + if (error?.status !== 404) { + throw error; + } + await github.rest.issues.createLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + name: label, + color: labelColor, + }); + } + } + + const files = await github.paginate(github.rest.pulls.listFiles, { + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: pullRequest.number, + per_page: 100, + }); + + const excludedLockfiles = new Set(["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lockb"]); + const totalChangedLines = files.reduce((total, file) => { + const path = file.filename ?? ""; + if (path === "docs.acp.md" || path.startsWith("docs/") || excludedLockfiles.has(path)) { + return total; + } + return total + (file.additions ?? 0) + (file.deletions ?? 0); + }, 0); + + let targetSizeLabel = "size: XL"; + if (totalChangedLines < 50) { + targetSizeLabel = "size: XS"; + } else if (totalChangedLines < 200) { + targetSizeLabel = "size: S"; + } else if (totalChangedLines < 500) { + targetSizeLabel = "size: M"; + } else if (totalChangedLines < 1000) { + targetSizeLabel = "size: L"; + } + + const currentLabels = await github.paginate(github.rest.issues.listLabelsOnIssue, { + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequest.number, + per_page: 100, + }); + + for (const label of currentLabels) { + const name = label.name ?? ""; + if (!sizeLabels.includes(name)) { + continue; + } + if (name === targetSizeLabel) { + continue; + } + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequest.number, + name, + }); + } + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequest.number, + labels: [targetSizeLabel], + }); + - name: Apply maintainer or trusted-contributor label + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7 + with: + github-token: ${{ steps.app-token.outputs.token }} + script: | + const login = context.payload.pull_request?.user?.login; + if (!login) { + return; + } + + const repo = `${context.repo.owner}/${context.repo.repo}`; + const trustedLabel = "trusted-contributor"; + const experiencedLabel = "experienced-contributor"; + const trustedThreshold = 4; + const experiencedThreshold = 10; + + let isMaintainer = false; + try { + const membership = await github.rest.teams.getMembershipForUserInOrg({ + org: context.repo.owner, + team_slug: "maintainer", + username: login, + }); + isMaintainer = membership?.data?.state === "active"; + } catch (error) { + if (error?.status !== 404) { + throw error; + } + } + + if (isMaintainer) { + await github.rest.issues.addLabels({ + ...context.repo, + issue_number: context.payload.pull_request.number, + labels: ["maintainer"], + }); + return; + } + + const mergedQuery = `repo:${repo} is:pr is:merged author:${login}`; + let mergedCount = 0; + try { + const merged = await github.rest.search.issuesAndPullRequests({ + q: mergedQuery, + per_page: 1, + }); + mergedCount = merged?.data?.total_count ?? 0; + } catch (error) { + if (error?.status !== 422) { + throw error; + } + core.warning(`Skipping merged search for ${login}; treating as 0.`); + } + + if (mergedCount >= experiencedThreshold) { + await github.rest.issues.addLabels({ + ...context.repo, + issue_number: context.payload.pull_request.number, + labels: [experiencedLabel], + }); + return; + } + + if (mergedCount >= trustedThreshold) { + await github.rest.issues.addLabels({ + ...context.repo, + issue_number: context.payload.pull_request.number, + labels: [trustedLabel], + }); + } + + backfill-pr-labels: + if: github.event_name == 'workflow_dispatch' + permissions: + contents: read + pull-requests: write + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1 + id: app-token + with: + app-id: "2729701" + private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} + - name: Backfill PR labels + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7 + with: + github-token: ${{ steps.app-token.outputs.token }} + script: | + const owner = context.repo.owner; + const repo = context.repo.repo; + const repoFull = `${owner}/${repo}`; + const inputs = context.payload.inputs ?? {}; + const maxPrsInput = inputs.max_prs ?? "200"; + const perPageInput = inputs.per_page ?? "50"; + const parsedMaxPrs = Number.parseInt(maxPrsInput, 10); + const parsedPerPage = Number.parseInt(perPageInput, 10); + const maxPrs = Number.isFinite(parsedMaxPrs) ? parsedMaxPrs : 200; + const perPage = Number.isFinite(parsedPerPage) ? Math.min(100, Math.max(1, parsedPerPage)) : 50; + const processAll = maxPrs <= 0; + const maxCount = processAll ? Number.POSITIVE_INFINITY : Math.max(1, maxPrs); + + const sizeLabels = ["size: XS", "size: S", "size: M", "size: L", "size: XL"]; + const labelColor = "b76e79"; + const trustedLabel = "trusted-contributor"; + const experiencedLabel = "experienced-contributor"; + const trustedThreshold = 4; + const experiencedThreshold = 10; + + const contributorCache = new Map(); + + async function ensureSizeLabels() { + for (const label of sizeLabels) { + try { + await github.rest.issues.getLabel({ + owner, + repo, + name: label, + }); + } catch (error) { + if (error?.status !== 404) { + throw error; + } + await github.rest.issues.createLabel({ + owner, + repo, + name: label, + color: labelColor, + }); + } + } + } + + async function resolveContributorLabel(login) { + if (contributorCache.has(login)) { + return contributorCache.get(login); + } + + let isMaintainer = false; + try { + const membership = await github.rest.teams.getMembershipForUserInOrg({ + org: owner, + team_slug: "maintainer", + username: login, + }); + isMaintainer = membership?.data?.state === "active"; + } catch (error) { + if (error?.status !== 404) { + throw error; + } + } + + if (isMaintainer) { + contributorCache.set(login, "maintainer"); + return "maintainer"; + } + + const mergedQuery = `repo:${repoFull} is:pr is:merged author:${login}`; + let mergedCount = 0; + try { + const merged = await github.rest.search.issuesAndPullRequests({ + q: mergedQuery, + per_page: 1, + }); + mergedCount = merged?.data?.total_count ?? 0; + } catch (error) { + if (error?.status !== 422) { + throw error; + } + core.warning(`Skipping merged search for ${login}; treating as 0.`); + } + + let label = null; + if (mergedCount >= experiencedThreshold) { + label = experiencedLabel; + } else if (mergedCount >= trustedThreshold) { + label = trustedLabel; + } + + contributorCache.set(login, label); + return label; + } + + async function applySizeLabel(pullRequest, currentLabels, labelNames) { + const files = await github.paginate(github.rest.pulls.listFiles, { + owner, + repo, + pull_number: pullRequest.number, + per_page: 100, + }); + + const excludedLockfiles = new Set(["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lockb"]); + const totalChangedLines = files.reduce((total, file) => { + const path = file.filename ?? ""; + if (path === "docs.acp.md" || path.startsWith("docs/") || excludedLockfiles.has(path)) { + return total; + } + return total + (file.additions ?? 0) + (file.deletions ?? 0); + }, 0); + + let targetSizeLabel = "size: XL"; + if (totalChangedLines < 50) { + targetSizeLabel = "size: XS"; + } else if (totalChangedLines < 200) { + targetSizeLabel = "size: S"; + } else if (totalChangedLines < 500) { + targetSizeLabel = "size: M"; + } else if (totalChangedLines < 1000) { + targetSizeLabel = "size: L"; + } + + for (const label of currentLabels) { + const name = label.name ?? ""; + if (!sizeLabels.includes(name)) { + continue; + } + if (name === targetSizeLabel) { + continue; + } + await github.rest.issues.removeLabel({ + owner, + repo, + issue_number: pullRequest.number, + name, + }); + labelNames.delete(name); + } + + if (!labelNames.has(targetSizeLabel)) { + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: pullRequest.number, + labels: [targetSizeLabel], + }); + labelNames.add(targetSizeLabel); + } + } + + async function applyContributorLabel(pullRequest, labelNames) { + const login = pullRequest.user?.login; + if (!login) { + return; + } + + const label = await resolveContributorLabel(login); + if (!label) { + return; + } + + if (labelNames.has(label)) { + return; + } + + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: pullRequest.number, + labels: [label], + }); + labelNames.add(label); + } + + await ensureSizeLabels(); + + let page = 1; + let processed = 0; + + while (processed < maxCount) { + const remaining = maxCount - processed; + const pageSize = processAll ? perPage : Math.min(perPage, remaining); + const { data: pullRequests } = await github.rest.pulls.list({ + owner, + repo, + state: "open", + per_page: pageSize, + page, + }); + + if (pullRequests.length === 0) { + break; + } + + for (const pullRequest of pullRequests) { + if (!processAll && processed >= maxCount) { + break; + } + + const currentLabels = await github.paginate(github.rest.issues.listLabelsOnIssue, { + owner, + repo, + issue_number: pullRequest.number, + per_page: 100, + }); + + const labelNames = new Set( + currentLabels.map((label) => label.name).filter((name) => typeof name === "string"), + ); + + await applySizeLabel(pullRequest, currentLabels, labelNames); + await applyContributorLabel(pullRequest, labelNames); + + processed += 1; + } + + if (pullRequests.length < pageSize) { + break; + } + + page += 1; + } + + core.info(`Processed ${processed} pull requests.`); + + label-issues: + permissions: + issues: write + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1 + id: app-token + with: + app-id: "2729701" + private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} + - name: Apply maintainer or trusted-contributor label + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7 + with: + github-token: ${{ steps.app-token.outputs.token }} + script: | + const login = context.payload.issue?.user?.login; + if (!login) { + return; + } + + const repo = `${context.repo.owner}/${context.repo.repo}`; + const trustedLabel = "trusted-contributor"; + const experiencedLabel = "experienced-contributor"; + const trustedThreshold = 4; + const experiencedThreshold = 10; + + let isMaintainer = false; + try { + const membership = await github.rest.teams.getMembershipForUserInOrg({ + org: context.repo.owner, + team_slug: "maintainer", + username: login, + }); + isMaintainer = membership?.data?.state === "active"; + } catch (error) { + if (error?.status !== 404) { + throw error; + } + } + + if (isMaintainer) { + await github.rest.issues.addLabels({ + ...context.repo, + issue_number: context.payload.issue.number, + labels: ["maintainer"], + }); + return; + } + + const mergedQuery = `repo:${repo} is:pr is:merged author:${login}`; + let mergedCount = 0; + try { + const merged = await github.rest.search.issuesAndPullRequests({ + q: mergedQuery, + per_page: 1, + }); + mergedCount = merged?.data?.total_count ?? 0; + } catch (error) { + if (error?.status !== 422) { + throw error; + } + core.warning(`Skipping merged search for ${login}; treating as 0.`); + } + + if (mergedCount >= experiencedThreshold) { + await github.rest.issues.addLabels({ + ...context.repo, + issue_number: context.payload.issue.number, + labels: [experiencedLabel], + }); + return; + } + + if (mergedCount >= trustedThreshold) { + await github.rest.issues.addLabels({ + ...context.repo, + issue_number: context.payload.issue.number, + labels: [trustedLabel], + }); + } diff --git a/.github/workflows/sandbox-common-smoke.yml b/.github/workflows/sandbox-common-smoke.yml new file mode 100644 index 0000000..26c0dcc --- /dev/null +++ b/.github/workflows/sandbox-common-smoke.yml @@ -0,0 +1,56 @@ +name: Sandbox Common Smoke + +on: + push: + branches: [main] + paths: + - Dockerfile.sandbox + - Dockerfile.sandbox-common + - scripts/sandbox-common-setup.sh + pull_request: + paths: + - Dockerfile.sandbox + - Dockerfile.sandbox-common + - scripts/sandbox-common-setup.sh + +concurrency: + group: sandbox-common-smoke-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + sandbox-common-smoke: + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: false + + - name: Build minimal sandbox base (USER sandbox) + shell: bash + run: | + set -euo pipefail + + docker build -t openclaw-sandbox-smoke-base:bookworm-slim - <<'EOF' + FROM debian:bookworm-slim + RUN useradd --create-home --shell /bin/bash sandbox + USER sandbox + WORKDIR /home/sandbox + EOF + + - name: Build sandbox-common image (root for installs, sandbox at runtime) + shell: bash + run: | + set -euo pipefail + + BASE_IMAGE="openclaw-sandbox-smoke-base:bookworm-slim" \ + TARGET_IMAGE="openclaw-sandbox-common-smoke:bookworm-slim" \ + PACKAGES="ca-certificates" \ + INSTALL_PNPM=0 \ + INSTALL_BUN=0 \ + INSTALL_BREW=0 \ + FINAL_USER=sandbox \ + scripts/sandbox-common-setup.sh + + u="$(docker run --rm openclaw-sandbox-common-smoke:bookworm-slim sh -lc 'id -un')" + test "$u" = "sandbox" diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..6248a93 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,51 @@ +name: Stale + +on: + schedule: + - cron: "17 3 * * *" + workflow_dispatch: + +permissions: {} + +jobs: + stale: + permissions: + issues: write + pull-requests: write + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - uses: actions/create-github-app-token@d72941d797fd3113feb6b93fd0dec494b13a2547 # v1 + id: app-token + with: + app-id: "2729701" + private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} + - name: Mark stale issues and pull requests + uses: actions/stale@v9 + with: + repo-token: ${{ steps.app-token.outputs.token }} + days-before-issue-stale: 7 + days-before-issue-close: 5 + days-before-pr-stale: 5 + days-before-pr-close: 3 + stale-issue-label: stale + stale-pr-label: stale + exempt-issue-labels: enhancement,maintainer,pinned,security,no-stale + exempt-pr-labels: maintainer,no-stale + operations-per-run: 10000 + exempt-all-assignees: true + remove-stale-when-updated: true + stale-issue-message: | + This issue has been automatically marked as stale due to inactivity. + Please add updates or it will be closed. + stale-pr-message: | + This pull request has been automatically marked as stale due to inactivity. + Please add updates or it will be closed. + close-issue-message: | + Closing due to inactivity. + If this is still an issue, please retry on the latest OpenClaw release and share updated details. + If you are absolutely sure it still happens on the latest release, open a new issue with fresh repro steps. + close-issue-reason: not_planned + close-pr-message: | + Closing due to inactivity. + If you believe this PR should be revived, post in #pr-thunderdome-dangerzone on Discord to talk to a maintainer. + That channel is the escape hatch for high-quality PRs that get auto-closed. diff --git a/.github/workflows/workflow-sanity.yml b/.github/workflows/workflow-sanity.yml new file mode 100644 index 0000000..19668e6 --- /dev/null +++ b/.github/workflows/workflow-sanity.yml @@ -0,0 +1,67 @@ +name: Workflow Sanity + +on: + pull_request: + push: + branches: [main] + +concurrency: + group: workflow-sanity-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + no-tabs: + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Fail on tabs in workflow files + run: | + python - <<'PY' + from __future__ import annotations + + import pathlib + import sys + + root = pathlib.Path(".github/workflows") + bad: list[str] = [] + for path in sorted(root.rglob("*.yml")): + if b"\t" in path.read_bytes(): + bad.append(str(path)) + + for path in sorted(root.rglob("*.yaml")): + if b"\t" in path.read_bytes(): + bad.append(str(path)) + + if bad: + print("Tabs found in workflow file(s):") + for path in bad: + print(f"- {path}") + sys.exit(1) + PY + + actionlint: + runs-on: blacksmith-16vcpu-ubuntu-2404 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install actionlint + shell: bash + run: | + set -euo pipefail + ACTIONLINT_VERSION="1.7.11" + archive="actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz" + base_url="https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}" + curl -sSfL -o "${archive}" "${base_url}/${archive}" + curl -sSfL -o checksums.txt "${base_url}/actionlint_${ACTIONLINT_VERSION}_checksums.txt" + grep " ${archive}\$" checksums.txt | sha256sum -c - + tar -xzf "${archive}" actionlint + sudo install -m 0755 actionlint /usr/local/bin/actionlint + + - name: Lint workflows + run: actionlint + + - name: Disallow direct inputs interpolation in composite run blocks + run: python3 scripts/check-composite-action-input-interpolation.py diff --git a/.gitignore b/.gitignore index 217b7f8..ac67b38 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,111 @@ -# Obsidian -.obsidian/ -.trash/ - -# OS +node_modules +**/node_modules/ +.env +docker-compose.extra.yml +dist +bun.lock +bun.lockb +coverage +__pycache__/ +*.pyc +.tsbuildinfo +.pnpm-store +.worktrees/ .DS_Store -Thumbs.db +**/.DS_Store +ui/src/ui/__screenshots__/ +ui/playwright-report/ +ui/test-results/ +packages/dashboard-next/.next/ +packages/dashboard-next/out/ + +# Mise configuration files +mise.toml + +# Android build artifacts +apps/android/.gradle/ +apps/android/app/build/ +apps/android/.cxx/ + +# Bun build artifacts +*.bun-build +apps/macos/.build/ +apps/shared/MoltbotKit/.build/ +apps/shared/OpenClawKit/.build/ +apps/shared/OpenClawKit/Package.resolved +**/ModuleCache/ +bin/ +bin/clawdbot-mac +bin/docs-list +apps/macos/.build-local/ +apps/macos/.swiftpm/ +apps/shared/MoltbotKit/.swiftpm/ +apps/shared/OpenClawKit/.swiftpm/ +Core/ +apps/ios/*.xcodeproj/ +apps/ios/*.xcworkspace/ +apps/ios/.swiftpm/ +apps/ios/.derivedData/ +apps/ios/.local-signing.xcconfig +vendor/ +apps/ios/Clawdbot.xcodeproj/ +apps/ios/Clawdbot.xcodeproj/** +apps/macos/.build/** +**/*.bun-build +apps/ios/*.xcfilelist + +# Vendor build artifacts +vendor/a2ui/renderers/lit/dist/ +src/canvas-host/a2ui/*.bundle.js +src/canvas-host/a2ui/*.map +.bundle.hash + +# fastlane (iOS) +apps/ios/fastlane/README.md +apps/ios/fastlane/report.xml +apps/ios/fastlane/Preview.html +apps/ios/fastlane/screenshots/ +apps/ios/fastlane/test_output/ +apps/ios/fastlane/logs/ +apps/ios/fastlane/.env + +# fastlane build artifacts (local) +apps/ios/*.ipa +apps/ios/*.dSYM.zip + +# provisioning profiles (local) +apps/ios/*.mobileprovision + +# Local untracked files +.local/ +docs/.local/ +IDENTITY.md +USER.md +# Template files in docs/reference/templates/ are part of the repo +!docs/reference/templates/IDENTITY.md +!docs/reference/templates/USER.md +.tgz +.idea + +# local tooling +.serena/ -# Temporary files -*.tmp -*~ -.*.swp +# Agent credentials and memory (NEVER COMMIT) +/memory/ +.agent/*.json +!.agent/workflows/ +/local/ +package-lock.json +.claude/settings.local.json +.agents/ +.agents +.agent/ -# Personal -.private/ +# Local iOS signing overrides +apps/ios/LocalSigning.xcconfig +# Generated protocol schema (produced via pnpm protocol:gen) +dist/protocol.schema.json +.ant-colony/ +# Local OpenClaw reference clone (NEVER COMMIT) openclaw/ diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc new file mode 100644 index 0000000..9403571 --- /dev/null +++ b/.markdownlint-cli2.jsonc @@ -0,0 +1,52 @@ +{ + "globs": ["docs/**/*.md", "docs/**/*.mdx", "README.md"], + "ignores": ["docs/zh-CN/**", "docs/.i18n/**", "docs/reference/templates/**", "**/.local/**"], + "config": { + "default": true, + + "MD013": false, + "MD025": false, + "MD029": false, + + "MD033": { + "allowed_elements": [ + "Note", + "Info", + "Tip", + "Warning", + "Card", + "CardGroup", + "Columns", + "Steps", + "Step", + "Tabs", + "Tab", + "Accordion", + "AccordionGroup", + "CodeGroup", + "Frame", + "Callout", + "ParamField", + "ResponseField", + "RequestExample", + "ResponseExample", + "img", + "a", + "br", + "details", + "summary", + "p", + "strong", + "picture", + "source", + "Tooltip", + "Check", + ], + }, + + "MD036": false, + "MD040": false, + "MD041": false, + "MD046": false, + }, +} diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..f0c783c --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +allow-build-scripts=@whiskeysockets/baileys,sharp,esbuild,protobufjs,fs-ext,node-pty,@lydell/node-pty,@matrix-org/matrix-sdk-crypto-nodejs diff --git a/.oxfmtrc.jsonc b/.oxfmtrc.jsonc new file mode 100644 index 0000000..445d62b --- /dev/null +++ b/.oxfmtrc.jsonc @@ -0,0 +1,24 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "experimentalSortImports": { + "newlinesBetween": false, + }, + "experimentalSortPackageJson": { + "sortScripts": true, + }, + "tabWidth": 2, + "useTabs": false, + "ignorePatterns": [ + "apps/", + "assets/", + "docker-compose.yml", + "dist/", + "docs/_layouts/", + "node_modules/", + "patches/", + "pnpm-lock.yaml/", + "src/auto-reply/reply/export-html/", + "Swabble/", + "vendor/", + ], +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..687b5bb --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,39 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["unicorn", "typescript", "oxc"], + "categories": { + "correctness": "error", + "perf": "error", + "suspicious": "error" + }, + "rules": { + "curly": "error", + "eslint-plugin-unicorn/prefer-array-find": "off", + "eslint/no-await-in-loop": "off", + "eslint/no-new": "off", + "eslint/no-shadow": "off", + "eslint/no-unmodified-loop-condition": "off", + "oxc/no-accumulating-spread": "off", + "oxc/no-async-endpoint-handlers": "off", + "oxc/no-map-spread": "off", + "typescript/no-explicit-any": "error", + "typescript/no-extraneous-class": "off", + "typescript/no-unsafe-type-assertion": "off", + "unicorn/consistent-function-scoping": "off", + "unicorn/require-post-message-target-origin": "off" + }, + "ignorePatterns": [ + "assets/", + "dist/", + "docs/_layouts/", + "extensions/", + "node_modules/", + "patches/", + "pnpm-lock.yaml", + "skills/", + "src/auto-reply/reply/export-html/template.js", + "src/canvas-host/a2ui/a2ui.bundle.js", + "Swabble/", + "vendor/" + ] +} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..e946d18 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,105 @@ +# Pre-commit hooks for openclaw +# Install: prek install +# Run manually: prek run --all-files +# +# See https://pre-commit.com for more information + +repos: + # Basic file hygiene + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + - id: trailing-whitespace + exclude: '^(docs/|dist/|vendor/|.*\.snap$)' + - id: end-of-file-fixer + exclude: '^(docs/|dist/|vendor/|.*\.snap$)' + - id: check-yaml + args: [--allow-multiple-documents] + - id: check-added-large-files + args: [--maxkb=500] + - id: check-merge-conflict + + # Secret detection (same as CI) + - repo: https://github.com/Yelp/detect-secrets + rev: v1.5.0 + hooks: + - id: detect-secrets + args: + - --baseline + - .secrets.baseline + - --exclude-files + - '(^|/)(dist/|vendor/|pnpm-lock\.yaml$|\.detect-secrets\.cfg$)' + - --exclude-lines + - 'key_content\.include\?\("BEGIN PRIVATE KEY"\)' + - --exclude-lines + - 'case \.apiKeyEnv: "API key \(env var\)"' + - --exclude-lines + - 'case apikey = "apiKey"' + - --exclude-lines + - '"gateway\.remote\.password"' + - --exclude-lines + - '"gateway\.auth\.password"' + - --exclude-lines + - '"talk\.apiKey"' + - --exclude-lines + - '=== "string"' + - --exclude-lines + - 'typeof remote\?\.password === "string"' + + # Shell script linting + - repo: https://github.com/koalaman/shellcheck-precommit + rev: v0.11.0 + hooks: + - id: shellcheck + args: [--severity=error] # Only fail on errors, not warnings/info + # Exclude vendor and scripts with embedded code or known issues + exclude: "^(vendor/|scripts/e2e/)" + + # GitHub Actions linting + - repo: https://github.com/rhysd/actionlint + rev: v1.7.10 + hooks: + - id: actionlint + + # GitHub Actions security audit + - repo: https://github.com/zizmorcore/zizmor-pre-commit + rev: v1.22.0 + hooks: + - id: zizmor + args: [--persona=regular, --min-severity=medium, --min-confidence=medium] + exclude: "^(vendor/|Swabble/)" + + # Project checks (same commands as CI) + - repo: local + hooks: + # oxlint --type-aware src test + - id: oxlint + name: oxlint + entry: scripts/pre-commit/run-node-tool.sh oxlint --type-aware src test + language: system + pass_filenames: false + types_or: [javascript, jsx, ts, tsx] + + # oxfmt --check src test + - id: oxfmt + name: oxfmt + entry: scripts/pre-commit/run-node-tool.sh oxfmt --check src test + language: system + pass_filenames: false + types_or: [javascript, jsx, ts, tsx] + + # swiftlint (same as CI) + - id: swiftlint + name: swiftlint + entry: swiftlint --config .swiftlint.yml + language: system + pass_filenames: false + types: [swift] + + # swiftformat --lint (same as CI) + - id: swiftformat + name: swiftformat + entry: swiftformat --lint apps/macos/Sources --config .swiftformat + language: system + pass_filenames: false + types: [swift] diff --git a/.secrets.baseline b/.secrets.baseline new file mode 100644 index 0000000..089515f --- /dev/null +++ b/.secrets.baseline @@ -0,0 +1,13104 @@ +{ + "version": "1.5.0", + "plugins_used": [ + { + "name": "ArtifactoryDetector" + }, + { + "name": "AWSKeyDetector" + }, + { + "name": "AzureStorageKeyDetector" + }, + { + "name": "Base64HighEntropyString", + "limit": 4.5 + }, + { + "name": "BasicAuthDetector" + }, + { + "name": "CloudantDetector" + }, + { + "name": "DiscordBotTokenDetector" + }, + { + "name": "GitHubTokenDetector" + }, + { + "name": "GitLabTokenDetector" + }, + { + "name": "HexHighEntropyString", + "limit": 3.0 + }, + { + "name": "IbmCloudIamDetector" + }, + { + "name": "IbmCosHmacDetector" + }, + { + "name": "IPPublicDetector" + }, + { + "name": "JwtTokenDetector" + }, + { + "name": "KeywordDetector", + "keyword_exclude": "" + }, + { + "name": "MailchimpDetector" + }, + { + "name": "NpmDetector" + }, + { + "name": "OpenAIDetector" + }, + { + "name": "PrivateKeyDetector" + }, + { + "name": "PypiTokenDetector" + }, + { + "name": "SendGridDetector" + }, + { + "name": "SlackDetector" + }, + { + "name": "SoftlayerDetector" + }, + { + "name": "SquareOAuthDetector" + }, + { + "name": "StripeDetector" + }, + { + "name": "TelegramBotTokenDetector" + }, + { + "name": "TwilioKeyDetector" + } + ], + "filters_used": [ + { + "path": "detect_secrets.filters.allowlist.is_line_allowlisted" + }, + { + "path": "detect_secrets.filters.common.is_baseline_file", + "filename": ".secrets.baseline" + }, + { + "path": "detect_secrets.filters.common.is_ignored_due_to_verification_policies", + "min_level": 2 + }, + { + "path": "detect_secrets.filters.heuristic.is_indirect_reference" + }, + { + "path": "detect_secrets.filters.heuristic.is_likely_id_string" + }, + { + "path": "detect_secrets.filters.heuristic.is_lock_file" + }, + { + "path": "detect_secrets.filters.heuristic.is_not_alphanumeric_string" + }, + { + "path": "detect_secrets.filters.heuristic.is_potential_uuid" + }, + { + "path": "detect_secrets.filters.heuristic.is_prefixed_with_dollar_sign" + }, + { + "path": "detect_secrets.filters.heuristic.is_sequential_string" + }, + { + "path": "detect_secrets.filters.heuristic.is_swagger_file" + }, + { + "path": "detect_secrets.filters.heuristic.is_templated_secret" + }, + { + "path": "detect_secrets.filters.regex.should_exclude_file", + "pattern": [ + "(^|/)pnpm-lock\\.yaml$" + ] + }, + { + "path": "detect_secrets.filters.regex.should_exclude_line", + "pattern": [ + "key_content\\.include\\?\\(\"BEGIN PRIVATE KEY\"\\)", + "case \\.apiKeyEnv: \"API key \\(env var\\)\"", + "case apikey = \"apiKey\"", + "\"gateway\\.remote\\.password\"", + "\"gateway\\.auth\\.password\"", + "\"talk\\.apiKey\"", + "=== \"string\"", + "typeof remote\\?\\.password === \"string\"" + ] + } + ], + "results": { + ".detect-secrets.cfg": [ + { + "type": "Private Key", + "filename": ".detect-secrets.cfg", + "hashed_secret": "1348b145fa1a555461c1b790a2f66614781091e9", + "is_verified": false, + "line_number": 17 + }, + { + "type": "Secret Keyword", + "filename": ".detect-secrets.cfg", + "hashed_secret": "fe88fceb47e040ba1bfafa4ac639366188df2f6d", + "is_verified": false, + "line_number": 19 + } + ], + "appcast.xml": [ + { + "type": "Base64 High Entropy String", + "filename": "appcast.xml", + "hashed_secret": "2bc43713edb8f775582c6314953b7c020d691aba", + "is_verified": false, + "line_number": 141 + }, + { + "type": "Base64 High Entropy String", + "filename": "appcast.xml", + "hashed_secret": "2fcd83b35235522978c19dbbab2884a09aa64f35", + "is_verified": false, + "line_number": 209 + }, + { + "type": "Base64 High Entropy String", + "filename": "appcast.xml", + "hashed_secret": "78b65f0952ed8a557e0f67b2364ff67cb6863bc8", + "is_verified": false, + "line_number": 310 + } + ], + "apps/android/app/src/test/java/ai/openclaw/android/node/AppUpdateHandlerTest.kt": [ + { + "type": "Hex High Entropy String", + "filename": "apps/android/app/src/test/java/ai/openclaw/android/node/AppUpdateHandlerTest.kt", + "hashed_secret": "ee662f2bc691daa48d074542722d8e1b0587673c", + "is_verified": false, + "line_number": 58 + } + ], + "apps/ios/Sources/Gateway/GatewaySettingsStore.swift": [ + { + "type": "Secret Keyword", + "filename": "apps/ios/Sources/Gateway/GatewaySettingsStore.swift", + "hashed_secret": "5f7c0c35e552780b67fe1c0ee186764354793be3", + "is_verified": false, + "line_number": 28 + } + ], + "apps/ios/Tests/DeepLinkParserTests.swift": [ + { + "type": "Secret Keyword", + "filename": "apps/ios/Tests/DeepLinkParserTests.swift", + "hashed_secret": "1a91d62f7ca67399625a4368a6ab5d4a3baa6073", + "is_verified": false, + "line_number": 89 + } + ], + "apps/macos/Sources/OpenClawProtocol/GatewayModels.swift": [ + { + "type": "Secret Keyword", + "filename": "apps/macos/Sources/OpenClawProtocol/GatewayModels.swift", + "hashed_secret": "7990585255d25249fb1e6eac3d2bd6c37429b2cd", + "is_verified": false, + "line_number": 1492 + } + ], + "apps/macos/Tests/OpenClawIPCTests/AnthropicAuthResolverTests.swift": [ + { + "type": "Secret Keyword", + "filename": "apps/macos/Tests/OpenClawIPCTests/AnthropicAuthResolverTests.swift", + "hashed_secret": "e761624445731fcb8b15da94343c6b92e507d190", + "is_verified": false, + "line_number": 26 + }, + { + "type": "Secret Keyword", + "filename": "apps/macos/Tests/OpenClawIPCTests/AnthropicAuthResolverTests.swift", + "hashed_secret": "a23c8630c8a5fbaa21f095e0269c135c20d21689", + "is_verified": false, + "line_number": 42 + } + ], + "apps/macos/Tests/OpenClawIPCTests/GatewayEndpointStoreTests.swift": [ + { + "type": "Secret Keyword", + "filename": "apps/macos/Tests/OpenClawIPCTests/GatewayEndpointStoreTests.swift", + "hashed_secret": "19dad5cecb110281417d1db56b60e1b006d55bb4", + "is_verified": false, + "line_number": 61 + } + ], + "apps/macos/Tests/OpenClawIPCTests/GatewayLaunchAgentManagerTests.swift": [ + { + "type": "Secret Keyword", + "filename": "apps/macos/Tests/OpenClawIPCTests/GatewayLaunchAgentManagerTests.swift", + "hashed_secret": "1a91d62f7ca67399625a4368a6ab5d4a3baa6073", + "is_verified": false, + "line_number": 13 + } + ], + "apps/macos/Tests/OpenClawIPCTests/TailscaleIntegrationSectionTests.swift": [ + { + "type": "Secret Keyword", + "filename": "apps/macos/Tests/OpenClawIPCTests/TailscaleIntegrationSectionTests.swift", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 27 + } + ], + "apps/shared/OpenClawKit/Sources/OpenClawKit/GatewayChannel.swift": [ + { + "type": "Secret Keyword", + "filename": "apps/shared/OpenClawKit/Sources/OpenClawKit/GatewayChannel.swift", + "hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", + "is_verified": false, + "line_number": 106 + } + ], + "apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift": [ + { + "type": "Secret Keyword", + "filename": "apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift", + "hashed_secret": "7990585255d25249fb1e6eac3d2bd6c37429b2cd", + "is_verified": false, + "line_number": 1492 + } + ], + "docs/.i18n/zh-CN.tm.jsonl": [ + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6ba7bb7047f44b28279fbb11350e1a7bf4e7de59", + "is_verified": false, + "line_number": 1 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e83ec66165edcee8f2b408b5e6bafe4844071f8f", + "is_verified": false, + "line_number": 2 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8793597fb80169cbcefe08a1b0151138b7ab78bd", + "is_verified": false, + "line_number": 3 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "af6b2a2ef841b637288e2eb2726e20ed9c3974c0", + "is_verified": false, + "line_number": 4 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "db1f9e54942e872f3a7b29aa174c70a3167d76f2", + "is_verified": false, + "line_number": 5 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f66de1a7ae418bd55115d4fac319824deb0d88cb", + "is_verified": false, + "line_number": 6 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "98510d5b8050a30514bc7fa147af6f66e5e34804", + "is_verified": false, + "line_number": 7 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b03e1a8bbe1b422cb64d7aea071d94088b6c1768", + "is_verified": false, + "line_number": 8 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6f72b03efde2d701a7e882dcaed1e935484a8e67", + "is_verified": false, + "line_number": 9 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "57d35c7411cff6f679c4a437d3251c0532fbe3cb", + "is_verified": false, + "line_number": 10 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fbffe72a354d73fad191eec6605543d3e8e5f549", + "is_verified": false, + "line_number": 11 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ceb3b4e53c22f7e28ab7006c9e1931bd31d534e1", + "is_verified": false, + "line_number": 12 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3eb65eb5d24ab5bd58a57bcd1a1894c1d05ad7f6", + "is_verified": false, + "line_number": 13 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "88e065467489c885d4d80d8f582707f3ca6284e6", + "is_verified": false, + "line_number": 14 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fd9e2dd936c475429f6d461056c5d97d1635de2e", + "is_verified": false, + "line_number": 15 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b7a629ae866eda49b01fe2eccbf842b52594442a", + "is_verified": false, + "line_number": 16 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "67c615ed823ff022c807fcb65d52bd454a52bc1f", + "is_verified": false, + "line_number": 17 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "121e6974c091fafcc6e493892b7e7ffe3c81e7eb", + "is_verified": false, + "line_number": 18 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2be720cb8d166c422e71de2c43dbb5832c952df5", + "is_verified": false, + "line_number": 19 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e44ba9d2b09e8923191b76eb9f58127ad9980cae", + "is_verified": false, + "line_number": 20 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ff53d507245282f09d082321e8ef511a3e2af5ff", + "is_verified": false, + "line_number": 21 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7ecbf8a10b1e8bc096b49c27d3b70812778205eb", + "is_verified": false, + "line_number": 22 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5628e70d1f7717c328418619beb0ae164fb5075c", + "is_verified": false, + "line_number": 23 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b0b8efbb45c2854a57241d51c2b556838eaebc00", + "is_verified": false, + "line_number": 24 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "686c14971a01fa1737cc2c00790933213b688e52", + "is_verified": false, + "line_number": 25 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6311a112d1ef120acc3247c79a07721b9dc52f5b", + "is_verified": false, + "line_number": 26 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0765cbc88514c95526bffd2e5b5144e050969aae", + "is_verified": false, + "line_number": 27 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8d4d995d95dae479362773b1fe5ff943f735dd97", + "is_verified": false, + "line_number": 28 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6da60e76ffee6f074c22f89fbfe1969b9b5bbbe2", + "is_verified": false, + "line_number": 29 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "40efc129489cfc37e7f114be79db3843adfd6549", + "is_verified": false, + "line_number": 30 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "976e548e417838885ab177817cf2b04f9c390571", + "is_verified": false, + "line_number": 31 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "26ad87428b833b4d5d569c10ec5bd7cc32019a0a", + "is_verified": false, + "line_number": 32 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "45f8de688074faa92a647dcf9f67b670de68a2b0", + "is_verified": false, + "line_number": 33 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "24d6fb4ef117d39c5f9c45a205faf1c85f356fa0", + "is_verified": false, + "line_number": 34 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "172a6875ed57d321409cb9c27d425b0b41eacb29", + "is_verified": false, + "line_number": 35 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bf13e4219d558c0deff114eb6b6098dd12d30e90", + "is_verified": false, + "line_number": 36 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1c91d3756008237ba0540b5831e88763e45a4fa9", + "is_verified": false, + "line_number": 37 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "63f55dcafa051c764eebfc72939788ec777fa3b5", + "is_verified": false, + "line_number": 38 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2fec58745fb43cefe32e523ca60285baa33825c3", + "is_verified": false, + "line_number": 39 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7dc4fc41a5c1ba307be067570a0e458f3b139696", + "is_verified": false, + "line_number": 40 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "26e2d413623e29e208ee2e71dd8aa02db3f0daa5", + "is_verified": false, + "line_number": 41 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "816184e85b856e06b4d70967ce713e72b22292e5", + "is_verified": false, + "line_number": 42 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "874b4362c636af8f5b4aebe013ae321ab0b83fd9", + "is_verified": false, + "line_number": 43 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8e89a4e4945335d905762eb2dc5e8510abc9716d", + "is_verified": false, + "line_number": 44 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7d4eb519b7fa3bce189b20609de596db82b56fae", + "is_verified": false, + "line_number": 45 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "22f878f965c38ebecdfd6ba0229e118cbfc80b00", + "is_verified": false, + "line_number": 46 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2b2b5ced0fb09d74ab6fba9f058139ef47ad6bda", + "is_verified": false, + "line_number": 47 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ff5c4ac7b55661c8bb699005b3ba9e0299b66ec9", + "is_verified": false, + "line_number": 48 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "541344e343f0f02cb1548729b073161d0b44c373", + "is_verified": false, + "line_number": 49 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "886979ee264082f1daebc1a2c95e9376281869fa", + "is_verified": false, + "line_number": 50 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d1c7b012097938e3b75365359d49aa134768f64f", + "is_verified": false, + "line_number": 51 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9c6a58787264a4fb0a823f9e20fd2c9abf82b96d", + "is_verified": false, + "line_number": 52 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "79e2c2821ed6a8b47486b4ddea90be8c7d4ad5b8", + "is_verified": false, + "line_number": 53 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ae8e49c80ed43d16eef9f633c28879b3166318ab", + "is_verified": false, + "line_number": 54 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f96db0197e1d67eab1197a03c107b07a71cd0ce7", + "is_verified": false, + "line_number": 55 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cf799fdab5d19a32f25735f5b6a1265b6e30c33d", + "is_verified": false, + "line_number": 56 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9d2165cc2b208ca555fb00ddaa1768455c89c4d0", + "is_verified": false, + "line_number": 57 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9139a8402a3454c747b23df0d7c8e957312dd6d2", + "is_verified": false, + "line_number": 58 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "00bb66a6c79ba6cfebbf1018a83af7129a29a479", + "is_verified": false, + "line_number": 59 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5b43b45627cffb5959d10386ec63025d28dbeec4", + "is_verified": false, + "line_number": 60 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c99e2f9d7726da2ea48cb07e71a33a757cb12118", + "is_verified": false, + "line_number": 61 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1880416d744d0693237d330f6ca744b59e7e12b4", + "is_verified": false, + "line_number": 62 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2ed0dc836758d77d6a96c6b96d054697a59d64f0", + "is_verified": false, + "line_number": 63 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8f34c522fe85146a367d92efe27488718791707e", + "is_verified": false, + "line_number": 64 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5bc1ce83e698af25ed3427553c8a3fcf8aaefdc9", + "is_verified": false, + "line_number": 65 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "05e16bf4e66e22a4a83defe89f6e746becf049b8", + "is_verified": false, + "line_number": 66 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "97b2b3d469cde6e5e88ac0089433c772d2d86b0d", + "is_verified": false, + "line_number": 67 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "149e7eb26c3598e6fa620c61de9e7562d7995e01", + "is_verified": false, + "line_number": 68 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5ec42634100091a94f71a2fd14820cb535df481e", + "is_verified": false, + "line_number": 69 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8d6ef196daa5e81bda9ac982bcb40a6f07d4f50c", + "is_verified": false, + "line_number": 70 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2d5c79b7d58642498f734dbe2c1245159a277a1e", + "is_verified": false, + "line_number": 71 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7efd41240b058195c11e1ea621060bc8c82df8fc", + "is_verified": false, + "line_number": 72 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "47f6371bd5fe1746bcade2fea59cb8d93ff5c4e0", + "is_verified": false, + "line_number": 73 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c67ce872a65c537d8748b302f45479714a04c420", + "is_verified": false, + "line_number": 74 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fc32724374d238112dd530743e85af73f1c8eb8e", + "is_verified": false, + "line_number": 75 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a01d187f1b0f38159c62f32405796de21548be31", + "is_verified": false, + "line_number": 76 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a39ae2ab785dc2d4aab7856b0a7c6e4e5875b215", + "is_verified": false, + "line_number": 77 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4ad4b170f1617e562f07cba453b69c8bc53cb5cd", + "is_verified": false, + "line_number": 78 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b0e551f8b6fbe0147169202fbc141c1a0478dfb2", + "is_verified": false, + "line_number": 79 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "02593ce120c7398316c65894a5fa4be694ea3cee", + "is_verified": false, + "line_number": 80 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "789bc546ba1936b86999373fca6d6a6a4899a787", + "is_verified": false, + "line_number": 81 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ee29461a81f3e898f4376d270ac84b8567f9b68c", + "is_verified": false, + "line_number": 82 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "235f549d4c65ec31307e0887204c428441d6229f", + "is_verified": false, + "line_number": 83 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "87b2376e9f5457bad56b7fb363c6a5f86d8f119a", + "is_verified": false, + "line_number": 84 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c3b3424f5845769977ccb309a3c2b70117989e3c", + "is_verified": false, + "line_number": 85 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "88ddc980ca5f609c2806df08e2e1b9b206153817", + "is_verified": false, + "line_number": 86 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "af48a18326858bfcef8e5f3a850fba0f9d462549", + "is_verified": false, + "line_number": 87 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c22217254346f8d551183caac2f73ec8284953b3", + "is_verified": false, + "line_number": 88 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2de7388be37ebdde032f5e169940da7c9d38ac8b", + "is_verified": false, + "line_number": 89 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "98facee0b1bf74672bacb855a27972851929dd78", + "is_verified": false, + "line_number": 90 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0a5cae7f96ade77892c5caa993b6d19cd41232fb", + "is_verified": false, + "line_number": 91 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fe0da76f124e112f6702f2e9c62514238398ba8d", + "is_verified": false, + "line_number": 92 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d5ce761d7b87445aa65b1734ad36c5d3d1d71c2a", + "is_verified": false, + "line_number": 93 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f5b70c708f3034bd837835329603a499207c4fb5", + "is_verified": false, + "line_number": 94 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "50d6381367811dd8a0ad61bf1dd2c3619ece8a44", + "is_verified": false, + "line_number": 95 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fe061e35aafc5841544633d917f55357813c0906", + "is_verified": false, + "line_number": 96 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "dc8722d30a33248ccc5dd9012fba71eefd3a44ac", + "is_verified": false, + "line_number": 97 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2fb43da561bbb79d7cf89e5d6c5102c1436f6f49", + "is_verified": false, + "line_number": 98 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cf61d12e9d98f6ba507bf40285d05f37fe158a01", + "is_verified": false, + "line_number": 99 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "dfeb7563bafd2d89888b8b440dee49d089daeb78", + "is_verified": false, + "line_number": 100 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fea45d453b5b8650cda0b2b9db6b85b60c503d6c", + "is_verified": false, + "line_number": 101 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bb7538d46b4fde60dc88be303de19d35fe89019d", + "is_verified": false, + "line_number": 102 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "08e0674faf444c6dc671036d900e3decce98d1eb", + "is_verified": false, + "line_number": 103 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e261897f1d1a99aafec462606b65228331e30583", + "is_verified": false, + "line_number": 104 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ffe19721c941dfb929b30707c8513e2f0c8c4dc7", + "is_verified": false, + "line_number": 105 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fe1fc5b0e4ca6aa0189f77a9d78b852201366b81", + "is_verified": false, + "line_number": 106 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "590787fa67e0d75346ed1a3850f98741b6a49506", + "is_verified": false, + "line_number": 107 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "eccb56a947e4d36b8e9d51d0e071caf1a978c6f2", + "is_verified": false, + "line_number": 108 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c301ee23c9e41d15d5c58c7cd5939e41e7d1eb99", + "is_verified": false, + "line_number": 109 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9f8607273e42be64e9779e59455706923081cd80", + "is_verified": false, + "line_number": 110 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "72d31fe5a3e5b6e818f5fd3ec97a9ac0042acec7", + "is_verified": false, + "line_number": 111 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bb9158c9b6e8a0a1007b93b92ec531bdd9ffd32e", + "is_verified": false, + "line_number": 112 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c2ca44d18bd79c0f1b663d8bc3dfcfb02a7e02df", + "is_verified": false, + "line_number": 113 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "eac2c4cc6263495036a0ef8d8aaf2d8075167249", + "is_verified": false, + "line_number": 114 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f55341301796552621f367fff6ea9a2bd076df29", + "is_verified": false, + "line_number": 115 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "21967ac89d793aa883840d7a71308514e9e1dc4e", + "is_verified": false, + "line_number": 116 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "679dc9deb86fd7375692381ae784de604a552ae3", + "is_verified": false, + "line_number": 117 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "dd90f8337c050490f6e9b191fb603c9ad402d8c0", + "is_verified": false, + "line_number": 118 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3c8bfe5a9f458f3884e67768465ac1c17ff80e0f", + "is_verified": false, + "line_number": 119 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3f01eb8d14a37b6e087592d109baf01e603417eb", + "is_verified": false, + "line_number": 120 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "021709695261ffbc463f12b726d9dd6c27abb6f0", + "is_verified": false, + "line_number": 121 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a09a21e3684c15de00769686d906f72dd664f663", + "is_verified": false, + "line_number": 122 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "15a62195ff8e8694bfd7045af4391df383b990ed", + "is_verified": false, + "line_number": 123 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "010fa027e45282a3941133bf3403ab98cacc9edd", + "is_verified": false, + "line_number": 124 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e19fd3f99a05ccf60d1083f5601dea6817b1ac03", + "is_verified": false, + "line_number": 125 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d17a8e92d9f18e17c7477d375dcac30af8c34ff5", + "is_verified": false, + "line_number": 126 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c33ae1092a63f763487a4e0d84720b06a2523880", + "is_verified": false, + "line_number": 127 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9486a607ef0dcb94ce9ac75a85f0a76230defd1d", + "is_verified": false, + "line_number": 128 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1d850e2d57c74a691b52e3e2526c2767865fb798", + "is_verified": false, + "line_number": 129 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "60a0c030c7e8a5beddd199d1061825b5684ab4ae", + "is_verified": false, + "line_number": 130 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2986a818d44589ee322b0d05a751b9184b74ebac", + "is_verified": false, + "line_number": 131 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "440aad6aaad76b0dab4c53eb8a9c511d38f5ee1c", + "is_verified": false, + "line_number": 132 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "372c99f2afefff2b07dd4611b07c6830ec1014f3", + "is_verified": false, + "line_number": 133 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "99678a4cbb8d20741f35f04235ee808686a5ee52", + "is_verified": false, + "line_number": 134 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3486b5c6f177ac543d846a9195d3291a0d3bd724", + "is_verified": false, + "line_number": 135 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2902179aba6cb39f2c7b774649301a368a39b969", + "is_verified": false, + "line_number": 136 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4108ee51d5c321b98393b68a262b74d6377cec76", + "is_verified": false, + "line_number": 137 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8abe8434123396924dc964759bc7823d59b31283", + "is_verified": false, + "line_number": 138 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a2a8363585b5988aeff2a2c8c878c15445322a52", + "is_verified": false, + "line_number": 139 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bbbcc1630c23a709000e6da74ca22fe18b78b919", + "is_verified": false, + "line_number": 140 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "be582fadd937879b93b46e404049076080faed08", + "is_verified": false, + "line_number": 141 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "15320eb2e8d97720f682f8dc5105cb86a539a452", + "is_verified": false, + "line_number": 142 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "611278690506b584ecc5d4c88b334dbe7e9b8c54", + "is_verified": false, + "line_number": 143 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8a08069ce7a3702f245f8c50ac49a529092384be", + "is_verified": false, + "line_number": 144 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8cf1444399ca01a1bf569233106065b30c103cd2", + "is_verified": false, + "line_number": 145 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4a5a11832d16a4c2c6914d05397ce3e6f457572f", + "is_verified": false, + "line_number": 146 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "80490973b1980ad3740d42426c7c0f2986cbe462", + "is_verified": false, + "line_number": 147 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "495d2b2d95ba56eded4e4d738b229dd5caaeea67", + "is_verified": false, + "line_number": 148 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2264d1d1a69546223eb2754465a1b40ce20ab936", + "is_verified": false, + "line_number": 149 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6e9e9f0b269aacbf7358498c088c226a9296de14", + "is_verified": false, + "line_number": 150 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1cb9e17cefe3759cb8fd0de893e8a12531c4375b", + "is_verified": false, + "line_number": 151 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ddc15a0e8c7caca06cf93d15768533595b8ba232", + "is_verified": false, + "line_number": 152 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7dbafb9953c44da0cc46c003d3dacd14a32a4438", + "is_verified": false, + "line_number": 153 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "be61d29ac11ba55400fcaf405a1b404e269e528e", + "is_verified": false, + "line_number": 154 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2e65dec5c2802e2bb8102d3cd8d0a7e031a6b130", + "is_verified": false, + "line_number": 155 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c43e69c82865cf66a55df2d00a9e842df3525669", + "is_verified": false, + "line_number": 156 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "084448bff84b39813fc1efe3ff5840807d7da8f9", + "is_verified": false, + "line_number": 157 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e175aaf2f1a6929f95138b56d92ae7b84b831ffe", + "is_verified": false, + "line_number": 158 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9d6deadf9c4eb8ea0240ecca10258afb9b39e0a2", + "is_verified": false, + "line_number": 159 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4bf318f05592507a55a872cdb1a5739ad4477293", + "is_verified": false, + "line_number": 160 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b71cc2bafb860b166886bb522c191f45d405cc76", + "is_verified": false, + "line_number": 161 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a723b7af4e7b4ede705855c03e4d3ac8b17a17a0", + "is_verified": false, + "line_number": 162 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "595c5493c18960b81043b1aaa0ada4a86a493f2b", + "is_verified": false, + "line_number": 163 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "dee9b3f8262451274b6451ead384675a75700188", + "is_verified": false, + "line_number": 164 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b300397e68cfcee9898e8e00f7395a27f8280070", + "is_verified": false, + "line_number": 165 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "44973e389b0e5b25d51439d6a9b6c9d43fdd6ee0", + "is_verified": false, + "line_number": 166 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "93ebcb14fec5ae9ae41b0bdce7d6aa2971298e47", + "is_verified": false, + "line_number": 167 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c5b1332b11dd3ba639ce2fdaaa025bad034207e9", + "is_verified": false, + "line_number": 168 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4927a4f45fa60e6d8deb3d42ca896410d791f3db", + "is_verified": false, + "line_number": 169 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "081e263d2c8f882eb19692648f71ac03a8731c09", + "is_verified": false, + "line_number": 170 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ef5eba4fd8203b259dd839628ddc0d9a3ed6f97f", + "is_verified": false, + "line_number": 171 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c90d7323630daddb2824cd0d9e637521237e2454", + "is_verified": false, + "line_number": 172 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "99e13b6a3b2c3c60603df94711c67938be98e776", + "is_verified": false, + "line_number": 173 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2c55757167c8ecf90790ad052900e790f269619e", + "is_verified": false, + "line_number": 174 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f3e5c54b01b6e69be585cd9142ed7abe5d4056e5", + "is_verified": false, + "line_number": 175 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b0dd1c28e143d597218a174dbe0274598c59b9c8", + "is_verified": false, + "line_number": 176 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9a1fe8341b21243d6116f6b3375877b7fa9b34d7", + "is_verified": false, + "line_number": 177 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e6b9bc000db030828a117a2d31a0598a84120186", + "is_verified": false, + "line_number": 178 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8e40eebcfe379882ecbfb761bb470c208826ebf8", + "is_verified": false, + "line_number": 179 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "afd7a7532b580be96e7cc3c0e368a89f31ef621c", + "is_verified": false, + "line_number": 180 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bfd20c7315b569fab2449be3018de404ed0d6fc3", + "is_verified": false, + "line_number": 181 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ccba0997cbb3cea20186ca1d3d3b170044e78f27", + "is_verified": false, + "line_number": 182 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "43cd2dcd4adf33ef138634454d93153671a58357", + "is_verified": false, + "line_number": 183 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7244b34d4c1c0014497a432c580eeea0498b7996", + "is_verified": false, + "line_number": 184 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ec96512c56ade3837920de713f54fa81e6463a5b", + "is_verified": false, + "line_number": 185 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f9ab8ac96faef103a825c131a9f6aa18aaf5c496", + "is_verified": false, + "line_number": 186 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "988b02f25fa7b8124ad9d5e3127ec7690bd7f568", + "is_verified": false, + "line_number": 187 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "71d4e0487a5ed7f3f82b2256bed1efb3797c99e2", + "is_verified": false, + "line_number": 188 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4dad8db6d2449abd1800ac11f64dd362f579a823", + "is_verified": false, + "line_number": 189 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d079b5fbe50b0b84ad69a0d061b4307a3a0a6688", + "is_verified": false, + "line_number": 190 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c2672b9214bb9991530f943c1a5a0d05977c0f0a", + "is_verified": false, + "line_number": 191 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f3a8f4566cd7f256979933da8536f6dafb05d447", + "is_verified": false, + "line_number": 192 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e3b44891d5e5ec135f1e977ec5fd79c74ca11d9c", + "is_verified": false, + "line_number": 193 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8542da23c2d0a4b0bcab3939f096b31e3131d85f", + "is_verified": false, + "line_number": 194 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fb281df2d7a6793a43236092a3fcc1b038db56c9", + "is_verified": false, + "line_number": 195 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "727686c68fa10c5edecbf37cdfec2d44f3a5f669", + "is_verified": false, + "line_number": 196 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e7957179705dafeab8797bb8f90fcaf5ad0a61ee", + "is_verified": false, + "line_number": 197 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7424aea64d7c75511030d719e479517e8bef9d25", + "is_verified": false, + "line_number": 198 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3ad22266e9a3214addc49722b44d9559eb7cbedc", + "is_verified": false, + "line_number": 199 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8b00c700bf0f6c74820e1ad93d812f961989d69e", + "is_verified": false, + "line_number": 200 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2eef664e5193da7dde51adccd6d726a988701aaf", + "is_verified": false, + "line_number": 201 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9186e0986b4b7967aa03cfe311149d508d22e6aa", + "is_verified": false, + "line_number": 202 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1a639bb9895dc305d6db698183635c1f8b173c5c", + "is_verified": false, + "line_number": 203 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b5fbec5f1451e2d940c70945a01323eda82984bd", + "is_verified": false, + "line_number": 204 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ebb046a7ba8464ce615d215edb8b1fd82a1357b6", + "is_verified": false, + "line_number": 205 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "719e3976a5a00a7473cd38f81f712ca8c6e522e1", + "is_verified": false, + "line_number": 206 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "12cde4d54e7136273e8aa76d161b6f143469ef6d", + "is_verified": false, + "line_number": 207 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e04ec69eef9a4325231986801ebd42d3159ccca7", + "is_verified": false, + "line_number": 208 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "07c8e9accb3cfcc748b91d0369629fa1ee90576f", + "is_verified": false, + "line_number": 209 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3b00038548a6119fba962ca93f6bd24035d5571e", + "is_verified": false, + "line_number": 210 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2914f579938a910fb510898044063bec779e5ad5", + "is_verified": false, + "line_number": 211 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "868cf20bb88168a03fa29c7261762c97430ea0fc", + "is_verified": false, + "line_number": 212 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0475a43ad50f08c4a7012c4a87f15eeee3762ff9", + "is_verified": false, + "line_number": 213 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5ebe715bd56f0448d0374adae8568a6d86856442", + "is_verified": false, + "line_number": 214 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9c6dff479fd398382a289dc8f60cabf06fa60a26", + "is_verified": false, + "line_number": 215 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0102959abc9fee55edba97642bb1bcc546ce07dc", + "is_verified": false, + "line_number": 216 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "45459296596dbed9d7fbf7eab7a9645eb4fa107a", + "is_verified": false, + "line_number": 217 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5a5a491d064e789e785a8b080d38d9d1cc7d207f", + "is_verified": false, + "line_number": 218 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f3005c052e76c7e804c10403bdfcd9265a9de2ea", + "is_verified": false, + "line_number": 219 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "73aaaaf5bcab49cc1b1f47b45eae9b31db783a66", + "is_verified": false, + "line_number": 220 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "13aae30474af34fdede678dc5e8c00c075612707", + "is_verified": false, + "line_number": 221 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "336edbc017f4dadc0bf047e0f6d1889679fc3b48", + "is_verified": false, + "line_number": 222 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7bff3213c39d3873551698ec233998613e6b69dc", + "is_verified": false, + "line_number": 223 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9f1a6484627a58c233e1ec3f0aeffe4ff2d8a440", + "is_verified": false, + "line_number": 224 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d7c80e31311e912fb766bb2348b02785c28d878b", + "is_verified": false, + "line_number": 225 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2c75cc7344d810bb26cb768be82e843af623001a", + "is_verified": false, + "line_number": 226 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "607df6be12ab20f70a64076c372b178d6c10bc00", + "is_verified": false, + "line_number": 227 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9b7fed64d1f0682953011eb4702467dee8cd1174", + "is_verified": false, + "line_number": 228 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e982d9359554bc4a5c58d9d8d4387843e6e5cbb4", + "is_verified": false, + "line_number": 229 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c2f3985aed2da033a083cb330fb006239b2a1c8e", + "is_verified": false, + "line_number": 230 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "23d658cf19e1e76efbfa3498d2c2ed091c60b1f4", + "is_verified": false, + "line_number": 231 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a58be87cd80825e211c567b3c5397e122f702019", + "is_verified": false, + "line_number": 232 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f96f43b99c2f249a03a2e57e097c236561a1162c", + "is_verified": false, + "line_number": 233 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2fc8f0d1c9fadfb9cc384af21c8d3716c99a40f6", + "is_verified": false, + "line_number": 234 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f229dfc403d5b25f3362e73c4a7dc05233ecd4b6", + "is_verified": false, + "line_number": 235 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cf79e1dd8ff4c91b3346f5153780ba52438830be", + "is_verified": false, + "line_number": 236 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "20a1e643e857f0f63923b810289ab4b6c848252e", + "is_verified": false, + "line_number": 237 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9754246ca2c82802cc557d5958175d94ae5c760b", + "is_verified": false, + "line_number": 238 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ca0abe4a600e610c1bbbb25de89390251811ed1c", + "is_verified": false, + "line_number": 239 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b9c7402f138d31bea12092e7243ac7050a693146", + "is_verified": false, + "line_number": 240 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "07e9e0d4ea04d51535c0ec78454f32830dcfe8da", + "is_verified": false, + "line_number": 241 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9872435a00467574f08579e551e3900c65f2b36e", + "is_verified": false, + "line_number": 242 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "eec328050797cfffad3dc2dd6dd16d8ec33675f6", + "is_verified": false, + "line_number": 243 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b3b084478fcaec50b9f7e39dfef8bda422d48d91", + "is_verified": false, + "line_number": 244 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2093470fb2ffad170981ec4b030b0292929f3022", + "is_verified": false, + "line_number": 245 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b920a9ef2ec94e4e4edac20163e006425a391da4", + "is_verified": false, + "line_number": 246 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "06455554c00ce5845d49ebef199c0021b208d5df", + "is_verified": false, + "line_number": 247 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a077b13877b651822b80de2903f4b6acdbac3433", + "is_verified": false, + "line_number": 248 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "78fd658f1b01b01b25be00348caeced0e3ad0b29", + "is_verified": false, + "line_number": 249 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "79f7d6f792cc4e4ba79e3bf7cd3538fb65e4399a", + "is_verified": false, + "line_number": 250 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8280b950e62db218766e1087ec5771ec93de3b36", + "is_verified": false, + "line_number": 251 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "11fffafcae5d1e1aacf6f3c3a0235bbed17cacb2", + "is_verified": false, + "line_number": 252 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f0aebb371b0356a2e803f625a1274299544e0472", + "is_verified": false, + "line_number": 253 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bce9139737d07f1759822ac6e458eff6c06c1dae", + "is_verified": false, + "line_number": 254 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a61bed5d464a3dd53f1814dc44da919124e2c72b", + "is_verified": false, + "line_number": 255 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9c553b7e8c46273c6e1841f82032a11f697cafe1", + "is_verified": false, + "line_number": 256 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "24535adb56bd8d682e42561ded0eaab8a1a18475", + "is_verified": false, + "line_number": 257 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7f16429d5dba0340ae2ec02921abbe054ad4d9fd", + "is_verified": false, + "line_number": 258 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "61bac3ad8d011d3db96793f70a9fdaf5def37244", + "is_verified": false, + "line_number": 259 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "413654967fff8eae5dd1fece27756c957721d131", + "is_verified": false, + "line_number": 260 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c42fd06a8e9c5ad8b9b3624c1732347dd992f665", + "is_verified": false, + "line_number": 261 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "53fbf2125f17fd346dba810d394774c191c05241", + "is_verified": false, + "line_number": 262 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "312ebc5348c48d940a08737cc70b257c7ba67358", + "is_verified": false, + "line_number": 263 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3c072673c95b839b4c75a59ffcb4e7de11df227c", + "is_verified": false, + "line_number": 264 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "67dcac03bb680bd7400daff1125821df29119a57", + "is_verified": false, + "line_number": 265 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "74ceb07916759595af8144a74de06f4622295fab", + "is_verified": false, + "line_number": 266 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "becd47f7a933263c4029eb3298bdf67e64166b72", + "is_verified": false, + "line_number": 267 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "62cbb7af58e6841cb33ae8aa20b188904e88400b", + "is_verified": false, + "line_number": 268 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1240f6fbe789e15d2488a1f63a38913ace848063", + "is_verified": false, + "line_number": 269 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b313e2c9b9b7a229486000525bd2bfd909c739c3", + "is_verified": false, + "line_number": 270 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9ccd84180f08a811fc82fc6c2baa43b92b0c6d4c", + "is_verified": false, + "line_number": 271 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fec498a62202037efd0ff28ff270b1d65600ee21", + "is_verified": false, + "line_number": 272 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5e5991defd9bf4c9cd7ad44bfc3499b021f9b306", + "is_verified": false, + "line_number": 273 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3ac80ba9980be6af93aa361f71cc0b24ebb9a80d", + "is_verified": false, + "line_number": 274 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3e58a970f8a2580b7929b87623a05bcfd18ff5d0", + "is_verified": false, + "line_number": 275 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4e95912a938c4a5d793d6147f17b1a4f4564f521", + "is_verified": false, + "line_number": 276 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b9c19621f11904336bb1c83271b6e66392139adf", + "is_verified": false, + "line_number": 277 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ea26c6b69a1fbd9d19136131f1a4904190cdc910", + "is_verified": false, + "line_number": 278 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "88806d10d6a88e386d7bffe5ed9d13a01aa30188", + "is_verified": false, + "line_number": 279 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "92c4052a065855d439918461deb8ab1d85b8dec4", + "is_verified": false, + "line_number": 280 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5a801127b30267b3143bcd1879b09ce966f4e4db", + "is_verified": false, + "line_number": 281 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "03c0a54929a02a84158ffbab6a79ba8a31bbea5e", + "is_verified": false, + "line_number": 282 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9adc71007b98c2f47eb094b8c771d0a2c81e8584", + "is_verified": false, + "line_number": 283 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "19cc3f05c05fc6ff92f9a56656d3903fb6e05af1", + "is_verified": false, + "line_number": 284 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "901c70145ec0a76f9705743bc180ac505301db81", + "is_verified": false, + "line_number": 285 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e264698710238eada7824909e03b11a1d5b94d01", + "is_verified": false, + "line_number": 286 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e74cd3a559f33f9541ef286068dee5338b7c2f5d", + "is_verified": false, + "line_number": 287 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a0b7170416566ab964d395d0cf138ecd3c65fe2c", + "is_verified": false, + "line_number": 288 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c9c183b3a85dec6b215a6a18a1f0ce82381c12a6", + "is_verified": false, + "line_number": 289 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "06b739bfeff8deb1f44a03424e08ab08f1280851", + "is_verified": false, + "line_number": 290 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "25dc7c4a6b8bfdcb8bc41e815d05dac7fa905711", + "is_verified": false, + "line_number": 291 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1b298510f55fd15ee6110b2a9250263dbc9f4fc9", + "is_verified": false, + "line_number": 292 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6403b53b45d57554b17c4388178cd5250aa7587a", + "is_verified": false, + "line_number": 293 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f944cf9178e33e14fddf0ac6149cbb69e993d05c", + "is_verified": false, + "line_number": 294 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "61b4fee247e19961be2d760ed745da4e39d8bf4e", + "is_verified": false, + "line_number": 295 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d25d1f3178dd3a9485d590ce68bd38b3029d0806", + "is_verified": false, + "line_number": 296 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9fdfeae6046b80e2ae85322799cdc6da4842f991", + "is_verified": false, + "line_number": 297 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f7143b0c85044b4b76ef20cd58177815daf7407e", + "is_verified": false, + "line_number": 298 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5e605f0950f7c24e192224fa469889b9c83c80ac", + "is_verified": false, + "line_number": 299 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "329c29edf1fb8e3427b1d79a30e77a700c01ff5c", + "is_verified": false, + "line_number": 300 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "74a03233311d2f477a3dd7ffa81c7343586b1f8e", + "is_verified": false, + "line_number": 301 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3b1df47dbd920bfaf1de8a7b957d21d552d78a76", + "is_verified": false, + "line_number": 302 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "929a23cdbe2b28de6dac28454d1e7478a4a14fea", + "is_verified": false, + "line_number": 303 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a6436a4a36cd90e5d03b33f562213dfc3d038455", + "is_verified": false, + "line_number": 304 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a010833ccd24af9e70339bac73664fb47b6ac727", + "is_verified": false, + "line_number": 305 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "53be5a9c1c894e77c4fcdfbbb3b003405252ed79", + "is_verified": false, + "line_number": 306 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "61b289fe5c2eb0d8b8bc5b1cc5e9855472daabd9", + "is_verified": false, + "line_number": 307 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "773307c58ca81fd42a4734bbc4b3c7eb8bcfd774", + "is_verified": false, + "line_number": 308 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "35f607d2769173d1672e30f60b9276d01b8250d7", + "is_verified": false, + "line_number": 309 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e602d5d9691c09f57a628600014aaae749d38489", + "is_verified": false, + "line_number": 310 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "625238f7e6c9febfca3878a385daa7b8646a2439", + "is_verified": false, + "line_number": 311 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e6ba52cd1f2f9a30963834fd94aafc869bf05b82", + "is_verified": false, + "line_number": 312 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d629b569233f71690b6e6eaed9001e44b88c50bf", + "is_verified": false, + "line_number": 313 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a001d4059055a1c86b9ec62774d044b54ddb3376", + "is_verified": false, + "line_number": 314 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bce06d4b0177a2d06399e21e0b26bc99e44d6e9b", + "is_verified": false, + "line_number": 315 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cb6af31518d65e6dcb92fb01b9f31556c3a70c5e", + "is_verified": false, + "line_number": 316 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c2a95352f382fdbe53bd8b729a718c38eacfbf73", + "is_verified": false, + "line_number": 317 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f9b16dccab1e453362789df2fc682f2ba2c9ee2a", + "is_verified": false, + "line_number": 318 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1bb4e4fd05b7c33cfab0dad062c54a16278d3423", + "is_verified": false, + "line_number": 319 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9dcc6dc6f20a71fd6880951ceb63262d34de8334", + "is_verified": false, + "line_number": 320 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "666382b579258537d6cf5e7094dbaa0684b78707", + "is_verified": false, + "line_number": 321 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "072c49f046dfdce12c1553a67756e2f5ee4d7e49", + "is_verified": false, + "line_number": 322 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "47b792bdebbbf305d87092f12c0afcd8810e054d", + "is_verified": false, + "line_number": 323 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "41d3b22a387fa43c1491d62310faf50c4ab7956a", + "is_verified": false, + "line_number": 324 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bcdc3859e08c518f75cfe65b69f3adb9f489400b", + "is_verified": false, + "line_number": 325 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fc2b22e2d43816acf209af822877aff7e82fa4d0", + "is_verified": false, + "line_number": 326 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f63542bc2eb9de2caa3bfaeafd53d7bf65485889", + "is_verified": false, + "line_number": 327 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7ab01f0f438a3d21b529df89fbde67234aa49d89", + "is_verified": false, + "line_number": 328 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fed608fe9221f0e45c84b68a80a0c065a9a2b7f1", + "is_verified": false, + "line_number": 329 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7a6394c70b925009c3e708ec195a17ee40cae8f4", + "is_verified": false, + "line_number": 330 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5d615bd2adf567fe7403c51814ff76c694b1c8d3", + "is_verified": false, + "line_number": 331 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "77f3c695d15ee63db41dabcecce126a246b266e6", + "is_verified": false, + "line_number": 332 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "78138e46003e12617c75a8011fddbe2868ff5650", + "is_verified": false, + "line_number": 333 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "89c905852505ac6168e4132b5ee29241a64b2654", + "is_verified": false, + "line_number": 334 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3d55f361c5d2bf2c1ec7d2c2551d7bec67b3cc35", + "is_verified": false, + "line_number": 335 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "89f1aec19abc18d22541dc01270e0fee325a878b", + "is_verified": false, + "line_number": 336 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "23ed3413498b5fe9fe2d6d3ae4040a0e2571c9df", + "is_verified": false, + "line_number": 337 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e7f990c94d57f6880b1e2cf856ab0646636bc46a", + "is_verified": false, + "line_number": 338 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "87dccf8b7123c723b5c35c45533d7471a19c9c22", + "is_verified": false, + "line_number": 339 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "14a222dcf6b592c1178fae0babbb73d809102462", + "is_verified": false, + "line_number": 340 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "161b87029fb1fe5f37573770659140c254b6f26d", + "is_verified": false, + "line_number": 341 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e01ccf01c8ae560637e1fba1396ec9d27a48943e", + "is_verified": false, + "line_number": 342 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0d45bd0e0858d416488ca24b5e277430fdbc29a2", + "is_verified": false, + "line_number": 343 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bd6b3d87fee3f95d7bbe77782404507c7d6d23ba", + "is_verified": false, + "line_number": 344 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "297eface47da40362e6c34af977185a96ecd4503", + "is_verified": false, + "line_number": 345 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1d908d54bd47e7b762cf149a00428daf8ab41535", + "is_verified": false, + "line_number": 346 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e0404cb2e3feaba3e7bdc52c798b9bce57f546d3", + "is_verified": false, + "line_number": 347 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8dc5b0bbc5b3c3f93405daac036e950013ae6e83", + "is_verified": false, + "line_number": 348 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c914f94ead99fe6e6b262f63f419aba9f1f65cc9", + "is_verified": false, + "line_number": 349 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5d2559e8fbde4bdf604babb1a00a92f547e9c305", + "is_verified": false, + "line_number": 350 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b28706495d2c7f4e44a064279570ec409025bce8", + "is_verified": false, + "line_number": 351 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ce77aa4f51f5ee1a1f56ba0999a3873e07bdec29", + "is_verified": false, + "line_number": 352 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c828435ec3655b9b44974c212f94811121d3183c", + "is_verified": false, + "line_number": 353 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0361b85a6a04d362a8704e834cd633a76d7c8531", + "is_verified": false, + "line_number": 354 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e8b43fe4aa4ece98317775e13e359f784187c9ea", + "is_verified": false, + "line_number": 355 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ec00a6364212bbc187bc15f3a22ec56eb7d5d201", + "is_verified": false, + "line_number": 356 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5599c260b57d92c0f8bd7613fa1233ad9f599db3", + "is_verified": false, + "line_number": 357 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d11065d4dd0b6fd8e29dd99b53bfbe17e1447ab3", + "is_verified": false, + "line_number": 358 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c8c47349a7991ac9cb1df02c20e18dde2ec48b9c", + "is_verified": false, + "line_number": 359 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e5302dc80bfbd04a37e52099a936c74b38d022ec", + "is_verified": false, + "line_number": 360 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4a4e17621d292bddf3604bcc712ed17fdd28aca2", + "is_verified": false, + "line_number": 361 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a43a1929d714363194cc42b3477dfe9b4c679036", + "is_verified": false, + "line_number": 362 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "645e56a2836118de395a78586b710ac24c6d1b9d", + "is_verified": false, + "line_number": 363 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c0f20d875c6d2d8e99539de46a245a5a30e757d0", + "is_verified": false, + "line_number": 364 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fb552bf2f6ea4da1a8d0203ac4c6b4ecb1bbea56", + "is_verified": false, + "line_number": 365 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "53c6b8e08eeb37812e6e40071ac16916c372b60f", + "is_verified": false, + "line_number": 366 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c64cf6bc4ec02fa8b2bf2f5de1c04f0a0c8ec77d", + "is_verified": false, + "line_number": 367 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e7dc30b59854ec80d81edc89378c880df83697c4", + "is_verified": false, + "line_number": 368 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e60404864ae5ddda3612f7ece72537ab2a97abf7", + "is_verified": false, + "line_number": 369 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a84bea5c674feff72b4542a20373b69d25a47b89", + "is_verified": false, + "line_number": 370 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "47cbc18c75b60b6e0ed4d8b6a56b705a918e814b", + "is_verified": false, + "line_number": 371 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cd8bc0fe19677ebb0187995618c3fa78d994bbb2", + "is_verified": false, + "line_number": 372 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "887786ac035ae25cc86bd2205542f8a1936e04d2", + "is_verified": false, + "line_number": 373 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3ef2e1c199d211d5f1805b7116cb0314d7180a5c", + "is_verified": false, + "line_number": 374 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f89746f236eab3882d16c8ff8668ed874692cde3", + "is_verified": false, + "line_number": 375 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2b3db4dc1799edfee973978b339357881c73d3ab", + "is_verified": false, + "line_number": 376 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b7254fda5baf4f83d6081229d10c2734763d58b4", + "is_verified": false, + "line_number": 377 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9af3e435c37c257b5e652e38a2dfd776ab01726e", + "is_verified": false, + "line_number": 378 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "833be77b754d40e1f889b7eda5c192ae9e3a63fe", + "is_verified": false, + "line_number": 379 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a153d9446771953d3e571c86725da1572899c284", + "is_verified": false, + "line_number": 380 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "68d2128a64a2b421d62bc4a5afeeb20649efe317", + "is_verified": false, + "line_number": 381 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "92490f06bfafdb12118f5494f08821c771abafff", + "is_verified": false, + "line_number": 382 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "84a479485dd167e8dc97cce221767e68cbe14793", + "is_verified": false, + "line_number": 383 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ca9c140d7b9b6dbf874d9124b3de861939eb834e", + "is_verified": false, + "line_number": 384 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d293b3b1e9c7e4b8adde8f2a8d68159c72582f71", + "is_verified": false, + "line_number": 385 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "120db881813bc074d8abb7a52909f1ffc4acf08b", + "is_verified": false, + "line_number": 386 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6be68465c1bce11d46731c083c86cc39b4ca4b26", + "is_verified": false, + "line_number": 387 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ec613f94f9c8e0a7c9a412e1405a0d1862888d44", + "is_verified": false, + "line_number": 388 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "53300289cf9589a5e08bfa702e1f3a09d2d088b1", + "is_verified": false, + "line_number": 389 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "aac8dac3f68993b049bcc04acbb83ee491921fa8", + "is_verified": false, + "line_number": 390 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b309b1a5cda603c764ed884401105a00c1a1b760", + "is_verified": false, + "line_number": 391 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c1d9acf0ca3757e6861a2c8eab08f6bf39f8f1a3", + "is_verified": false, + "line_number": 392 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "39860c432a27f5bcbcd30b58cdd4b2f8e6daf65f", + "is_verified": false, + "line_number": 393 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f28f8289110a85b1b99cd2089e9dfa14901a6bbe", + "is_verified": false, + "line_number": 394 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7c51dd968d2ae5ffad1bc290812c0d6d3f79b28a", + "is_verified": false, + "line_number": 395 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "19e03888ea02a1788b3e7aacdb982a5f29c67816", + "is_verified": false, + "line_number": 396 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "936e0dfc9fa79e90eabe1640e4808232112d6def", + "is_verified": false, + "line_number": 397 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "66b03fc6f79763108c0e0ebced61830ce609d769", + "is_verified": false, + "line_number": 398 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b4615dacf79e97a732e205acd45e29c655a422cb", + "is_verified": false, + "line_number": 399 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4e9cab1ac24cee599dc609b69273255207fb9703", + "is_verified": false, + "line_number": 400 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7c2d628057af1a5f9cdc10e1a94d61fa2f43671c", + "is_verified": false, + "line_number": 401 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1f76628414c76162638c6cdd002f50d35c0030df", + "is_verified": false, + "line_number": 402 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "656cd81676438907b67dc35f1dcbc7f65fb44eae", + "is_verified": false, + "line_number": 403 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2b7c94fe6035b5e6d98a65122fd66d9fbc0710f6", + "is_verified": false, + "line_number": 404 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d55f6f2d0aff7554ed2c85a4f534c421ba83601a", + "is_verified": false, + "line_number": 405 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "742a9e62c813d9b6326e2540f1f9f97dfca8542c", + "is_verified": false, + "line_number": 406 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8b446fd2f0b22dc0fdfee36b5b370643b669bd2d", + "is_verified": false, + "line_number": 407 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ce38475ba93df187a8dd9972a02437ffef9e849c", + "is_verified": false, + "line_number": 408 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e5581573b5114490af9bdc16bad95dca6177f4ba", + "is_verified": false, + "line_number": 409 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2f005879125b38683f71c8a64bd232cd11591e08", + "is_verified": false, + "line_number": 410 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7e1581a6326b6fb0d8f18d69631ee8ee2a2b3d50", + "is_verified": false, + "line_number": 411 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e5814a47cd07ed2435b048b8b97f41be6cd2c9eb", + "is_verified": false, + "line_number": 412 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "72a7b76523b4eda36ffdd63ac1bcd4f52063e387", + "is_verified": false, + "line_number": 413 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3d2aeb7f6499d336ff54871823348b2bf58e7c89", + "is_verified": false, + "line_number": 414 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ca1473b861759dfa5fb912c2a7c49316897cafa5", + "is_verified": false, + "line_number": 415 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5bc665714e4b5b73c47d7e066567db6fde6ff539", + "is_verified": false, + "line_number": 416 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8f2f91164826d44904bc522f6680822bfd758342", + "is_verified": false, + "line_number": 417 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c9c956b3f172ca5ed76808abd98502a3499268f1", + "is_verified": false, + "line_number": 418 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b0c287a3b80addbf5fe7eb56f10dd251368ba491", + "is_verified": false, + "line_number": 419 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5da8ed9d858656f49131055a4b632defccffd4dd", + "is_verified": false, + "line_number": 420 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "23dd6031c249baabd4b92e8596f896bbc407eb7e", + "is_verified": false, + "line_number": 421 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c58b01cfd3befe531fdad283418fa7ac558cea5f", + "is_verified": false, + "line_number": 422 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "32a9671da53c8e3572ffd9303171adf6ae95a919", + "is_verified": false, + "line_number": 423 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "60789728174b9ee630b33b2af057e0c6a0180947", + "is_verified": false, + "line_number": 424 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "073252599d795b92b38cbad3ed849f1c5fd5368b", + "is_verified": false, + "line_number": 425 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "761bcb628d3c585abebaa8a64b04ab193f5a559e", + "is_verified": false, + "line_number": 426 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "dd230524f2606a207b426444142d01d518781aef", + "is_verified": false, + "line_number": 427 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3b459c62a8c9fe3401808103493996348ef70870", + "is_verified": false, + "line_number": 428 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "70dbcfd2a8a038e265a0d3d6379284b679226101", + "is_verified": false, + "line_number": 429 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "29398aafd66a1c4f181e540ec90a2b76dcdfe2cc", + "is_verified": false, + "line_number": 430 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4698c1c5c6daf3f88ec2768de0693d543e81c8b5", + "is_verified": false, + "line_number": 431 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cd333285b1ef33582b502f72b4a153a16a4678a9", + "is_verified": false, + "line_number": 432 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b2c2475773928e727fd3ba3969aaae40ab2b99b2", + "is_verified": false, + "line_number": 433 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c28676c2076efac73f3d01195ed463c6d7a6f442", + "is_verified": false, + "line_number": 434 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c520370cf0e7b1bcc405af46775963a7df856b9d", + "is_verified": false, + "line_number": 435 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fcd376b4fd7ecf2299b1ad018e66732a5e74ee08", + "is_verified": false, + "line_number": 436 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f9a69a2290885d929addfd83a6c1570dc7c76646", + "is_verified": false, + "line_number": 437 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5fdb5ce747a93d7048f4fd3a428653520b3efb50", + "is_verified": false, + "line_number": 438 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4ca9129303ac0d5e4e1b810e7abf90ea11a16833", + "is_verified": false, + "line_number": 439 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f83fb00877111e23db5ceb8b74255963d17c84e9", + "is_verified": false, + "line_number": 440 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "17e35c47564c0e6fefa2946f24d71618053bcfb7", + "is_verified": false, + "line_number": 441 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fab7d05454c71ae59bade022116124571421e4c4", + "is_verified": false, + "line_number": 442 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7820b9feb8912aee44c524eedf37df78b8d90200", + "is_verified": false, + "line_number": 443 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ea2a0f7323961fd704b1bad39ae54e02c9345d2a", + "is_verified": false, + "line_number": 444 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "353fcf93df94d7081d2bd21eab903cf8e492f614", + "is_verified": false, + "line_number": 445 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7149d4db2de10af66a4390042173958d5fa1cbde", + "is_verified": false, + "line_number": 446 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "85b4428454e38494e03e227d224ae58a586ab768", + "is_verified": false, + "line_number": 447 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "df83530e6fb8ccd7f380c5dc82bc8c314b82436a", + "is_verified": false, + "line_number": 448 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "106157744da44adeb38c39220b1db267c26deb77", + "is_verified": false, + "line_number": 449 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c5e67d1eed731314ac68f5e67cb7b7dba68225f5", + "is_verified": false, + "line_number": 450 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d9737cec69cbdedea1a2d9a70d7961ff76592696", + "is_verified": false, + "line_number": 451 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7aab6c9118166720f0f0e3a9db46fd59e3ed647d", + "is_verified": false, + "line_number": 452 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "500a58b74d63b4c10c8c098743d63e51a477c9cd", + "is_verified": false, + "line_number": 453 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "69a150ffbef689cc7a14cfc019e9c808b19afd4a", + "is_verified": false, + "line_number": 454 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "49d3801a82b82e48cbcc596af60be9d4b72bbd76", + "is_verified": false, + "line_number": 455 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5f3e17df79af2812cc6b5dbc211224595f8299a8", + "is_verified": false, + "line_number": 456 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5f21f46cef784459cbac4d4dc83015d760f37bcf", + "is_verified": false, + "line_number": 457 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4a91f36506d85a30ddc1a32f9ed41545eeb1320f", + "is_verified": false, + "line_number": 458 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b99666bc5cc4bf48a44f4f7265633ebc8af6d4b7", + "is_verified": false, + "line_number": 459 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c061353e73ac0a46b366b0de2325b728e3d75c5b", + "is_verified": false, + "line_number": 460 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d17d588edde018a01f319f5f235e2d3bcbbe8879", + "is_verified": false, + "line_number": 461 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "63567656706221b839b2545375a8ba06cd8d99ae", + "is_verified": false, + "line_number": 462 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "976e5ce3af12f576a37ce83ccf034fd223616033", + "is_verified": false, + "line_number": 463 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "626b3f10041c9e9a173ca99252424b49e3377345", + "is_verified": false, + "line_number": 464 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f8ba93d3a155b11bb1f2ef51b2e3c48c2723ef8e", + "is_verified": false, + "line_number": 465 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8b4879aed0c0368438de972c19849b7835adb762", + "is_verified": false, + "line_number": 466 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d35dbaf2ea5ec4fc587bed878582bba8599f31c0", + "is_verified": false, + "line_number": 467 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c09d7037f9b01473f6d2980d71c2f9a1a666411c", + "is_verified": false, + "line_number": 468 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d53d7f86659a0602cd1eb8068a5ad80a85e16234", + "is_verified": false, + "line_number": 469 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "aa9442f71f2747b5bb2a190454e511a7c62263d8", + "is_verified": false, + "line_number": 470 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f800b1fed08ed55a8e2a9223fc3939c96f3e11e5", + "is_verified": false, + "line_number": 471 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e46a4855198ba0f803471fb44a70ae5fbd2dd58f", + "is_verified": false, + "line_number": 472 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f47b48b6b7c2847fbe206253667d1eda00880758", + "is_verified": false, + "line_number": 473 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a9d98ab785981fe0f13a721e7fe2094a6e644b5d", + "is_verified": false, + "line_number": 474 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fe151aabb001edb57e3fed654d3a96e00bc58c81", + "is_verified": false, + "line_number": 475 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "77c40b5a173e170886069d57178c0074dfe71514", + "is_verified": false, + "line_number": 476 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "04e04736dcf54eb8a8ef78638b0b0412cab69e96", + "is_verified": false, + "line_number": 477 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b13a34e3be842da54436ed8ab8f2a9758b2cc38e", + "is_verified": false, + "line_number": 478 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3971f1dcb845e4eaedcb04a6505fd69e27b60982", + "is_verified": false, + "line_number": 479 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1b8ae7b1c309866e28fe66e07927675ce0e24514", + "is_verified": false, + "line_number": 480 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4c3f6543b234d2db27b1a347b3768028dd60bc77", + "is_verified": false, + "line_number": 481 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ca4ac68931f7c54308050c1b6ac9657c4ff0d399", + "is_verified": false, + "line_number": 482 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "02cca5fc17dc903feb5088abec3d2262f604402e", + "is_verified": false, + "line_number": 483 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d864c37f23cab8cff54e9977a41676319c040928", + "is_verified": false, + "line_number": 484 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e67a5309737b99b0ac9ba746ca33d6682975cea1", + "is_verified": false, + "line_number": 485 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "aef65112b27cc0ecbcfbd3ae95847e9e0fbee0b7", + "is_verified": false, + "line_number": 486 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "40d73861d177d9e22d977dd62b8a111bbf8ee0b7", + "is_verified": false, + "line_number": 487 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "71e44d4a353467958cd9be3a7e6942385e883568", + "is_verified": false, + "line_number": 488 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e1f00f9205b689ba1d025f88e948f03a4ac77a59", + "is_verified": false, + "line_number": 489 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6a9f1470e772a7f4176e8c24b7ab0e307847b92b", + "is_verified": false, + "line_number": 490 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5959a3a8554f9ce7987b60e5e915b9e357af0d99", + "is_verified": false, + "line_number": 491 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b0a791edf8675bd6a65fc9de9ba5bcb8336d1fc0", + "is_verified": false, + "line_number": 492 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "557bcf89f60a98f72b336e21f56521a4c30a2f0c", + "is_verified": false, + "line_number": 493 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "80e8a78fd29c2ac00817f37e03d9208f8fd59441", + "is_verified": false, + "line_number": 494 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "351dded8c590b80cc8dc498021fccadc972c1d00", + "is_verified": false, + "line_number": 495 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4f55ad2c0e5a697defde047e6a388c14b3423cda", + "is_verified": false, + "line_number": 496 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "20412c530d4b4c38510d9924cbfb259126c2568c", + "is_verified": false, + "line_number": 497 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "05e66772d14918a72d1b6f45872428a35c424347", + "is_verified": false, + "line_number": 498 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c61a40f7ae13f5e26ea16a6266491d58e78f6f1f", + "is_verified": false, + "line_number": 499 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b4d93dd6c2e36056d55ce3844610991eec962277", + "is_verified": false, + "line_number": 500 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c7088e4ff6e5a3bc44ca3fdf1b06847711f3e95c", + "is_verified": false, + "line_number": 501 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5e5168774b473fb9fcc31c8f5c1518eb0f9771c1", + "is_verified": false, + "line_number": 502 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a1f86c50a6626bcab082286bec7f5474e7c8b293", + "is_verified": false, + "line_number": 503 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a9fac6e3490672c5dccd35d5e6fc1cb7b1b5931b", + "is_verified": false, + "line_number": 504 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b48c69b346d712e3df1728014956ac0397c659ea", + "is_verified": false, + "line_number": 505 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8367e351d57fa775f22fc1132dd170c458799542", + "is_verified": false, + "line_number": 506 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "972953c33baa3303c488360576bdd3bae95e79a3", + "is_verified": false, + "line_number": 507 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2ef2d21dde1d6ef435fbf1b6a049f7e94a2d5588", + "is_verified": false, + "line_number": 508 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "76bf193e8f7b54ab5f0007ee41b768ee1e3ce24d", + "is_verified": false, + "line_number": 509 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e8e93efe226e4bf62b880c14bdef1507dc67c4fe", + "is_verified": false, + "line_number": 510 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "71cd9e3eb02ec34d305a55df09540b95549f8342", + "is_verified": false, + "line_number": 511 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "34c2c4351cc369f306886089967adc3fd23202b5", + "is_verified": false, + "line_number": 512 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "95a9e6645670ef390609e97a9a94ab1af8ecb5e5", + "is_verified": false, + "line_number": 513 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7a773ead4f5cbee039dd9c90bcbd2157ff9dfe98", + "is_verified": false, + "line_number": 514 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c8974d5459c5318a865674227914120b61ee7ca8", + "is_verified": false, + "line_number": 515 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9aa53dd7b54460ca4058dc1b993c61c85016c3a5", + "is_verified": false, + "line_number": 516 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5cf42e6632ac13c10b1709348bda0d36d4cc8fe2", + "is_verified": false, + "line_number": 517 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "22368f64933f9d4b20751ed12db25bdb937f4288", + "is_verified": false, + "line_number": 518 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "558145b7f5778e24056c8de59bd9d54190950f14", + "is_verified": false, + "line_number": 519 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2068d5b68ddc59653056d96e1283951282b22267", + "is_verified": false, + "line_number": 520 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4d807498a9a96f89bb538a8308d6056a2a303a0d", + "is_verified": false, + "line_number": 521 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3457741ed34d5ad7b9d04fa9cc677a72e8c47b4d", + "is_verified": false, + "line_number": 522 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "59556e4aa33301c95feb9c58d99d10a080179646", + "is_verified": false, + "line_number": 523 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2d49954101a3bd1dd5da50b8a1847f00bf4ec16b", + "is_verified": false, + "line_number": 524 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c2f14cff186baad8445fb7997c3dc863eff10ef6", + "is_verified": false, + "line_number": 525 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "dd317a7973e49de529850041e8c1ce51b0d378df", + "is_verified": false, + "line_number": 526 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9cbaaf4ff0453e81aaac598e05d8c973991c77b3", + "is_verified": false, + "line_number": 527 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "576dd6a98701c267f16a5e568f8b6a748665713d", + "is_verified": false, + "line_number": 528 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c5ce7f45e2ddbd43d244e473e165b1400ba86dd9", + "is_verified": false, + "line_number": 529 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "04a10a70b498263467ef1968fabfb90e012fd101", + "is_verified": false, + "line_number": 530 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "482928d9b3b49339bc5f96e54f970e98f84970b7", + "is_verified": false, + "line_number": 531 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "24d25f3a906f38241bd1d3dfa750631cd4b2f91f", + "is_verified": false, + "line_number": 532 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8cc46e3c020e63d10457e32b2e5d28b5c7ce0960", + "is_verified": false, + "line_number": 533 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "da272306205373082db86bc6bc2577ab85ed9e31", + "is_verified": false, + "line_number": 534 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b03284305e4d5012e7c3cf243b2942a6dab309cc", + "is_verified": false, + "line_number": 535 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f7c91578b688a0054f2c1e18082541d6ecc6b865", + "is_verified": false, + "line_number": 536 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1f009c80b8504a856a276e8d2c66210b59e8bf2e", + "is_verified": false, + "line_number": 537 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "54490e77b2c296149b58ae26c414fea75c6b34ec", + "is_verified": false, + "line_number": 538 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d5bd68de7769dde988f99eab3781025297a7212d", + "is_verified": false, + "line_number": 539 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b6161808b7485264957a2f88c822f0929047f39a", + "is_verified": false, + "line_number": 540 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1ff88fb1bf83bca472ab129466e257c9cc412821", + "is_verified": false, + "line_number": 541 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "002e1405d3a8ea0f2241832ea5480b0bf374c4c6", + "is_verified": false, + "line_number": 542 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1058c455a959a189a2d87806d15edeff48e32077", + "is_verified": false, + "line_number": 543 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cbcf1915e42c132c29771ceea1ba465602f4907c", + "is_verified": false, + "line_number": 544 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "23738e07a26a79ab81f4d2f72dc46d89f411e234", + "is_verified": false, + "line_number": 545 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "270492f5701f4895695b3491000112ddc2c1427d", + "is_verified": false, + "line_number": 546 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "88aec41eb1eedc51148e0e36361361a6d2ecc84f", + "is_verified": false, + "line_number": 547 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7b7d73969b405098122cd3d32d75689cd37ee505", + "is_verified": false, + "line_number": 548 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "79b731de4a4426370b701ad4274d52a3dc1fc6c1", + "is_verified": false, + "line_number": 549 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5b328e2a87876ae0b6b37b90ef8637e04822a81b", + "is_verified": false, + "line_number": 550 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8638f4b78c1059177cbfccd236d764224c3cad5c", + "is_verified": false, + "line_number": 551 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ef285f61357b53010f004c1d4435b6bb9eeaff09", + "is_verified": false, + "line_number": 552 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ddd64557778a6d44ac631e92ed64691335cf80df", + "is_verified": false, + "line_number": 553 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "de486a7abd16c23dfdf2da477534329520c0c5ec", + "is_verified": false, + "line_number": 554 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0618c0886736acb309b0ad209de20783b224caa6", + "is_verified": false, + "line_number": 555 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "521ee58b56f589a8f3b116e6ef2e0d31efd4da1d", + "is_verified": false, + "line_number": 556 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5b916ff5502800f5113b33ba3a8d88671346e3b3", + "is_verified": false, + "line_number": 557 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7582e85dc9e4a416aa1e2a4ce9e38854f02e8a56", + "is_verified": false, + "line_number": 558 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b24c1e8ac697a8ff152decc54d028e08dd482e4f", + "is_verified": false, + "line_number": 559 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "923eb19912270d9a7c2614d35594711272bc33c0", + "is_verified": false, + "line_number": 560 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e0331901bcbebd698248f7ba932083b13144da42", + "is_verified": false, + "line_number": 561 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f49cc7570d7e3331425d2c1cca13e437c6eb0c86", + "is_verified": false, + "line_number": 562 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6adbf5db8ff386502f09c1dbb9fa2b37600491a6", + "is_verified": false, + "line_number": 563 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "03060c922cbe09ed17fe632cbf93ed32eb018577", + "is_verified": false, + "line_number": 564 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "71cfee01fe9f254c01da3a00f2b752cf39cbe95d", + "is_verified": false, + "line_number": 565 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "542ef00d5b90d5b9935d54e3c2ebd84c59b7e7ba", + "is_verified": false, + "line_number": 566 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4073dc551871d96e2b647f18924989272ea88177", + "is_verified": false, + "line_number": 567 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0a4afe0870fdff9777720cab41c253d7a2a1b318", + "is_verified": false, + "line_number": 568 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ef7992a75c33f682c8382997f7f93d370996ee7d", + "is_verified": false, + "line_number": 569 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a265ebf662a7b28aeacc7f61bdb9ba819782fc24", + "is_verified": false, + "line_number": 570 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2bc27f59373f1a1091eef59a7d9d23c720506614", + "is_verified": false, + "line_number": 571 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e17be476c0805f05b4445d528ae5b03fa7a13366", + "is_verified": false, + "line_number": 572 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6b8281ade6ee972b53eb2e5e173068a482250005", + "is_verified": false, + "line_number": 573 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "931c912c0da827ad7895c4e6d901dc2924ef23e4", + "is_verified": false, + "line_number": 574 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ecf0566d6b6ce6c44f7f8fb56af4a8608e72f5e4", + "is_verified": false, + "line_number": 575 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "947323679dbee5d60736f14258621626565ea1c6", + "is_verified": false, + "line_number": 576 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "05d0d9d4a4e53fa7d7f3f7f8317bec618b1bfe15", + "is_verified": false, + "line_number": 577 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6b7871d101c02971f1b9f6f95f5a969c36a8483c", + "is_verified": false, + "line_number": 578 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "05441b75c971d39d04a13b168a1b0f2c4aeb2114", + "is_verified": false, + "line_number": 579 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c9d8088c151b2a7c09676ed3fd9de0fddc490b30", + "is_verified": false, + "line_number": 580 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "07eb4a0a546de02a324550e1e1b66e306bd3f706", + "is_verified": false, + "line_number": 581 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "baa791026849604561c1dd00787a9caa598abae1", + "is_verified": false, + "line_number": 582 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8d49f6f1c3e27bdfe580816e609cab2c9ca00cc6", + "is_verified": false, + "line_number": 583 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "926d8707e359f80554585f4eca9f90b6021d3327", + "is_verified": false, + "line_number": 584 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "68982f7b9ff005fdd9d27fdf5ef5d37c9c611f58", + "is_verified": false, + "line_number": 585 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cc95ebd65aeae6dd8e774a1e90798079211554f3", + "is_verified": false, + "line_number": 586 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a76b151ddad3198ad11b962ff59170a761baf0c6", + "is_verified": false, + "line_number": 587 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8a59e160326a76b11b5fc26cfa592cfdf158fd49", + "is_verified": false, + "line_number": 588 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "784d839853e3c0966a262a542b36e259aa00e8df", + "is_verified": false, + "line_number": 589 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fbba9f2d7a916915d9535d71c785ba4491a3b733", + "is_verified": false, + "line_number": 590 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f290b3c4f8aacf898285d68358fcdffe6baf1e2e", + "is_verified": false, + "line_number": 591 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "14f10baeacada2cc41047108f58b200c6026bca3", + "is_verified": false, + "line_number": 592 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e583513a87e1f5b242e81fe86427da78faa63ede", + "is_verified": false, + "line_number": 593 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "391f7646f98c7bf123453c90b372ac45f4ea35fc", + "is_verified": false, + "line_number": 594 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "da2e4b9e552f03c36dcf672072f1d6cda917672d", + "is_verified": false, + "line_number": 595 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9c4a1dc6277cda2374666e447dceb663ac39c62a", + "is_verified": false, + "line_number": 596 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "469b9dfc4d3851edbd0c27f80b4b36c04ec52f5e", + "is_verified": false, + "line_number": 597 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c09b72b36f9e813bdfcf32f58e070a4fe98f4092", + "is_verified": false, + "line_number": 598 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6ee9dd6fd0333921cb607f274d3bfc04187bfac5", + "is_verified": false, + "line_number": 599 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9ccd2b0b5ae426a9c581621270630389e40d08e0", + "is_verified": false, + "line_number": 600 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "881f2e047f571e1ea937638ea2598581e92e4900", + "is_verified": false, + "line_number": 601 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1e5acdb5b4e970fd7be282ae31e3195d24aa98b9", + "is_verified": false, + "line_number": 602 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8b1564bd262285220c1f4cc7ba034b14836d3496", + "is_verified": false, + "line_number": 603 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2f79127d99b576c55a920ce8195d9c871296dd79", + "is_verified": false, + "line_number": 604 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0aa38b942875102db24b7ce22856fbce4dd8bca5", + "is_verified": false, + "line_number": 605 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "62f537c1449b850f2f3b66c200a85fff4e4ce6c3", + "is_verified": false, + "line_number": 606 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2f83b93fddaa24f65acbea08be3fc0b2456f3ea5", + "is_verified": false, + "line_number": 607 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0d3a416a9b47316629342cf32e4535bd5de367bd", + "is_verified": false, + "line_number": 608 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9d018c03a51c7405ca8de9dafde5fb12bf198544", + "is_verified": false, + "line_number": 609 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0e20193d744f60ef0bcd425ce45d19c73f5ff504", + "is_verified": false, + "line_number": 610 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a2ad69c925092acbbffb97ea70f2c87985fccc8e", + "is_verified": false, + "line_number": 611 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "997ad02ee3779b7ffcd11b8e19df0afe052b66f6", + "is_verified": false, + "line_number": 612 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "46bc2f629e8b64d43d23cc3429346583a7319bae", + "is_verified": false, + "line_number": 613 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "10e4c7043154dc91c0a002d88fe23f356370b80b", + "is_verified": false, + "line_number": 614 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b002194b0535528d6a24fa7502e7f76b935afc8d", + "is_verified": false, + "line_number": 615 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "43728be0f14a9413b4bebd1d22562002cbd07c2d", + "is_verified": false, + "line_number": 616 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "172cb154f89a4168cbbcc48186b6f5a2b113e893", + "is_verified": false, + "line_number": 617 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1df3a86d99563dd6124a197f28a21f1412fd438b", + "is_verified": false, + "line_number": 618 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d44276da69dfa1c411354e75dcda7d75ea6d605a", + "is_verified": false, + "line_number": 619 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "39c326b627e45a8ae4192ac750d38cda7fa55d79", + "is_verified": false, + "line_number": 620 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3c24ec7ee3be457039f1e46a4b437065ba4c4130", + "is_verified": false, + "line_number": 621 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "98b18d68b753e89b1b0c8b4ce575011326b0d2c6", + "is_verified": false, + "line_number": 622 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "95dc0c323f31332cea1b74ce77fe4af9fd0d5c5c", + "is_verified": false, + "line_number": 623 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cb0763f8b448f29101b230bf3ace6a9fc200be9b", + "is_verified": false, + "line_number": 624 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f746e396467de57bda19eb1fe555bc43b8773bf2", + "is_verified": false, + "line_number": 625 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d0878fed2da5ef58888639234936d2df27aa1380", + "is_verified": false, + "line_number": 626 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3010d3905af38cd8156a527f4d531f34c46c39a7", + "is_verified": false, + "line_number": 627 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4da40200c07f4e433a8fafc73d0567d024606752", + "is_verified": false, + "line_number": 628 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5415afc22a2c5f94eabfdadbccbe688b42341335", + "is_verified": false, + "line_number": 629 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "86f3350f28fa5af153e0021bd0f95610f50f0aa6", + "is_verified": false, + "line_number": 630 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "84541393133a5662b9b265024ec3edc3545c3802", + "is_verified": false, + "line_number": 631 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "05830a12efa0b065e55a209e1de1b7721546f2a1", + "is_verified": false, + "line_number": 632 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9e7dabf3cda36b3ab3b57fefca047d5271cb674e", + "is_verified": false, + "line_number": 633 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ef05a15dcbe9f43b719bec0f2dc74d6870cab938", + "is_verified": false, + "line_number": 634 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "35c2e8c0d488a1e0e7f4a721cb9fc5af4f91423b", + "is_verified": false, + "line_number": 635 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e4ad4eb707a0dd2b2ef876c8001f966f51f524d9", + "is_verified": false, + "line_number": 636 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f99b3161abeffa11c6be076150cccd8221fcd703", + "is_verified": false, + "line_number": 637 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4b1647cf6264941baa9ba28fb792cd82e06217cd", + "is_verified": false, + "line_number": 638 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a62b12a0505128c7094f73376a7b32b6896a8602", + "is_verified": false, + "line_number": 639 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8ac29efbb3b877bfdebdcba31d3528f2cd0809ea", + "is_verified": false, + "line_number": 640 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1aa7fb76951a195b27333fc8580b44a57e98fa9e", + "is_verified": false, + "line_number": 641 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3a29474a5fbc845f27b5bafd16ddbb4d7defa2d8", + "is_verified": false, + "line_number": 642 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b1c3e50ce69aa2cc899da1df5a55338242567ab4", + "is_verified": false, + "line_number": 643 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "841f3550b43d66f5f3138d26990ffbb161a3b827", + "is_verified": false, + "line_number": 644 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "80cfd7fb194ed700b9c0e4970bf4e47cc75257a9", + "is_verified": false, + "line_number": 645 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bc4508d089cc2186f7bc5bb14ccddeb772a04244", + "is_verified": false, + "line_number": 646 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "01b35bc3e5deb295f2dd6c43f2abae453ed7a20f", + "is_verified": false, + "line_number": 647 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fa3e9c6424f3bc18eb13d341ed64c132b4f8c929", + "is_verified": false, + "line_number": 648 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b13663ab4e5621994f9bb7909a69c769c343e542", + "is_verified": false, + "line_number": 649 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c06f704f3a0cefec9a28623bda60f64f8c038bdd", + "is_verified": false, + "line_number": 650 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a2eadafda305962f6b553a99abf919d450cc4df2", + "is_verified": false, + "line_number": 651 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "43c8cab46cbb8319ee64234130771cb99a47e034", + "is_verified": false, + "line_number": 652 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1cc137a3c9d41ba4b30464890ae6a6f08c7ba92d", + "is_verified": false, + "line_number": 653 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b43d13f2dcc835cd55d4a40733b22d07fd882167", + "is_verified": false, + "line_number": 654 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "78d7945d58ea7aaaf4861131b57b5fd4c308437f", + "is_verified": false, + "line_number": 655 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6b2f6f1c7b573efc39d8bd013cef20e89e011276", + "is_verified": false, + "line_number": 656 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d92bdf2e2be4bfe8acb991a3cf2b0f23da624825", + "is_verified": false, + "line_number": 657 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e8b7c1a13d23facf8589088b2de85f851ad53a82", + "is_verified": false, + "line_number": 658 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6d3e58158529f32b5ead6e3b94c7ca491ef27ed3", + "is_verified": false, + "line_number": 659 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "800ea2592a27f8b38f0a18253dd49f97b65a3aad", + "is_verified": false, + "line_number": 660 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0b13798c29f5879b119c807ab7490d35a0342cef", + "is_verified": false, + "line_number": 661 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0a9a21ca4e9aa08b2b5fbe769bf6afb1deb8da91", + "is_verified": false, + "line_number": 662 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "183877effc366e532c7937f2f62f7f67f299bd36", + "is_verified": false, + "line_number": 663 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e245782b2f99805ed35dab1350ac78781ae882eb", + "is_verified": false, + "line_number": 664 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9b619bf6db9561f29c4cc75e26244017cc97d305", + "is_verified": false, + "line_number": 665 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "377469b721f5e247f1ad0fee41cca960c49a1fe9", + "is_verified": false, + "line_number": 666 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f2cb896b3defe96fd6a885f608e528704b40728c", + "is_verified": false, + "line_number": 667 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7643925d0ad2652497482352b404604985b0f41e", + "is_verified": false, + "line_number": 668 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ce5594ef11357e35de0d439687defce446dd0f66", + "is_verified": false, + "line_number": 669 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "65dde318bca6689643335f831444daf0156cc4e5", + "is_verified": false, + "line_number": 670 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "143c3d69803143aa5d40372c0863df82b176b41c", + "is_verified": false, + "line_number": 671 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c32dcbc4225f3183d5f5a5df78ec5ae9afb38968", + "is_verified": false, + "line_number": 672 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cfa29e11ebef38d8e08fb599491372f6404e6b6f", + "is_verified": false, + "line_number": 673 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3d91d5f1054fc768cf87c6b19d005e6d3ccbc2f3", + "is_verified": false, + "line_number": 674 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2d6bffd0f0c9cc4790eebc50b6a56155c3789663", + "is_verified": false, + "line_number": 675 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "64110bdd2bf084ec47040ce8b25fc13add2318e7", + "is_verified": false, + "line_number": 676 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7f6bf6522a85f71bf4b93350ec369683759735f9", + "is_verified": false, + "line_number": 677 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3d53588bd3f314ef6e7bf9806e69872aa2ce1aff", + "is_verified": false, + "line_number": 678 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d5efc1772557e4bff709c55a59904928b70ffe1c", + "is_verified": false, + "line_number": 679 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b8e46dd05b23c4127cca0009514527e49b6c400f", + "is_verified": false, + "line_number": 680 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "58d30b123d121316480c37ae6222d755dc9144ca", + "is_verified": false, + "line_number": 681 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "66a2abf99d8a4a38e6d64192d347850840a580bf", + "is_verified": false, + "line_number": 682 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d434fa5b419700a92dc830da1c3d135e8ad0b3e2", + "is_verified": false, + "line_number": 683 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ee251356a77d3ec7b7134156818fac73a2972077", + "is_verified": false, + "line_number": 684 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "239cb830c56b6d22115d2905399f8518bd1a5657", + "is_verified": false, + "line_number": 685 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2e6143570c020503a4e1455ec190038b82bedc19", + "is_verified": false, + "line_number": 686 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9107d00af85969940a45efb9eccad5e87f8a87f2", + "is_verified": false, + "line_number": 687 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5a5d1ac75eb4c31c7e9650ac70bdc363a9b612c5", + "is_verified": false, + "line_number": 688 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "05a99938fdc58951b4a6a756c8317050e3f5d665", + "is_verified": false, + "line_number": 689 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "67ccbdebe626ab7af430920c1d0d6ec524bdc4f9", + "is_verified": false, + "line_number": 690 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "71fd81160a50c9d47b12b4522c5c60f2fca72b6a", + "is_verified": false, + "line_number": 691 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f150f2f043f66a564ed3b3fb2f29c0636fd2921a", + "is_verified": false, + "line_number": 692 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a1140dfe90f9a5da45451945b56877c45cb36881", + "is_verified": false, + "line_number": 693 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7533bea169a68e900d67a401cac35a7aade18d92", + "is_verified": false, + "line_number": 694 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f0dd83a2a8d653ad8b30fefcde5603b98bf1ca66", + "is_verified": false, + "line_number": 695 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "21334df57a3a5c6629c12f451eeb819a2b37b42c", + "is_verified": false, + "line_number": 696 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "99f04da5b8530b3eb79e3740fece370654d3c271", + "is_verified": false, + "line_number": 697 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c2dfd7c77cafb9193a0e77a45d14ccc1498816fb", + "is_verified": false, + "line_number": 698 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5351e6405ba12ea193b349e8b2273201bb568404", + "is_verified": false, + "line_number": 699 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cc215cb1a47a674d2b0c1fb09df87db836ce8505", + "is_verified": false, + "line_number": 700 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3078af7fa82e149420b97ff56fff9f824387b35b", + "is_verified": false, + "line_number": 701 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ac0e1537926b5bbd543ad3e731959a0bad451c73", + "is_verified": false, + "line_number": 702 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a6da4e82d314f4ca0bf7262a78875b0b6edc30aa", + "is_verified": false, + "line_number": 703 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e08c74c3fbf412c2d4f330b0414f1275679cb818", + "is_verified": false, + "line_number": 704 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7bf9ae1b766cb0b9a5aa335a0103518d7be00daf", + "is_verified": false, + "line_number": 705 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ec844560c5f208fa8723c1700f6e86b8e7ffed04", + "is_verified": false, + "line_number": 706 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6c133b025f53327eb652d2a1ca576dfe58eef1b4", + "is_verified": false, + "line_number": 707 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3dc21b9f6f63b73a241d900e379a3c7094341f8b", + "is_verified": false, + "line_number": 708 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1a012b2bf61ee9874d5af73df474051c0d235ecf", + "is_verified": false, + "line_number": 709 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b0ebf0b521ec6e6e696f9be2fe4e1845876d57ab", + "is_verified": false, + "line_number": 710 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f0a5d3ac0705186e25effb02649df87361b8c67e", + "is_verified": false, + "line_number": 711 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "385ecb845a1d5d43766d568b466d1dd237a81980", + "is_verified": false, + "line_number": 712 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "18d0416b8ea44ce305b214380de978cef27e8603", + "is_verified": false, + "line_number": 713 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "89dca45aa9146b8a31236fd77001c02769dceb60", + "is_verified": false, + "line_number": 714 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "30acd4c1f4a878883c654846b8f3c5a6ab807285", + "is_verified": false, + "line_number": 715 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7d3229ff5e754c72a8b2072d3d7a5e00749ece9b", + "is_verified": false, + "line_number": 716 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e6da9d65dc0cfb42b86ae8f9b7c1d5fe79b4a763", + "is_verified": false, + "line_number": 717 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9c85908a1bfd5f2a7337f812c68f2ce8dfbfd65e", + "is_verified": false, + "line_number": 718 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4000341e5c04854eeca9fe7537dfddfdbb7c785a", + "is_verified": false, + "line_number": 719 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ef23e2969a46edf410fab2c69d1b29b2a65f57f9", + "is_verified": false, + "line_number": 720 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4902863163e24fa9f172e61808385de2b9ee3099", + "is_verified": false, + "line_number": 721 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "31efc8d3bba9c8f66b3f54bc146443732ac15c2c", + "is_verified": false, + "line_number": 722 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "263deaf83b359554fc9dafca8e6622ece44cf75d", + "is_verified": false, + "line_number": 723 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ead7409fe5b86813e3609f7fe6e13b8fc4b0b9d6", + "is_verified": false, + "line_number": 724 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7b0d884d6cdc64a613cf3e887395d875ff738c3e", + "is_verified": false, + "line_number": 725 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fa0a0a999cb067eee81673f3d2de8bfd96a0d14c", + "is_verified": false, + "line_number": 726 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0db684d862dfc8427e8f66adb62f33fcdc9f3de8", + "is_verified": false, + "line_number": 727 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8794a8121832fd31b1871d2c5d4b00af07779b0c", + "is_verified": false, + "line_number": 728 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d6070805e7a6c25dbe13a540cbc0f16a89055e7e", + "is_verified": false, + "line_number": 729 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "56b3e8e6d14b9b459bf055900784e8aa31c306c2", + "is_verified": false, + "line_number": 730 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a4d6976637c19991da48707bf35b3cf2ded4c2fb", + "is_verified": false, + "line_number": 731 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f714e448a86a46baf2128d81014e554874f0d4f6", + "is_verified": false, + "line_number": 732 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2b03a5eb51085de41df415881ef1d425f20f9e05", + "is_verified": false, + "line_number": 733 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "99fa7285e15d91ac3047b95ddb475d339c7afc7b", + "is_verified": false, + "line_number": 734 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4a9880aa478dba526c2d311ae17578711d0f9426", + "is_verified": false, + "line_number": 735 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0cd512ccf176189c7bf36765b520d8ec2ddeade0", + "is_verified": false, + "line_number": 736 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2eb8822459b9db479752d12f62dec094ab68fc55", + "is_verified": false, + "line_number": 737 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1aab694ebb334a12ccd22baa0044a3b058db67f9", + "is_verified": false, + "line_number": 738 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ce29f8616e1c62e54a8f0b39b829d9bd7df5721c", + "is_verified": false, + "line_number": 739 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c099a1c5f639e647bda5961d9c51cc158790ff3e", + "is_verified": false, + "line_number": 740 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "78dc2b71e3614e4e802c4f578a66132ea1ae0be8", + "is_verified": false, + "line_number": 741 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0befb6d3255080ce4d051a531fc1fedb33801389", + "is_verified": false, + "line_number": 742 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "087447f269677e0947da157a5bc0bb535c6c7759", + "is_verified": false, + "line_number": 743 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8911e3aef563e1481305a379a083f7616d57cd08", + "is_verified": false, + "line_number": 744 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2846a4bb4af2826a787fb0d8a0e7342c404a1cd1", + "is_verified": false, + "line_number": 745 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3364317b783250007fcee5bcddf07b2006752ad3", + "is_verified": false, + "line_number": 746 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e1a4444540434bc0ba51a8b5e6540e82d4b17f4f", + "is_verified": false, + "line_number": 747 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f453d1221dfbe308b5c71029f5cc2fba020f2c6a", + "is_verified": false, + "line_number": 748 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3e4231678403aa61b0f4f6719081016d579fa3e4", + "is_verified": false, + "line_number": 749 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a64b90a0dd1a214d6c65a4078437eab4ada65a32", + "is_verified": false, + "line_number": 750 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0433fe0f97f7a354a3ed06d6a8a77c2f1983f947", + "is_verified": false, + "line_number": 751 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a21195a2dde808b7cff35695396ecf7699125a53", + "is_verified": false, + "line_number": 752 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6547a05519f26198981f500b703d36443958ad14", + "is_verified": false, + "line_number": 753 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fbb8441f5e8e9b911cc42a025c856470784d89d1", + "is_verified": false, + "line_number": 754 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6378293ead806f554612c82fddf04ea8fb1ab2cc", + "is_verified": false, + "line_number": 755 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3272309f5c986a45cd892d943c5bd5af5165ad70", + "is_verified": false, + "line_number": 756 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1c79d15ecac42472241726cbae8d19bb820f478b", + "is_verified": false, + "line_number": 757 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a868da324435f3b1f32bc12bbd3171e9d62fcdca", + "is_verified": false, + "line_number": 758 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c56de5d2c763355c7a508dec8c7318e0c985dfec", + "is_verified": false, + "line_number": 759 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "258e19436174463d0e1b8066eb8adfbf79f78b32", + "is_verified": false, + "line_number": 760 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "112d96e04bf661b672adc373f32126696e9c06fe", + "is_verified": false, + "line_number": 761 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bdeaea4ca3484db9e8b0769382e1ba65b62362b3", + "is_verified": false, + "line_number": 762 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fff367064d95bace4262a1b712aa5b6fb2a821d6", + "is_verified": false, + "line_number": 763 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e16dcae490d17a842f5acd262ca51eae385fb6af", + "is_verified": false, + "line_number": 764 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bad941c81722b152629cebce1794a7fd01b85ebc", + "is_verified": false, + "line_number": 765 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "65e6aaaad1727c35328c05dd79fb718d5b1f01ce", + "is_verified": false, + "line_number": 766 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b7ea9b9d7d8c84eeeb12423e69f8d4f228e37add", + "is_verified": false, + "line_number": 767 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "42bea72c021eedb1af58f249bdae3a2e948c03fa", + "is_verified": false, + "line_number": 768 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1ddcb2cad21af53ad5dd2483478f91f3c884cea0", + "is_verified": false, + "line_number": 769 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e72ad6e31d1a19d6b69a1a316486290cb2c61eab", + "is_verified": false, + "line_number": 770 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8ca884c8fb24ecd61300231b81d1d575611cda07", + "is_verified": false, + "line_number": 771 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5754688edbb69be88b9c0ea821cc97eada724c14", + "is_verified": false, + "line_number": 772 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a267e65960056589647f075496fd3a6067618928", + "is_verified": false, + "line_number": 773 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ad3424f420bf25442aa9df96533852d29eac12a9", + "is_verified": false, + "line_number": 774 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8a5a26db2b7bda6268a9250808256e08d2a62262", + "is_verified": false, + "line_number": 775 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ff90aa934268bd629b33708b7db9a10b5f0bf822", + "is_verified": false, + "line_number": 776 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9294697fb9b36decacc26c3c33c3d186fc128f82", + "is_verified": false, + "line_number": 777 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8dfc552d4f52ed53ccb13c958117ceba6c8038d8", + "is_verified": false, + "line_number": 778 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "49c6467fa09d3052faaa1a369ebd226234db892d", + "is_verified": false, + "line_number": 779 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f2a450ffba5b1fdb7f016e4add7035ef6ba2df77", + "is_verified": false, + "line_number": 780 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "79a4f5a8804b9a94b5c4801700f08a2cdef54662", + "is_verified": false, + "line_number": 781 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1baf161ffff392357bbfb8e38d95c8c2f79ef6a2", + "is_verified": false, + "line_number": 782 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "840365ccbf5f23b939e8ee15571bdb838a862cb3", + "is_verified": false, + "line_number": 783 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0e50db71a57f0d0016b2abeaf299294c3bb4fedb", + "is_verified": false, + "line_number": 784 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b108976e96b8ce856b59b4f73cc6caa2555310cf", + "is_verified": false, + "line_number": 785 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "474f1a83c946ec223093d46f5010ff081f433765", + "is_verified": false, + "line_number": 786 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3740691aa3a788e71b7b74806dbcae3009b4f7fb", + "is_verified": false, + "line_number": 787 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c11bddda98ea121b857aabafbcdf75307a18bc45", + "is_verified": false, + "line_number": 788 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3445e70b7f8f3d381c21f6ed88c28c0db545662e", + "is_verified": false, + "line_number": 789 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c368482da3144e79d4f4f8063bdcfc85b1318ca1", + "is_verified": false, + "line_number": 790 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "470e734260c3e67dd19fca5ef32dbc6ce863dcbc", + "is_verified": false, + "line_number": 791 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0dc9bbedd1b90674d2d0c81563b1b59e82f901b6", + "is_verified": false, + "line_number": 792 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "49bbe143a0a5d2d81eaa04b0ae5f02b89b2e60ce", + "is_verified": false, + "line_number": 793 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9e009fcc53e8ae16ac2cd1c31945812a8b3cb1f8", + "is_verified": false, + "line_number": 794 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fda8ab7b8d8d0e3d995648f21cb97fb6a4371008", + "is_verified": false, + "line_number": 795 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "15ca6383ad968b3f606e5600e0ee5765cc61a223", + "is_verified": false, + "line_number": 796 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c901600adaae1fae9b24fe869cc11364e07651c1", + "is_verified": false, + "line_number": 797 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2a6968448cc0520a44b0fc8eac395ef9047a0ba9", + "is_verified": false, + "line_number": 798 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e58e1397cdedc8cedfc10472af62b0e24b7d90bd", + "is_verified": false, + "line_number": 799 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3f1a00fc8f814e6e5bfbb1b38a44318af25c0149", + "is_verified": false, + "line_number": 800 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "23887318ac83e9f3953825ada42ec746364c362a", + "is_verified": false, + "line_number": 801 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c5ebf6b1cd6af76112bb20fb2ef8482bd95088fe", + "is_verified": false, + "line_number": 802 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7f2b7465a347061ef449ed6410a3fccb7805775a", + "is_verified": false, + "line_number": 803 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "35c7486eb3aab3d324e34c9f2e4149c0833e7368", + "is_verified": false, + "line_number": 804 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6bafab58fdb0248c4e31eb58b8b99d326a5fec77", + "is_verified": false, + "line_number": 805 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b5b8f84bebc143026521dd3dec400fc319c8f07f", + "is_verified": false, + "line_number": 806 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "dc663ea73f635724beef79b22fe7c40bf812907f", + "is_verified": false, + "line_number": 807 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a5f5ebcab108b702af3122c9dec85e4aed492ba1", + "is_verified": false, + "line_number": 808 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "24826ebb519bed6f61af4c6dc3008fea3ca87c62", + "is_verified": false, + "line_number": 809 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f5e2d1ee2fc9d16703269c4942a406effa9208ae", + "is_verified": false, + "line_number": 810 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f28e36af3d92643a5ca738f66b0f9b0f0906a02a", + "is_verified": false, + "line_number": 811 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "19c8b107d6fdc4b807d831334b433ba0f051ee3d", + "is_verified": false, + "line_number": 812 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fd640c778ecdae75e71f490588436bad8551dc0c", + "is_verified": false, + "line_number": 813 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b93f3e5a8f7937290e368015ec63b9faa148a091", + "is_verified": false, + "line_number": 814 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b665cd0e94b8b690e5edb8446039bc20bd4edf8f", + "is_verified": false, + "line_number": 815 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e3482306ec339930b1f4d60e13c4006b9ac9949d", + "is_verified": false, + "line_number": 816 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a2c8590320283074b40e9c0f05af26ac1671580f", + "is_verified": false, + "line_number": 817 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e30ee01ef2baf677c7592e2a339d1d4c5f3b3053", + "is_verified": false, + "line_number": 818 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b8495b9cd806dbee2e7679dc94c9ca6b675107af", + "is_verified": false, + "line_number": 819 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b175eb842c0cb4c4d2b816c80b2cfea2b81eca04", + "is_verified": false, + "line_number": 820 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7cca142d68498553dd9cd10129b64f8f6b1d130d", + "is_verified": false, + "line_number": 821 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "62709b572d8c7952674f5ca8c807aa12346d8219", + "is_verified": false, + "line_number": 822 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "260d9d5da81fc235a36890dc1df9b0b93e620051", + "is_verified": false, + "line_number": 823 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f45c83b63c8fb4ee062a5649950ed25963f72269", + "is_verified": false, + "line_number": 824 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "94ab5caccdc141879f89dff48b17d633cce7c6ae", + "is_verified": false, + "line_number": 825 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8a67f56357e2ab075ec362aa17de81e09829dd1e", + "is_verified": false, + "line_number": 826 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e47ea7fc498253e920531b2f9440df22b65b4bfb", + "is_verified": false, + "line_number": 827 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "608bda7f1c9bbb04cbcd94fbef60907b34e5107c", + "is_verified": false, + "line_number": 828 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0ef4f672781b0c8008104b4833da99758a37c2d5", + "is_verified": false, + "line_number": 829 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b84c442c7f733ee0416ab3e451b3acd4fe708d11", + "is_verified": false, + "line_number": 830 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "af40c42cfab503d271744c98fa2d912f75fe1192", + "is_verified": false, + "line_number": 831 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "088fb0ba102fd16911bc92ecad1e96d6b9d7c6e1", + "is_verified": false, + "line_number": 832 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0205ce524bdf9689abb764ade3daff0a75a9680b", + "is_verified": false, + "line_number": 833 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ffb06eac178944f7cd519dffee1bce92b7b39de0", + "is_verified": false, + "line_number": 834 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1f4fec8780ce70e3b189b9ef478d52cb508ab225", + "is_verified": false, + "line_number": 835 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2084a2c1c5c015caab2036e77747bc1bc8da1b5b", + "is_verified": false, + "line_number": 836 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6d61e0dc6e9e3786a038ce41b2645ffa55ad34dd", + "is_verified": false, + "line_number": 837 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c2eedfdfb494f1da2837db4fe02a349f6b83e34b", + "is_verified": false, + "line_number": 838 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cb90f645f60eb596ccd816c2c9cad6df1da2f7af", + "is_verified": false, + "line_number": 839 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3714fb2f7dd6cc5392456fa413a7a6ba3cceca16", + "is_verified": false, + "line_number": 840 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a2b9353093261900009e92216ad07fb712d3aeef", + "is_verified": false, + "line_number": 841 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "38abeae07fcc9d78f57c915f7ec1ef448928c8d7", + "is_verified": false, + "line_number": 842 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4aab4807666815ca001aecb2c98150fa4e998a4e", + "is_verified": false, + "line_number": 843 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a3c2b5f078ce6bd677972296a39a9b6f476ad8fb", + "is_verified": false, + "line_number": 844 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "76cb76a7b46fbebf5a3d38b4f7507f5f6f966bbb", + "is_verified": false, + "line_number": 845 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6216237ea7f4271573ad9257b04f29624b32d067", + "is_verified": false, + "line_number": 846 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c46a24ae59ed9570cd0eaaf744cbdac682131822", + "is_verified": false, + "line_number": 847 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c7f4bfd365cfeda78938b48c174e84c476e0b121", + "is_verified": false, + "line_number": 848 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "95306491cf2bf602d32f153877fa3668188e89e5", + "is_verified": false, + "line_number": 849 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0a86977039aca715fef41f075a006d08913e2f9e", + "is_verified": false, + "line_number": 850 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "98ab4de33fb607da8c4bd3e6dcde7fc48be461cb", + "is_verified": false, + "line_number": 851 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c8a681b8468ceb7be04c81c9531fc1b76a73a979", + "is_verified": false, + "line_number": 852 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c1f2b4dc85c69f47bab7f0c95934abeb21241dfe", + "is_verified": false, + "line_number": 853 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d2c65d95022c1689e545f27bdb9125abfa65014a", + "is_verified": false, + "line_number": 854 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5334888b103ace2ac1628b453dfba0374aa21563", + "is_verified": false, + "line_number": 855 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "db870d53e2dbee8610b39a18017bf2e95d9b6a1d", + "is_verified": false, + "line_number": 856 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a874dd47f5e9d721212644df27395f9d0455bc7b", + "is_verified": false, + "line_number": 857 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "24304e79b441e1689f7db990cf1380e8ea172237", + "is_verified": false, + "line_number": 858 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ed52cda8715ae3d4b24fdea5e451cf0610003eb6", + "is_verified": false, + "line_number": 859 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8b5757852d0c36e7217daf8504004e6c85212d7a", + "is_verified": false, + "line_number": 860 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "85d089a4858f5681d1828bc1d67eb3f19bbeba6f", + "is_verified": false, + "line_number": 861 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "80dbb757c0b7fb948816886168d397b09b317e0b", + "is_verified": false, + "line_number": 862 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a45b519f89630194e67ed91782425b2095083fcb", + "is_verified": false, + "line_number": 863 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "297a0f9e38f85884d7d6beb518b33f8f35349004", + "is_verified": false, + "line_number": 864 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2200c973aaaaa2f1201604176787152091904d25", + "is_verified": false, + "line_number": 865 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "07d4fef177f006578f4d37289137d90727a5fa86", + "is_verified": false, + "line_number": 866 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d68f0a891f53a354bff2a9002ce0e3c60236d0fa", + "is_verified": false, + "line_number": 867 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d101c2cdae39ce8adcf30a777effd4be14b07713", + "is_verified": false, + "line_number": 868 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7e5670956a5ca012cbfe2ec89841595ada7ffc4a", + "is_verified": false, + "line_number": 869 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d58782068176eeb0987b1850ec9b1e54764c5947", + "is_verified": false, + "line_number": 870 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d779f72f04dbb76344f4c264d19bba7242e25e90", + "is_verified": false, + "line_number": 871 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "99c57a64facfebfb9e41dfae591af95633715986", + "is_verified": false, + "line_number": 872 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a7a97bb3f0508c2ed46ad81ed8cc53ff7469edc5", + "is_verified": false, + "line_number": 873 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c8b289fb0554107bbd07c43f462a87e7b929a529", + "is_verified": false, + "line_number": 874 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3c092d1639246d4ce9167319e729dc39d1bb3793", + "is_verified": false, + "line_number": 875 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c34cc18e2fb77269d8f33529c23d4ae2a55b873e", + "is_verified": false, + "line_number": 876 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "57562f3034b2895272567bccdb4476ff4ffb387f", + "is_verified": false, + "line_number": 877 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e75aa06fcf9eb16ce4f765009f73bff5998b4d82", + "is_verified": false, + "line_number": 878 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "561dd2c1798724b1f7730df97cf07b16f27db369", + "is_verified": false, + "line_number": 879 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "548d01127e6414ebc307a1da07e1814eb28d9c43", + "is_verified": false, + "line_number": 880 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d356fdfdeab6a77435a395a60e99e988f3c7e85e", + "is_verified": false, + "line_number": 881 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7d850865aadf5851746b420805c2d1a859af11fe", + "is_verified": false, + "line_number": 882 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a2221c705b602dee5ab23632133b47700d5a1dd2", + "is_verified": false, + "line_number": 883 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0d4e54941ee10299f1064634fffb86e4b7bfd005", + "is_verified": false, + "line_number": 884 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "589f88e962e41fc2e6691090dc335a20c7520348", + "is_verified": false, + "line_number": 885 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0d9ea7340e4afb03c7564f911883428d4d0e5e01", + "is_verified": false, + "line_number": 886 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "86525dece15cc1ed811c029ebae7ce496af598aa", + "is_verified": false, + "line_number": 887 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f3add200e410ee751ec2e65f4c00d5fe546a2b46", + "is_verified": false, + "line_number": 888 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "89588ee266a0fee04980b989461d344c91f917cf", + "is_verified": false, + "line_number": 889 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c02f12006740778cceb3e14d10eef033650f0905", + "is_verified": false, + "line_number": 890 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "16d1c52b661852a0a2d801d14e5153cd2245854a", + "is_verified": false, + "line_number": 891 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bd48b759e75395bd491df6811d82ada954b1a8f8", + "is_verified": false, + "line_number": 892 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f9d8d2bcc1f978b39c12409b8bd5c35e1fd3caef", + "is_verified": false, + "line_number": 893 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bd7006183d8fc08da5a29edc7dce2833b7d67c29", + "is_verified": false, + "line_number": 894 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b4f7d597cf8d0e4a8bdd47b462ffaf7f753906f6", + "is_verified": false, + "line_number": 895 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "10d3f4cb2e16143374e3db5c6828184d97cef711", + "is_verified": false, + "line_number": 896 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6045891b6aed86c8d19a6aecd12b2df1a32e3921", + "is_verified": false, + "line_number": 897 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f09ecd7a19945614bd73b5be04331b691d2bc030", + "is_verified": false, + "line_number": 898 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f0cf1445d72e773713d17ed9ecbf6f805206cc80", + "is_verified": false, + "line_number": 899 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "34cba93b5c522de558e25672a78a5d75028a02fc", + "is_verified": false, + "line_number": 900 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b08833d65be532022a038652bffe2445f840479f", + "is_verified": false, + "line_number": 901 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ed24a43ca6ed9df8d933b25418889701bdf1492d", + "is_verified": false, + "line_number": 902 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f081d33d1093e834b3fe9e678720c07c7dfbaef7", + "is_verified": false, + "line_number": 903 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fbd0b56627efce28202a4ebc927ed09fb338cf24", + "is_verified": false, + "line_number": 904 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8f79ecdca6ff2d1240ab55db0395f3babd8e0cd7", + "is_verified": false, + "line_number": 905 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0d42925b4018649775d5543b6e5ccd1096eea954", + "is_verified": false, + "line_number": 906 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5564f26e8a7f58c2e525d04261557b54ccb3eeae", + "is_verified": false, + "line_number": 907 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7e61f7e6fbbccc54b49c5932dfee56e4d05d8bb6", + "is_verified": false, + "line_number": 908 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d28c82f5235be5773d7b556004493d197863e47e", + "is_verified": false, + "line_number": 909 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ead7a2d8ba1098da1203103338f6077d384ec789", + "is_verified": false, + "line_number": 910 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "57b73b00541a671b1c0f9b49b1a5b9b6d43e386f", + "is_verified": false, + "line_number": 911 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "00d3ba478bd4e0005ba325c0fa3bbb80969a4072", + "is_verified": false, + "line_number": 912 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "63497e9fab38614d05946c0b9dd1338983132696", + "is_verified": false, + "line_number": 913 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bf7915a186cac89cbf27b479b4318af45d334f3e", + "is_verified": false, + "line_number": 914 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9e5791210452015df2676f6a7706415ad7c8149e", + "is_verified": false, + "line_number": 915 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "149a819c93748d871763fdd157fbf2c93fcff33d", + "is_verified": false, + "line_number": 916 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5c0e33a6cdc2bcfa911e665929ae524093e8d4a8", + "is_verified": false, + "line_number": 917 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0a04734c82ec76181682c537a590934fbe46fe44", + "is_verified": false, + "line_number": 918 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fb96412139d649dc332fc596841dc2d7543a09d3", + "is_verified": false, + "line_number": 919 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c48b721469472686b78de0db8d34ccfbe5113804", + "is_verified": false, + "line_number": 920 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7c832e5288c3cd8f714e3b57d31c7fe05ad0b98b", + "is_verified": false, + "line_number": 921 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "58383e090cd1cdfdbd494f46d533d7be96c3d16f", + "is_verified": false, + "line_number": 922 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "964063ef09c1114c0b89c4a8bdc6fb9a5238b75b", + "is_verified": false, + "line_number": 923 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0f70be8ee00fb5491a86ff2b185e193bed8147d2", + "is_verified": false, + "line_number": 924 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "eade9c861e70446d1a4057306ea14bcbb105515a", + "is_verified": false, + "line_number": 925 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "645a4a4787c20dbf7d23af52b6b66e963a79701d", + "is_verified": false, + "line_number": 926 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "952b79bc3f47f661ffd882f2cac342d761c7ee89", + "is_verified": false, + "line_number": 927 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "325ae8750d58cb76ba5b471c776b575c6dd8f7de", + "is_verified": false, + "line_number": 928 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c848e0ebbd67aadd99f498bf457fe74377e2dee9", + "is_verified": false, + "line_number": 929 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "938a394aacb5f28860f2a21dc11c2143dfda6609", + "is_verified": false, + "line_number": 930 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6f7cc320c863e5e4d854df9f1d9343408b316152", + "is_verified": false, + "line_number": 931 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bca601976f824d572c9829820d04ef78f0aa89f2", + "is_verified": false, + "line_number": 932 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8f436a87f64990bcc5bba342e4614ba240cb4001", + "is_verified": false, + "line_number": 933 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3c41d19e585a5d6932fbedfe9a9970b2be5be662", + "is_verified": false, + "line_number": 934 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "11c444922d1367a8d844b4f265dd34234145b4e1", + "is_verified": false, + "line_number": 935 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4b5b8766a87bdfe9e72b205635cf3202579c294e", + "is_verified": false, + "line_number": 936 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a8c32045952ca987aa668c54161b8313d4e27d06", + "is_verified": false, + "line_number": 937 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7280d2d3abaeaa0b8c09b30184cfa8e9d96f16f9", + "is_verified": false, + "line_number": 938 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d353aeb68a062440b13bc25906bc19450808c33f", + "is_verified": false, + "line_number": 939 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c06ff020b6c003435cd543d7c094df946d5cee8a", + "is_verified": false, + "line_number": 940 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6c846e552b2bae1eb5fb1ee603bd35dbcf43f8e1", + "is_verified": false, + "line_number": 941 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9526db9835d636a82d4c7843dcb4b1a97f0cd41a", + "is_verified": false, + "line_number": 942 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c0d1d341758862cd2d243425d7e0e638ccde2be9", + "is_verified": false, + "line_number": 943 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "168f03ae12ec1b265302c9be39275b3ff886f0ba", + "is_verified": false, + "line_number": 944 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d4431e65831239ecb46c60b109b3cdf3d90413e4", + "is_verified": false, + "line_number": 945 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6065a318efbc35fa8bfa8179ea00d139aa8ac5f8", + "is_verified": false, + "line_number": 946 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ca8eb4ab2a13fd9c8009f64e9a57a9698da2af08", + "is_verified": false, + "line_number": 947 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "076d36e09e412d1baffcfe20e235b32e766d9d37", + "is_verified": false, + "line_number": 948 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8a96b1bb17e8fc8048721963a8944f194e0d6383", + "is_verified": false, + "line_number": 949 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "036334bc532f791df9f17a922a6b282468e3a32d", + "is_verified": false, + "line_number": 950 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2e9e4798ee11ce742834d80c2103c846b8a7daa8", + "is_verified": false, + "line_number": 951 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b34309d4e552ffa204cbf7632dd06376f7cfe925", + "is_verified": false, + "line_number": 952 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "eb323c2dabc2fe8fe9d73e355e24554f45a097ef", + "is_verified": false, + "line_number": 953 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "eeb750c5480e76e5b075a1cc415007182d5a84a5", + "is_verified": false, + "line_number": 954 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "baa82df8fe62f21e4a9bd056515d279b5f4bf296", + "is_verified": false, + "line_number": 955 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7ed197e47d75c92a2bb9fa469ce2584338ae7978", + "is_verified": false, + "line_number": 956 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "eacb84eb412e97afee8329c534ea5822025d2f34", + "is_verified": false, + "line_number": 957 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1a7e7d49835c298874d24cf9434a7c249f71811c", + "is_verified": false, + "line_number": 958 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "71124a16113f0bfca8f71090445ea96115e92c3b", + "is_verified": false, + "line_number": 959 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "eb6fed65dc17090a731ba790be1c1e913ed43696", + "is_verified": false, + "line_number": 960 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ff488edfba52bda0a9d4ef548f4e848e1bc407c1", + "is_verified": false, + "line_number": 961 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d58ebcc9017888fd12d9eee6a1dbb7a1e5d8bf72", + "is_verified": false, + "line_number": 962 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4db9b98c3dc42567e08ac91e4658c7774eacfddd", + "is_verified": false, + "line_number": 963 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e91ea43a53d83fb4b47e5769b7db51e4f1c0a333", + "is_verified": false, + "line_number": 964 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b8768444a059004aa7d50c73da0c7665e774c8b7", + "is_verified": false, + "line_number": 965 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "52af7be744b7e8e3c9d75db11b3de31693313573", + "is_verified": false, + "line_number": 966 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "169a53ab3aa86b11c6a4fb5064b2cab7b64d260d", + "is_verified": false, + "line_number": 967 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6c29925cd018548844c1b174a4fad45f39ca4d3b", + "is_verified": false, + "line_number": 968 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "793d9bb0e0d7f5e031e367587ecb877881cdd56b", + "is_verified": false, + "line_number": 969 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "709969f024af92b318a5dc3a0315a66c2a024820", + "is_verified": false, + "line_number": 970 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6c66657d4bd785b7c16df241260cd51f8d7e7702", + "is_verified": false, + "line_number": 971 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "54330bf419e7174ab210ac03a0b26bdbb50832e3", + "is_verified": false, + "line_number": 972 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "02bbbfc42d316c59297fe15109e17447512bc76c", + "is_verified": false, + "line_number": 973 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "446f08aead8d20df9ee177b4ee290303cbbfc348", + "is_verified": false, + "line_number": 974 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9b47bd9a70c30307c89348cf7044e66b8eeb604b", + "is_verified": false, + "line_number": 975 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "16799c910c44755b0c3ffa38c27e420439938bb8", + "is_verified": false, + "line_number": 976 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cfba338d2d1c6c8ee47fd7297eae9e346ef33d2c", + "is_verified": false, + "line_number": 977 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "42f730799ccc5f4e3f522abf901ce4a7872f4353", + "is_verified": false, + "line_number": 978 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5669611e63657e7b6d5f10aee1fe08837577dc99", + "is_verified": false, + "line_number": 979 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8b8a1180371e560308a4b3bcbf7d135e4fdce66e", + "is_verified": false, + "line_number": 980 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b5b25fad7a60d76bb8612fe1fe7f4114134b7fe1", + "is_verified": false, + "line_number": 981 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7268358632fc15cc97395c23ac937631427a06da", + "is_verified": false, + "line_number": 982 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "77b14302acab126de73e1960951b4d8862f8996b", + "is_verified": false, + "line_number": 983 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a9f98d55aa73cddda74d878887f9cf7c91ed9622", + "is_verified": false, + "line_number": 984 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7c0abf324bb40af2772baa72ec9eb002674b972d", + "is_verified": false, + "line_number": 985 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ecd7751d16ed66ffbccbc3bc0cdc6767e85c9737", + "is_verified": false, + "line_number": 986 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1829e0ea8aa97dd1c07f83877af61079a0420f0a", + "is_verified": false, + "line_number": 987 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "246e88cdb42b377333a3fb259ca89b8f2927c9f6", + "is_verified": false, + "line_number": 988 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "70c184cc1ba36cc336edff03d3180e16a7b6a8c8", + "is_verified": false, + "line_number": 989 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f3e0f3c62ed74ee4c701d70dbfbf5825e9b153e3", + "is_verified": false, + "line_number": 990 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fceabb5893c16c83a2f75e44a2c969cb6bff4c70", + "is_verified": false, + "line_number": 991 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "dd14309feb249e827dba5ced8ac68b654e7db8cf", + "is_verified": false, + "line_number": 992 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9f675a535ed79052f233c3b6f844eb96368d2d4f", + "is_verified": false, + "line_number": 993 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0e0d26feae012efa3585e895b6fa672005c3434e", + "is_verified": false, + "line_number": 994 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "42a18905f6b1ba2fa6cda2c3b08b43059503926d", + "is_verified": false, + "line_number": 995 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "960330eaa639a3374f20fb3bb1d33c3cb926f9cc", + "is_verified": false, + "line_number": 996 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c676ae0d67843480085f4544a475ccec95b1c942", + "is_verified": false, + "line_number": 997 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "05a62b604c1187eb336526d03642a7c46e6727c3", + "is_verified": false, + "line_number": 998 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cde1211319f593ead3f23c0fac4f0ab48866f5da", + "is_verified": false, + "line_number": 999 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7d12d1e4865212b188c6aefd69096d4f6df8d113", + "is_verified": false, + "line_number": 1000 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "58c2087994575f810e6fb07f476718ac01436189", + "is_verified": false, + "line_number": 1001 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b9b320c5cd52c63f2c7d8df9f7eb8d7ae97ea0c9", + "is_verified": false, + "line_number": 1002 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "94ade2ea50c865df9827f975b66b0ed87f6196b3", + "is_verified": false, + "line_number": 1003 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "399c06fffa9278491e56e25312b94398408888b6", + "is_verified": false, + "line_number": 1004 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f20cde564b4b5821671912b7c6a87f2955fa42e8", + "is_verified": false, + "line_number": 1005 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6f320defd3068726e899c9764628473dfd3552bf", + "is_verified": false, + "line_number": 1006 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2e1374c55dbeb0c445b7cebbcf13b2258776c08b", + "is_verified": false, + "line_number": 1007 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "60d220a965d81b4d93238d90e5f9f6a8cfe4ee1a", + "is_verified": false, + "line_number": 1008 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b6b4a1a8971608d6c5f4612efb7b811612fab847", + "is_verified": false, + "line_number": 1009 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "54d103be76f6e12ddfb2d277d367ce2e78d41c5b", + "is_verified": false, + "line_number": 1010 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "65de6ec76c0fb7685c47bc8c136b9f8e35187a14", + "is_verified": false, + "line_number": 1011 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3e507308114a34a5709c1796bc43132539ecc410", + "is_verified": false, + "line_number": 1012 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6b2d7139a0eb9228a3ee9cce0808e1f8a8790e82", + "is_verified": false, + "line_number": 1013 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7a6e781d3ddf14c6314ee3329b8fec94fb15c29c", + "is_verified": false, + "line_number": 1014 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fee4d49183e2b79df72990acf34d147d86b65df3", + "is_verified": false, + "line_number": 1015 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6f0633cbd3640e2b979a8a1516c9bd394da76fe5", + "is_verified": false, + "line_number": 1016 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "711980892808cca786860a2790796417f526d762", + "is_verified": false, + "line_number": 1017 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "25756983273f8f4a48bb032b07c85104e4fc98cd", + "is_verified": false, + "line_number": 1018 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5726a0328e5579f407bbf03fc3caa06062205ca8", + "is_verified": false, + "line_number": 1019 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e8c6a788cf042a2a2ea8989b33826f1d6423eb29", + "is_verified": false, + "line_number": 1020 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "755577452cdccb63d3e7f1d3176316fe5ef084c8", + "is_verified": false, + "line_number": 1021 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0ec16170fcd97d28c0f5fa919e3c635358935c04", + "is_verified": false, + "line_number": 1022 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0f91ef272eab7567d0f2db99dffc6dbaae2cc084", + "is_verified": false, + "line_number": 1023 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "35e6dad6c44367b5bb860ff5afeb54c8c92cef58", + "is_verified": false, + "line_number": 1024 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "73dcdb9d800fe9776667edb8cde8312a0a768ada", + "is_verified": false, + "line_number": 1025 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b56ea4486eded8635f63a8622a012fb3ee81a3bb", + "is_verified": false, + "line_number": 1026 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b0f4a8c4f6255ea5f66fdb118eba5eeb0829307d", + "is_verified": false, + "line_number": 1027 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "88d9c65e3ce55ba286c8faf8cb105ea6ac39a19b", + "is_verified": false, + "line_number": 1028 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "adc51f3f9a4c42b861f0da4fcc29392bafe2d98e", + "is_verified": false, + "line_number": 1029 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "96b4ea6fc588c3413700405f4d169504240aa637", + "is_verified": false, + "line_number": 1030 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f119079e796b8f2b9d29804daa90877f525cee3a", + "is_verified": false, + "line_number": 1031 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fbf43f6ca18c68df0a478acd09bb465453c9358b", + "is_verified": false, + "line_number": 1032 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d437b203233fd78ffc8630e42a0655f58d2e9f4e", + "is_verified": false, + "line_number": 1033 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6b7f8512ed9b6046476383c6515fc080c63ca508", + "is_verified": false, + "line_number": 1034 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d9f3006796ec72e11dba105176761e360fcf2a3d", + "is_verified": false, + "line_number": 1035 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ad59895b47e8ab566d17c2ef7121c98d469e0559", + "is_verified": false, + "line_number": 1036 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "132f531444b23991fdf797454d8f949e5426ff45", + "is_verified": false, + "line_number": 1037 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "406f3373f38a62e52e8caa4458dfaa68eca20780", + "is_verified": false, + "line_number": 1038 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ce605737729ff998492c8760553bd54393097aac", + "is_verified": false, + "line_number": 1039 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fc42bf79fd0d8179e9f4f9f0190faad588388004", + "is_verified": false, + "line_number": 1040 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "efc0f56dded17fa0c00b58a820fbe74a1e368b63", + "is_verified": false, + "line_number": 1041 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9d450e49c3cbcffcfb559a51d6ab4531f2a645bf", + "is_verified": false, + "line_number": 1042 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8437e864bc114188554fd79b98cfd43f4c588df7", + "is_verified": false, + "line_number": 1043 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "de462d8851d3dc92579a62f39fadecf6b9d6bc22", + "is_verified": false, + "line_number": 1044 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "508fdca9918030fb0b8a8739ba791f611b793112", + "is_verified": false, + "line_number": 1045 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4933bc7d4edeb7116d71e7f1947e5d6ed29760ec", + "is_verified": false, + "line_number": 1046 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4a8bfde12d39966ecc92cc667695767bbdf7366b", + "is_verified": false, + "line_number": 1047 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3dbc1c47b263483e20fa69941a4274cc19f85bc2", + "is_verified": false, + "line_number": 1048 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d1287d92f048a817c6bb27b0993a87aa9560996b", + "is_verified": false, + "line_number": 1049 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "10cb9bc401ea5975fd15188a2b9cc592e513647a", + "is_verified": false, + "line_number": 1050 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f18de35aa597b41bb9d73890f35c8f7704c72ea1", + "is_verified": false, + "line_number": 1051 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "dfe7e4f70a85c9d4d9e5e43b38e6c4afb6af9858", + "is_verified": false, + "line_number": 1052 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d39edd8dd598dfb8918b748d29c25259509675dd", + "is_verified": false, + "line_number": 1053 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5d2721a37cabecbb784a5e45ff9d869e7c90d7f5", + "is_verified": false, + "line_number": 1054 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "60d52adbbee54411db221581b7d93960b772f691", + "is_verified": false, + "line_number": 1055 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "af1320e386741990cf1c7201101f2ae194fc72ca", + "is_verified": false, + "line_number": 1056 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4bbc199707b0d38feb6244d4069391cf4af4b8bb", + "is_verified": false, + "line_number": 1057 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "22023f99a0e352116a61bf566f8af2ab60b5d9c1", + "is_verified": false, + "line_number": 1058 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3f664164c66bb49689d9931436c3d4f57f316eb6", + "is_verified": false, + "line_number": 1059 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9a4a988167abb6a3816d472d4be97cd105a69baf", + "is_verified": false, + "line_number": 1060 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7edf4402503eaf501e23c31ef1306392d5ecacd0", + "is_verified": false, + "line_number": 1061 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "508b4ed03f5a2f09fb22e2641580065ee4c8a372", + "is_verified": false, + "line_number": 1062 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b02f44c26e7091096fa6fcafb832b62869af42a2", + "is_verified": false, + "line_number": 1063 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0f9174e85538561b056727e432773bb69e128278", + "is_verified": false, + "line_number": 1064 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cabc1f10dc737ef7e110172b814966cdad11b159", + "is_verified": false, + "line_number": 1065 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ee5288a3e32b3b55b342ef18051c78ffff012231", + "is_verified": false, + "line_number": 1066 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0a25e259c157bcc1a99d7e001e52b35d0a4ae2b8", + "is_verified": false, + "line_number": 1067 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3c7bdd0b20d6f7c299da33dbb32d99105489f1c4", + "is_verified": false, + "line_number": 1068 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "19b40ca81ef322c1c0028ad1a005654faa9cfe93", + "is_verified": false, + "line_number": 1069 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fc4ff73da4fb03231a38728acf285f405b1b3ce5", + "is_verified": false, + "line_number": 1070 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c4e603285dc95917f8836283bebce03ff4bc11ba", + "is_verified": false, + "line_number": 1071 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e9e498abd308db923d58b1c35ad83467e58a60b3", + "is_verified": false, + "line_number": 1072 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "954161d814c5c2ccf3ce8c3609ebb4157c08b6f7", + "is_verified": false, + "line_number": 1073 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9bcf9c2a4de2db297ac881231955ad39f19a9df1", + "is_verified": false, + "line_number": 1074 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8eafb590298e1d35ed72d88625bd344a427ccc8b", + "is_verified": false, + "line_number": 1075 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "32a3705a4ce42eecec3c45b0bb0a2c36142b6d08", + "is_verified": false, + "line_number": 1076 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5e8a991485e2080c429eab8a5049b3c3bf7c0ba8", + "is_verified": false, + "line_number": 1077 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d9fbae4d79a44395e6eca487062df13d46954053", + "is_verified": false, + "line_number": 1078 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f62a4f64d930b746fbefdad6c48b0d2a2dc07130", + "is_verified": false, + "line_number": 1079 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f7af30387bf7c4ac2cc0b48eef09f350ec43dae8", + "is_verified": false, + "line_number": 1080 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "afb00100d9ca02672c09acc78c7e13b56b049f63", + "is_verified": false, + "line_number": 1081 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "428e0f17cb680f5fc2b3cdc648ef8739b0fc1d87", + "is_verified": false, + "line_number": 1082 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a7846f258d908bca9bdf9120db6b9b370a4143bd", + "is_verified": false, + "line_number": 1083 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "38c581282a5c2d07745c008443cdc545acbf5aca", + "is_verified": false, + "line_number": 1084 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "63f97716fc1f282d6718710c230006611b86be04", + "is_verified": false, + "line_number": 1085 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "57600ce03478249d79dd13c009f7f64b7ae6211c", + "is_verified": false, + "line_number": 1086 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8e96ee931397b82b3f2c330bcfb3cfea3093d5a7", + "is_verified": false, + "line_number": 1087 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c85653058313f125a2438e1cf446cb90bbedd8ed", + "is_verified": false, + "line_number": 1088 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1a54794f5e3a4dd2036cfd120e294e6401f6d227", + "is_verified": false, + "line_number": 1089 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "60f2b36dcf992c96fe61ea001441417f314064ff", + "is_verified": false, + "line_number": 1090 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "939ca981ece9656aebd5b02d02ed33deadb8923b", + "is_verified": false, + "line_number": 1091 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c28c0ae6268f5e6e813f9fe3b119e211473071e6", + "is_verified": false, + "line_number": 1092 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fa66a89cdd91b75a640282d832886514fe6456a1", + "is_verified": false, + "line_number": 1093 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e464c2a1ba37ae51b0f7ff8b3fba06a8ed7108dc", + "is_verified": false, + "line_number": 1094 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8fb023d4933c56bfeb403311ffc3752d2fbc975e", + "is_verified": false, + "line_number": 1095 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8f066fc1693da2a9cfa30bc540bb35f884c62a30", + "is_verified": false, + "line_number": 1096 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "63a7db4c42e5b728324ad5d2c92e6514ab23364a", + "is_verified": false, + "line_number": 1097 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d4b9ba68b048c4c52c65e192dd281c1c203463c0", + "is_verified": false, + "line_number": 1098 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "33e4d896c6a8b4d14cb836f616f03eaafa43018b", + "is_verified": false, + "line_number": 1099 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1a5b72368ecddce420d879781be813c19475c1be", + "is_verified": false, + "line_number": 1100 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0106004ab89b24991e5e01849276a2ed348d1194", + "is_verified": false, + "line_number": 1101 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "54ede800e24d999c54ce14b80d8c56f834d1a570", + "is_verified": false, + "line_number": 1102 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ff58b7f59920c5d3484985e53a686b91d7b183cd", + "is_verified": false, + "line_number": 1103 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "255ac9b7f9fa6a2376b2fc2219ff38f80dc8c655", + "is_verified": false, + "line_number": 1104 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b0b7694dff36d2e9337b1012073d9ab41aec18c6", + "is_verified": false, + "line_number": 1105 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3d675b3354c15f5088cf1581fc9fa052360c8ecf", + "is_verified": false, + "line_number": 1106 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6e11485ed9e411128ab20a54b6d52e4e879e289f", + "is_verified": false, + "line_number": 1107 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "200a78aa828ba2d7cca00e420a85bef9dde6c841", + "is_verified": false, + "line_number": 1108 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "936a30deb66f624c112527914bbe2f09fb1c2ea2", + "is_verified": false, + "line_number": 1109 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "430e0786d83a62119d1ed6bdc8b87efbf7afbc9d", + "is_verified": false, + "line_number": 1110 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f3fd7614d07e21dc15fa385fc2042847610f8259", + "is_verified": false, + "line_number": 1111 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "dddf43eddf77d768ace4901fc5d506ae2c85ec2d", + "is_verified": false, + "line_number": 1112 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ae367707142233fce304a364467337f943952845", + "is_verified": false, + "line_number": 1113 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6b16b9ea707df813fc90c54d7a531cf0f6b754d0", + "is_verified": false, + "line_number": 1114 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cd1dc83b5bd180fb9f5e72361ff34526b2227197", + "is_verified": false, + "line_number": 1115 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2f4400f3ba736cab5d0bf75f249c030724c8d0b7", + "is_verified": false, + "line_number": 1116 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "43d51f653e0a59b1f5988c8b6732b71dc2492bde", + "is_verified": false, + "line_number": 1117 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "32336fe7d0a6638edadafcef1f7355ff5a5043d1", + "is_verified": false, + "line_number": 1118 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4915df89c72bb9de93ba1cf88de251db9ebb05ec", + "is_verified": false, + "line_number": 1119 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3f1343a17f1e3d24a58df03d29a1330994239874", + "is_verified": false, + "line_number": 1120 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a240e2ccfb08d02d3d54ce913d120af2b4a68a19", + "is_verified": false, + "line_number": 1121 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ac1f2ad12e871b6e5818be4e7f23f90f0b655c65", + "is_verified": false, + "line_number": 1122 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3b792af94a90899b8cfb1cc44605d4de5c0eab7a", + "is_verified": false, + "line_number": 1123 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d6d3294546ce3a4df35269a80497b35d3d97851c", + "is_verified": false, + "line_number": 1124 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "04992ccff77891f14f3dca8bb59cc30534ae31f3", + "is_verified": false, + "line_number": 1125 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bbb54a9a3169f76822f3c8de4c5c33c12138a8ed", + "is_verified": false, + "line_number": 1126 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "64419f894e06d7b0ab1236d60034a5410006f422", + "is_verified": false, + "line_number": 1127 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f58a6063b0ce4ccf2630215d7ab442eb3a6cc154", + "is_verified": false, + "line_number": 1128 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "80fa5cbedc3d970f28652338cbd1da179a4b24f5", + "is_verified": false, + "line_number": 1129 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "904d8f8daa11159afe547828d6da112ec785fc9e", + "is_verified": false, + "line_number": 1130 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "62e23442e30718968242cf6397ceaf835e2b6758", + "is_verified": false, + "line_number": 1131 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8ce675cce57b21a3cf664029ff539107da67583b", + "is_verified": false, + "line_number": 1132 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "64098f0a9449c43a8f071d2052c6066940e75ee8", + "is_verified": false, + "line_number": 1133 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "876250d35eaa0e8f788304e6f47bfb9ecf4aa1f4", + "is_verified": false, + "line_number": 1134 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7aac80369e7b76f53ae0de0d94dfbaa21a130d32", + "is_verified": false, + "line_number": 1135 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "65df2537b97ebdb84c0dc6afa37f140811294e57", + "is_verified": false, + "line_number": 1136 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f6ed524b021390fe734f26cac66fcf1e6a6c455e", + "is_verified": false, + "line_number": 1137 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8fdc365a4e50f09aa482d72bba1974df3b6c9859", + "is_verified": false, + "line_number": 1138 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "36890040b0afedd15fdd9eb87459a4165fcbe2a3", + "is_verified": false, + "line_number": 1139 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9df5cbdfba97fabe10d94f771bcd7ca889c87b2d", + "is_verified": false, + "line_number": 1140 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "de65594f00e0098e7ab3312414faf191bbc3e3c1", + "is_verified": false, + "line_number": 1141 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "37247ab05766ecc1ac7fae19a77b31f7116cce38", + "is_verified": false, + "line_number": 1142 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "13d8923244df4b3025c5d2dd405a22a757628f8d", + "is_verified": false, + "line_number": 1143 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9eef15e4a145e31f7c74235731b69dba5207b237", + "is_verified": false, + "line_number": 1144 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "746b63eabaddeed7ab5dbe3b1fe4e41f89e9f21e", + "is_verified": false, + "line_number": 1145 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f9512226d4044bb241d77988dac046b05effb4f3", + "is_verified": false, + "line_number": 1146 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "de168aa5d99ff80498b7552c850db5d42cb425f9", + "is_verified": false, + "line_number": 1147 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2367ab77f144da2b2349cdbfdc4500d429754353", + "is_verified": false, + "line_number": 1148 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d6a619ebb4b2766bce83fa5bfb6118a9d8ba3212", + "is_verified": false, + "line_number": 1149 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "35fe8489533c677b657cfee61474bab7f268a495", + "is_verified": false, + "line_number": 1150 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e58be566894c228cb922e434d34416a473f0dc28", + "is_verified": false, + "line_number": 1151 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "18f33c6db138875913acb6ad887ed80ca3dc317f", + "is_verified": false, + "line_number": 1152 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1e8a66cfa6671b1771e5874f29bfd96e47b4ad76", + "is_verified": false, + "line_number": 1153 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "284301d7ef66a6721a4b76a02c274419de91a437", + "is_verified": false, + "line_number": 1154 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6694d586f66b50c0162e1cff4b1f133e2c8a9423", + "is_verified": false, + "line_number": 1155 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c712802905f08891cac2e68e6d8f5f6d85e4cf60", + "is_verified": false, + "line_number": 1156 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cd5f0c85968b392a77596cb5143de81f6f109bcd", + "is_verified": false, + "line_number": 1157 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e158eb64d577c9904690ff67584f2b0090792139", + "is_verified": false, + "line_number": 1158 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "62cef2983d23c372ffd1175683e2cf0489a0a93c", + "is_verified": false, + "line_number": 1159 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0039a393f63d3b522516a90354354b6477765b06", + "is_verified": false, + "line_number": 1160 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5c91012c71d492f7e5bc5607f71e1d3337562f9b", + "is_verified": false, + "line_number": 1161 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "83fd266255474e467fcc3f1ca61b0371bf6933eb", + "is_verified": false, + "line_number": 1162 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "44dc9bc4f3a32681036d3328bf2e2c298c94c5b3", + "is_verified": false, + "line_number": 1163 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c077db4aab559fcc23cecde6c8dce6f58a86c7ba", + "is_verified": false, + "line_number": 1164 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f2e728ed22184e3a7bf3b34308c53815d811687d", + "is_verified": false, + "line_number": 1165 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9d653c4cd2f63ba627e1f7eb557b793e7eb50f3a", + "is_verified": false, + "line_number": 1166 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "33e0029ea6c1f2989bf2b5b86f6c4acc03fd7b10", + "is_verified": false, + "line_number": 1167 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "139c8a653e6827e2b29b75c31d27eba181977579", + "is_verified": false, + "line_number": 1168 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e34424070b48aeaee9eeeb88a1a928d2ce1f5517", + "is_verified": false, + "line_number": 1169 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c4db39ccd7c06e68ada50b294aa53f947559a99a", + "is_verified": false, + "line_number": 1170 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0636d970e79e781a5159068c6fe7f0411698b596", + "is_verified": false, + "line_number": 1171 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0bc38af13c57dafb7f18b33b86e5bcbe1292bc2e", + "is_verified": false, + "line_number": 1172 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "02d9eabf8b61d1e62425eac9c7b39385e602ddad", + "is_verified": false, + "line_number": 1173 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3ba33420b436dd34da6f45fdbdbb26a87c99e811", + "is_verified": false, + "line_number": 1174 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2965a6a5b73c3edfdc11d9a979bb085546d63d1f", + "is_verified": false, + "line_number": 1175 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8b15da0afbed8313d1daec67d4bca7958949484d", + "is_verified": false, + "line_number": 1176 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4bf0c8b08ddcb81f5ac2457580003197ff4782dd", + "is_verified": false, + "line_number": 1177 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9e3822884cf25511703c4fbfce1ddacc0d19d021", + "is_verified": false, + "line_number": 1178 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "26fd6e63721168b064c7825415fda7da4c17cd36", + "is_verified": false, + "line_number": 1179 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "82db110822969249eff39d4b7e6830ee919c4b8e", + "is_verified": false, + "line_number": 1180 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e81523785f6e5efeb372a665059ab959c7911c37", + "is_verified": false, + "line_number": 1181 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4c8056fa1e16e63e4da13f329a0f0ba8c3d875eb", + "is_verified": false, + "line_number": 1182 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "63a9faac8e9440b425905da27052de51aa69b937", + "is_verified": false, + "line_number": 1183 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e0ad9315e82b5f80b7b02ce12ba3e686c9a637a5", + "is_verified": false, + "line_number": 1184 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "176ca3d77737c23c86a524235e4281df3a64a573", + "is_verified": false, + "line_number": 1185 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e8b4a7abb0c1178809eb5f5703ed43d558083a2d", + "is_verified": false, + "line_number": 1186 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7e0ad9ba810350bcd8da9180615fd964827c14ef", + "is_verified": false, + "line_number": 1187 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "39c3357766171faf88e70eea0dccb00239f273c5", + "is_verified": false, + "line_number": 1188 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d17aa49aceeaf925527404fa57a4e17668de8596", + "is_verified": false, + "line_number": 1189 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2a6b75b5576df53c3219112e7daff1dc142702d1", + "is_verified": false, + "line_number": 1190 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b75fa52e7d8ecfb8e7e9ff3dc2c37b73abcf7e2c", + "is_verified": false, + "line_number": 1191 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c551bfc4af7eb1fd5daa4f05fd58a2d4d65b85fe", + "is_verified": false, + "line_number": 1192 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a8d858cd02dcd5038dc3e76ac76b2da91f8dbccd", + "is_verified": false, + "line_number": 1193 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1bf631baf29fc48072c20ebfdd321964066f9f08", + "is_verified": false, + "line_number": 1194 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c6eb53905cd7e0253f4e69f34295cb6a50f58e08", + "is_verified": false, + "line_number": 1195 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7bbb8b2539588d170a6c26e9f61ae0800f9d8f2d", + "is_verified": false, + "line_number": 1196 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "26caefb3dca46d7afafdcf0010c67b9e9fccc92b", + "is_verified": false, + "line_number": 1197 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2cb19ac1427a96db3d380729bf039e5349ef63be", + "is_verified": false, + "line_number": 1198 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9e2aa480ce341383cbca0c207198d483e20322bd", + "is_verified": false, + "line_number": 1199 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "be742ba9f651b96a51823045433f3a1948d7eced", + "is_verified": false, + "line_number": 1200 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "317bd6bc5bcc732a1db7e57d0371aa9257f8df00", + "is_verified": false, + "line_number": 1201 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7c80c0ebf44179e49cf0e5a3d0408cc76aee83de", + "is_verified": false, + "line_number": 1202 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7858b77e2046951eadc43758c07104d777668eb7", + "is_verified": false, + "line_number": 1203 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "85a09b9fd03c47f1b036cf44c4909bc73ddd6cad", + "is_verified": false, + "line_number": 1204 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1718e46e064b47cec903bad3b0e9d6ef1da2f11b", + "is_verified": false, + "line_number": 1205 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0c1ee8a96d538ba8b4fa8b05db03563fd7ef8973", + "is_verified": false, + "line_number": 1206 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2017b3f2be44d213be17940140c168a5fba7561d", + "is_verified": false, + "line_number": 1207 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b083a5002d8fe4f2a66696aa0814e03ffa6d1837", + "is_verified": false, + "line_number": 1208 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ff42555f72300b656e47db4ed191f5df0ac07560", + "is_verified": false, + "line_number": 1209 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2ef2cf7195a65a890efa0632dd212ef8220aa1c6", + "is_verified": false, + "line_number": 1210 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "69cb36505922753131885b4a08c707f81ac66a47", + "is_verified": false, + "line_number": 1211 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "069b86c3a9114bd673eef998e22656df1fcaddd8", + "is_verified": false, + "line_number": 1212 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "70c8686a1be4b67a602a59a873ddbede2cd4da7e", + "is_verified": false, + "line_number": 1213 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "523d5a3e6d4fbf64c23594663c7e4687ae9c2be3", + "is_verified": false, + "line_number": 1214 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "16e86f176fd3cd4f7a58f0ffb8dc5791f3f95a86", + "is_verified": false, + "line_number": 1215 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ed84afa53dc05329a7991f5bf5cd2cae1fd77ffc", + "is_verified": false, + "line_number": 1216 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f1289b7119566377ed28ab9dd62af0fd09ed9fe2", + "is_verified": false, + "line_number": 1217 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a4f904b0556d1681ef00ea1813f2f94e28b797eb", + "is_verified": false, + "line_number": 1218 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0949c112813b58b0da6912740cf8bcbb85226c34", + "is_verified": false, + "line_number": 1219 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1bbf17622cda5702d35e14ba66df075a7bb57913", + "is_verified": false, + "line_number": 1220 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8e3a03cec08874a64bccc6d6d425f0afe79533a1", + "is_verified": false, + "line_number": 1221 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1aafc9018c54c7198cf74db22feb0319707898b6", + "is_verified": false, + "line_number": 1222 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e7b49f254a6e2de711e659bd28ad158691e30fce", + "is_verified": false, + "line_number": 1223 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fbc11861a047faba2041e2b6c715d8ca60803c8e", + "is_verified": false, + "line_number": 1224 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "44c990c1ce572f1e8f1ab851427e3a42ce71242a", + "is_verified": false, + "line_number": 1225 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4d3640532de6af408ed943d63ed3e3c2689e9c5f", + "is_verified": false, + "line_number": 1226 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a523fffc0ede19e1deeda09652de2b7a018cf8b4", + "is_verified": false, + "line_number": 1227 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4a995d1758da7e7154ba4acbec5b5b403742b7e1", + "is_verified": false, + "line_number": 1228 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "de4be8856b30e21fc713dc10f8988539feea7023", + "is_verified": false, + "line_number": 1229 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "fb1c0866f73c66412d08391f3ce4878af73aa639", + "is_verified": false, + "line_number": 1230 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a702fefff9cdbe1f95ab8827ddec5ba8efc30892", + "is_verified": false, + "line_number": 1231 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "724b47ffa7a9db1bbaf712b3d9d2b76898db0ea5", + "is_verified": false, + "line_number": 1232 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e0f16906358b6b058b6d986929a05521b6901f68", + "is_verified": false, + "line_number": 1233 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4332f528fff4a967c90c89db64aa58e23393bfed", + "is_verified": false, + "line_number": 1234 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "451a10712041218c61b0cc3787311943dab42dc6", + "is_verified": false, + "line_number": 1235 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "6a1be9deb76862f934fd8a9197069f4609ef70b5", + "is_verified": false, + "line_number": 1236 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2b1256a86a2fb02c20dc58e47774d30baed60f62", + "is_verified": false, + "line_number": 1237 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "74d000f3ede09a41df362d509537a2ac5f1fa07b", + "is_verified": false, + "line_number": 1238 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "43f8293d7eda52b663063cd56e5a3e394f193642", + "is_verified": false, + "line_number": 1239 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "51352b84bafc3573024540c543cc95922a764ef0", + "is_verified": false, + "line_number": 1240 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0ece3e42bfed9840f907fa700d5d29f0087985db", + "is_verified": false, + "line_number": 1241 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3b91d6d99ae8c482392adc042654bd076573cd8a", + "is_verified": false, + "line_number": 1242 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ab529305822e1642ed7c7d3acd9ba80dabc55108", + "is_verified": false, + "line_number": 1243 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3cf4744d88fd85b0fcb0fbf0425c5b50eae93b3e", + "is_verified": false, + "line_number": 1244 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "228fe53a555785f979a20a0159c96ef7d8d057c7", + "is_verified": false, + "line_number": 1245 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8d21215aa0a8f29d068ff316fc09ea6ae9e766c7", + "is_verified": false, + "line_number": 1246 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d63d3d63396c5e88f1fd8cdab9116331080cd2e2", + "is_verified": false, + "line_number": 1247 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d4fe6d5f06c2860ed38ebb02079bb2ebfcbfb093", + "is_verified": false, + "line_number": 1248 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5e1d352485a30350ac108f66da7ac3ce62b1ea4f", + "is_verified": false, + "line_number": 1249 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c682e7af6638379e4edf52c36995c3454ea1b149", + "is_verified": false, + "line_number": 1250 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "bb193ef1c9bcbc39ed64689f474af29719df489e", + "is_verified": false, + "line_number": 1251 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "01c34073e2e61552f4fd0ba64139be0ccabcdb8a", + "is_verified": false, + "line_number": 1252 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "cc47b8620102a6216f098eb7f9ea841c3c2a5f22", + "is_verified": false, + "line_number": 1253 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8f070c859fe84c5502e45b84a274308bbc0a7744", + "is_verified": false, + "line_number": 1254 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5f3061dc64135be12c1eaef23ab8e02f1826f24d", + "is_verified": false, + "line_number": 1255 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "9238be5963618c3501e919ebd4c13992a4bea3b4", + "is_verified": false, + "line_number": 1256 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "68c1365f209fa103e65c4da375b42d5656575940", + "is_verified": false, + "line_number": 1257 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "384be6402a8d31d62cb35fefaec77b06c8211f59", + "is_verified": false, + "line_number": 1258 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "360329c0a8cb6053168e61758688b85104fc86ff", + "is_verified": false, + "line_number": 1259 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7cd87f59db950306302a74b81e8f926df1577397", + "is_verified": false, + "line_number": 1260 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "553b2380d863621a9e4ab7c7a97fdec425ebab25", + "is_verified": false, + "line_number": 1261 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "43562265e7cf90c28221c2b7dbfcafa8f62843dc", + "is_verified": false, + "line_number": 1262 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ed7e495370ef7882b13866c332dff00ef7c361a6", + "is_verified": false, + "line_number": 1263 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7123453c9f62fc6c33951aa2595f1714b23d583a", + "is_verified": false, + "line_number": 1264 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e941c0eb1694570c999ca3fe548f76f6daaca83c", + "is_verified": false, + "line_number": 1265 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "85018e48b287ca7323192ff38ebe9411e61b38e2", + "is_verified": false, + "line_number": 1266 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "814d7edca30e0262ab0b07c6baf47d20738c823b", + "is_verified": false, + "line_number": 1267 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5dca59fe14f949e763116aef3968af2662926895", + "is_verified": false, + "line_number": 1268 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "ee86abd29ecfab79519c1efc033546d2c477477f", + "is_verified": false, + "line_number": 1269 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5878ed0ebded462f8d2461fe18061aa18d1000fd", + "is_verified": false, + "line_number": 1270 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4dd683cc3993e43d00b1b5f9e4e57895bb56e8e5", + "is_verified": false, + "line_number": 1271 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "a8a20da925fd5126d24df7d8baf68ac1fa23a184", + "is_verified": false, + "line_number": 1272 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "137f68b2d3f03ddd81ed8602ff19218c71df55fb", + "is_verified": false, + "line_number": 1273 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b32f2f31a868ddf0e3f013465c72527f62057e44", + "is_verified": false, + "line_number": 1274 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f5425542a9e9183a33dd16d559c92182f35f44a8", + "is_verified": false, + "line_number": 1275 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "77e8234c8ff852ec820384cd8f9284cde00e34a9", + "is_verified": false, + "line_number": 1276 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "be6e0ac8ab7d8ac8d7f7a4fc86b123392c09374e", + "is_verified": false, + "line_number": 1277 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3063130919857912b6373c6182853095d60ca18b", + "is_verified": false, + "line_number": 1278 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "607c9f8efafb2de11157fefd103f9f1cda4f347b", + "is_verified": false, + "line_number": 1279 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "2c301b0126a15e8150d92a84d8a49ab1eb9b4282", + "is_verified": false, + "line_number": 1280 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "84737ddb75ed5806c645ba66e122402be971389a", + "is_verified": false, + "line_number": 1281 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5a9adaee2ecb6e99992aa263eda966061c9acac0", + "is_verified": false, + "line_number": 1282 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0c09b49e14a5a35d3f26420994f8b786035166e6", + "is_verified": false, + "line_number": 1283 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0ef06e9fe84d92197ae053067b3f3d5051070690", + "is_verified": false, + "line_number": 1284 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b249743c201079e983e03d0afeb3c140342fc9d0", + "is_verified": false, + "line_number": 1285 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "82d624e2d36bf5346e60dd14806ff782bb2a4334", + "is_verified": false, + "line_number": 1286 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "88850db69d81a7ece67fb1d9b286c2d951b70819", + "is_verified": false, + "line_number": 1287 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "e49afb46bf458312000f8f9660ae81ff47bdc199", + "is_verified": false, + "line_number": 1288 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1cbdad16e84903fc3b9b6388a089a067dea2a3d2", + "is_verified": false, + "line_number": 1289 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "82feda736f248ac86d376891de516d9d1824a27c", + "is_verified": false, + "line_number": 1290 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "4a71f468c1364aff801b9120b1f5d529078048e9", + "is_verified": false, + "line_number": 1291 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f091998ff0fee46909f88aa7fd4f3cc73a3d3c9a", + "is_verified": false, + "line_number": 1292 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "29eaffa6f6f8a37758a5f7b32907b3dc5b691896", + "is_verified": false, + "line_number": 1293 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "44f681b1a58ce0c6df53676cc0808013e97ea9f4", + "is_verified": false, + "line_number": 1294 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "962dfd74b7253ac6cd612a6e748f2e95efb79f51", + "is_verified": false, + "line_number": 1295 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c86ef7132a2306cf87224e55cb204e6d2e8e7828", + "is_verified": false, + "line_number": 1296 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c4eb42c72ecfdf7810202a43d54548f7d2bff62d", + "is_verified": false, + "line_number": 1297 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "19383a628b845b1cbb1c0444832b0afbe8ab5064", + "is_verified": false, + "line_number": 1298 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b34bf28a1f7465a72772787a147d434d923c8d1b", + "is_verified": false, + "line_number": 1299 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "288ba78781c2ed007a423cb65cb1bf2306c3fd95", + "is_verified": false, + "line_number": 1300 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f3ceb3cc25a1228a6c53b4e215d7568d36e757a6", + "is_verified": false, + "line_number": 1301 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "87996bb1e32b4a0ecc22ac1d13cea8e0190b350b", + "is_verified": false, + "line_number": 1302 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "790704b8f93fe5aca8ac2ecfcb68f1584dad2647", + "is_verified": false, + "line_number": 1303 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "86223a1c42e86aae0a1ed4fa7d40eb2d059c4dd5", + "is_verified": false, + "line_number": 1304 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1673e79621b9dddf3b29a9b1ddf8d2ec0aad4bdc", + "is_verified": false, + "line_number": 1305 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "35b29b6e62d70ae4822318a19d0a46658eddd34f", + "is_verified": false, + "line_number": 1306 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b3cb65216294e3c0b3981e2db721954bafc3b23a", + "is_verified": false, + "line_number": 1307 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5dbca02e62ce0d208d12a1da12ba317344d8c6cc", + "is_verified": false, + "line_number": 1308 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "83acef9b2863c05447dea16c378025f007bc8c34", + "is_verified": false, + "line_number": 1309 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "524ef34b587ca7240673b9607b4314f3f37cd2a8", + "is_verified": false, + "line_number": 1310 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c76948814be7ef0455d6d9ff65aeae688b7bec24", + "is_verified": false, + "line_number": 1311 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5604fd630dabf095466a6c854750348059dbb1aa", + "is_verified": false, + "line_number": 1312 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "0b5772a512bb087fa1d6e34a062c7eec75f6e744", + "is_verified": false, + "line_number": 1313 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "7d3fa248843c7c76c909ee18b0dd773bbb5741e7", + "is_verified": false, + "line_number": 1314 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d7d16ac0dbd0bb5e98c6cb1d8508ff0132bbcbb0", + "is_verified": false, + "line_number": 1315 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d33b30cdcf982839a7cb6ae4e04b74deb2bd8f28", + "is_verified": false, + "line_number": 1316 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "281ca8a981dae1cebcb05b90cde4c895f3c59525", + "is_verified": false, + "line_number": 1317 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "712b5a91ad8f25eaaae3afccd7b41c6215102f70", + "is_verified": false, + "line_number": 1318 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "5fbc83376379b2201ae51f28039f87cb1ca14649", + "is_verified": false, + "line_number": 1319 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "d7497697fc350ef28cc0682526233a7846bfbf7f", + "is_verified": false, + "line_number": 1320 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "3f3d0b8308dfa23ce4c75abcfdd3840cab33de8b", + "is_verified": false, + "line_number": 1321 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "71a4936bbf172bf22c55b532a505a2c33f04ef2a", + "is_verified": false, + "line_number": 1322 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "f76a3c0087070143222761d33c9496d10ec5645a", + "is_verified": false, + "line_number": 1323 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "b8e837e18bc28489da6d38ac38370bd4a7757770", + "is_verified": false, + "line_number": 1324 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "af90bf5453dacd36dd205811a40eda42d5496cb5", + "is_verified": false, + "line_number": 1325 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "1fd5a47605b1192ee40beb9203beaafe8e53e13c", + "is_verified": false, + "line_number": 1326 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "c286938c2542589cd0fbed6acb6326d3c9efeb77", + "is_verified": false, + "line_number": 1327 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "73cfd5a17466838726c63386a3e5cccdf722a9d8", + "is_verified": false, + "line_number": 1328 + }, + { + "type": "Hex High Entropy String", + "filename": "docs/.i18n/zh-CN.tm.jsonl", + "hashed_secret": "8bb0680522ae015a5b71c1e7d24ec4641960c322", + "is_verified": false, + "line_number": 1329 + } + ], + "docs/brave-search.md": [ + { + "type": "Secret Keyword", + "filename": "docs/brave-search.md", + "hashed_secret": "491d458f895b9213facb2ee9375b1b044eaea3ac", + "is_verified": false, + "line_number": 27 + } + ], + "docs/channels/bluebubbles.md": [ + { + "type": "Secret Keyword", + "filename": "docs/channels/bluebubbles.md", + "hashed_secret": "555da20df20d4172e00f1b73d7c3943802055270", + "is_verified": false, + "line_number": 37 + } + ], + "docs/channels/feishu.md": [ + { + "type": "Secret Keyword", + "filename": "docs/channels/feishu.md", + "hashed_secret": "b60d121b438a380c343d5ec3c2037564b82ffef3", + "is_verified": false, + "line_number": 187 + }, + { + "type": "Secret Keyword", + "filename": "docs/channels/feishu.md", + "hashed_secret": "186154712b2d5f6791d85b9a0987b98fa231779c", + "is_verified": false, + "line_number": 435 + } + ], + "docs/channels/irc.md": [ + { + "type": "Secret Keyword", + "filename": "docs/channels/irc.md", + "hashed_secret": "d54831b8e4b461d85e32ea82156d2fb5ce5cb624", + "is_verified": false, + "line_number": 191 + } + ], + "docs/channels/line.md": [ + { + "type": "Secret Keyword", + "filename": "docs/channels/line.md", + "hashed_secret": "83661b43df128631f891767fbfc5b049af3dce86", + "is_verified": false, + "line_number": 61 + } + ], + "docs/channels/matrix.md": [ + { + "type": "Secret Keyword", + "filename": "docs/channels/matrix.md", + "hashed_secret": "45d676e7c6ab44cf4b8fa366ef2d8fccd3e6d6e6", + "is_verified": false, + "line_number": 60 + } + ], + "docs/channels/nextcloud-talk.md": [ + { + "type": "Secret Keyword", + "filename": "docs/channels/nextcloud-talk.md", + "hashed_secret": "76ed0a056aa77060de25754586440cff390791d0", + "is_verified": false, + "line_number": 56 + } + ], + "docs/channels/nostr.md": [ + { + "type": "Secret Keyword", + "filename": "docs/channels/nostr.md", + "hashed_secret": "edeb23e25a619c434d22bb7f1c3ca4841166b4e8", + "is_verified": false, + "line_number": 67 + } + ], + "docs/channels/slack.md": [ + { + "type": "Secret Keyword", + "filename": "docs/channels/slack.md", + "hashed_secret": "3f4800fb7c1fb79a9a48bfd562d90bc6b2e2b718", + "is_verified": false, + "line_number": 104 + } + ], + "docs/channels/twitch.md": [ + { + "type": "Secret Keyword", + "filename": "docs/channels/twitch.md", + "hashed_secret": "0d1ba0da3e84e54f29846c93c43182eede365858", + "is_verified": false, + "line_number": 138 + }, + { + "type": "Secret Keyword", + "filename": "docs/channels/twitch.md", + "hashed_secret": "7cb4c5b8b81e266d08d4f106799af98d748bceb9", + "is_verified": false, + "line_number": 324 + } + ], + "docs/concepts/memory.md": [ + { + "type": "Secret Keyword", + "filename": "docs/concepts/memory.md", + "hashed_secret": "39d711243bfcee9fec8299b204e1aa9c3430fa12", + "is_verified": false, + "line_number": 281 + }, + { + "type": "Secret Keyword", + "filename": "docs/concepts/memory.md", + "hashed_secret": "1a8abbf465c52363ab4c9c6ad945b8e857cbea55", + "is_verified": false, + "line_number": 305 + }, + { + "type": "Secret Keyword", + "filename": "docs/concepts/memory.md", + "hashed_secret": "b9f640d6095b9f6b5a65983f7b76dbbb254e0044", + "is_verified": false, + "line_number": 706 + } + ], + "docs/concepts/model-providers.md": [ + { + "type": "Secret Keyword", + "filename": "docs/concepts/model-providers.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 178 + }, + { + "type": "Secret Keyword", + "filename": "docs/concepts/model-providers.md", + "hashed_secret": "6a4a6c8f2406f4f0843a0a1aae6a320f92f9d6ae", + "is_verified": false, + "line_number": 274 + }, + { + "type": "Secret Keyword", + "filename": "docs/concepts/model-providers.md", + "hashed_secret": "ef83ad68b9b66e008727b7c417c6a8f618b5177e", + "is_verified": false, + "line_number": 305 + } + ], + "docs/gateway/configuration-examples.md": [ + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-examples.md", + "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281", + "is_verified": false, + "line_number": 57 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-examples.md", + "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25", + "is_verified": false, + "line_number": 59 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-examples.md", + "hashed_secret": "22af290a1a3d5e941193a41a3d3a9e4ca8da5e27", + "is_verified": false, + "line_number": 332 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-examples.md", + "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd", + "is_verified": false, + "line_number": 431 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-examples.md", + "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209", + "is_verified": false, + "line_number": 596 + } + ], + "docs/gateway/configuration-reference.md": [ + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-reference.md", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 149 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-reference.md", + "hashed_secret": "1188d5a8ed7edcff5144a9472af960243eacf12e", + "is_verified": false, + "line_number": 1267 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-reference.md", + "hashed_secret": "bde4db9b4c3be4049adc3b9a69851d7c35119770", + "is_verified": false, + "line_number": 1283 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-reference.md", + "hashed_secret": "7f8aaf142ce0552c260f2e546dda43ddd7c9aef3", + "is_verified": false, + "line_number": 1461 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-reference.md", + "hashed_secret": "22af290a1a3d5e941193a41a3d3a9e4ca8da5e27", + "is_verified": false, + "line_number": 1603 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-reference.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 1631 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-reference.md", + "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd", + "is_verified": false, + "line_number": 1862 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-reference.md", + "hashed_secret": "45d676e7c6ab44cf4b8fa366ef2d8fccd3e6d6e6", + "is_verified": false, + "line_number": 1966 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-reference.md", + "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281", + "is_verified": false, + "line_number": 2202 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration-reference.md", + "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25", + "is_verified": false, + "line_number": 2204 + } + ], + "docs/gateway/configuration.md": [ + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration.md", + "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281", + "is_verified": false, + "line_number": 434 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/configuration.md", + "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25", + "is_verified": false, + "line_number": 435 + } + ], + "docs/gateway/local-models.md": [ + { + "type": "Secret Keyword", + "filename": "docs/gateway/local-models.md", + "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209", + "is_verified": false, + "line_number": 34 + }, + { + "type": "Secret Keyword", + "filename": "docs/gateway/local-models.md", + "hashed_secret": "49fd535e63175a827aab3eff9ac58a9e82460ac9", + "is_verified": false, + "line_number": 124 + } + ], + "docs/gateway/tailscale.md": [ + { + "type": "Secret Keyword", + "filename": "docs/gateway/tailscale.md", + "hashed_secret": "9cb0dc5383312aa15b9dc6745645bde18ff5ade9", + "is_verified": false, + "line_number": 81 + } + ], + "docs/help/environment.md": [ + { + "type": "Secret Keyword", + "filename": "docs/help/environment.md", + "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281", + "is_verified": false, + "line_number": 31 + }, + { + "type": "Secret Keyword", + "filename": "docs/help/environment.md", + "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25", + "is_verified": false, + "line_number": 33 + } + ], + "docs/help/faq.md": [ + { + "type": "Secret Keyword", + "filename": "docs/help/faq.md", + "hashed_secret": "491d458f895b9213facb2ee9375b1b044eaea3ac", + "is_verified": false, + "line_number": 1412 + }, + { + "type": "Secret Keyword", + "filename": "docs/help/faq.md", + "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281", + "is_verified": false, + "line_number": 1689 + }, + { + "type": "Secret Keyword", + "filename": "docs/help/faq.md", + "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25", + "is_verified": false, + "line_number": 1690 + }, + { + "type": "Secret Keyword", + "filename": "docs/help/faq.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 2118 + }, + { + "type": "Secret Keyword", + "filename": "docs/help/faq.md", + "hashed_secret": "45d676e7c6ab44cf4b8fa366ef2d8fccd3e6d6e6", + "is_verified": false, + "line_number": 2398 + } + ], + "docs/install/macos-vm.md": [ + { + "type": "Secret Keyword", + "filename": "docs/install/macos-vm.md", + "hashed_secret": "8dd3bcd07c9ee927e6921c98b4dc6e94e2cc10a9", + "is_verified": false, + "line_number": 217 + } + ], + "docs/nodes/talk.md": [ + { + "type": "Secret Keyword", + "filename": "docs/nodes/talk.md", + "hashed_secret": "1188d5a8ed7edcff5144a9472af960243eacf12e", + "is_verified": false, + "line_number": 58 + } + ], + "docs/perplexity.md": [ + { + "type": "Secret Keyword", + "filename": "docs/perplexity.md", + "hashed_secret": "6b26c117c66a0c030e239eef595c1e18865132a8", + "is_verified": false, + "line_number": 36 + } + ], + "docs/plugins/voice-call.md": [ + { + "type": "Secret Keyword", + "filename": "docs/plugins/voice-call.md", + "hashed_secret": "cb46980ce5532f18440dff4bbbe097896a8c08c8", + "is_verified": false, + "line_number": 239 + } + ], + "docs/providers/anthropic.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/anthropic.md", + "hashed_secret": "c7a8c334eef5d1749fface7d42c66f9ae5e8cf36", + "is_verified": false, + "line_number": 33 + } + ], + "docs/providers/claude-max-api-proxy.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/claude-max-api-proxy.md", + "hashed_secret": "b5c2827eb65bf13b87130e7e3c424ba9ff07cd67", + "is_verified": false, + "line_number": 80 + } + ], + "docs/providers/glm.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/glm.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 24 + } + ], + "docs/providers/litellm.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/litellm.md", + "hashed_secret": "b907cadbe5a060ca6c6b78fee4c1953f34c64c32", + "is_verified": false, + "line_number": 40 + }, + { + "type": "Secret Keyword", + "filename": "docs/providers/litellm.md", + "hashed_secret": "651702a4fa521c0c493a3171cfba79c3c49eeaec", + "is_verified": false, + "line_number": 52 + } + ], + "docs/providers/minimax.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/minimax.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 71 + }, + { + "type": "Secret Keyword", + "filename": "docs/providers/minimax.md", + "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209", + "is_verified": false, + "line_number": 140 + } + ], + "docs/providers/moonshot.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/moonshot.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 43 + } + ], + "docs/providers/nvidia.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/nvidia.md", + "hashed_secret": "2083c49ad8d63838a4d18f1de0c419f06eb464db", + "is_verified": false, + "line_number": 18 + } + ], + "docs/providers/ollama.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/ollama.md", + "hashed_secret": "e774aaeac31c6272107ba89080295e277050fa7c", + "is_verified": false, + "line_number": 33 + } + ], + "docs/providers/openai.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/openai.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 31 + } + ], + "docs/providers/opencode.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/opencode.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 27 + } + ], + "docs/providers/openrouter.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/openrouter.md", + "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281", + "is_verified": false, + "line_number": 24 + } + ], + "docs/providers/synthetic.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/synthetic.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 33 + } + ], + "docs/providers/venice.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/venice.md", + "hashed_secret": "0b1b9301d9cd541620de4e3865d4a8f54f42fa89", + "is_verified": false, + "line_number": 55 + }, + { + "type": "Secret Keyword", + "filename": "docs/providers/venice.md", + "hashed_secret": "c179fe46776696372a90218532dc0d67267f2f04", + "is_verified": false, + "line_number": 236 + } + ], + "docs/providers/vllm.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/vllm.md", + "hashed_secret": "6a4a6c8f2406f4f0843a0a1aae6a320f92f9d6ae", + "is_verified": false, + "line_number": 26 + } + ], + "docs/providers/xiaomi.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/xiaomi.md", + "hashed_secret": "6d9c68c603e465077bdd49c62347fe54717f83a3", + "is_verified": false, + "line_number": 34 + }, + { + "type": "Secret Keyword", + "filename": "docs/providers/xiaomi.md", + "hashed_secret": "2369ac9988d706e53899168280d126c81c33bcd2", + "is_verified": false, + "line_number": 42 + } + ], + "docs/providers/zai.md": [ + { + "type": "Secret Keyword", + "filename": "docs/providers/zai.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 27 + } + ], + "docs/tools/browser.md": [ + { + "type": "Basic Auth Credentials", + "filename": "docs/tools/browser.md", + "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684", + "is_verified": false, + "line_number": 140 + } + ], + "docs/tools/firecrawl.md": [ + { + "type": "Secret Keyword", + "filename": "docs/tools/firecrawl.md", + "hashed_secret": "674397e2c0c2faaa85961c708d2a96a7cc7af217", + "is_verified": false, + "line_number": 29 + } + ], + "docs/tools/skills-config.md": [ + { + "type": "Secret Keyword", + "filename": "docs/tools/skills-config.md", + "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd", + "is_verified": false, + "line_number": 29 + } + ], + "docs/tools/skills.md": [ + { + "type": "Secret Keyword", + "filename": "docs/tools/skills.md", + "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd", + "is_verified": false, + "line_number": 198 + } + ], + "docs/tools/web.md": [ + { + "type": "Secret Keyword", + "filename": "docs/tools/web.md", + "hashed_secret": "6b26c117c66a0c030e239eef595c1e18865132a8", + "is_verified": false, + "line_number": 62 + }, + { + "type": "Secret Keyword", + "filename": "docs/tools/web.md", + "hashed_secret": "96c682c88ed551f22fe76d206c2dfb7df9221ad9", + "is_verified": false, + "line_number": 113 + }, + { + "type": "Secret Keyword", + "filename": "docs/tools/web.md", + "hashed_secret": "491d458f895b9213facb2ee9375b1b044eaea3ac", + "is_verified": false, + "line_number": 161 + }, + { + "type": "Secret Keyword", + "filename": "docs/tools/web.md", + "hashed_secret": "674397e2c0c2faaa85961c708d2a96a7cc7af217", + "is_verified": false, + "line_number": 235 + } + ], + "docs/tts.md": [ + { + "type": "Secret Keyword", + "filename": "docs/tts.md", + "hashed_secret": "bde4db9b4c3be4049adc3b9a69851d7c35119770", + "is_verified": false, + "line_number": 95 + }, + { + "type": "Secret Keyword", + "filename": "docs/tts.md", + "hashed_secret": "1188d5a8ed7edcff5144a9472af960243eacf12e", + "is_verified": false, + "line_number": 100 + } + ], + "docs/zh-CN/brave-search.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/brave-search.md", + "hashed_secret": "491d458f895b9213facb2ee9375b1b044eaea3ac", + "is_verified": false, + "line_number": 34 + } + ], + "docs/zh-CN/channels/bluebubbles.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/channels/bluebubbles.md", + "hashed_secret": "555da20df20d4172e00f1b73d7c3943802055270", + "is_verified": false, + "line_number": 43 + } + ], + "docs/zh-CN/channels/feishu.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/channels/feishu.md", + "hashed_secret": "b60d121b438a380c343d5ec3c2037564b82ffef3", + "is_verified": false, + "line_number": 195 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/channels/feishu.md", + "hashed_secret": "186154712b2d5f6791d85b9a0987b98fa231779c", + "is_verified": false, + "line_number": 445 + } + ], + "docs/zh-CN/channels/line.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/channels/line.md", + "hashed_secret": "83661b43df128631f891767fbfc5b049af3dce86", + "is_verified": false, + "line_number": 62 + } + ], + "docs/zh-CN/channels/matrix.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/channels/matrix.md", + "hashed_secret": "45d676e7c6ab44cf4b8fa366ef2d8fccd3e6d6e6", + "is_verified": false, + "line_number": 62 + } + ], + "docs/zh-CN/channels/nextcloud-talk.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/channels/nextcloud-talk.md", + "hashed_secret": "76ed0a056aa77060de25754586440cff390791d0", + "is_verified": false, + "line_number": 61 + } + ], + "docs/zh-CN/channels/nostr.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/channels/nostr.md", + "hashed_secret": "edeb23e25a619c434d22bb7f1c3ca4841166b4e8", + "is_verified": false, + "line_number": 74 + } + ], + "docs/zh-CN/channels/slack.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/channels/slack.md", + "hashed_secret": "3f4800fb7c1fb79a9a48bfd562d90bc6b2e2b718", + "is_verified": false, + "line_number": 153 + } + ], + "docs/zh-CN/channels/twitch.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/channels/twitch.md", + "hashed_secret": "0d1ba0da3e84e54f29846c93c43182eede365858", + "is_verified": false, + "line_number": 145 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/channels/twitch.md", + "hashed_secret": "7cb4c5b8b81e266d08d4f106799af98d748bceb9", + "is_verified": false, + "line_number": 330 + } + ], + "docs/zh-CN/concepts/memory.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/concepts/memory.md", + "hashed_secret": "39d711243bfcee9fec8299b204e1aa9c3430fa12", + "is_verified": false, + "line_number": 127 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/concepts/memory.md", + "hashed_secret": "1a8abbf465c52363ab4c9c6ad945b8e857cbea55", + "is_verified": false, + "line_number": 150 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/concepts/memory.md", + "hashed_secret": "b9f640d6095b9f6b5a65983f7b76dbbb254e0044", + "is_verified": false, + "line_number": 398 + } + ], + "docs/zh-CN/concepts/model-providers.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/concepts/model-providers.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 181 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/concepts/model-providers.md", + "hashed_secret": "ef83ad68b9b66e008727b7c417c6a8f618b5177e", + "is_verified": false, + "line_number": 282 + } + ], + "docs/zh-CN/gateway/configuration-examples.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration-examples.md", + "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281", + "is_verified": false, + "line_number": 64 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration-examples.md", + "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25", + "is_verified": false, + "line_number": 66 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration-examples.md", + "hashed_secret": "22af290a1a3d5e941193a41a3d3a9e4ca8da5e27", + "is_verified": false, + "line_number": 329 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration-examples.md", + "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd", + "is_verified": false, + "line_number": 424 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration-examples.md", + "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209", + "is_verified": false, + "line_number": 563 + } + ], + "docs/zh-CN/gateway/configuration.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration.md", + "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281", + "is_verified": false, + "line_number": 289 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration.md", + "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25", + "is_verified": false, + "line_number": 291 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration.md", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 1092 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration.md", + "hashed_secret": "1188d5a8ed7edcff5144a9472af960243eacf12e", + "is_verified": false, + "line_number": 1570 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration.md", + "hashed_secret": "bde4db9b4c3be4049adc3b9a69851d7c35119770", + "is_verified": false, + "line_number": 1586 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration.md", + "hashed_secret": "22af290a1a3d5e941193a41a3d3a9e4ca8da5e27", + "is_verified": false, + "line_number": 2398 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 2476 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration.md", + "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd", + "is_verified": false, + "line_number": 2768 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/configuration.md", + "hashed_secret": "45d676e7c6ab44cf4b8fa366ef2d8fccd3e6d6e6", + "is_verified": false, + "line_number": 2967 + } + ], + "docs/zh-CN/gateway/local-models.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/local-models.md", + "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209", + "is_verified": false, + "line_number": 41 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/local-models.md", + "hashed_secret": "49fd535e63175a827aab3eff9ac58a9e82460ac9", + "is_verified": false, + "line_number": 131 + } + ], + "docs/zh-CN/gateway/tailscale.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/gateway/tailscale.md", + "hashed_secret": "9cb0dc5383312aa15b9dc6745645bde18ff5ade9", + "is_verified": false, + "line_number": 80 + } + ], + "docs/zh-CN/help/environment.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/help/environment.md", + "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281", + "is_verified": false, + "line_number": 38 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/help/environment.md", + "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25", + "is_verified": false, + "line_number": 40 + } + ], + "docs/zh-CN/help/faq.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/help/faq.md", + "hashed_secret": "491d458f895b9213facb2ee9375b1b044eaea3ac", + "is_verified": false, + "line_number": 1277 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/help/faq.md", + "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281", + "is_verified": false, + "line_number": 1524 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/help/faq.md", + "hashed_secret": "b6f56e5e92078ed7c078c46fbfeedcbe5719bc25", + "is_verified": false, + "line_number": 1525 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/help/faq.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 1916 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/help/faq.md", + "hashed_secret": "45d676e7c6ab44cf4b8fa366ef2d8fccd3e6d6e6", + "is_verified": false, + "line_number": 2191 + } + ], + "docs/zh-CN/install/macos-vm.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/install/macos-vm.md", + "hashed_secret": "8dd3bcd07c9ee927e6921c98b4dc6e94e2cc10a9", + "is_verified": false, + "line_number": 224 + } + ], + "docs/zh-CN/nodes/talk.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/nodes/talk.md", + "hashed_secret": "1188d5a8ed7edcff5144a9472af960243eacf12e", + "is_verified": false, + "line_number": 65 + } + ], + "docs/zh-CN/perplexity.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/perplexity.md", + "hashed_secret": "6b26c117c66a0c030e239eef595c1e18865132a8", + "is_verified": false, + "line_number": 42 + } + ], + "docs/zh-CN/plugins/voice-call.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/plugins/voice-call.md", + "hashed_secret": "cb46980ce5532f18440dff4bbbe097896a8c08c8", + "is_verified": false, + "line_number": 167 + } + ], + "docs/zh-CN/providers/anthropic.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/anthropic.md", + "hashed_secret": "c7a8c334eef5d1749fface7d42c66f9ae5e8cf36", + "is_verified": false, + "line_number": 40 + } + ], + "docs/zh-CN/providers/claude-max-api-proxy.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/claude-max-api-proxy.md", + "hashed_secret": "b5c2827eb65bf13b87130e7e3c424ba9ff07cd67", + "is_verified": false, + "line_number": 87 + } + ], + "docs/zh-CN/providers/glm.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/glm.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 30 + } + ], + "docs/zh-CN/providers/minimax.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/minimax.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 72 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/minimax.md", + "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209", + "is_verified": false, + "line_number": 140 + } + ], + "docs/zh-CN/providers/moonshot.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/moonshot.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 47 + } + ], + "docs/zh-CN/providers/ollama.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/ollama.md", + "hashed_secret": "e774aaeac31c6272107ba89080295e277050fa7c", + "is_verified": false, + "line_number": 38 + } + ], + "docs/zh-CN/providers/openai.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/openai.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 37 + } + ], + "docs/zh-CN/providers/opencode.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/opencode.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 32 + } + ], + "docs/zh-CN/providers/openrouter.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/openrouter.md", + "hashed_secret": "a219d7693c25cd2d93313512e200ff3eb374d281", + "is_verified": false, + "line_number": 30 + } + ], + "docs/zh-CN/providers/synthetic.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/synthetic.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 39 + } + ], + "docs/zh-CN/providers/venice.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/venice.md", + "hashed_secret": "0b1b9301d9cd541620de4e3865d4a8f54f42fa89", + "is_verified": false, + "line_number": 62 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/venice.md", + "hashed_secret": "c179fe46776696372a90218532dc0d67267f2f04", + "is_verified": false, + "line_number": 243 + } + ], + "docs/zh-CN/providers/xiaomi.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/xiaomi.md", + "hashed_secret": "6d9c68c603e465077bdd49c62347fe54717f83a3", + "is_verified": false, + "line_number": 38 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/xiaomi.md", + "hashed_secret": "2369ac9988d706e53899168280d126c81c33bcd2", + "is_verified": false, + "line_number": 46 + } + ], + "docs/zh-CN/providers/zai.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/providers/zai.md", + "hashed_secret": "ec3810e10fb78db55ce38b9c18d1c3eb1db739e0", + "is_verified": false, + "line_number": 32 + } + ], + "docs/zh-CN/tools/browser.md": [ + { + "type": "Basic Auth Credentials", + "filename": "docs/zh-CN/tools/browser.md", + "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684", + "is_verified": false, + "line_number": 137 + } + ], + "docs/zh-CN/tools/firecrawl.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/tools/firecrawl.md", + "hashed_secret": "674397e2c0c2faaa85961c708d2a96a7cc7af217", + "is_verified": false, + "line_number": 36 + } + ], + "docs/zh-CN/tools/skills-config.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/tools/skills-config.md", + "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd", + "is_verified": false, + "line_number": 36 + } + ], + "docs/zh-CN/tools/skills.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/tools/skills.md", + "hashed_secret": "c1e6ee547fd492df1441ac492e8bb294974712bd", + "is_verified": false, + "line_number": 183 + } + ], + "docs/zh-CN/tools/web.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/tools/web.md", + "hashed_secret": "6b26c117c66a0c030e239eef595c1e18865132a8", + "is_verified": false, + "line_number": 67 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/tools/web.md", + "hashed_secret": "96c682c88ed551f22fe76d206c2dfb7df9221ad9", + "is_verified": false, + "line_number": 112 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/tools/web.md", + "hashed_secret": "491d458f895b9213facb2ee9375b1b044eaea3ac", + "is_verified": false, + "line_number": 159 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/tools/web.md", + "hashed_secret": "674397e2c0c2faaa85961c708d2a96a7cc7af217", + "is_verified": false, + "line_number": 229 + } + ], + "docs/zh-CN/tts.md": [ + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/tts.md", + "hashed_secret": "bde4db9b4c3be4049adc3b9a69851d7c35119770", + "is_verified": false, + "line_number": 89 + }, + { + "type": "Secret Keyword", + "filename": "docs/zh-CN/tts.md", + "hashed_secret": "1188d5a8ed7edcff5144a9472af960243eacf12e", + "is_verified": false, + "line_number": 94 + } + ], + "extensions/bluebubbles/src/actions.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/actions.test.ts", + "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc", + "is_verified": false, + "line_number": 86 + } + ], + "extensions/bluebubbles/src/attachments.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/attachments.test.ts", + "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc", + "is_verified": false, + "line_number": 21 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/attachments.test.ts", + "hashed_secret": "db1530e1ea43af094d3d75b8dbaf19a4a182a318", + "is_verified": false, + "line_number": 85 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/attachments.test.ts", + "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", + "is_verified": false, + "line_number": 103 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/attachments.test.ts", + "hashed_secret": "052f076c732648ab32d2fcde9fe255319bfa0c7b", + "is_verified": false, + "line_number": 215 + } + ], + "extensions/bluebubbles/src/chat.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/chat.test.ts", + "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", + "is_verified": false, + "line_number": 19 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/chat.test.ts", + "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc", + "is_verified": false, + "line_number": 54 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/chat.test.ts", + "hashed_secret": "5c5a15a8b0b3e154d77746945e563ba40100681b", + "is_verified": false, + "line_number": 82 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/chat.test.ts", + "hashed_secret": "faacad0ce4ea1c19b46e128fd79679d37d3d331d", + "is_verified": false, + "line_number": 131 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/chat.test.ts", + "hashed_secret": "4dcc26a1d99532846fedf1265df4f40f4e0005b8", + "is_verified": false, + "line_number": 227 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/chat.test.ts", + "hashed_secret": "fd2a721f7be1ee3d691a011affcdb11d0ca365a8", + "is_verified": false, + "line_number": 290 + } + ], + "extensions/bluebubbles/src/monitor.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/monitor.test.ts", + "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc", + "is_verified": false, + "line_number": 278 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/monitor.test.ts", + "hashed_secret": "1ae0af3fe72b3ba394f9fa95a6cffc090d726c23", + "is_verified": false, + "line_number": 552 + } + ], + "extensions/bluebubbles/src/reactions.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/reactions.test.ts", + "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", + "is_verified": false, + "line_number": 37 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/reactions.test.ts", + "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc", + "is_verified": false, + "line_number": 178 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/reactions.test.ts", + "hashed_secret": "a4a05c9a6449eb9d6cdac81dd7edc49230e327e6", + "is_verified": false, + "line_number": 209 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/reactions.test.ts", + "hashed_secret": "a2833da9f0a16f09994754d0a31749cecf8c8c77", + "is_verified": false, + "line_number": 315 + } + ], + "extensions/bluebubbles/src/send.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/send.test.ts", + "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", + "is_verified": false, + "line_number": 55 + }, + { + "type": "Secret Keyword", + "filename": "extensions/bluebubbles/src/send.test.ts", + "hashed_secret": "faacad0ce4ea1c19b46e128fd79679d37d3d331d", + "is_verified": false, + "line_number": 692 + } + ], + "extensions/bluebubbles/src/targets.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "extensions/bluebubbles/src/targets.test.ts", + "hashed_secret": "a3af2fb0c1e2a30bb038049e1e4b401593af6225", + "is_verified": false, + "line_number": 61 + } + ], + "extensions/bluebubbles/src/targets.ts": [ + { + "type": "Hex High Entropy String", + "filename": "extensions/bluebubbles/src/targets.ts", + "hashed_secret": "a3af2fb0c1e2a30bb038049e1e4b401593af6225", + "is_verified": false, + "line_number": 265 + } + ], + "extensions/copilot-proxy/index.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/copilot-proxy/index.ts", + "hashed_secret": "50f013532a9770a2c2cfdc38b7581dd01df69b70", + "is_verified": false, + "line_number": 9 + } + ], + "extensions/feishu/skills/feishu-doc/SKILL.md": [ + { + "type": "Hex High Entropy String", + "filename": "extensions/feishu/skills/feishu-doc/SKILL.md", + "hashed_secret": "8a2256bca273bb01a4e09ae6555b1e6652d9ff8c", + "is_verified": false, + "line_number": 20 + } + ], + "extensions/feishu/skills/feishu-wiki/SKILL.md": [ + { + "type": "Hex High Entropy String", + "filename": "extensions/feishu/skills/feishu-wiki/SKILL.md", + "hashed_secret": "8a2256bca273bb01a4e09ae6555b1e6652d9ff8c", + "is_verified": false, + "line_number": 40 + } + ], + "extensions/feishu/src/channel.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/feishu/src/channel.test.ts", + "hashed_secret": "8437d84cae482d10a2b9fd3f555d45006979e4be", + "is_verified": false, + "line_number": 21 + } + ], + "extensions/feishu/src/docx.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/feishu/src/docx.test.ts", + "hashed_secret": "f49922d511d666848f250663c4fca84074b856a8", + "is_verified": false, + "line_number": 97 + } + ], + "extensions/feishu/src/media.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/feishu/src/media.test.ts", + "hashed_secret": "f49922d511d666848f250663c4fca84074b856a8", + "is_verified": false, + "line_number": 45 + } + ], + "extensions/feishu/src/reply-dispatcher.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/feishu/src/reply-dispatcher.test.ts", + "hashed_secret": "f49922d511d666848f250663c4fca84074b856a8", + "is_verified": false, + "line_number": 48 + } + ], + "extensions/google-antigravity-auth/index.ts": [ + { + "type": "Base64 High Entropy String", + "filename": "extensions/google-antigravity-auth/index.ts", + "hashed_secret": "709d0f232b6ac4f8d24dec3e4fabfdb14257174f", + "is_verified": false, + "line_number": 14 + } + ], + "extensions/google-gemini-cli-auth/oauth.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/google-gemini-cli-auth/oauth.test.ts", + "hashed_secret": "021343c1f561d7bcbc3b513df45cc3a6baf67b43", + "is_verified": false, + "line_number": 30 + } + ], + "extensions/irc/src/accounts.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/irc/src/accounts.ts", + "hashed_secret": "920f8f5815b381ea692e9e7c2f7119f2b1aa620a", + "is_verified": false, + "line_number": 19 + } + ], + "extensions/irc/src/client.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/irc/src/client.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 8 + }, + { + "type": "Secret Keyword", + "filename": "extensions/irc/src/client.test.ts", + "hashed_secret": "b1cc3814a07fc3d7094f4cc181df7b57b51d165b", + "is_verified": false, + "line_number": 39 + } + ], + "extensions/line/src/channel.startup.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/line/src/channel.startup.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 103 + } + ], + "extensions/matrix/src/matrix/accounts.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/matrix/src/matrix/accounts.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 74 + } + ], + "extensions/matrix/src/matrix/client.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/matrix/src/matrix/client.test.ts", + "hashed_secret": "fe7fcdaea49ece14677acd32374d2f1225819d5c", + "is_verified": false, + "line_number": 13 + }, + { + "type": "Secret Keyword", + "filename": "extensions/matrix/src/matrix/client.test.ts", + "hashed_secret": "3dc927d80543dc0f643940b70d066bd4b4c4b78e", + "is_verified": false, + "line_number": 23 + } + ], + "extensions/matrix/src/matrix/client/storage.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/matrix/src/matrix/client/storage.ts", + "hashed_secret": "7505d64a54e061b7acd54ccd58b49dc43500b635", + "is_verified": false, + "line_number": 8 + } + ], + "extensions/memory-lancedb/config.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/memory-lancedb/config.ts", + "hashed_secret": "ecb252044b5ea0f679ee78ec1a12904739e2904d", + "is_verified": false, + "line_number": 101 + } + ], + "extensions/memory-lancedb/index.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/memory-lancedb/index.test.ts", + "hashed_secret": "ed65c049bb2f78ee4f703b2158ba9cc6ea31fb7e", + "is_verified": false, + "line_number": 71 + } + ], + "extensions/msteams/src/probe.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/msteams/src/probe.test.ts", + "hashed_secret": "1a91d62f7ca67399625a4368a6ab5d4a3baa6073", + "is_verified": false, + "line_number": 35 + } + ], + "extensions/nextcloud-talk/src/accounts.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/nextcloud-talk/src/accounts.ts", + "hashed_secret": "920f8f5815b381ea692e9e7c2f7119f2b1aa620a", + "is_verified": false, + "line_number": 22 + }, + { + "type": "Secret Keyword", + "filename": "extensions/nextcloud-talk/src/accounts.ts", + "hashed_secret": "71f8e7976e4cbc4561c9d62fb283e7f788202acb", + "is_verified": false, + "line_number": 151 + } + ], + "extensions/nextcloud-talk/src/channel.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/nextcloud-talk/src/channel.ts", + "hashed_secret": "71f8e7976e4cbc4561c9d62fb283e7f788202acb", + "is_verified": false, + "line_number": 396 + } + ], + "extensions/nostr/README.md": [ + { + "type": "Secret Keyword", + "filename": "extensions/nostr/README.md", + "hashed_secret": "edeb23e25a619c434d22bb7f1c3ca4841166b4e8", + "is_verified": false, + "line_number": 46 + } + ], + "extensions/nostr/src/channel.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/channel.test.ts", + "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", + "is_verified": false, + "line_number": 48 + }, + { + "type": "Secret Keyword", + "filename": "extensions/nostr/src/channel.test.ts", + "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", + "is_verified": false, + "line_number": 48 + } + ], + "extensions/nostr/src/nostr-bus.fuzz.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/nostr-bus.fuzz.test.ts", + "hashed_secret": "2b4489606a23fb31fcdc849fa7e577ba90f6d39a", + "is_verified": false, + "line_number": 193 + }, + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/nostr-bus.fuzz.test.ts", + "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", + "is_verified": false, + "line_number": 194 + }, + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/nostr-bus.fuzz.test.ts", + "hashed_secret": "b84cb0c3925d34496e6c8b0e55b8c1664a438035", + "is_verified": false, + "line_number": 199 + } + ], + "extensions/nostr/src/nostr-bus.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/nostr-bus.test.ts", + "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", + "is_verified": false, + "line_number": 11 + }, + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/nostr-bus.test.ts", + "hashed_secret": "7258e28563f03fb4c5994e8402e6f610d1f0f110", + "is_verified": false, + "line_number": 33 + }, + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/nostr-bus.test.ts", + "hashed_secret": "2b4489606a23fb31fcdc849fa7e577ba90f6d39a", + "is_verified": false, + "line_number": 101 + }, + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/nostr-bus.test.ts", + "hashed_secret": "ef717286343f6da3f4e6f68c6de02a5148a801c4", + "is_verified": false, + "line_number": 106 + }, + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/nostr-bus.test.ts", + "hashed_secret": "98b35fe4c45011220f509ebb5546d3889b55a891", + "is_verified": false, + "line_number": 111 + } + ], + "extensions/nostr/src/nostr-profile.fuzz.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/nostr-profile.fuzz.test.ts", + "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", + "is_verified": false, + "line_number": 11 + } + ], + "extensions/nostr/src/nostr-profile.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/nostr-profile.test.ts", + "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", + "is_verified": false, + "line_number": 14 + } + ], + "extensions/nostr/src/types.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "extensions/nostr/src/types.test.ts", + "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", + "is_verified": false, + "line_number": 4 + }, + { + "type": "Secret Keyword", + "filename": "extensions/nostr/src/types.test.ts", + "hashed_secret": "ce4303f6b22257d9c9cf314ef1dee4707c6e1c13", + "is_verified": false, + "line_number": 4 + }, + { + "type": "Secret Keyword", + "filename": "extensions/nostr/src/types.test.ts", + "hashed_secret": "3bee216ebc256d692260fc3adc765050508fef5e", + "is_verified": false, + "line_number": 123 + } + ], + "extensions/open-prose/skills/prose/SKILL.md": [ + { + "type": "Basic Auth Credentials", + "filename": "extensions/open-prose/skills/prose/SKILL.md", + "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684", + "is_verified": false, + "line_number": 204 + } + ], + "extensions/open-prose/skills/prose/state/postgres.md": [ + { + "type": "Secret Keyword", + "filename": "extensions/open-prose/skills/prose/state/postgres.md", + "hashed_secret": "fa9beb99e4029ad5a6615399e7bbae21356086b3", + "is_verified": false, + "line_number": 77 + }, + { + "type": "Basic Auth Credentials", + "filename": "extensions/open-prose/skills/prose/state/postgres.md", + "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684", + "is_verified": false, + "line_number": 200 + } + ], + "extensions/twitch/src/onboarding.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/twitch/src/onboarding.test.ts", + "hashed_secret": "f2b14f68eb995facb3a1c35287b778d5bd785511", + "is_verified": false, + "line_number": 239 + }, + { + "type": "Secret Keyword", + "filename": "extensions/twitch/src/onboarding.test.ts", + "hashed_secret": "c8d8f8140951794fa875ea2c2d010c4382f36566", + "is_verified": false, + "line_number": 249 + } + ], + "extensions/twitch/src/status.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/twitch/src/status.test.ts", + "hashed_secret": "f2b14f68eb995facb3a1c35287b778d5bd785511", + "is_verified": false, + "line_number": 122 + } + ], + "extensions/voice-call/README.md": [ + { + "type": "Secret Keyword", + "filename": "extensions/voice-call/README.md", + "hashed_secret": "48004f85d79e636cfd408c3baddcb1f0bbdd611a", + "is_verified": false, + "line_number": 49 + } + ], + "extensions/voice-call/src/config.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/voice-call/src/config.test.ts", + "hashed_secret": "62207a469ec2fdcfc7d66b04c2980ac1501acbf0", + "is_verified": false, + "line_number": 129 + } + ], + "extensions/voice-call/src/providers/telnyx.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/voice-call/src/providers/telnyx.test.ts", + "hashed_secret": "62207a469ec2fdcfc7d66b04c2980ac1501acbf0", + "is_verified": false, + "line_number": 30 + } + ], + "extensions/zalo/README.md": [ + { + "type": "Secret Keyword", + "filename": "extensions/zalo/README.md", + "hashed_secret": "f51aaee16a4a756d287f126b99c081b73cba7f15", + "is_verified": false, + "line_number": 41 + } + ], + "extensions/zalo/src/monitor.webhook.test.ts": [ + { + "type": "Secret Keyword", + "filename": "extensions/zalo/src/monitor.webhook.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 40 + } + ], + "skills/1password/references/cli-examples.md": [ + { + "type": "Secret Keyword", + "filename": "skills/1password/references/cli-examples.md", + "hashed_secret": "9dda0987cc3054773a2df97e352d4f64d233ef10", + "is_verified": false, + "line_number": 17 + } + ], + "skills/openai-whisper-api/SKILL.md": [ + { + "type": "Secret Keyword", + "filename": "skills/openai-whisper-api/SKILL.md", + "hashed_secret": "1077361f94d70e1ddcc7c6dc581a489532a81d03", + "is_verified": false, + "line_number": 48 + } + ], + "skills/trello/SKILL.md": [ + { + "type": "Secret Keyword", + "filename": "skills/trello/SKILL.md", + "hashed_secret": "11fa7c37d697f30e6aee828b4426a10f83ab2380", + "is_verified": false, + "line_number": 22 + } + ], + "src/agents/compaction.tool-result-details.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/compaction.tool-result-details.e2e.test.ts", + "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", + "is_verified": false, + "line_number": 50 + } + ], + "src/agents/memory-search.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/memory-search.e2e.test.ts", + "hashed_secret": "a1b49d68a91fdf9c9217773f3fac988d77fa0f50", + "is_verified": false, + "line_number": 189 + } + ], + "src/agents/minimax-vlm.normalizes-api-key.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/minimax-vlm.normalizes-api-key.e2e.test.ts", + "hashed_secret": "8a8461b67e3fe515f248ac2610fd7b1f4fc3b412", + "is_verified": false, + "line_number": 28 + } + ], + "src/agents/model-auth.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/model-auth.e2e.test.ts", + "hashed_secret": "07a6b9cec637c806195e8aa7e5c0851ab03dc35e", + "is_verified": false, + "line_number": 228 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/model-auth.e2e.test.ts", + "hashed_secret": "21f296583ccd80c5ab9b3330a8b0d47e4a409fb9", + "is_verified": false, + "line_number": 254 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/model-auth.e2e.test.ts", + "hashed_secret": "b65888424ecafcc98bfd803b24817e4dadf821f8", + "is_verified": false, + "line_number": 275 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/model-auth.e2e.test.ts", + "hashed_secret": "77e991e9f56e6fa4ed1a908208048421f1214c07", + "is_verified": false, + "line_number": 296 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/model-auth.e2e.test.ts", + "hashed_secret": "dff6d4ff5dc357cf451d1855ab9cbda562645c9f", + "is_verified": false, + "line_number": 319 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/model-auth.e2e.test.ts", + "hashed_secret": "b43be360db55d89ec6afd74d6ed8f82002fe4982", + "is_verified": false, + "line_number": 374 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/model-auth.e2e.test.ts", + "hashed_secret": "5b850e9dc678446137ff6d905ebd78634d687fdd", + "is_verified": false, + "line_number": 395 + } + ], + "src/agents/model-auth.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/model-auth.ts", + "hashed_secret": "8956265d216d474a080edaa97880d37fc1386f33", + "is_verified": false, + "line_number": 25 + } + ], + "src/agents/models-config.e2e-harness.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/models-config.e2e-harness.ts", + "hashed_secret": "7cf31e8b6cda49f70c31f1f25af05d46f924142d", + "is_verified": false, + "line_number": 110 + } + ], + "src/agents/models-config.fills-missing-provider-apikey-from-env-var.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/models-config.fills-missing-provider-apikey-from-env-var.e2e.test.ts", + "hashed_secret": "fcdd655b11f33ba4327695084a347b2ba192976c", + "is_verified": false, + "line_number": 19 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/models-config.fills-missing-provider-apikey-from-env-var.e2e.test.ts", + "hashed_secret": "3a81eb091f80c845232225be5663d270e90dacb7", + "is_verified": false, + "line_number": 73 + } + ], + "src/agents/models-config.normalizes-gemini-3-ids-preview-google-providers.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/models-config.normalizes-gemini-3-ids-preview-google-providers.e2e.test.ts", + "hashed_secret": "980d02eb9335ae7c9e9984f6c8ad432352a0d2ac", + "is_verified": false, + "line_number": 20 + } + ], + "src/agents/models-config.providers.nvidia.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/models-config.providers.nvidia.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 13 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/models-config.providers.nvidia.test.ts", + "hashed_secret": "be1a7be9d4d5af417882b267f4db6dddc08507bd", + "is_verified": false, + "line_number": 27 + } + ], + "src/agents/models-config.providers.ollama.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/models-config.providers.ollama.e2e.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 37 + } + ], + "src/agents/models-config.providers.qianfan.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/models-config.providers.qianfan.e2e.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 12 + } + ], + "src/agents/models-config.skips-writing-models-json-no-env-token.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/models-config.skips-writing-models-json-no-env-token.e2e.test.ts", + "hashed_secret": "4c7bac93427c83bcc3beeceebfa54f16f801b78f", + "is_verified": false, + "line_number": 100 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/models-config.skips-writing-models-json-no-env-token.e2e.test.ts", + "hashed_secret": "4f2b3ddc953da005a97d825652080fe6eff21520", + "is_verified": false, + "line_number": 113 + } + ], + "src/agents/openai-responses.reasoning-replay.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/openai-responses.reasoning-replay.test.ts", + "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", + "is_verified": false, + "line_number": 55 + } + ], + "src/agents/pi-embedded-runner.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/pi-embedded-runner.e2e.test.ts", + "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd", + "is_verified": false, + "line_number": 127 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/pi-embedded-runner.e2e.test.ts", + "hashed_secret": "fcdd655b11f33ba4327695084a347b2ba192976c", + "is_verified": false, + "line_number": 238 + } + ], + "src/agents/pi-embedded-runner/model.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/pi-embedded-runner/model.ts", + "hashed_secret": "e774aaeac31c6272107ba89080295e277050fa7c", + "is_verified": false, + "line_number": 118 + } + ], + "src/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 86 + } + ], + "src/agents/pi-tools.safe-bins.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/pi-tools.safe-bins.e2e.test.ts", + "hashed_secret": "3ea88a727641fd5571b5e126ce87032377be1e7f", + "is_verified": false, + "line_number": 126 + } + ], + "src/agents/sanitize-for-prompt.test.ts": [ + { + "type": "Base64 High Entropy String", + "filename": "src/agents/sanitize-for-prompt.test.ts", + "hashed_secret": "9c62d3aa77c19e170c44b18129f967e2041fda41", + "is_verified": false, + "line_number": 28 + } + ], + "src/agents/skills.build-workspace-skills-prompt.prefers-workspace-skills-managed-skills.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/skills.build-workspace-skills-prompt.prefers-workspace-skills-managed-skills.e2e.test.ts", + "hashed_secret": "7a85f4764bbd6daf1c3545efbbf0f279a6dc0beb", + "is_verified": false, + "line_number": 103 + } + ], + "src/agents/skills.build-workspace-skills-prompt.syncs-merged-skills-into-target-workspace.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/skills.build-workspace-skills-prompt.syncs-merged-skills-into-target-workspace.e2e.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 147 + } + ], + "src/agents/skills.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/skills.e2e.test.ts", + "hashed_secret": "5df3a673d724e8a1eb673a8baf623e183940804d", + "is_verified": false, + "line_number": 250 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/skills.e2e.test.ts", + "hashed_secret": "8921daaa546693e52bc1f9c40bdcf15e816e0448", + "is_verified": false, + "line_number": 277 + } + ], + "src/agents/tools/web-fetch.firecrawl-api-key-normalization.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/tools/web-fetch.firecrawl-api-key-normalization.e2e.test.ts", + "hashed_secret": "9da08ab1e27fe0ae2ba6101aea30edcec02d21a4", + "is_verified": false, + "line_number": 45 + } + ], + "src/agents/tools/web-fetch.ssrf.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/tools/web-fetch.ssrf.e2e.test.ts", + "hashed_secret": "5ce8e9d54c77266fff990194d2219a708c59b76c", + "is_verified": false, + "line_number": 73 + } + ], + "src/agents/tools/web-search.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/tools/web-search.e2e.test.ts", + "hashed_secret": "c8d313eac6d38274ccfc0fa7935c68bd61d5bc2f", + "is_verified": false, + "line_number": 129 + } + ], + "src/agents/tools/web-search.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/tools/web-search.ts", + "hashed_secret": "dfba7aade0868074c2861c98e2a9a92f3178a51b", + "is_verified": false, + "line_number": 97 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/tools/web-search.ts", + "hashed_secret": "71f8e7976e4cbc4561c9d62fb283e7f788202acb", + "is_verified": false, + "line_number": 285 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/tools/web-search.ts", + "hashed_secret": "c4865ff9250aca23b0d98eb079dad70ebec1cced", + "is_verified": false, + "line_number": 295 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/tools/web-search.ts", + "hashed_secret": "527ee41f36386e85fa932ef09471ca017f3c95c8", + "is_verified": false, + "line_number": 298 + } + ], + "src/agents/tools/web-tools.enabled-defaults.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/tools/web-tools.enabled-defaults.e2e.test.ts", + "hashed_secret": "47b249a75ca78fdb578d0f28c33685e27ea82684", + "is_verified": false, + "line_number": 181 + }, + { + "type": "Secret Keyword", + "filename": "src/agents/tools/web-tools.enabled-defaults.e2e.test.ts", + "hashed_secret": "d0ffd81d6d7ad1bc3c365660fe8882480c9a986e", + "is_verified": false, + "line_number": 187 + } + ], + "src/agents/tools/web-tools.fetch.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/agents/tools/web-tools.fetch.e2e.test.ts", + "hashed_secret": "5ce8e9d54c77266fff990194d2219a708c59b76c", + "is_verified": false, + "line_number": 246 + } + ], + "src/auto-reply/reply.directive.directive-behavior.prefers-alias-matches-fuzzy-selection-is-ambiguous.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/auto-reply/reply.directive.directive-behavior.prefers-alias-matches-fuzzy-selection-is-ambiguous.e2e.test.ts", + "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd", + "is_verified": false, + "line_number": 56 + }, + { + "type": "Secret Keyword", + "filename": "src/auto-reply/reply.directive.directive-behavior.prefers-alias-matches-fuzzy-selection-is-ambiguous.e2e.test.ts", + "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209", + "is_verified": false, + "line_number": 62 + } + ], + "src/auto-reply/reply.directive.directive-behavior.supports-fuzzy-model-matches-model-directive.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/auto-reply/reply.directive.directive-behavior.supports-fuzzy-model-matches-model-directive.e2e.test.ts", + "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd", + "is_verified": false, + "line_number": 42 + }, + { + "type": "Secret Keyword", + "filename": "src/auto-reply/reply.directive.directive-behavior.supports-fuzzy-model-matches-model-directive.e2e.test.ts", + "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209", + "is_verified": false, + "line_number": 149 + } + ], + "src/auto-reply/status.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/auto-reply/status.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 36 + } + ], + "src/browser/bridge-server.auth.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/browser/bridge-server.auth.test.ts", + "hashed_secret": "6af3c121ed4a752936c297cddfb7b00394eabf10", + "is_verified": false, + "line_number": 66 + } + ], + "src/browser/browser-utils.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "src/browser/browser-utils.test.ts", + "hashed_secret": "4e126c049580d66ca1549fa534d95a7263f27f46", + "is_verified": false, + "line_number": 38 + }, + { + "type": "Basic Auth Credentials", + "filename": "src/browser/browser-utils.test.ts", + "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684", + "is_verified": false, + "line_number": 159 + } + ], + "src/browser/cdp.test.ts": [ + { + "type": "Basic Auth Credentials", + "filename": "src/browser/cdp.test.ts", + "hashed_secret": "9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684", + "is_verified": false, + "line_number": 186 + } + ], + "src/channels/plugins/plugins-channel.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "src/channels/plugins/plugins-channel.test.ts", + "hashed_secret": "99c962e8c62296bdc9a17f5caf91ce9bb4c7e0e6", + "is_verified": false, + "line_number": 46 + } + ], + "src/cli/program.smoke.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/cli/program.smoke.e2e.test.ts", + "hashed_secret": "8689a958b58e4a6f7da6211e666da8e17651697c", + "is_verified": false, + "line_number": 215 + } + ], + "src/cli/update-cli.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "src/cli/update-cli.test.ts", + "hashed_secret": "e4f91dd323bac5bfc4f60a6e433787671dc2421d", + "is_verified": false, + "line_number": 239 + } + ], + "src/commands/auth-choice.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/auth-choice.e2e.test.ts", + "hashed_secret": "2480500ff391183070fe22ba8665a8be19350833", + "is_verified": false, + "line_number": 454 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/auth-choice.e2e.test.ts", + "hashed_secret": "844ae5308654406d80db6f2b3d0beb07d616f9e1", + "is_verified": false, + "line_number": 487 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/auth-choice.e2e.test.ts", + "hashed_secret": "77e991e9f56e6fa4ed1a908208048421f1214c07", + "is_verified": false, + "line_number": 549 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/auth-choice.e2e.test.ts", + "hashed_secret": "266e955b27b5fc2c2f532e446f2e71c3667a4cd9", + "is_verified": false, + "line_number": 584 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/auth-choice.e2e.test.ts", + "hashed_secret": "1b4d8423b11d32dd0c466428ac81de84a4a9442b", + "is_verified": false, + "line_number": 726 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/auth-choice.e2e.test.ts", + "hashed_secret": "c24e00b94c972ed497d5961212ac96f0dffb4f7a", + "is_verified": false, + "line_number": 798 + } + ], + "src/commands/auth-choice.preferred-provider.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/auth-choice.preferred-provider.ts", + "hashed_secret": "c03a8d10174dd7eb2b3288b570a5a74fdd9ae05d", + "is_verified": false, + "line_number": 8 + } + ], + "src/commands/configure.gateway-auth.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/configure.gateway-auth.e2e.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 21 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/configure.gateway-auth.e2e.test.ts", + "hashed_secret": "d5d4cd07616a542891b7ec2d0257b3a24b69856e", + "is_verified": false, + "line_number": 62 + } + ], + "src/commands/daemon-install-helpers.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/daemon-install-helpers.e2e.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 128 + } + ], + "src/commands/doctor-memory-search.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/doctor-memory-search.test.ts", + "hashed_secret": "2e07956ffc9bc4fd624064c40b7495c85d5f1467", + "is_verified": false, + "line_number": 38 + } + ], + "src/commands/model-picker.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/model-picker.e2e.test.ts", + "hashed_secret": "5b924ca5330ede58702a5b0e414207b90fb1aef3", + "is_verified": false, + "line_number": 127 + } + ], + "src/commands/models/list.status.e2e.test.ts": [ + { + "type": "Base64 High Entropy String", + "filename": "src/commands/models/list.status.e2e.test.ts", + "hashed_secret": "d6ae2508a78a232d5378ef24b85ce40cbb4d7ff0", + "is_verified": false, + "line_number": 12 + }, + { + "type": "Base64 High Entropy String", + "filename": "src/commands/models/list.status.e2e.test.ts", + "hashed_secret": "2d8012102440ea97852b3152239218f00579bafa", + "is_verified": false, + "line_number": 19 + }, + { + "type": "Base64 High Entropy String", + "filename": "src/commands/models/list.status.e2e.test.ts", + "hashed_secret": "51848e2be4b461a549218d3167f19c01be6b98b8", + "is_verified": false, + "line_number": 51 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/models/list.status.e2e.test.ts", + "hashed_secret": "51848e2be4b461a549218d3167f19c01be6b98b8", + "is_verified": false, + "line_number": 51 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/models/list.status.e2e.test.ts", + "hashed_secret": "1c1e381bfb72d3b7bfca9437053d9875356680f0", + "is_verified": false, + "line_number": 57 + } + ], + "src/commands/onboard-auth.config-minimax.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-auth.config-minimax.ts", + "hashed_secret": "16c249e04e2be318050cb883c40137361c0c7209", + "is_verified": false, + "line_number": 36 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-auth.config-minimax.ts", + "hashed_secret": "ddcb713196b974770575a9bea5a4e7d46361f8e9", + "is_verified": false, + "line_number": 78 + } + ], + "src/commands/onboard-auth.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-auth.e2e.test.ts", + "hashed_secret": "e184b402822abc549b37689c84e8e0e33c39a1f1", + "is_verified": false, + "line_number": 272 + } + ], + "src/commands/onboard-custom.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-custom.e2e.test.ts", + "hashed_secret": "62e6748c6bb4c4a0f785a28cdd7d41ef212c0091", + "is_verified": false, + "line_number": 238 + } + ], + "src/commands/onboard-non-interactive.provider-auth.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-non-interactive.provider-auth.e2e.test.ts", + "hashed_secret": "fcdd655b11f33ba4327695084a347b2ba192976c", + "is_verified": false, + "line_number": 153 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-non-interactive.provider-auth.e2e.test.ts", + "hashed_secret": "07a6b9cec637c806195e8aa7e5c0851ab03dc35e", + "is_verified": false, + "line_number": 191 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-non-interactive.provider-auth.e2e.test.ts", + "hashed_secret": "77e991e9f56e6fa4ed1a908208048421f1214c07", + "is_verified": false, + "line_number": 234 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-non-interactive.provider-auth.e2e.test.ts", + "hashed_secret": "65547299f940eca3dc839f3eac85e8a78a6deb05", + "is_verified": false, + "line_number": 282 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-non-interactive.provider-auth.e2e.test.ts", + "hashed_secret": "2833d098c110602e4c8d577fbfdb423a9ffd58e9", + "is_verified": false, + "line_number": 304 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-non-interactive.provider-auth.e2e.test.ts", + "hashed_secret": "266e955b27b5fc2c2f532e446f2e71c3667a4cd9", + "is_verified": false, + "line_number": 338 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-non-interactive.provider-auth.e2e.test.ts", + "hashed_secret": "995b80728ee01edb90ddfed07870bbab405df19f", + "is_verified": false, + "line_number": 366 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-non-interactive.provider-auth.e2e.test.ts", + "hashed_secret": "b65888424ecafcc98bfd803b24817e4dadf821f8", + "is_verified": false, + "line_number": 383 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-non-interactive.provider-auth.e2e.test.ts", + "hashed_secret": "62e6748c6bb4c4a0f785a28cdd7d41ef212c0091", + "is_verified": false, + "line_number": 402 + }, + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-non-interactive.provider-auth.e2e.test.ts", + "hashed_secret": "8818d3b7c102fd6775af9e1390e5ed3a128473fb", + "is_verified": false, + "line_number": 447 + } + ], + "src/commands/onboard-non-interactive/api-keys.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/onboard-non-interactive/api-keys.ts", + "hashed_secret": "112f3a99b283a4e1788dedd8e0e5d35375c33747", + "is_verified": false, + "line_number": 11 + } + ], + "src/commands/status.update.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "src/commands/status.update.test.ts", + "hashed_secret": "33c76f70af66754ca47d19b17da8dc232e125253", + "is_verified": false, + "line_number": 74 + } + ], + "src/commands/vllm-setup.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/vllm-setup.ts", + "hashed_secret": "5b924ca5330ede58702a5b0e414207b90fb1aef3", + "is_verified": false, + "line_number": 60 + } + ], + "src/commands/zai-endpoint-detect.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/commands/zai-endpoint-detect.e2e.test.ts", + "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd", + "is_verified": false, + "line_number": 24 + } + ], + "src/config/config-misc.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/config-misc.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 62 + } + ], + "src/config/config.env-vars.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/config.env-vars.test.ts", + "hashed_secret": "a24ef9c1a27cac44823571ceef2e8262718eee36", + "is_verified": false, + "line_number": 13 + }, + { + "type": "Secret Keyword", + "filename": "src/config/config.env-vars.test.ts", + "hashed_secret": "29d5f92e9ee44d4854d6dfaeefc3dc27d779fdf3", + "is_verified": false, + "line_number": 19 + }, + { + "type": "Secret Keyword", + "filename": "src/config/config.env-vars.test.ts", + "hashed_secret": "1672b6a1e7956c6a70f45d699aa42a351b1f8b80", + "is_verified": false, + "line_number": 27 + } + ], + "src/config/config.irc.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/config.irc.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 92 + } + ], + "src/config/config.talk-api-key-fallback.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/config.talk-api-key-fallback.test.ts", + "hashed_secret": "bea2f7b64fab8d1d414d0449530b1e088d36d5b1", + "is_verified": false, + "line_number": 33 + } + ], + "src/config/env-preserve-io.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/env-preserve-io.test.ts", + "hashed_secret": "85639f0560fd9bf8704f52e01c5e764c9ed5a6aa", + "is_verified": false, + "line_number": 59 + }, + { + "type": "Secret Keyword", + "filename": "src/config/env-preserve-io.test.ts", + "hashed_secret": "996650087ab48bdb1ca80f0842c97d4fbb6f1c71", + "is_verified": false, + "line_number": 86 + } + ], + "src/config/env-preserve.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/env-preserve.test.ts", + "hashed_secret": "f6067ac4599b1cd5176f34897bb556a1a1eaf049", + "is_verified": false, + "line_number": 6 + }, + { + "type": "Secret Keyword", + "filename": "src/config/env-preserve.test.ts", + "hashed_secret": "5a41c5061e7279cec0566b3ef52cbe042e831192", + "is_verified": false, + "line_number": 7 + }, + { + "type": "Secret Keyword", + "filename": "src/config/env-preserve.test.ts", + "hashed_secret": "53d407242b91f07138abcf30ee0e6b71f304b87f", + "is_verified": false, + "line_number": 19 + }, + { + "type": "Secret Keyword", + "filename": "src/config/env-preserve.test.ts", + "hashed_secret": "c1b24294f00e281605f9dd6a298612e3060062b4", + "is_verified": false, + "line_number": 82 + } + ], + "src/config/env-substitution.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/env-substitution.test.ts", + "hashed_secret": "f2b14f68eb995facb3a1c35287b778d5bd785511", + "is_verified": false, + "line_number": 37 + }, + { + "type": "Secret Keyword", + "filename": "src/config/env-substitution.test.ts", + "hashed_secret": "ec417f567082612f8fd6afafe1abcab831fca840", + "is_verified": false, + "line_number": 68 + }, + { + "type": "Secret Keyword", + "filename": "src/config/env-substitution.test.ts", + "hashed_secret": "520bd69c3eb1646d9a78181ecb4c90c51fdf428d", + "is_verified": false, + "line_number": 69 + }, + { + "type": "Secret Keyword", + "filename": "src/config/env-substitution.test.ts", + "hashed_secret": "f136444bf9b3d01a9f9b772b80ac6bf7b6a43ef0", + "is_verified": false, + "line_number": 227 + } + ], + "src/config/io.write-config.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/io.write-config.test.ts", + "hashed_secret": "13951588fd3325e25ed1e3b116d7009fb221c85e", + "is_verified": false, + "line_number": 65 + } + ], + "src/config/model-alias-defaults.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/model-alias-defaults.test.ts", + "hashed_secret": "e9a5f12a8ecbb3eb46eca5096b5c52aa5e7c9fdd", + "is_verified": false, + "line_number": 66 + } + ], + "src/config/redact-snapshot.test.ts": [ + { + "type": "Base64 High Entropy String", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "3732e17b2d11ed6c64fef02c341958007af154e7", + "is_verified": false, + "line_number": 77 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "3732e17b2d11ed6c64fef02c341958007af154e7", + "is_verified": false, + "line_number": 77 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "7f413afd37447cd321d79286be0f58d7a9875d9b", + "is_verified": false, + "line_number": 89 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "c21afa950dee2a70f3e0f6ffdfbc87f8edb90262", + "is_verified": false, + "line_number": 99 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "83a9937c6de261ffda22304834f30fe6c8f97926", + "is_verified": false, + "line_number": 110 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "87ac76dfc9cba93bead43c191e31bd099a97cc11", + "is_verified": false, + "line_number": 198 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "abb1aabcd0e49019c2873944a40671a80ccd64c7", + "is_verified": false, + "line_number": 309 + }, + { + "type": "Base64 High Entropy String", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "8e22880b4e96bab354e1da6c91d2f58dabde3555", + "is_verified": false, + "line_number": 321 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "8e22880b4e96bab354e1da6c91d2f58dabde3555", + "is_verified": false, + "line_number": 321 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "a9c732e05044a08c760cce7f6d142cd0d35a19e5", + "is_verified": false, + "line_number": 375 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "50843dd5651cfafbe7c5611c1eed195c63e6e3fd", + "is_verified": false, + "line_number": 691 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "927e7cdedcb8f71af399a49fb90a381df8b8df28", + "is_verified": false, + "line_number": 808 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "1996cc327bd39dad69cd8feb24250dafd51e7c08", + "is_verified": false, + "line_number": 814 + }, + { + "type": "Secret Keyword", + "filename": "src/config/redact-snapshot.test.ts", + "hashed_secret": "a5c0a65a4fa8874a486aa5072671927ceba82a90", + "is_verified": false, + "line_number": 838 + } + ], + "src/config/schema.help.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/schema.help.ts", + "hashed_secret": "9f4cda226d3868676ac7f86f59e4190eb94bd208", + "is_verified": false, + "line_number": 109 + }, + { + "type": "Secret Keyword", + "filename": "src/config/schema.help.ts", + "hashed_secret": "01822c8bbf6a8b136944b14182cb885100ec2eae", + "is_verified": false, + "line_number": 130 + }, + { + "type": "Secret Keyword", + "filename": "src/config/schema.help.ts", + "hashed_secret": "bb7dfd9746e660e4a4374951ec5938ef0e343255", + "is_verified": false, + "line_number": 187 + } + ], + "src/config/schema.irc.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/schema.irc.ts", + "hashed_secret": "de18cf01737148de8ff7cb33fd38dd4d3e226384", + "is_verified": false, + "line_number": 6 + }, + { + "type": "Secret Keyword", + "filename": "src/config/schema.irc.ts", + "hashed_secret": "b362522192a2259c5d10ecb89fe728a66d6015e9", + "is_verified": false, + "line_number": 7 + }, + { + "type": "Secret Keyword", + "filename": "src/config/schema.irc.ts", + "hashed_secret": "383088054f9b38c21ec29db239e3fccb7eb0a485", + "is_verified": false, + "line_number": 20 + }, + { + "type": "Secret Keyword", + "filename": "src/config/schema.irc.ts", + "hashed_secret": "a3484eea8ccb96dd79f50edc14b8fbf2867a9180", + "is_verified": false, + "line_number": 21 + } + ], + "src/config/schema.labels.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/schema.labels.ts", + "hashed_secret": "e73c9fcad85cd4eecc74181ec4bdb31064d68439", + "is_verified": false, + "line_number": 104 + }, + { + "type": "Secret Keyword", + "filename": "src/config/schema.labels.ts", + "hashed_secret": "2eda7cd978f39eebec3bf03e4410a40e14167fff", + "is_verified": false, + "line_number": 145 + } + ], + "src/config/slack-http-config.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/slack-http-config.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 10 + } + ], + "src/config/telegram-webhook-secret.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/config/telegram-webhook-secret.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 10 + } + ], + "src/docker-setup.test.ts": [ + { + "type": "Base64 High Entropy String", + "filename": "src/docker-setup.test.ts", + "hashed_secret": "32ac33b537769e97787f70ef85576cc243fab934", + "is_verified": false, + "line_number": 131 + } + ], + "src/gateway/auth-rate-limit.ts": [ + { + "type": "Secret Keyword", + "filename": "src/gateway/auth-rate-limit.ts", + "hashed_secret": "76ed0a056aa77060de25754586440cff390791d0", + "is_verified": false, + "line_number": 37 + } + ], + "src/gateway/auth.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/gateway/auth.test.ts", + "hashed_secret": "db5543cd7440bbdc4c5aaf8aa363715c31dd5a27", + "is_verified": false, + "line_number": 32 + }, + { + "type": "Secret Keyword", + "filename": "src/gateway/auth.test.ts", + "hashed_secret": "d51f846285cbc6d1dd76677a0fd588c8df44e506", + "is_verified": false, + "line_number": 48 + }, + { + "type": "Secret Keyword", + "filename": "src/gateway/auth.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 95 + }, + { + "type": "Secret Keyword", + "filename": "src/gateway/auth.test.ts", + "hashed_secret": "a4b48a81cdab1e1a5dd37907d6c85ca1c61ddc7c", + "is_verified": false, + "line_number": 103 + } + ], + "src/gateway/call.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/gateway/call.test.ts", + "hashed_secret": "db5543cd7440bbdc4c5aaf8aa363715c31dd5a27", + "is_verified": false, + "line_number": 357 + }, + { + "type": "Secret Keyword", + "filename": "src/gateway/call.test.ts", + "hashed_secret": "de1c41e8ece73f5d5c259bb37eccb59a542b91dc", + "is_verified": false, + "line_number": 361 + }, + { + "type": "Secret Keyword", + "filename": "src/gateway/call.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 398 + }, + { + "type": "Secret Keyword", + "filename": "src/gateway/call.test.ts", + "hashed_secret": "e493f561d90c6638c1f51c5a8a069c3b129b79ed", + "is_verified": false, + "line_number": 408 + }, + { + "type": "Secret Keyword", + "filename": "src/gateway/call.test.ts", + "hashed_secret": "2e07956ffc9bc4fd624064c40b7495c85d5f1467", + "is_verified": false, + "line_number": 413 + }, + { + "type": "Secret Keyword", + "filename": "src/gateway/call.test.ts", + "hashed_secret": "bddc29032de580fb53b3a9a0357dd409086db800", + "is_verified": false, + "line_number": 426 + }, + { + "type": "Secret Keyword", + "filename": "src/gateway/call.test.ts", + "hashed_secret": "6255675480f681df08c1704b7b3cd2c49917f0e2", + "is_verified": false, + "line_number": 463 + } + ], + "src/gateway/client.e2e.test.ts": [ + { + "type": "Private Key", + "filename": "src/gateway/client.e2e.test.ts", + "hashed_secret": "1348b145fa1a555461c1b790a2f66614781091e9", + "is_verified": false, + "line_number": 85 + } + ], + "src/gateway/gateway-cli-backend.live.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "src/gateway/gateway-cli-backend.live.test.ts", + "hashed_secret": "3e2fd4a90d5afbd27974730c4d6a9592fe300825", + "is_verified": false, + "line_number": 38 + } + ], + "src/gateway/gateway-models.profiles.live.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "src/gateway/gateway-models.profiles.live.test.ts", + "hashed_secret": "3e2fd4a90d5afbd27974730c4d6a9592fe300825", + "is_verified": false, + "line_number": 242 + } + ], + "src/gateway/server-methods/skills.update.normalizes-api-key.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/gateway/server-methods/skills.update.normalizes-api-key.test.ts", + "hashed_secret": "c17b6f497b392e2efc655e8b646b3455f4b28e58", + "is_verified": false, + "line_number": 29 + } + ], + "src/gateway/server-methods/talk.ts": [ + { + "type": "Secret Keyword", + "filename": "src/gateway/server-methods/talk.ts", + "hashed_secret": "e478a5eeba4907d2f12a68761996b9de745d826d", + "is_verified": false, + "line_number": 13 + } + ], + "src/gateway/server.auth.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/gateway/server.auth.e2e.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 460 + }, + { + "type": "Secret Keyword", + "filename": "src/gateway/server.auth.e2e.test.ts", + "hashed_secret": "a4b48a81cdab1e1a5dd37907d6c85ca1c61ddc7c", + "is_verified": false, + "line_number": 478 + } + ], + "src/gateway/server.skills-status.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/gateway/server.skills-status.e2e.test.ts", + "hashed_secret": "1cc6bff0f84efb2d3ff4fa1347f3b2bc173aaff0", + "is_verified": false, + "line_number": 13 + } + ], + "src/gateway/server.talk-config.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/gateway/server.talk-config.e2e.test.ts", + "hashed_secret": "3c310634864babb081f0b617c14bc34823d7e369", + "is_verified": false, + "line_number": 13 + } + ], + "src/gateway/session-utils.test.ts": [ + { + "type": "Base64 High Entropy String", + "filename": "src/gateway/session-utils.test.ts", + "hashed_secret": "bb9a5d9483409d2c60b28268a0efcb93324d4cda", + "is_verified": false, + "line_number": 280 + } + ], + "src/gateway/test-openai-responses-model.ts": [ + { + "type": "Secret Keyword", + "filename": "src/gateway/test-openai-responses-model.ts", + "hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", + "is_verified": false, + "line_number": 17 + } + ], + "src/gateway/ws-log.test.ts": [ + { + "type": "Base64 High Entropy String", + "filename": "src/gateway/ws-log.test.ts", + "hashed_secret": "edd2e7ac4f61d0c606e80a0919d727540842a307", + "is_verified": false, + "line_number": 22 + } + ], + "src/infra/env.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/infra/env.test.ts", + "hashed_secret": "df98a117ddabf85991b9fe0e268214dc0e1254dc", + "is_verified": false, + "line_number": 9 + }, + { + "type": "Secret Keyword", + "filename": "src/infra/env.test.ts", + "hashed_secret": "6d811dc1f59a55ca1a3d38b5042a062b9f79e8ec", + "is_verified": false, + "line_number": 30 + } + ], + "src/infra/outbound/message-action-runner.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "src/infra/outbound/message-action-runner.test.ts", + "hashed_secret": "804ec071803318791b835cffd6e509c8d32239db", + "is_verified": false, + "line_number": 129 + }, + { + "type": "Secret Keyword", + "filename": "src/infra/outbound/message-action-runner.test.ts", + "hashed_secret": "789cbe0407840b1c2041cb33452ff60f19bf58cc", + "is_verified": false, + "line_number": 435 + } + ], + "src/infra/outbound/outbound.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "src/infra/outbound/outbound.test.ts", + "hashed_secret": "804ec071803318791b835cffd6e509c8d32239db", + "is_verified": false, + "line_number": 631 + } + ], + "src/infra/provider-usage.auth.normalizes-keys.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/infra/provider-usage.auth.normalizes-keys.test.ts", + "hashed_secret": "45c7365e3b542cdb4fae6ec10c2ff149224d7656", + "is_verified": false, + "line_number": 80 + }, + { + "type": "Secret Keyword", + "filename": "src/infra/provider-usage.auth.normalizes-keys.test.ts", + "hashed_secret": "b67074884ab7ef7c7a8cd6a3da9565d96c792248", + "is_verified": false, + "line_number": 81 + }, + { + "type": "Secret Keyword", + "filename": "src/infra/provider-usage.auth.normalizes-keys.test.ts", + "hashed_secret": "d4d8027e64f9cf4180d3aecfe31ea409368022ee", + "is_verified": false, + "line_number": 82 + } + ], + "src/infra/shell-env.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/infra/shell-env.test.ts", + "hashed_secret": "65c10dc3549fe07424148a8a4790a3341ecbc253", + "is_verified": false, + "line_number": 26 + }, + { + "type": "Secret Keyword", + "filename": "src/infra/shell-env.test.ts", + "hashed_secret": "e013ffda590d2178607c16d11b1ea42f75ceb0e7", + "is_verified": false, + "line_number": 58 + }, + { + "type": "Base64 High Entropy String", + "filename": "src/infra/shell-env.test.ts", + "hashed_secret": "be6ee9a6bf9f2dad84a5a67d6c0576a5bacc391e", + "is_verified": false, + "line_number": 60 + } + ], + "src/line/accounts.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/line/accounts.test.ts", + "hashed_secret": "fe1bae27cb7c1fb823f496f286e78f1d2ae87734", + "is_verified": false, + "line_number": 30 + }, + { + "type": "Secret Keyword", + "filename": "src/line/accounts.test.ts", + "hashed_secret": "8a8281cec699f5e51330e21dd7fab3531af6ef0c", + "is_verified": false, + "line_number": 48 + }, + { + "type": "Secret Keyword", + "filename": "src/line/accounts.test.ts", + "hashed_secret": "b4924d9834a1126714643ac231fb6623c14c3449", + "is_verified": false, + "line_number": 74 + } + ], + "src/line/bot-handlers.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/line/bot-handlers.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 106 + } + ], + "src/line/bot-message-context.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/line/bot-message-context.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 18 + } + ], + "src/line/monitor.fail-closed.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/line/monitor.fail-closed.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 22 + } + ], + "src/line/webhook-node.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/line/webhook-node.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 28 + } + ], + "src/line/webhook.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/line/webhook.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 23 + } + ], + "src/logging/redact.test.ts": [ + { + "type": "Base64 High Entropy String", + "filename": "src/logging/redact.test.ts", + "hashed_secret": "dd7754662b89333191ff45e8257a3e6d3fcd3990", + "is_verified": false, + "line_number": 8 + }, + { + "type": "Private Key", + "filename": "src/logging/redact.test.ts", + "hashed_secret": "1348b145fa1a555461c1b790a2f66614781091e9", + "is_verified": false, + "line_number": 73 + }, + { + "type": "Hex High Entropy String", + "filename": "src/logging/redact.test.ts", + "hashed_secret": "7992945213f7d76889fa83ff0f2be352409c837e", + "is_verified": false, + "line_number": 74 + }, + { + "type": "Base64 High Entropy String", + "filename": "src/logging/redact.test.ts", + "hashed_secret": "063995ecb4fa5afe2460397d322925cd867b7d74", + "is_verified": false, + "line_number": 88 + } + ], + "src/media-understanding/apply.e2e.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/media-understanding/apply.e2e.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 12 + } + ], + "src/media-understanding/providers/deepgram/audio.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/media-understanding/providers/deepgram/audio.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 27 + } + ], + "src/media-understanding/providers/google/video.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/media-understanding/providers/google/video.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 64 + } + ], + "src/media-understanding/providers/openai/audio.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/media-understanding/providers/openai/audio.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 22 + } + ], + "src/media-understanding/runner.auto-audio.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/media-understanding/runner.auto-audio.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 40 + } + ], + "src/media-understanding/runner.deepgram.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/media-understanding/runner.deepgram.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 44 + } + ], + "src/memory/embeddings-voyage.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/memory/embeddings-voyage.test.ts", + "hashed_secret": "7c2020578bbe5e2e3f78d7f954eb2ad8ab5b0403", + "is_verified": false, + "line_number": 33 + }, + { + "type": "Secret Keyword", + "filename": "src/memory/embeddings-voyage.test.ts", + "hashed_secret": "8afdb3da9b79c8957ae35978ea8f33fbc3bfdf60", + "is_verified": false, + "line_number": 77 + } + ], + "src/memory/embeddings.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/memory/embeddings.test.ts", + "hashed_secret": "a47110e348a3063541fb1f1f640d635d457181a0", + "is_verified": false, + "line_number": 45 + }, + { + "type": "Secret Keyword", + "filename": "src/memory/embeddings.test.ts", + "hashed_secret": "c734e47630dda71619c696d88381f06f7511bd78", + "is_verified": false, + "line_number": 160 + }, + { + "type": "Secret Keyword", + "filename": "src/memory/embeddings.test.ts", + "hashed_secret": "56e1d57b8db262b08bc73c60ed08d8c92e59503f", + "is_verified": false, + "line_number": 189 + } + ], + "src/pairing/pairing-store.ts": [ + { + "type": "Base64 High Entropy String", + "filename": "src/pairing/pairing-store.ts", + "hashed_secret": "f8c6f1ff98c5ee78c27d34a3ca68f35ad79847af", + "is_verified": false, + "line_number": 13 + } + ], + "src/pairing/setup-code.test.ts": [ + { + "type": "Base64 High Entropy String", + "filename": "src/pairing/setup-code.test.ts", + "hashed_secret": "4914c103484773b5a8e18448b11919bb349cbff8", + "is_verified": false, + "line_number": 22 + }, + { + "type": "Secret Keyword", + "filename": "src/pairing/setup-code.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 96 + } + ], + "src/security/audit.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/security/audit.test.ts", + "hashed_secret": "21f688ab56f76a99e5c6ed342291422f4e57e47f", + "is_verified": false, + "line_number": 2063 + }, + { + "type": "Secret Keyword", + "filename": "src/security/audit.test.ts", + "hashed_secret": "3dc927d80543dc0f643940b70d066bd4b4c4b78e", + "is_verified": false, + "line_number": 2094 + } + ], + "src/telegram/monitor.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/telegram/monitor.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 205 + }, + { + "type": "Secret Keyword", + "filename": "src/telegram/monitor.test.ts", + "hashed_secret": "5934c4d4a4fa5d66ddb3d3fc0bba84996c17a5b7", + "is_verified": false, + "line_number": 233 + } + ], + "src/telegram/webhook.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/telegram/webhook.test.ts", + "hashed_secret": "e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4", + "is_verified": false, + "line_number": 42 + } + ], + "src/tts/tts.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/tts/tts.test.ts", + "hashed_secret": "2e7a7ee14caebf378fc32d6cf6f557f347c96773", + "is_verified": false, + "line_number": 36 + }, + { + "type": "Hex High Entropy String", + "filename": "src/tts/tts.test.ts", + "hashed_secret": "b214f706bb602c1cc2adc5c6165e73622305f4bb", + "is_verified": false, + "line_number": 98 + }, + { + "type": "Secret Keyword", + "filename": "src/tts/tts.test.ts", + "hashed_secret": "75ddfb45216fe09680dfe70eda4f559a910c832c", + "is_verified": false, + "line_number": 397 + }, + { + "type": "Secret Keyword", + "filename": "src/tts/tts.test.ts", + "hashed_secret": "e29af93630aa18cc3457cb5b13937b7ab7c99c9b", + "is_verified": false, + "line_number": 413 + }, + { + "type": "Secret Keyword", + "filename": "src/tts/tts.test.ts", + "hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f", + "is_verified": false, + "line_number": 447 + } + ], + "src/tui/gateway-chat.test.ts": [ + { + "type": "Secret Keyword", + "filename": "src/tui/gateway-chat.test.ts", + "hashed_secret": "6255675480f681df08c1704b7b3cd2c49917f0e2", + "is_verified": false, + "line_number": 85 + } + ], + "src/web/login.test.ts": [ + { + "type": "Hex High Entropy String", + "filename": "src/web/login.test.ts", + "hashed_secret": "564666dc1ca6e7318b2d5feeb1ce7b5bf717411e", + "is_verified": false, + "line_number": 60 + } + ], + "ui/src/i18n/locales/en.ts": [ + { + "type": "Secret Keyword", + "filename": "ui/src/i18n/locales/en.ts", + "hashed_secret": "de0ff6b974d6910aca8d6b830e1b761f076d8fe6", + "is_verified": false, + "line_number": 60 + } + ], + "ui/src/i18n/locales/pt-BR.ts": [ + { + "type": "Secret Keyword", + "filename": "ui/src/i18n/locales/pt-BR.ts", + "hashed_secret": "ef7b6f95faca2d7d3a5aa5a6434c89530c6dd243", + "is_verified": false, + "line_number": 60 + } + ], + "vendor/a2ui/README.md": [ + { + "type": "Secret Keyword", + "filename": "vendor/a2ui/README.md", + "hashed_secret": "2619a5397a5d054dab3fe24e6a8da1fbd76ec3a6", + "is_verified": false, + "line_number": 123 + } + ] + }, + "generated_at": "2026-02-17T13:34:38Z" +} diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 0000000..515f25a --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1,25 @@ +# ShellCheck configuration +# https://www.shellcheck.net/wiki/ + +# Disable common false positives and style suggestions + +# SC2034: Variable appears unused (often exported or used indirectly) +disable=SC2034 + +# SC2155: Declare and assign separately (common idiom, rarely causes issues) +disable=SC2155 + +# SC2295: Expansions inside ${..} need quoting (info-level, rarely causes issues) +disable=SC2295 + +# SC1012: \r is literal (tr -d '\r' works as intended on most systems) +disable=SC1012 + +# SC2026: Word outside quotes (info-level, often intentional) +disable=SC2026 + +# SC2016: Expressions don't expand in single quotes (often intentional in sed/awk) +disable=SC2016 + +# SC2129: Consider using { cmd1; cmd2; } >> file (style preference) +disable=SC2129 diff --git a/.swiftformat b/.swiftformat new file mode 100644 index 0000000..fd8c0e6 --- /dev/null +++ b/.swiftformat @@ -0,0 +1,51 @@ +# SwiftFormat configuration adapted from Peekaboo defaults (Swift 6 friendly) + +--swiftversion 6.2 + +# Self handling +--self insert +--selfrequired + +# Imports / extensions +--importgrouping testable-bottom +--extensionacl on-declarations + +# Indentation +--indent 4 +--indentcase false +--ifdef no-indent +--xcodeindentation enabled + +# Line breaks +--linebreaks lf +--maxwidth 120 + +# Whitespace +--trimwhitespace always +--emptybraces no-space +--nospaceoperators ...,..< +--ranges no-space +--someAny true +--voidtype void + +# Wrapping +--wraparguments before-first +--wrapparameters before-first +--wrapcollections before-first +--closingparen same-line + +# Organization +--organizetypes class,struct,enum,extension +--extensionmark "MARK: - %t + %p" +--marktypes always +--markextensions always +--structthreshold 0 +--enumthreshold 0 + +# Other +--stripunusedargs closure-only +--header ignore +--allman false + +# Exclusions +--exclude .build,.swiftpm,DerivedData,node_modules,dist,coverage,xcuserdata,Peekaboo,Swabble,apps/android,apps/ios,apps/shared,apps/macos/Sources/MoltbotProtocol diff --git a/.swiftlint.yml b/.swiftlint.yml new file mode 100644 index 0000000..b562288 --- /dev/null +++ b/.swiftlint.yml @@ -0,0 +1,148 @@ +# SwiftLint configuration adapted from Peekaboo defaults (Swift 6 friendly) + +included: + - apps/macos/Sources + +excluded: + - .build + - DerivedData + - "**/.build" + - "**/.swiftpm" + - "**/DerivedData" + - "**/Generated" + - "**/Resources" + - "**/Package.swift" + - "**/Tests/Resources" + - node_modules + - dist + - coverage + - "*.playground" + # Generated (protocol-gen-swift.ts) + - apps/macos/Sources/MoltbotProtocol/GatewayModels.swift + +analyzer_rules: + - unused_declaration + - unused_import + +opt_in_rules: + - array_init + - closure_spacing + - contains_over_first_not_nil + - empty_count + - empty_string + - explicit_init + - fallthrough + - fatal_error_message + - first_where + - joined_default_parameter + - last_where + - literal_expression_end_indentation + - multiline_arguments + - multiline_parameters + - operator_usage_whitespace + - overridden_super_call + - pattern_matching_keywords + - private_outlet + - prohibited_super_call + - redundant_nil_coalescing + - sorted_first_last + - switch_case_alignment + - unneeded_parentheses_in_closure_argument + - vertical_parameter_alignment_on_call + +disabled_rules: + # SwiftFormat handles these + - trailing_whitespace + - trailing_newline + - trailing_comma + - vertical_whitespace + - indentation_width + + # Style exclusions + - explicit_self + - identifier_name + - file_header + - explicit_top_level_acl + - explicit_acl + - explicit_type_interface + - missing_docs + - required_deinit + - prefer_nimble + - quick_discouraged_call + - quick_discouraged_focused_test + - quick_discouraged_pending_test + - anonymous_argument_in_multiline_closure + - no_extension_access_modifier + - no_grouping_extension + - switch_case_on_newline + - strict_fileprivate + - extension_access_modifier + - convenience_type + - no_magic_numbers + - one_declaration_per_file + - vertical_whitespace_between_cases + - vertical_whitespace_closing_braces + - superfluous_else + - number_separator + - prefixed_toplevel_constant + - opening_brace + - trailing_closure + - contrasted_opening_brace + - sorted_imports + - redundant_type_annotation + - shorthand_optional_binding + - untyped_error_in_catch + - file_name + - todo + +force_cast: warning +force_try: warning + +type_name: + min_length: + warning: 2 + error: 1 + max_length: + warning: 60 + error: 80 + +function_body_length: + warning: 150 + error: 300 + +function_parameter_count: + warning: 7 + error: 10 + +file_length: + warning: 1500 + error: 2500 + ignore_comment_only_lines: true + +type_body_length: + warning: 800 + error: 1200 + +cyclomatic_complexity: + warning: 20 + error: 120 + +large_tuple: + warning: 4 + error: 5 + +nesting: + type_level: + warning: 4 + error: 6 + function_level: + warning: 5 + error: 7 + +line_length: + warning: 120 + error: 250 + ignores_comments: true + ignores_urls: true + +reporter: "xcode" diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..99e2f7d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["oxc.oxc-vscode"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e291954 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "editor.formatOnSave": true, + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "[javascript]": { + "editor.defaultFormatter": "oxc.oxc-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "oxc.oxc-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "oxc.oxc-vscode" + }, + "[json]": { + "editor.defaultFormatter": "oxc.oxc-vscode" + }, + "typescript.preferences.importModuleSpecifierEnding": "js", + "typescript.reportStyleChecksAsWarnings": false, + "typescript.updateImportsOnFileMove.enabled": "always", + "typescript.tsdk": "node_modules/typescript/lib", + "typescript.experimental.useTsgo": true +} diff --git a/AGENTS.md b/AGENTS.md index 4af38a3..a06863a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -42,7 +42,7 @@ Strict rules: - Simplified - Replaced - Omitted - **only if PLAN.md says so** + **only if PLAN.md says so** --- @@ -88,6 +88,67 @@ All work MUST respect these invariants: --- +## DevContainer Requirements (Mandatory) + +This repository MUST be fully developable and testable inside a **devcontainer**. + +### Source of Truth + +- `.devcontainer.json` and any referenced build files (e.g. `Dockerfile`, `docker-compose.yml`, feature configs) are considered **first-class project artifacts** +- They MUST reflect the current requirements of the active PLAN.md phase + +### Hard Rules + +All contributors (human and LLM) MUST ensure: + +- The devcontainer: + - Builds successfully from a clean state + - Starts without manual intervention + - Supports all development and validation steps required by the current phase +- All required tools, runtimes, and dependencies are: + - Installed via the devcontainer build + - Version-pinned where appropriate +- No instructions assume tools installed on the host outside the devcontainer + +### Change Discipline + +- Any change that affects: + - Tooling + - Build steps + - Runtime dependencies + - Test execution + MUST be reflected in: + - `.devcontainer.json` + - And any referenced build files +- Updating code without updating the devcontainer is considered **incomplete work** + +### Security Constraints + +- Devcontainer configuration MUST: + - Never embed secrets + - Never require secrets at build time + - Use environment variables or mounted files only +- `.env` files: + - MUST NOT be committed + - MUST NOT be auto-generated with placeholder secrets + +### Validation Gate + +A phase is NOT complete unless: + +- The project can be: + - Built + - Run + - Tested + entirely inside the devcontainer +- Devcontainer build and startup issues are treated as **blocking failures** + +LLM agents MUST assume: + +> "If it does not work in the devcontainer, it does not work at all." + +--- + ## Git & Contribution Rules These rules are **non-negotiable**. @@ -114,6 +175,7 @@ These rules are **non-negotiable**. - ❌ NEVER push any part of a locally cloned openclaw repo LLM agents MUST assume: + > "Local work only unless told otherwise." --- @@ -162,4 +224,3 @@ Violations of this document invalidate the work. ## Acknowledgement By contributing to this repository, you agree to follow **AGENTS.md** and treat **PLAN.md as law**. - diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a9aa5bd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +FROM node:22-bookworm-slim@sha256:3cfe526ec8dd62013b8843e8e5d4877e297b886e5aace4a59fec25dc20736e45 + +RUN corepack enable + +WORKDIR /app +RUN chown node:node /app + +# Copy package files +COPY --chown=node:node package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./ +COPY --chown=node:node patches ./patches +COPY --chown=node:node scripts ./scripts +# Copy extension package manifests so pnpm installs workspace dep trees correctly +COPY --chown=node:node extensions ./extensions + +# Install dependencies (extensions must exist for workspace SDK deps to be installed) +USER node +RUN pnpm install --frozen-lockfile + +# Optional: install browser dependencies for Playwright support +ARG OPENCLAW_INSTALL_BROWSER=false +USER root +RUN if [ "$OPENCLAW_INSTALL_BROWSER" = "true" ]; then \ + apt-get update && apt-get install -y --no-install-recommends xvfb && rm -rf /var/lib/apt/lists/* && \ + node /app/node_modules/playwright-core/cli.js install --with-deps chromium; \ + fi +USER node + +# Copy source code +COPY --chown=node:node . . + +# Build the application +RUN pnpm build + +ENV NODE_ENV=production + +# Run as non-root user for security +USER node + +# Start gateway server +# --allow-unconfigured: skip the gateway.mode=local config requirement (Phase 0 scaffold) +CMD ["node", "dist/index.js", "gateway", "run", "--allow-unconfigured"] + diff --git a/Dockerfile.sandbox b/Dockerfile.sandbox new file mode 100644 index 0000000..a463d4a --- /dev/null +++ b/Dockerfile.sandbox @@ -0,0 +1,20 @@ +FROM debian:bookworm-slim@sha256:98f4b71de414932439ac6ac690d7060df1f27161073c5036a7553723881bffbe + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + bash \ + ca-certificates \ + curl \ + git \ + jq \ + python3 \ + ripgrep \ + && rm -rf /var/lib/apt/lists/* + +RUN useradd --create-home --shell /bin/bash sandbox +USER sandbox +WORKDIR /home/sandbox + +CMD ["sleep", "infinity"] diff --git a/Dockerfile.sandbox-browser b/Dockerfile.sandbox-browser new file mode 100644 index 0000000..ec9faf7 --- /dev/null +++ b/Dockerfile.sandbox-browser @@ -0,0 +1,32 @@ +FROM debian:bookworm-slim@sha256:98f4b71de414932439ac6ac690d7060df1f27161073c5036a7553723881bffbe + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + bash \ + ca-certificates \ + chromium \ + curl \ + fonts-liberation \ + fonts-noto-color-emoji \ + git \ + jq \ + novnc \ + python3 \ + socat \ + websockify \ + x11vnc \ + xvfb \ + && rm -rf /var/lib/apt/lists/* + +COPY scripts/sandbox-browser-entrypoint.sh /usr/local/bin/openclaw-sandbox-browser +RUN chmod +x /usr/local/bin/openclaw-sandbox-browser + +RUN useradd --create-home --shell /bin/bash sandbox +USER sandbox +WORKDIR /home/sandbox + +EXPOSE 9222 5900 6080 + +CMD ["openclaw-sandbox-browser"] diff --git a/Dockerfile.sandbox-common b/Dockerfile.sandbox-common new file mode 100644 index 0000000..71f8007 --- /dev/null +++ b/Dockerfile.sandbox-common @@ -0,0 +1,45 @@ +ARG BASE_IMAGE=openclaw-sandbox:bookworm-slim +FROM ${BASE_IMAGE} + +USER root + +ENV DEBIAN_FRONTEND=noninteractive + +ARG PACKAGES="curl wget jq coreutils grep nodejs npm python3 git ca-certificates golang-go rustc cargo unzip pkg-config libasound2-dev build-essential file" +ARG INSTALL_PNPM=1 +ARG INSTALL_BUN=1 +ARG BUN_INSTALL_DIR=/opt/bun +ARG INSTALL_BREW=1 +ARG BREW_INSTALL_DIR=/home/linuxbrew/.linuxbrew +ARG FINAL_USER=sandbox + +ENV BUN_INSTALL=${BUN_INSTALL_DIR} +ENV HOMEBREW_PREFIX=${BREW_INSTALL_DIR} +ENV HOMEBREW_CELLAR=${BREW_INSTALL_DIR}/Cellar +ENV HOMEBREW_REPOSITORY=${BREW_INSTALL_DIR}/Homebrew +ENV PATH=${BUN_INSTALL_DIR}/bin:${BREW_INSTALL_DIR}/bin:${BREW_INSTALL_DIR}/sbin:${PATH} + +RUN apt-get update \ + && apt-get install -y --no-install-recommends ${PACKAGES} \ + && rm -rf /var/lib/apt/lists/* + +RUN if [ "${INSTALL_PNPM}" = "1" ]; then npm install -g pnpm; fi + +RUN if [ "${INSTALL_BUN}" = "1" ]; then \ + curl -fsSL https://bun.sh/install | bash; \ + ln -sf "${BUN_INSTALL_DIR}/bin/bun" /usr/local/bin/bun; \ +fi + +RUN if [ "${INSTALL_BREW}" = "1" ]; then \ + if ! id -u linuxbrew >/dev/null 2>&1; then useradd -m -s /bin/bash linuxbrew; fi; \ + mkdir -p "${BREW_INSTALL_DIR}"; \ + chown -R linuxbrew:linuxbrew "$(dirname "${BREW_INSTALL_DIR}")"; \ + su - linuxbrew -c "NONINTERACTIVE=1 CI=1 /bin/bash -c '$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)'"; \ + if [ ! -e "${BREW_INSTALL_DIR}/Library" ]; then ln -s "${BREW_INSTALL_DIR}/Homebrew/Library" "${BREW_INSTALL_DIR}/Library"; fi; \ + if [ ! -x "${BREW_INSTALL_DIR}/bin/brew" ]; then echo \"brew install failed\"; exit 1; fi; \ + ln -sf "${BREW_INSTALL_DIR}/bin/brew" /usr/local/bin/brew; \ +fi + +# Default is sandbox, but allow BASE_IMAGE overrides to select another final user. +USER ${FINAL_USER} + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f7b5266 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Peter Steinberger + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/PHASE0-STATUS.md b/PHASE0-STATUS.md new file mode 100644 index 0000000..783ba0c --- /dev/null +++ b/PHASE0-STATUS.md @@ -0,0 +1,147 @@ +# Phase 0 - Completion Status + +## Requirements from PLAN.md + +### Completed ✅ + +1. **Fork OpenClaw and remove unused components** ✅ + - Copied OpenClaw source to repository root + - Removed all mobile apps (iOS, Android, macOS) + - Removed all channel extensions except Matrix + - Removed Pi embedded runner + - Removed UI, packages, and cloud deployment configs + - Removed OpenClaw-specific files + +2. **Stub opencode-runner/index.ts** ✅ + - Created `src/agents/opencode-runner/index.ts` + - Implements `runOpencodeAgent()` returning hardcoded response + - Returns: `Hello from Cortex! I received your message: "{message}" (Phase 0 stub)` + +3. **Add Python FastEmbed service scaffold** ✅ + - Created `services/fastembed/main.py` + - Implemented health endpoints: `/`, `/health`, `/ready` + - Added `Dockerfile` for FastEmbed service + - Added `requirements.txt` (fastapi, uvicorn) + +4. **Add docker-compose.yml** ✅ + - Created `docker-compose.yml` with gateway + fastembed + - Configured cortex network + - Added environment variables and health checks + - No OpenCode service yet (as per Phase 0 spec) + +5. **Set up CI** ✅ + - Created `.github/workflows/cortex-ci.yml` + - Lint job (format check + oxlint) + - Typecheck job (build) + - Test job (unit tests) + - Docker build job (both images) + +### Completed ✅ + +1. **Fork OpenClaw and remove unused components** ✅ + - Copied OpenClaw source to repository root + - Removed all mobile apps (iOS, Android, macOS) + - Removed all channel extensions except Matrix + - Removed Pi embedded runner (replaced with stubs for TypeScript compat) + - Removed UI, packages, and cloud deployment configs + - Removed OpenClaw-specific files + +2. **Stub opencode-runner/index.ts** ✅ + - Created `src/agents/opencode-runner/index.ts` + - Implements `runOpencodeAgent()` returning hardcoded response + - Returns: `Hello from Cortex! I received your message: "{message}" (Phase 0 stub)` + - **Note**: Wiring `runOpencodeAgent()` into the auto-reply path is a Phase 1 + task. The gateway auto-reply path still calls `runEmbeddedPiAgent` which + throws "not implemented in Phase 0" — this is intentional. The hardcoded + reply exit criterion requires Phase 1 wiring. + +3. **Add Python FastEmbed service scaffold** ✅ + - Created `services/fastembed/main.py` + - Implemented health endpoints: `/`, `/health`, `/ready` + - Added `Dockerfile` for FastEmbed service (base image digest-pinned) + - Added `requirements.txt` (fastapi, uvicorn with pinned versions) + - Service runs as non-root user + +4. **Add docker-compose.yml** ✅ + - Created `docker-compose.yml` with gateway + fastembed + - Configured cortex network + - Added environment variables and health checks + - No OpenCode service yet (as per Phase 0 spec) + +5. **Set up CI** ✅ + - Created `.github/workflows/cortex-ci.yml` + - Lint job (format check + oxlint) — **passing** + - Typecheck job (build) — **passing** + - Test job (unit tests) — **passing** + - Docker build job (both images) — **passing** + +6. **Build verification** ✅ + - `pnpm build` succeeds with no TypeScript errors + - Only `extensions/matrix` and `extensions/shared` present (all others removed) + - pi-embedded-runner submodules replaced with Phase 0 stubs for type compat + +### Known Architectural Gaps (Phase 1 work) + +- **opencode-runner not wired into gateway**: `runOpencodeAgent()` exists but is + not called by the auto-reply path. Wiring is explicitly listed in PLAN.md + Phase 1 tasks. Matrix DM reply requires Phase 1 completion. +- **FastEmbed not integrated**: Health endpoints only; `/embed` and `/search` + are Phase 2 work. +- **No Ollama configuration**: LLM provider config is Phase 1 work. + +### Remaining Manual Verification + +## Exit Criteria (from PLAN.md) + +> `docker compose up` → gateway starts, Matrix connects, hardcoded reply arrives in Matrix DM + +**CI automated checks: PASSING** (lint ✅ typecheck ✅ tests ✅ docker build ✅) + +**Manual verification required** (requires credentials + homeserver): + +### What's Needed + +To complete Phase 0, the following must be verified: + +1. **Build Verification** + + ```bash + pnpm install + pnpm build + # Should succeed with no errors + ``` + +2. **Docker Compose Test** + + ```bash + docker compose build + docker compose up -d + docker compose logs -f + # Should see: + # - cortex-gateway starting + # - cortex-fastembed health endpoint responding + # - No critical errors + ``` + +3. **Matrix Integration Test** + - Configure Matrix credentials in `.env` + - Complete Phase 1 wiring of `runOpencodeAgent()` into auto-reply path + - Gateway connects to Matrix homeserver + - Send a message to the bot in a DM + - Receive hardcoded response: + `Hello from Cortex! I received your message: "{your message}" (Phase 0 stub)` + +## Next Steps + +1. **Phase 1**: Wire `runOpencodeAgent()` into `src/auto-reply/reply/agent-runner-memory.ts` +2. Configure Matrix credentials in `.env` on target server +3. Test `docker compose up` end-to-end +4. Verify Matrix connection and hardcoded response +5. Mark Phase 0 exit criterion as verified once Matrix DM reply confirmed + +## Notes + +- All code changes are committed to `phase-0-scaffold` branch +- No push to remote yet (as per AGENTS.md) +- OpenClaw reference clone in `openclaw/` is gitignored +- Project renamed to "cortex" throughout codebase diff --git a/PLAN.md b/PLAN.md index 2b2ddd5..db48bf2 100644 --- a/PLAN.md +++ b/PLAN.md @@ -16,6 +16,7 @@ two key substitutions: 2. **Channel adaptor**: Matrix is the primary (and initially only) messaging channel The platform must: + - Connect to Ollama running on a dedicated Mac Mini for all LLM inference - Run agents remotely on a K3S cluster or a Podman host - Be fully container-native (Docker, Podman, Kubernetes) @@ -33,21 +34,21 @@ make architectural choices that prevent future multi-user expansion. OpenClaw is a mature TypeScript/Node.js AI gateway with the following subsystems: -| Subsystem | OpenClaw implementation | Decision for this platform | -|---|---|---| -| Gateway server | WebSocket/HTTP RPC, Node.js | **Reuse** — fork, strip unused channels | -| Agent runner | Pi embedded runner (Mariozechner SDK) | **Replace** — OpenCode runner | -| Matrix channel | `extensions/matrix` (`@openclaw/matrix`) | **Reuse as-is** — production-ready | -| Memory files | SOUL/USER/MEMORY/AGENTS/HEARTBEAT.md | **Reuse** — identical structure | -| Memory embeddings | OpenAI / Voyage / Gemini | **Replace** — FastEmbed (local Python) | -| Heartbeat | Cron + `HEARTBEAT.md` + channel delivery | **Reuse** — adapt Matrix as only target | -| Hooks | Event-driven lifecycle hooks | **Reuse** — keep bundled hooks | -| Skills registry | Bash/Node SKILL.md + tool generation | **Adapt** — add Python skill executor | -| Config schema | Zod schema, JSON config file | **Reuse** — slim down unused fields | -| Deployment | Dockerfile + docker-compose | **Extend** — add Helm chart, Podman quadlets | -| macOS menubar app | Swift / macOS native | **Drop** — not in scope | -| Mobile apps | iOS / Android | **Drop** — Matrix is the mobile interface | -| 38 other channel extensions | Slack, Discord, Telegram, etc. | **Drop** — matrix only initially | +| Subsystem | OpenClaw implementation | Decision for this platform | +| --------------------------- | ---------------------------------------- | -------------------------------------------- | +| Gateway server | WebSocket/HTTP RPC, Node.js | **Reuse** — fork, strip unused channels | +| Agent runner | Pi embedded runner (Mariozechner SDK) | **Replace** — OpenCode runner | +| Matrix channel | `extensions/matrix` (`@openclaw/matrix`) | **Reuse as-is** — production-ready | +| Memory files | SOUL/USER/MEMORY/AGENTS/HEARTBEAT.md | **Reuse** — identical structure | +| Memory embeddings | OpenAI / Voyage / Gemini | **Replace** — FastEmbed (local Python) | +| Heartbeat | Cron + `HEARTBEAT.md` + channel delivery | **Reuse** — adapt Matrix as only target | +| Hooks | Event-driven lifecycle hooks | **Reuse** — keep bundled hooks | +| Skills registry | Bash/Node SKILL.md + tool generation | **Adapt** — add Python skill executor | +| Config schema | Zod schema, JSON config file | **Reuse** — slim down unused fields | +| Deployment | Dockerfile + docker-compose | **Extend** — add Helm chart, Podman quadlets | +| macOS menubar app | Swift / macOS native | **Drop** — not in scope | +| Mobile apps | iOS / Android | **Drop** — Matrix is the mobile interface | +| 38 other channel extensions | Slack, Discord, Telegram, etc. | **Drop** — matrix only initially | ### Reuse boundary summary @@ -189,6 +190,7 @@ regardless of which mode is used. delivers responses **Changes from OpenClaw**: + - Remove all channel adapters except Matrix and Terminal (OpenCode CLI) - Remove Pi embedded runner; add OpenCode Runner Adapter - Remove mobile app node tracking (iOS/Android) @@ -231,16 +233,16 @@ src/ export interface OpencodeRunnerConfig { mode: "server" | "ephemeral"; // Mode A - serverUrl?: string; // e.g. http://opencode-server:4096 + serverUrl?: string; // e.g. http://opencode-server:4096 // Mode B containerRuntime?: "k3s" | "podman" | "docker"; k3sNamespace?: string; - podmanSocket?: string; // unix:///run/user/1000/podman/podman.sock - agentImage?: string; // image with opencode + Python SDK + podmanSocket?: string; // unix:///run/user/1000/podman/podman.sock + agentImage?: string; // image with opencode + Python SDK // Shared - ollamaBaseUrl: string; // http://mac-mini:11434 - defaultModel: string; // e.g. qwen2.5-coder:7b - sessionStorePath: string; // path to serialised session store + ollamaBaseUrl: string; // http://mac-mini:11434 + defaultModel: string; // e.g. qwen2.5-coder:7b + sessionStorePath: string; // path to serialised session store resourceLimits?: { cpu?: string; memory?: string; @@ -249,9 +251,9 @@ export interface OpencodeRunnerConfig { } export async function runOpencodeAgent( - ctx: AgentRunContext, // message, session, memory, skills, hooks + ctx: AgentRunContext, // message, session, memory, skills, hooks config: OpencodeRunnerConfig, -): Promise; // text reply, tool calls, usage +): Promise; // text reply, tool calls, usage ``` **Session state**: Because ephemeral containers cannot maintain in-memory @@ -319,6 +321,7 @@ results, merged and re-ranked by reciprocal rank fusion (RRF). **Source**: `openclaw/extensions/matrix/` — **reused with zero modification** The `@openclaw/matrix` extension is production-ready: + - E2EE support (opt-in, `encryption: true`) - Thread-per-conversation mapping (use `threadReplies: "always"`) - Per-room config with tool policies @@ -361,6 +364,7 @@ DMs map to `sessionId = hash(roomId + userId)` for 1:1 continuity. ``` **Search modes** (via FastEmbed service): + - `vector`: semantic similarity search across all chunked memory files - `keyword`: BM25 full-text search (FTS5) for exact terms, names, dates - `hybrid`: both, merged via RRF — default for agent memory recall @@ -374,12 +378,14 @@ memories to `daily/YYYY-MM-DD.md` before compaction. **Source**: `openclaw/src/cron/` — **reused with adaptation** **Changes**: + - Delivery target hardcoded to Matrix (remove multi-channel dispatch) - Target room configurable: `heartbeat.matrixRoomId` - HEARTBEAT.md-driven checks — identical to OpenClaw behaviour - Active hours window support via `heartbeat.activeHours` **Behaviour**: + 1. Cron fires at configured interval (default: `*/30 * * * *`) 2. Ephemeral agent turn (Mode B preferred for isolation) 3. Agent reads `HEARTBEAT.md`, performs checks, reports to Matrix @@ -391,13 +397,16 @@ memories to `daily/YYYY-MM-DD.md` before compaction. # Heartbeat Tasks ## Every run + - Check Ollama is reachable at http://mac-mini:11434 - Report any models that have changed or gone missing ## Daily at 08:00 + - Summarise anything notable from yesterday's daily log ## Weekly on Monday + - Review open tasks from MEMORY.md and flag stale items ``` @@ -437,6 +446,7 @@ print(get_weather("London")) ``` **Python skills runner** (`src/agents/skills/python-runner.ts`): + - Discovers `skill.py` alongside `SKILL.md` - Generates an OpenCode tool definition wrapping the Python function - Executes skill in a subprocess with a 30s timeout @@ -444,14 +454,14 @@ print(get_weather("London")) **Bundled skills to include** (keep relevant OpenClaw skills, adapt to Python): -| Skill | Purpose | Keep? | -|---|---|---| -| `weather` | wttr.in weather query | Yes — port to Python | -| `github` | GitHub API operations | Yes — port to Python | -| `healthcheck` | Service availability checks | Yes — essential for heartbeat | -| `summarize` | Document summarisation | Yes — keep | -| `coding-agent` | Spawn sub-agent for code tasks | Yes — adapt for OpenCode | -| `obsidian` | Read/write Obsidian vault | Yes — relevant to mobile workflow | +| Skill | Purpose | Keep? | +| -------------- | ------------------------------ | --------------------------------- | +| `weather` | wttr.in weather query | Yes — port to Python | +| `github` | GitHub API operations | Yes — port to Python | +| `healthcheck` | Service availability checks | Yes — essential for heartbeat | +| `summarize` | Document summarisation | Yes — keep | +| `coding-agent` | Spawn sub-agent for code tasks | Yes — adapt for OpenCode | +| `obsidian` | Read/write Obsidian vault | Yes — relevant to mobile workflow | --- @@ -517,11 +527,11 @@ print(get_weather("London")) ### 6.1 Container Images -| Image | Base | Contents | Tag | -|---|---|---|---| -| `agentic-gateway` | `node:22-bookworm-slim` | TypeScript gateway + Matrix extension | `latest` | -| `agentic-fastembed` | `python:3.12-slim` | FastEmbed service + SQLite | `latest` | -| `agentic-agent` | `python:3.12-slim` + opencode binary | OpenCode + Python SDK + bundled skills | `latest` | +| Image | Base | Contents | Tag | +| ------------------- | ------------------------------------ | -------------------------------------- | -------- | +| `agentic-gateway` | `node:22-bookworm-slim` | TypeScript gateway + Matrix extension | `latest` | +| `agentic-fastembed` | `python:3.12-slim` | FastEmbed service + SQLite | `latest` | +| `agentic-agent` | `python:3.12-slim` + opencode binary | OpenCode + Python SDK + bundled skills | `latest` | All images published to a private container registry (Gitea, GHCR, or internal). Images are the installation artefact — no git clone required. @@ -570,11 +580,11 @@ services: image: ${REGISTRY}/agentic-gateway:${TAG:-latest} restart: unless-stopped ports: - - "127.0.0.1:18789:18789" # Tailscale-exposed, not public + - "127.0.0.1:18789:18789" # Tailscale-exposed, not public volumes: - ${AGENTIC_CONFIG_DIR:-~/.agentic}:/home/node/.agentic - ${AGENTIC_WORKSPACE_DIR:-~/.agentic/workspace}:/home/node/.agentic/workspace - - /run/podman/podman.sock:/run/podman/podman.sock:ro # for Mode B + - /run/podman/podman.sock:/run/podman/podman.sock:ro # for Mode B environment: - OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-http://mac-mini:11434} - OPENCODE_RUNNER_MODE=${OPENCODE_RUNNER_MODE:-server} @@ -606,10 +616,10 @@ services: command: ["opencode", "serve", "--port", "4096"] environment: - OPENAI_BASE_URL=${OLLAMA_BASE_URL:-http://mac-mini:11434}/v1 - - OPENAI_API_KEY=ollama # Ollama doesn't validate keys + - OPENAI_API_KEY=ollama # Ollama doesn't validate keys - OPENCODE_DEFAULT_MODEL=${OPENCODE_DEFAULT_MODEL:-qwen2.5-coder:7b} profiles: - - mode-a # Only started when using Mode A + - mode-a # Only started when using Mode A volumes: embeddings-db: @@ -649,16 +659,16 @@ deploy/helm/agentic-platform/ gateway: image: registry/agentic-gateway tag: latest - replicaCount: 1 # StatefulSet for persistent workspace + replicaCount: 1 # StatefulSet for persistent workspace workspace: storageClass: local-path size: 5Gi opencode: runner: - mode: server # "server" | "ephemeral" + mode: server # "server" | "ephemeral" server: - enabled: true # only if mode=server + enabled: true # only if mode=server image: registry/agentic-agent ollama: @@ -668,7 +678,7 @@ ollama: matrix: homeserver: https://matrix.example.com userId: "@bot:example.com" - encryption: false # enable after initial testing + encryption: false # enable after initial testing threadReplies: always heartbeat: @@ -825,13 +835,13 @@ agentic-platform/ **Goal**: Runnable skeleton with no functionality, passing CI -- [ ] Fork OpenClaw into new repository; remove all unused channel extensions, - mobile apps, macOS app, Pi runner -- [ ] Verify remaining TypeScript compiles with Matrix extension only -- [ ] Stub `opencode-runner/index.ts` returning a hardcoded response -- [ ] Add Python FastEmbed service scaffold (health endpoint only) -- [ ] Add `docker-compose.yml` (gateway + fastembed, no opencode yet) -- [ ] Set up CI (lint, typecheck, unit tests, container build) +- [x] Fork OpenClaw into new repository; remove all unused channel extensions, + mobile apps, macOS app, Pi runner +- [x] Verify remaining TypeScript compiles with Matrix extension only +- [x] Stub `opencode-runner/index.ts` returning a hardcoded response +- [x] Add Python FastEmbed service scaffold (health endpoint only) +- [x] Add `docker-compose.yml` (gateway + fastembed, no opencode yet) +- [x] Set up CI (lint, typecheck, unit tests, container build) **Exit criteria**: `docker compose up` → gateway starts, Matrix connects, hardcoded reply arrives in Matrix DM @@ -924,18 +934,18 @@ from images already pulled; same for Podman host ## 9. Key Risks & Unknowns -| Risk | Severity | Mitigation | -|---|---|---| -| **OpenCode server API stability** — opencode is actively developed; HTTP API may change between versions | High | Pin opencode version in Dockerfile; wrap all API calls in a versioned adapter layer; add integration tests | -| **OpenCode session isolation (Mode A)** — shared server may leak context between sessions if not properly isolated | High | Audit OpenCode session API for isolation guarantees; if insufficient, default to Mode B for all cases | -| **Ollama network latency** — Mac Mini is on same LAN/Tailscale; round-trips for large context are slow | Medium | Use Tailscale for sub-10ms LAN paths; configure Ollama context window and batch size for throughput; test with realistic workloads | -| **FastEmbed model quality** — bge-small-en-v1.5 is CPU-fast but lower quality than OpenAI embeddings for long-form recall | Medium | Evaluate on real memory workloads; consider bge-base if quality insufficient; hybrid search (FTS5) compensates for semantic misses | -| **OpenClaw fork divergence** — upstream openclaw may fix bugs or add features we need | Low | Keep Matrix extension as vendored copy; track upstream releases; document what was changed vs original | -| **Matrix thread mapping correctness** — wrong sessionId → conversation cross-contamination | High | Unit-test thread root ID resolution; add sessionId to every log line; expose session debug info via heartbeat skill | -| **Mode B cold start latency** — container pull + start may take 2-10s per interactive message | Medium | Pre-pull images on host; use Mode A for interactive, Mode B for background only; cache agent image locally | -| **K3S RBAC for job spawning** — gateway needs permission to create Jobs | Low | Define minimal Role in Helm chart; document required permissions | -| **Python skill subprocess escaping** — untrusted input in skill args could be dangerous | Medium | Always pass args as JSON via stdin, not shell arguments; skills run as non-root; add sandbox mode for untrusted skills | -| **Encryption key management for Matrix E2EE** — crypto store tied to device identity | Medium | Store crypto DB on persistent volume; document key backup procedure; start with `encryption: false` and enable deliberately | +| Risk | Severity | Mitigation | +| ------------------------------------------------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| **OpenCode server API stability** — opencode is actively developed; HTTP API may change between versions | High | Pin opencode version in Dockerfile; wrap all API calls in a versioned adapter layer; add integration tests | +| **OpenCode session isolation (Mode A)** — shared server may leak context between sessions if not properly isolated | High | Audit OpenCode session API for isolation guarantees; if insufficient, default to Mode B for all cases | +| **Ollama network latency** — Mac Mini is on same LAN/Tailscale; round-trips for large context are slow | Medium | Use Tailscale for sub-10ms LAN paths; configure Ollama context window and batch size for throughput; test with realistic workloads | +| **FastEmbed model quality** — bge-small-en-v1.5 is CPU-fast but lower quality than OpenAI embeddings for long-form recall | Medium | Evaluate on real memory workloads; consider bge-base if quality insufficient; hybrid search (FTS5) compensates for semantic misses | +| **OpenClaw fork divergence** — upstream openclaw may fix bugs or add features we need | Low | Keep Matrix extension as vendored copy; track upstream releases; document what was changed vs original | +| **Matrix thread mapping correctness** — wrong sessionId → conversation cross-contamination | High | Unit-test thread root ID resolution; add sessionId to every log line; expose session debug info via heartbeat skill | +| **Mode B cold start latency** — container pull + start may take 2-10s per interactive message | Medium | Pre-pull images on host; use Mode A for interactive, Mode B for background only; cache agent image locally | +| **K3S RBAC for job spawning** — gateway needs permission to create Jobs | Low | Define minimal Role in Helm chart; document required permissions | +| **Python skill subprocess escaping** — untrusted input in skill args could be dangerous | Medium | Always pass args as JSON via stdin, not shell arguments; skills run as non-root; add sandbox mode for untrusted skills | +| **Encryption key management for Matrix E2EE** — crypto store tied to device identity | Medium | Store crypto DB on persistent volume; document key backup procedure; start with `encryption: false` and enable deliberately | --- @@ -958,17 +968,17 @@ without explicit re-scoping: ## 11. Naming Conventions -| Concept | Convention | -|---|---| -| Config directory | `~/.agentic/` | -| Workspace directory | `~/.agentic/workspace/` | -| Session store | `~/.agentic/workspace/agents//` | -| Session ID format | `sha256(roomId + ":" + threadRootId)[0:16]` | -| Container network | `agentic` | -| Helm release name | `agentic-platform` | -| Kubernetes namespace | `agentic-platform` | -| Image prefix | `registry/agentic-` | -| Env var prefix | `AGENTIC_` | +| Concept | Convention | +| -------------------- | ------------------------------------------- | +| Config directory | `~/.agentic/` | +| Workspace directory | `~/.agentic/workspace/` | +| Session store | `~/.agentic/workspace/agents//` | +| Session ID format | `sha256(roomId + ":" + threadRootId)[0:16]` | +| Container network | `agentic` | +| Helm release name | `agentic-platform` | +| Kubernetes namespace | `agentic-platform` | +| Image prefix | `registry/agentic-` | +| Env var prefix | `AGENTIC_` | --- @@ -990,4 +1000,4 @@ re-introduce them unless explicitly planned: --- -*End of PLAN.md* +_End of PLAN.md_ diff --git a/README.md b/README.md new file mode 100644 index 0000000..ad00643 --- /dev/null +++ b/README.md @@ -0,0 +1,121 @@ +# Cortex + +Personal AI assistant platform with Matrix integration and Ollama backend. + +## Overview + +Cortex is a variant of [OpenClaw](https://github.com/openclaw/openclaw) designed for personal use with the following key features: + +- **Matrix Integration**: Primary messaging channel for user interaction +- **Ollama Backend**: All LLM inference runs locally on a dedicated Mac Mini +- **OpenCode Agent Runner**: Remote agent execution via OpenCode +- **Local-First**: Privacy-focused, runs entirely on your infrastructure +- **Container-Native**: Docker/Podman/Kubernetes deployment + +## Architecture + +``` +Matrix Client ←→ Cortex Gateway ←→ OpenCode ←→ Ollama (Mac Mini) + ↓ + FastEmbed (Python) +``` + +## Current Status: Phase 0 - Scaffold + +**Phase 0 Goal**: Runnable skeleton with no functionality, passing CI + +### Completed + +- ✅ Copied OpenClaw source and removed unused components +- ✅ Created `opencode-runner` stub (hardcoded responses) +- ✅ Added Python FastEmbed service scaffold (health endpoint only) +- ✅ Created `docker-compose.yml` for gateway + fastembed +- ✅ Set up CI (lint, typecheck, unit tests, container build) + +### TODO + +- [ ] Verify TypeScript compiles with Matrix extension only +- [ ] Test `docker compose up` → gateway starts +- [ ] Verify Matrix connects +- [ ] Confirm hardcoded reply arrives in Matrix DM + +## Quick Start (Phase 0) + +**Not yet functional** - This is a Phase 0 scaffold. + +```bash +# Copy and configure environment +cp .env.example .env +# Edit .env with your configuration + +# Start services +docker compose up -d + +# Check logs +docker compose logs -f +``` + +## Development + +### Prerequisites + +- Node.js 22+ +- pnpm (via corepack) +- Python 3.12+ (for FastEmbed service) +- Docker or Podman + +### Commands + +```bash +# Install dependencies +pnpm install + +# Build +pnpm build + +# Lint and format +pnpm check + +# Run tests +pnpm test + +# Development mode +pnpm dev +``` + +## Project Structure + +``` +cortex/ + src/ # TypeScript source (Gateway) + ├── agents/ + │ └── opencode-runner/ # OpenCode integration (stub) + ├── gateway/ # Gateway server + └── ... + extensions/ + └── matrix/ # Matrix channel adapter + services/ + └── fastembed/ # Python FastEmbed service + docker-compose.yml # Compose stack + Dockerfile # Gateway container +``` + +## Roadmap + +- **Phase 0** (Current): Project scaffold +- **Phase 1**: OpenCode Server integration (Mode A) +- **Phase 2**: Memory system with FastEmbed +- **Phase 3**: Heartbeat system +- **Phase 4**: Ephemeral agent mode (Mode B) +- **Phase 5**: Python skills runtime +- **Phase 6**: Deployment hardening + +See [PLAN.md](PLAN.md) for detailed implementation plan. + +## License + +MIT + +## Acknowledgments + +Based on [OpenClaw](https://github.com/openclaw/openclaw) - A multi-channel AI gateway platform. diff --git a/README.openclaw.md b/README.openclaw.md new file mode 100644 index 0000000..72f3624 --- /dev/null +++ b/README.openclaw.md @@ -0,0 +1,580 @@ +# 🦞 OpenClaw — Personal AI Assistant + +

+ + + OpenClaw + +

+ +

+ EXFOLIATE! EXFOLIATE! +

+ +

+ CI status + GitHub release + Discord + MIT License +

+ +**OpenClaw** is a _personal AI assistant_ you run on your own devices. +It answers you on the channels you already use (WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, iMessage, Microsoft Teams, WebChat), plus extension channels like BlueBubbles, Matrix, Zalo, and Zalo Personal. It can speak and listen on macOS/iOS/Android, and can render a live Canvas you control. The Gateway is just the control plane — the product is the assistant. + +If you want a personal, single-user assistant that feels local, fast, and always-on, this is it. + +[Website](https://openclaw.ai) · [Docs](https://docs.openclaw.ai) · [Vision](VISION.md) · [DeepWiki](https://deepwiki.com/openclaw/openclaw) · [Getting Started](https://docs.openclaw.ai/start/getting-started) · [Updating](https://docs.openclaw.ai/install/updating) · [Showcase](https://docs.openclaw.ai/start/showcase) · [FAQ](https://docs.openclaw.ai/start/faq) · [Wizard](https://docs.openclaw.ai/start/wizard) · [Nix](https://github.com/openclaw/nix-openclaw) · [Docker](https://docs.openclaw.ai/install/docker) · [Discord](https://discord.gg/clawd) + +Preferred setup: run the onboarding wizard (`openclaw onboard`) in your terminal. +The wizard guides you step by step through setting up the gateway, workspace, channels, and skills. The CLI wizard is the recommended path and works on **macOS, Linux, and Windows (via WSL2; strongly recommended)**. +Works with npm, pnpm, or bun. +New install? Start here: [Getting started](https://docs.openclaw.ai/start/getting-started) + +## Sponsors + +| OpenAI | Blacksmith | +| ----------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| [![OpenAI](docs/assets/sponsors/openai.svg)](https://openai.com/) | [![Blacksmith](docs/assets/sponsors/blacksmith.svg)](https://blacksmith.sh/) | + +**Subscriptions (OAuth):** + +- **[Anthropic](https://www.anthropic.com/)** (Claude Pro/Max) +- **[OpenAI](https://openai.com/)** (ChatGPT/Codex) + +Model note: while any model is supported, I strongly recommend **Anthropic Pro/Max (100/200) + Opus 4.6** for long‑context strength and better prompt‑injection resistance. See [Onboarding](https://docs.openclaw.ai/start/onboarding). + +## Models (selection + auth) + +- Models config + CLI: [Models](https://docs.openclaw.ai/concepts/models) +- Auth profile rotation (OAuth vs API keys) + fallbacks: [Model failover](https://docs.openclaw.ai/concepts/model-failover) + +## Install (recommended) + +Runtime: **Node ≥22**. + +```bash +npm install -g openclaw@latest +# or: pnpm add -g openclaw@latest + +openclaw onboard --install-daemon +``` + +The wizard installs the Gateway daemon (launchd/systemd user service) so it stays running. + +## Quick start (TL;DR) + +Runtime: **Node ≥22**. + +Full beginner guide (auth, pairing, channels): [Getting started](https://docs.openclaw.ai/start/getting-started) + +```bash +openclaw onboard --install-daemon + +openclaw gateway --port 18789 --verbose + +# Send a message +openclaw message send --to +1234567890 --message "Hello from OpenClaw" + +# Talk to the assistant (optionally deliver back to any connected channel: WhatsApp/Telegram/Slack/Discord/Google Chat/Signal/iMessage/BlueBubbles/Microsoft Teams/Matrix/Zalo/Zalo Personal/WebChat) +openclaw agent --message "Ship checklist" --thinking high +``` + +Upgrading? [Updating guide](https://docs.openclaw.ai/install/updating) (and run `openclaw doctor`). + +## Development channels + +- **stable**: tagged releases (`vYYYY.M.D` or `vYYYY.M.D-`), npm dist-tag `latest`. +- **beta**: prerelease tags (`vYYYY.M.D-beta.N`), npm dist-tag `beta` (macOS app may be missing). +- **dev**: moving head of `main`, npm dist-tag `dev` (when published). + +Switch channels (git + npm): `openclaw update --channel stable|beta|dev`. +Details: [Development channels](https://docs.openclaw.ai/install/development-channels). + +## From source (development) + +Prefer `pnpm` for builds from source. Bun is optional for running TypeScript directly. + +```bash +git clone https://github.com/openclaw/openclaw.git +cd openclaw + +pnpm install +pnpm ui:build # auto-installs UI deps on first run +pnpm build + +pnpm openclaw onboard --install-daemon + +# Dev loop (auto-reload on TS changes) +pnpm gateway:watch +``` + +Note: `pnpm openclaw ...` runs TypeScript directly (via `tsx`). `pnpm build` produces `dist/` for running via Node / the packaged `openclaw` binary. + +## Security defaults (DM access) + +OpenClaw connects to real messaging surfaces. Treat inbound DMs as **untrusted input**. + +Full security guide: [Security](https://docs.openclaw.ai/gateway/security) + +Default behavior on Telegram/WhatsApp/Signal/iMessage/Microsoft Teams/Discord/Google Chat/Slack: + +- **DM pairing** (`dmPolicy="pairing"` / `channels.discord.dmPolicy="pairing"` / `channels.slack.dmPolicy="pairing"`; legacy: `channels.discord.dm.policy`, `channels.slack.dm.policy`): unknown senders receive a short pairing code and the bot does not process their message. +- Approve with: `openclaw pairing approve ` (then the sender is added to a local allowlist store). +- Public inbound DMs require an explicit opt-in: set `dmPolicy="open"` and include `"*"` in the channel allowlist (`allowFrom` / `channels.discord.allowFrom` / `channels.slack.allowFrom`; legacy: `channels.discord.dm.allowFrom`, `channels.slack.dm.allowFrom`). + +Run `openclaw doctor` to surface risky/misconfigured DM policies. + +## Highlights + +- **[Local-first Gateway](https://docs.openclaw.ai/gateway)** — single control plane for sessions, channels, tools, and events. +- **[Multi-channel inbox](https://docs.openclaw.ai/channels)** — WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, BlueBubbles (iMessage), iMessage (legacy), Microsoft Teams, Matrix, Zalo, Zalo Personal, WebChat, macOS, iOS/Android. +- **[Multi-agent routing](https://docs.openclaw.ai/gateway/configuration)** — route inbound channels/accounts/peers to isolated agents (workspaces + per-agent sessions). +- **[Voice Wake](https://docs.openclaw.ai/nodes/voicewake) + [Talk Mode](https://docs.openclaw.ai/nodes/talk)** — always-on speech for macOS/iOS/Android with ElevenLabs. +- **[Live Canvas](https://docs.openclaw.ai/platforms/mac/canvas)** — agent-driven visual workspace with [A2UI](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui). +- **[First-class tools](https://docs.openclaw.ai/tools)** — browser, canvas, nodes, cron, sessions, and Discord/Slack actions. +- **[Companion apps](https://docs.openclaw.ai/platforms/macos)** — macOS menu bar app + iOS/Android [nodes](https://docs.openclaw.ai/nodes). +- **[Onboarding](https://docs.openclaw.ai/start/wizard) + [skills](https://docs.openclaw.ai/tools/skills)** — wizard-driven setup with bundled/managed/workspace skills. + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=openclaw/openclaw&type=date&legend=top-left)](https://www.star-history.com/#openclaw/openclaw&type=date&legend=top-left) + +## Everything we built so far + +### Core platform + +- [Gateway WS control plane](https://docs.openclaw.ai/gateway) with sessions, presence, config, cron, webhooks, [Control UI](https://docs.openclaw.ai/web), and [Canvas host](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui). +- [CLI surface](https://docs.openclaw.ai/tools/agent-send): gateway, agent, send, [wizard](https://docs.openclaw.ai/start/wizard), and [doctor](https://docs.openclaw.ai/gateway/doctor). +- [Pi agent runtime](https://docs.openclaw.ai/concepts/agent) in RPC mode with tool streaming and block streaming. +- [Session model](https://docs.openclaw.ai/concepts/session): `main` for direct chats, group isolation, activation modes, queue modes, reply-back. Group rules: [Groups](https://docs.openclaw.ai/concepts/groups). +- [Media pipeline](https://docs.openclaw.ai/nodes/images): images/audio/video, transcription hooks, size caps, temp file lifecycle. Audio details: [Audio](https://docs.openclaw.ai/nodes/audio). + +### Channels + +- [Channels](https://docs.openclaw.ai/channels): [WhatsApp](https://docs.openclaw.ai/channels/whatsapp) (Baileys), [Telegram](https://docs.openclaw.ai/channels/telegram) (grammY), [Slack](https://docs.openclaw.ai/channels/slack) (Bolt), [Discord](https://docs.openclaw.ai/channels/discord) (discord.js), [Google Chat](https://docs.openclaw.ai/channels/googlechat) (Chat API), [Signal](https://docs.openclaw.ai/channels/signal) (signal-cli), [BlueBubbles](https://docs.openclaw.ai/channels/bluebubbles) (iMessage, recommended), [iMessage](https://docs.openclaw.ai/channels/imessage) (legacy imsg), [Microsoft Teams](https://docs.openclaw.ai/channels/msteams) (extension), [Matrix](https://docs.openclaw.ai/channels/matrix) (extension), [Zalo](https://docs.openclaw.ai/channels/zalo) (extension), [Zalo Personal](https://docs.openclaw.ai/channels/zalouser) (extension), [WebChat](https://docs.openclaw.ai/web/webchat). +- [Group routing](https://docs.openclaw.ai/concepts/group-messages): mention gating, reply tags, per-channel chunking and routing. Channel rules: [Channels](https://docs.openclaw.ai/channels). + +### Apps + nodes + +- [macOS app](https://docs.openclaw.ai/platforms/macos): menu bar control plane, [Voice Wake](https://docs.openclaw.ai/nodes/voicewake)/PTT, [Talk Mode](https://docs.openclaw.ai/nodes/talk) overlay, [WebChat](https://docs.openclaw.ai/web/webchat), debug tools, [remote gateway](https://docs.openclaw.ai/gateway/remote) control. +- [iOS node](https://docs.openclaw.ai/platforms/ios): [Canvas](https://docs.openclaw.ai/platforms/mac/canvas), [Voice Wake](https://docs.openclaw.ai/nodes/voicewake), [Talk Mode](https://docs.openclaw.ai/nodes/talk), camera, screen recording, Bonjour pairing. +- [Android node](https://docs.openclaw.ai/platforms/android): [Canvas](https://docs.openclaw.ai/platforms/mac/canvas), [Talk Mode](https://docs.openclaw.ai/nodes/talk), camera, screen recording, optional SMS. +- [macOS node mode](https://docs.openclaw.ai/nodes): system.run/notify + canvas/camera exposure. + +### Tools + automation + +- [Browser control](https://docs.openclaw.ai/tools/browser): dedicated openclaw Chrome/Chromium, snapshots, actions, uploads, profiles. +- [Canvas](https://docs.openclaw.ai/platforms/mac/canvas): [A2UI](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui) push/reset, eval, snapshot. +- [Nodes](https://docs.openclaw.ai/nodes): camera snap/clip, screen record, [location.get](https://docs.openclaw.ai/nodes/location-command), notifications. +- [Cron + wakeups](https://docs.openclaw.ai/automation/cron-jobs); [webhooks](https://docs.openclaw.ai/automation/webhook); [Gmail Pub/Sub](https://docs.openclaw.ai/automation/gmail-pubsub). +- [Skills platform](https://docs.openclaw.ai/tools/skills): bundled, managed, and workspace skills with install gating + UI. + +### Runtime + safety + +- [Channel routing](https://docs.openclaw.ai/concepts/channel-routing), [retry policy](https://docs.openclaw.ai/concepts/retry), and [streaming/chunking](https://docs.openclaw.ai/concepts/streaming). +- [Presence](https://docs.openclaw.ai/concepts/presence), [typing indicators](https://docs.openclaw.ai/concepts/typing-indicators), and [usage tracking](https://docs.openclaw.ai/concepts/usage-tracking). +- [Models](https://docs.openclaw.ai/concepts/models), [model failover](https://docs.openclaw.ai/concepts/model-failover), and [session pruning](https://docs.openclaw.ai/concepts/session-pruning). +- [Security](https://docs.openclaw.ai/gateway/security) and [troubleshooting](https://docs.openclaw.ai/channels/troubleshooting). + +### Ops + packaging + +- [Control UI](https://docs.openclaw.ai/web) + [WebChat](https://docs.openclaw.ai/web/webchat) served directly from the Gateway. +- [Tailscale Serve/Funnel](https://docs.openclaw.ai/gateway/tailscale) or [SSH tunnels](https://docs.openclaw.ai/gateway/remote) with token/password auth. +- [Nix mode](https://docs.openclaw.ai/install/nix) for declarative config; [Docker](https://docs.openclaw.ai/install/docker)-based installs. +- [Doctor](https://docs.openclaw.ai/gateway/doctor) migrations, [logging](https://docs.openclaw.ai/logging). + +## How it works (short) + +``` +WhatsApp / Telegram / Slack / Discord / Google Chat / Signal / iMessage / BlueBubbles / Microsoft Teams / Matrix / Zalo / Zalo Personal / WebChat + │ + ▼ +┌───────────────────────────────┐ +│ Gateway │ +│ (control plane) │ +│ ws://127.0.0.1:18789 │ +└──────────────┬────────────────┘ + │ + ├─ Pi agent (RPC) + ├─ CLI (openclaw …) + ├─ WebChat UI + ├─ macOS app + └─ iOS / Android nodes +``` + +## Key subsystems + +- **[Gateway WebSocket network](https://docs.openclaw.ai/concepts/architecture)** — single WS control plane for clients, tools, and events (plus ops: [Gateway runbook](https://docs.openclaw.ai/gateway)). +- **[Tailscale exposure](https://docs.openclaw.ai/gateway/tailscale)** — Serve/Funnel for the Gateway dashboard + WS (remote access: [Remote](https://docs.openclaw.ai/gateway/remote)). +- **[Browser control](https://docs.openclaw.ai/tools/browser)** — openclaw‑managed Chrome/Chromium with CDP control. +- **[Canvas + A2UI](https://docs.openclaw.ai/platforms/mac/canvas)** — agent‑driven visual workspace (A2UI host: [Canvas/A2UI](https://docs.openclaw.ai/platforms/mac/canvas#canvas-a2ui)). +- **[Voice Wake](https://docs.openclaw.ai/nodes/voicewake) + [Talk Mode](https://docs.openclaw.ai/nodes/talk)** — always‑on speech and continuous conversation. +- **[Nodes](https://docs.openclaw.ai/nodes)** — Canvas, camera snap/clip, screen record, `location.get`, notifications, plus macOS‑only `system.run`/`system.notify`. + +## Tailscale access (Gateway dashboard) + +OpenClaw can auto-configure Tailscale **Serve** (tailnet-only) or **Funnel** (public) while the Gateway stays bound to loopback. Configure `gateway.tailscale.mode`: + +- `off`: no Tailscale automation (default). +- `serve`: tailnet-only HTTPS via `tailscale serve` (uses Tailscale identity headers by default). +- `funnel`: public HTTPS via `tailscale funnel` (requires shared password auth). + +Notes: + +- `gateway.bind` must stay `loopback` when Serve/Funnel is enabled (OpenClaw enforces this). +- Serve can be forced to require a password by setting `gateway.auth.mode: "password"` or `gateway.auth.allowTailscale: false`. +- Funnel refuses to start unless `gateway.auth.mode: "password"` is set. +- Optional: `gateway.tailscale.resetOnExit` to undo Serve/Funnel on shutdown. + +Details: [Tailscale guide](https://docs.openclaw.ai/gateway/tailscale) · [Web surfaces](https://docs.openclaw.ai/web) + +## Remote Gateway (Linux is great) + +It’s perfectly fine to run the Gateway on a small Linux instance. Clients (macOS app, CLI, WebChat) can connect over **Tailscale Serve/Funnel** or **SSH tunnels**, and you can still pair device nodes (macOS/iOS/Android) to execute device‑local actions when needed. + +- **Gateway host** runs the exec tool and channel connections by default. +- **Device nodes** run device‑local actions (`system.run`, camera, screen recording, notifications) via `node.invoke`. + In short: exec runs where the Gateway lives; device actions run where the device lives. + +Details: [Remote access](https://docs.openclaw.ai/gateway/remote) · [Nodes](https://docs.openclaw.ai/nodes) · [Security](https://docs.openclaw.ai/gateway/security) + +## macOS permissions via the Gateway protocol + +The macOS app can run in **node mode** and advertises its capabilities + permission map over the Gateway WebSocket (`node.list` / `node.describe`). Clients can then execute local actions via `node.invoke`: + +- `system.run` runs a local command and returns stdout/stderr/exit code; set `needsScreenRecording: true` to require screen-recording permission (otherwise you’ll get `PERMISSION_MISSING`). +- `system.notify` posts a user notification and fails if notifications are denied. +- `canvas.*`, `camera.*`, `screen.record`, and `location.get` are also routed via `node.invoke` and follow TCC permission status. + +Elevated bash (host permissions) is separate from macOS TCC: + +- Use `/elevated on|off` to toggle per‑session elevated access when enabled + allowlisted. +- Gateway persists the per‑session toggle via `sessions.patch` (WS method) alongside `thinkingLevel`, `verboseLevel`, `model`, `sendPolicy`, and `groupActivation`. + +Details: [Nodes](https://docs.openclaw.ai/nodes) · [macOS app](https://docs.openclaw.ai/platforms/macos) · [Gateway protocol](https://docs.openclaw.ai/concepts/architecture) + +## Agent to Agent (sessions\_\* tools) + +- Use these to coordinate work across sessions without jumping between chat surfaces. +- `sessions_list` — discover active sessions (agents) and their metadata. +- `sessions_history` — fetch transcript logs for a session. +- `sessions_send` — message another session; optional reply‑back ping‑pong + announce step (`REPLY_SKIP`, `ANNOUNCE_SKIP`). + +Details: [Session tools](https://docs.openclaw.ai/concepts/session-tool) + +## Skills registry (ClawHub) + +ClawHub is a minimal skill registry. With ClawHub enabled, the agent can search for skills automatically and pull in new ones as needed. + +[ClawHub](https://clawhub.com) + +## Chat commands + +Send these in WhatsApp/Telegram/Slack/Google Chat/Microsoft Teams/WebChat (group commands are owner-only): + +- `/status` — compact session status (model + tokens, cost when available) +- `/new` or `/reset` — reset the session +- `/compact` — compact session context (summary) +- `/think ` — off|minimal|low|medium|high|xhigh (GPT-5.2 + Codex models only) +- `/verbose on|off` +- `/usage off|tokens|full` — per-response usage footer +- `/restart` — restart the gateway (owner-only in groups) +- `/activation mention|always` — group activation toggle (groups only) + +## Apps (optional) + +The Gateway alone delivers a great experience. All apps are optional and add extra features. + +If you plan to build/run companion apps, follow the platform runbooks below. + +### macOS (OpenClaw.app) (optional) + +- Menu bar control for the Gateway and health. +- Voice Wake + push-to-talk overlay. +- WebChat + debug tools. +- Remote gateway control over SSH. + +Note: signed builds required for macOS permissions to stick across rebuilds (see `docs/mac/permissions.md`). + +### iOS node (optional) + +- Pairs as a node via the Bridge. +- Voice trigger forwarding + Canvas surface. +- Controlled via `openclaw nodes …`. + +Runbook: [iOS connect](https://docs.openclaw.ai/platforms/ios). + +### Android node (optional) + +- Pairs via the same Bridge + pairing flow as iOS. +- Exposes Canvas, Camera, and Screen capture commands. +- Runbook: [Android connect](https://docs.openclaw.ai/platforms/android). + +## Agent workspace + skills + +- Workspace root: `~/.openclaw/workspace` (configurable via `agents.defaults.workspace`). +- Injected prompt files: `AGENTS.md`, `SOUL.md`, `TOOLS.md`. +- Skills: `~/.openclaw/workspace/skills//SKILL.md`. + +## Configuration + +Minimal `~/.openclaw/openclaw.json` (model + defaults): + +```json5 +{ + agent: { + model: "anthropic/claude-opus-4-6", + }, +} +``` + +[Full configuration reference (all keys + examples).](https://docs.openclaw.ai/gateway/configuration) + +## Security model (important) + +- **Default:** tools run on the host for the **main** session, so the agent has full access when it’s just you. +- **Group/channel safety:** set `agents.defaults.sandbox.mode: "non-main"` to run **non‑main sessions** (groups/channels) inside per‑session Docker sandboxes; bash then runs in Docker for those sessions. +- **Sandbox defaults:** allowlist `bash`, `process`, `read`, `write`, `edit`, `sessions_list`, `sessions_history`, `sessions_send`, `sessions_spawn`; denylist `browser`, `canvas`, `nodes`, `cron`, `discord`, `gateway`. + +Details: [Security guide](https://docs.openclaw.ai/gateway/security) · [Docker + sandboxing](https://docs.openclaw.ai/install/docker) · [Sandbox config](https://docs.openclaw.ai/gateway/configuration) + +### [WhatsApp](https://docs.openclaw.ai/channels/whatsapp) + +- Link the device: `pnpm openclaw channels login` (stores creds in `~/.openclaw/credentials`). +- Allowlist who can talk to the assistant via `channels.whatsapp.allowFrom`. +- If `channels.whatsapp.groups` is set, it becomes a group allowlist; include `"*"` to allow all. + +### [Telegram](https://docs.openclaw.ai/channels/telegram) + +- Set `TELEGRAM_BOT_TOKEN` or `channels.telegram.botToken` (env wins). +- Optional: set `channels.telegram.groups` (with `channels.telegram.groups."*".requireMention`); when set, it is a group allowlist (include `"*"` to allow all). Also `channels.telegram.allowFrom` or `channels.telegram.webhookUrl` + `channels.telegram.webhookSecret` as needed. + +```json5 +{ + channels: { + telegram: { + botToken: "123456:ABCDEF", + }, + }, +} +``` + +### [Slack](https://docs.openclaw.ai/channels/slack) + +- Set `SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN` (or `channels.slack.botToken` + `channels.slack.appToken`). + +### [Discord](https://docs.openclaw.ai/channels/discord) + +- Set `DISCORD_BOT_TOKEN` or `channels.discord.token` (env wins). +- Optional: set `commands.native`, `commands.text`, or `commands.useAccessGroups`, plus `channels.discord.allowFrom`, `channels.discord.guilds`, or `channels.discord.mediaMaxMb` as needed. + +```json5 +{ + channels: { + discord: { + token: "1234abcd", + }, + }, +} +``` + +### [Signal](https://docs.openclaw.ai/channels/signal) + +- Requires `signal-cli` and a `channels.signal` config section. + +### [BlueBubbles (iMessage)](https://docs.openclaw.ai/channels/bluebubbles) + +- **Recommended** iMessage integration. +- Configure `channels.bluebubbles.serverUrl` + `channels.bluebubbles.password` and a webhook (`channels.bluebubbles.webhookPath`). +- The BlueBubbles server runs on macOS; the Gateway can run on macOS or elsewhere. + +### [iMessage (legacy)](https://docs.openclaw.ai/channels/imessage) + +- Legacy macOS-only integration via `imsg` (Messages must be signed in). +- If `channels.imessage.groups` is set, it becomes a group allowlist; include `"*"` to allow all. + +### [Microsoft Teams](https://docs.openclaw.ai/channels/msteams) + +- Configure a Teams app + Bot Framework, then add a `msteams` config section. +- Allowlist who can talk via `msteams.allowFrom`; group access via `msteams.groupAllowFrom` or `msteams.groupPolicy: "open"`. + +### [WebChat](https://docs.openclaw.ai/web/webchat) + +- Uses the Gateway WebSocket; no separate WebChat port/config. + +Browser control (optional): + +```json5 +{ + browser: { + enabled: true, + color: "#FF4500", + }, +} +``` + +## Docs + +Use these when you’re past the onboarding flow and want the deeper reference. + +- [Start with the docs index for navigation and “what’s where.”](https://docs.openclaw.ai) +- [Read the architecture overview for the gateway + protocol model.](https://docs.openclaw.ai/concepts/architecture) +- [Use the full configuration reference when you need every key and example.](https://docs.openclaw.ai/gateway/configuration) +- [Run the Gateway by the book with the operational runbook.](https://docs.openclaw.ai/gateway) +- [Learn how the Control UI/Web surfaces work and how to expose them safely.](https://docs.openclaw.ai/web) +- [Understand remote access over SSH tunnels or tailnets.](https://docs.openclaw.ai/gateway/remote) +- [Follow the onboarding wizard flow for a guided setup.](https://docs.openclaw.ai/start/wizard) +- [Wire external triggers via the webhook surface.](https://docs.openclaw.ai/automation/webhook) +- [Set up Gmail Pub/Sub triggers.](https://docs.openclaw.ai/automation/gmail-pubsub) +- [Learn the macOS menu bar companion details.](https://docs.openclaw.ai/platforms/mac/menu-bar) +- [Platform guides: Windows (WSL2)](https://docs.openclaw.ai/platforms/windows), [Linux](https://docs.openclaw.ai/platforms/linux), [macOS](https://docs.openclaw.ai/platforms/macos), [iOS](https://docs.openclaw.ai/platforms/ios), [Android](https://docs.openclaw.ai/platforms/android) +- [Debug common failures with the troubleshooting guide.](https://docs.openclaw.ai/channels/troubleshooting) +- [Review security guidance before exposing anything.](https://docs.openclaw.ai/gateway/security) + +## Advanced docs (discovery + control) + +- [Discovery + transports](https://docs.openclaw.ai/gateway/discovery) +- [Bonjour/mDNS](https://docs.openclaw.ai/gateway/bonjour) +- [Gateway pairing](https://docs.openclaw.ai/gateway/pairing) +- [Remote gateway README](https://docs.openclaw.ai/gateway/remote-gateway-readme) +- [Control UI](https://docs.openclaw.ai/web/control-ui) +- [Dashboard](https://docs.openclaw.ai/web/dashboard) + +## Operations & troubleshooting + +- [Health checks](https://docs.openclaw.ai/gateway/health) +- [Gateway lock](https://docs.openclaw.ai/gateway/gateway-lock) +- [Background process](https://docs.openclaw.ai/gateway/background-process) +- [Browser troubleshooting (Linux)](https://docs.openclaw.ai/tools/browser-linux-troubleshooting) +- [Logging](https://docs.openclaw.ai/logging) + +## Deep dives + +- [Agent loop](https://docs.openclaw.ai/concepts/agent-loop) +- [Presence](https://docs.openclaw.ai/concepts/presence) +- [TypeBox schemas](https://docs.openclaw.ai/concepts/typebox) +- [RPC adapters](https://docs.openclaw.ai/reference/rpc) +- [Queue](https://docs.openclaw.ai/concepts/queue) + +## Workspace & skills + +- [Skills config](https://docs.openclaw.ai/tools/skills-config) +- [Default AGENTS](https://docs.openclaw.ai/reference/AGENTS.default) +- [Templates: AGENTS](https://docs.openclaw.ai/reference/templates/AGENTS) +- [Templates: BOOTSTRAP](https://docs.openclaw.ai/reference/templates/BOOTSTRAP) +- [Templates: IDENTITY](https://docs.openclaw.ai/reference/templates/IDENTITY) +- [Templates: SOUL](https://docs.openclaw.ai/reference/templates/SOUL) +- [Templates: TOOLS](https://docs.openclaw.ai/reference/templates/TOOLS) +- [Templates: USER](https://docs.openclaw.ai/reference/templates/USER) + +## Platform internals + +- [macOS dev setup](https://docs.openclaw.ai/platforms/mac/dev-setup) +- [macOS menu bar](https://docs.openclaw.ai/platforms/mac/menu-bar) +- [macOS voice wake](https://docs.openclaw.ai/platforms/mac/voicewake) +- [iOS node](https://docs.openclaw.ai/platforms/ios) +- [Android node](https://docs.openclaw.ai/platforms/android) +- [Windows (WSL2)](https://docs.openclaw.ai/platforms/windows) +- [Linux app](https://docs.openclaw.ai/platforms/linux) + +## Email hooks (Gmail) + +- [docs.openclaw.ai/gmail-pubsub](https://docs.openclaw.ai/automation/gmail-pubsub) + +## Molty + +OpenClaw was built for **Molty**, a space lobster AI assistant. 🦞 +by Peter Steinberger and the community. + +- [openclaw.ai](https://openclaw.ai) +- [soul.md](https://soul.md) +- [steipete.me](https://steipete.me) +- [@openclaw](https://x.com/openclaw) + +## Community + +See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines, maintainers, and how to submit PRs. +AI/vibe-coded PRs welcome! 🤖 + +Special thanks to [Mario Zechner](https://mariozechner.at/) for his support and for +[pi-mono](https://github.com/badlogic/pi-mono). +Special thanks to Adam Doppelt for lobster.bot. + +Thanks to all clawtributors: + +

+ steipete sktbrd cpojer joshp123 sebslight Mariano Belinky Takhoffman tyler6204 quotentiroler Verite Igiraneza + bohdanpodvirnyi gumadeiras iHildy jaydenfyi joaohlisboa rodrigouroz Glucksberg mneves75 MatthieuBizien MaudeBot + vignesh07 vincentkoc smartprogrammer93 advaitpaliwal HenryLoenwind rahthakor vrknetha abdelsfane radek-paclt joshavant + christianklotz zerone0x ranausmanai Tobias Bischoff heyhudson czekaj ethanpalm mukhtharcm yinghaosang aether-ai-agent + nabbilkhan Mrseenz maxsumrall coygeek xadenryan VACInc juanpablodlc conroywhitney buerbaumer Bridgerz + hsrvc magimetal openclaw-bot meaningfool mudrii JustasM ENCHIGO patelhiren NicholasSpisak claude + jonisjongithub abhisekbasu1 theonejvo Blakeshannon jamesgroat Marvae BunsDev shakkernerd gejifeng akoscz + divanoli ryan-crabbe nyanjou Sam Padilla dantelex SocialNerd42069 solstead natefikru daveonkels LeftX + Yida-Dev Masataka Shinohara arosstale riccardogiorato lc0rp adam91holt mousberg BillChirico shadril238 CharlieGreenman + hougangdev orlyjamie McRolly NWANGWU durenzidu JustYannicc Minidoracat magendary jessy2027 mteam88 hirefrank + M00N7682 dbhurley Eng. Juan Combetto Harrington-bot TSavo Lalit Singh julianengel jscaldwell55 bradleypriest TsekaLuk + benithors Shailesh loiie45e El-Fitz benostein pvtclawn thewilloftheshadow nachx639 0xRaini Taylor Asplund + Paul van Oorschot sreekaransrinath buddyh gupsammy AI-Reviewer-QS Stefan Galescu WalterSumbon nachoiacovino xinhuagu brandonwise + rodbland2021 Vasanth Rao Naik Sabavat fagemx petter-b leszekszpunar davidrudduck Jackten scald pycckuu Parker Todd Brooks + simonemacario omair445 AnonO6 Tanwa Arpornthip andranik-sahakyan davidguttman sleontenko denysvitali Tom Ron popomore + Patrick Barletta shayan919293 不做了睡大觉 Lucky Michael Lee sircrumpet peschee dakshaymehta nicolasstanley davidiach + nonggia.liang seheepeak danielwanwx hudson-rivera misterdas Shuai-DaiDai dominicnunez obviyus lploc94 sfo2001 + lutr0 dirbalak cathrynlavery kiranjd danielz1z Iranb cdorsey AdeboyeDN j2h4u Alg0rix + Skyler Miao peetzweg/ TideFinder Clawborn emanuelst bsormagec Diaspar4u evanotero Nate OscarMinjarez + webvijayi garnetlyx jlowin liebertar Max rhuanssauro joshrad-dev osolmaz adityashaw2 CashWilliams + sheeek asklee-klawd h0tp-ftw constansino Mitsuyuki Osabe onutc ryan artuskg Solvely-Colin mcaxtr + HirokiKobayashi-R taw0002 Kimitaka Watanabe Lilo Rajat Joshi Yuting Lin Neo Thorfinn wu-tian807 crimeacs + manuelhettich mcinteerj unisone bjesuiter Manik Vahsith alexgleason Nicholas Stephen Brian King mahanandhi andreesg + connorshea dinakars777 divisonofficer Flash-LHR Protocol Zero kyleok Limitless slonce70 grp06 robbyczgw-cla + JayMishra-source ngutman ide-rea badlogic lailoo amitbiswal007 azade-c John-Rood Iron9521 roshanasingh4 + tosh-hamburg dlauer ezhikkk Shivam Kumar Raut jabezborja Mykyta Bozhenko YuriNachos Josh Phillips Wangnov jadilson12 + 康熙 akramcodez clawdinator[bot] emonty kaizen403 Whoaa512 chriseidhof wangai-studio ysqander Yurii Chukhlib + 17jmumford aj47 google-labs-jules[bot] hyf0-agent Kenny Lee Lukavyi Operative-001 superman32432432 DylanWoodAkers Hisleren + widingmarcus-cyber antons austinm911 boris721 damoahdominic dan-dr doodlewind GHesericsu HeimdallStrategy imfing + jalehman jarvis-medmatic kkarimi mahmoudashraf93 pkrmf Randy Torres Ryan Lisse sumleo Yeom-JinHo zisisp + akyourowngames aldoeliacim Dithilli dougvk erikpr1994 fal3 Ghost jonasjancarik Keith the Silly Goose koala73 + L36 Server Marc mitschabaude-bot mkbehr Oren Rain shtse8 sibbl thesomewhatyou zats + chrisrodz echoVic Friederike Seiler gabriel-trigo ghsmc iamadig ibrahimq21 irtiq7 jeann2013 jogelin + Jonathan D. Rhyne (DJ-D) Joshua Mitchell Justin Ling kelvinCB Kit manmal MattQ Milofax mitsuhiko neist + pejmanjohn Ralph rmorse rubyrunsstuff rybnikov Steve (OpenClaw) suminhthanh svkozak wes-davis 24601 + AkashKobal ameno- awkoy BinHPdev bonald Chris Taylor dawondyifraw dguido Django Navarro evalexpr + henrino3 humanwritten hyojin joeykrug justinhuangcode larlyssa liuy ludd50155 Mark Liu natedenh + odysseus0 pcty-nextgen-service-account pi0 Roopak Nijhara Sean McLellan Syhids tmchow Ubuntu uli-will-code xiaose + Aaron Konyer aaronveklabs Aditya Singh andreabadesso Andrii battman21 BinaryMuse cash-echo-bot CJWTRUST Clawd + Clawdbot ClawdFx cordx56 danballance Elarwei001 EnzeD erik-agens Evizero fcatuhe gildo + Grynn hanxiao Ignacio itsjaydesu ivancasco ivanrvpereira Jarvis jayhickey jeffersonwarrior jeffersonwarrior + jverdi kentaro loeclos longmaba Marco Marandiz MarvinCui mjrussell odnxe optimikelabs oswalpalash + p6l-richard philipp-spiess Pocket Clawd RamiNoodle733 Raymond Berger Rob Axelsen Sash Catanzarite sauerdaniel Sriram Naidu Thota T5-AndyML + thejhinvirtuoso travisp VAC william arzt Yao yudshj zknicker 尹凯 {Suksham-sharma} 0oAstro + 8BlT Abdul535 abhaymundhara abhijeet117 aduk059 afurm aisling404 akari-musubi alejandro maza Alex-Alaniz + alexanderatallah alexstyl AlexZhangji amabito andrewting19 anisoptera araa47 arthyn Asleep123 Ayush Ojha + Ayush10 baccula beefiker bennewton999 bguidolim blacksmith-sh[bot] bqcfjwhz85-arch bravostation Buddy (AI) caelum0x + calvin-hpnet championswimmer chenglun.hu Chloe-VP Claw Clawdbot Maintainers cristip73 danielcadenhead dario-github DarwinsBuddy + David-Marsh-Photo davidbors-snyk dcantu96 dependabot[bot] Developer Dimitrios Ploutarchos Drake Thomsen dvrshil dxd5001 dylanneve1 + elliotsecops EmberCF ereid7 eternauta1337 f-trycua fan Felix Krause foeken frankekn fujiwara-tofu-shop + ganghyun kim gaowanqi08141999 gerardward2007 gitpds gtsifrikas habakan HassanFleyah HazAT hcl headswim + hlbbbbbbb Hubert hugobarauna hyaxia iamEvanYT ikari ikari-pl Iron ironbyte-rgb Ítalo Souza + Jamie Openshaw Jane Jarvis Deploy jarvis89757 jasonftl jasonsschin Jefferson Nunn jg-noncelogic jigar joeynyc + Jon Uleis Josh Long justyannicc Karim Naguib Kasper Neist Christjansen Keshav Rao Kevin Lin Kira knocte Knox + Kristijan Jovanovski Kyle Chen Latitude Bot Levi Figueira Liu Weizhan Lloyd Loganaden Velvindron lsh411 Lucas Kim Luka Zhang + Lukáš Loukota Lukin mac mimi mac26ai MackDing Mahsum Aktas Marc Beaupre Marcus Neves Mario Zechner Markus Buhatem Koch + Martin Púčik Martin Schürrer MarvinDontPanic Mateusz Michalik Matias Wainsten Matt Ezell Matt mini Matthew Dicembrino Mauro Bolis mcwigglesmcgee + meaadore1221-afk Mert Çiçekçi Michael Verrilli Miles minghinmatthewlam Mourad Boustani Mr. Guy Mustafa Tag Eldeen myfunc Nate + Nathaniel Kelner Netanel Draiman niceysam Nick Lamb Nick Taylor Nikolay Petrov NM nobrainer-tech Noctivoro norunners + Ocean Vael Ogulcan Celik Oleg Kossoy Olshansk Omar Khaleel OpenClaw Agent Ozgur Polat Pablo Nunez Palash Oswal pasogott + Patrick Shao Paul Pamment Paulo Portella Peter Lee Petra Donka Pham Nam pierreeurope pip-nomel plum-dawg pookNast + Pratham Dubey Quentin rafaelreis-r Raikan10 Ramin Shirali Hossein Zade Randy Torres Raphael Borg Ellul Vincenti Ratul Sarna Richard Pinedo Rick Qian + robhparker Rohan Nagpal Rohan Patil rohanpatriot Rolf Fredheim Rony Kelner Ryan Nelson Samrat Jha Santosh Sascha Reuter + Saurabh.Chopade saurav470 seans-openclawbot SecondThread seewhy Senol Dogan Sergiy Dybskiy Shadow shatner Shaun Loo + Shaun Mason Shiva Prasad Shrinija Kummari Siddhant Jain Simon Kelly SK Heavy Industries sldkfoiweuaranwdlaiwyeoaw Soumyadeep Ghosh Spacefish spiceoogway + Stephen Chen Steve succ985 Suksham Sunwoo Yu Suvin Nimnaka Swader swizzmagik Tag techboss + testingabc321 tewatia The Admiral therealZpoint-bot tian Xiao Tim Krase Timo Lins Tom McKenzie Tom Peri Tomas Hajek + Tomsun28 Tonic Travis Hinton Travis Irby Tulsi Prasad Ty Sabs Tyler uos-status Vai Varun Kruthiventi + Vibe Kanban Victor Castell victor-wu.eth vikpos Vincent VintLin Vladimir Peshekhonov void Vultr-Clawd Admin William Stock + williamtwomey Wimmie Winry Winston wolfred Xin Xinhe Hu Xu Haoran Yash Yaxuan42 + Yazin Yevhen Bobrov Yi Wang ymat19 Yuan Chen Yuanhai Zach Knickerbocker Zaf (via OpenClaw) zhixian 石川 諒 + 0xJonHoldsCrypto aaronn Alphonse-arianee atalovesyou Azade carlulsoe ddyo Erik hrdwdmrbl jiulingyun + kitze latitudeki5223 loukotal Manuel Maly minghinmatthewlam MSch odrobnik pcty-nextgen-ios-builder rafaelreis-r ratulsarna + reeltimeapps rhjoh ronak-guliani snopoke thesash timkrase +

diff --git a/assets/avatar-placeholder.svg b/assets/avatar-placeholder.svg new file mode 100644 index 0000000..d0a6999 --- /dev/null +++ b/assets/avatar-placeholder.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/chrome-extension/README.md b/assets/chrome-extension/README.md new file mode 100644 index 0000000..4ee072c --- /dev/null +++ b/assets/chrome-extension/README.md @@ -0,0 +1,23 @@ +# OpenClaw Chrome Extension (Browser Relay) + +Purpose: attach OpenClaw to an existing Chrome tab so the Gateway can automate it (via the local CDP relay server). + +## Dev / load unpacked + +1. Build/run OpenClaw Gateway with browser control enabled. +2. Ensure the relay server is reachable at `http://127.0.0.1:18792/` (default). +3. Install the extension to a stable path: + + ```bash + openclaw browser extension install + openclaw browser extension path + ``` + +4. Chrome → `chrome://extensions` → enable “Developer mode”. +5. “Load unpacked” → select the path printed above. +6. Pin the extension. Click the icon on a tab to attach/detach. + +## Options + +- `Relay port`: defaults to `18792`. +- `Gateway token`: required. Set this to `gateway.auth.token` (or `OPENCLAW_GATEWAY_TOKEN`). diff --git a/assets/chrome-extension/background.js b/assets/chrome-extension/background.js new file mode 100644 index 0000000..7a1754e --- /dev/null +++ b/assets/chrome-extension/background.js @@ -0,0 +1,453 @@ +const DEFAULT_PORT = 18792 + +const BADGE = { + on: { text: 'ON', color: '#FF5A36' }, + off: { text: '', color: '#000000' }, + connecting: { text: '…', color: '#F59E0B' }, + error: { text: '!', color: '#B91C1C' }, +} + +/** @type {WebSocket|null} */ +let relayWs = null +/** @type {Promise|null} */ +let relayConnectPromise = null + +let debuggerListenersInstalled = false + +let nextSession = 1 + +/** @type {Map} */ +const tabs = new Map() +/** @type {Map} */ +const tabBySession = new Map() +/** @type {Map} */ +const childSessionToTab = new Map() + +/** @type {Mapvoid, reject:(e:Error)=>void}>} */ +const pending = new Map() + +function nowStack() { + try { + return new Error().stack || '' + } catch { + return '' + } +} + +async function getRelayPort() { + const stored = await chrome.storage.local.get(['relayPort']) + const raw = stored.relayPort + const n = Number.parseInt(String(raw || ''), 10) + if (!Number.isFinite(n) || n <= 0 || n > 65535) return DEFAULT_PORT + return n +} + +async function getGatewayToken() { + const stored = await chrome.storage.local.get(['gatewayToken']) + const token = String(stored.gatewayToken || '').trim() + return token || '' +} + +function setBadge(tabId, kind) { + const cfg = BADGE[kind] + void chrome.action.setBadgeText({ tabId, text: cfg.text }) + void chrome.action.setBadgeBackgroundColor({ tabId, color: cfg.color }) + void chrome.action.setBadgeTextColor({ tabId, color: '#FFFFFF' }).catch(() => {}) +} + +async function ensureRelayConnection() { + if (relayWs && relayWs.readyState === WebSocket.OPEN) return + if (relayConnectPromise) return await relayConnectPromise + + relayConnectPromise = (async () => { + const port = await getRelayPort() + const gatewayToken = await getGatewayToken() + const httpBase = `http://127.0.0.1:${port}` + const wsUrl = gatewayToken + ? `ws://127.0.0.1:${port}/extension?token=${encodeURIComponent(gatewayToken)}` + : `ws://127.0.0.1:${port}/extension` + + // Fast preflight: is the relay server up? + try { + await fetch(`${httpBase}/`, { method: 'HEAD', signal: AbortSignal.timeout(2000) }) + } catch (err) { + throw new Error(`Relay server not reachable at ${httpBase} (${String(err)})`) + } + + if (!gatewayToken) { + throw new Error( + 'Missing gatewayToken in extension settings (chrome.storage.local.gatewayToken)', + ) + } + + const ws = new WebSocket(wsUrl) + relayWs = ws + + await new Promise((resolve, reject) => { + const t = setTimeout(() => reject(new Error('WebSocket connect timeout')), 5000) + ws.onopen = () => { + clearTimeout(t) + resolve() + } + ws.onerror = () => { + clearTimeout(t) + reject(new Error('WebSocket connect failed')) + } + ws.onclose = (ev) => { + clearTimeout(t) + reject(new Error(`WebSocket closed (${ev.code} ${ev.reason || 'no reason'})`)) + } + }) + + ws.onmessage = (event) => void onRelayMessage(String(event.data || '')) + ws.onclose = () => onRelayClosed('closed') + ws.onerror = () => onRelayClosed('error') + + if (!debuggerListenersInstalled) { + debuggerListenersInstalled = true + chrome.debugger.onEvent.addListener(onDebuggerEvent) + chrome.debugger.onDetach.addListener(onDebuggerDetach) + } + })() + + try { + await relayConnectPromise + } finally { + relayConnectPromise = null + } +} + +function onRelayClosed(reason) { + relayWs = null + for (const [id, p] of pending.entries()) { + pending.delete(id) + p.reject(new Error(`Relay disconnected (${reason})`)) + } + + for (const tabId of tabs.keys()) { + void chrome.debugger.detach({ tabId }).catch(() => {}) + setBadge(tabId, 'connecting') + void chrome.action.setTitle({ + tabId, + title: 'OpenClaw Browser Relay: disconnected (click to re-attach)', + }) + } + tabs.clear() + tabBySession.clear() + childSessionToTab.clear() +} + +function sendToRelay(payload) { + const ws = relayWs + if (!ws || ws.readyState !== WebSocket.OPEN) { + throw new Error('Relay not connected') + } + ws.send(JSON.stringify(payload)) +} + +async function maybeOpenHelpOnce() { + try { + const stored = await chrome.storage.local.get(['helpOnErrorShown']) + if (stored.helpOnErrorShown === true) return + await chrome.storage.local.set({ helpOnErrorShown: true }) + await chrome.runtime.openOptionsPage() + } catch { + // ignore + } +} + +function requestFromRelay(command) { + const id = command.id + return new Promise((resolve, reject) => { + pending.set(id, { resolve, reject }) + try { + sendToRelay(command) + } catch (err) { + pending.delete(id) + reject(err instanceof Error ? err : new Error(String(err))) + } + }) +} + +async function onRelayMessage(text) { + /** @type {any} */ + let msg + try { + msg = JSON.parse(text) + } catch { + return + } + + if (msg && msg.method === 'ping') { + try { + sendToRelay({ method: 'pong' }) + } catch { + // ignore + } + return + } + + if (msg && typeof msg.id === 'number' && (msg.result !== undefined || msg.error !== undefined)) { + const p = pending.get(msg.id) + if (!p) return + pending.delete(msg.id) + if (msg.error) p.reject(new Error(String(msg.error))) + else p.resolve(msg.result) + return + } + + if (msg && typeof msg.id === 'number' && msg.method === 'forwardCDPCommand') { + try { + const result = await handleForwardCdpCommand(msg) + sendToRelay({ id: msg.id, result }) + } catch (err) { + sendToRelay({ id: msg.id, error: err instanceof Error ? err.message : String(err) }) + } + } +} + +function getTabBySessionId(sessionId) { + const direct = tabBySession.get(sessionId) + if (direct) return { tabId: direct, kind: 'main' } + const child = childSessionToTab.get(sessionId) + if (child) return { tabId: child, kind: 'child' } + return null +} + +function getTabByTargetId(targetId) { + for (const [tabId, tab] of tabs.entries()) { + if (tab.targetId === targetId) return tabId + } + return null +} + +async function attachTab(tabId, opts = {}) { + const debuggee = { tabId } + await chrome.debugger.attach(debuggee, '1.3') + await chrome.debugger.sendCommand(debuggee, 'Page.enable').catch(() => {}) + + const info = /** @type {any} */ (await chrome.debugger.sendCommand(debuggee, 'Target.getTargetInfo')) + const targetInfo = info?.targetInfo + const targetId = String(targetInfo?.targetId || '').trim() + if (!targetId) { + throw new Error('Target.getTargetInfo returned no targetId') + } + + const sessionId = `cb-tab-${nextSession++}` + const attachOrder = nextSession + + tabs.set(tabId, { state: 'connected', sessionId, targetId, attachOrder }) + tabBySession.set(sessionId, tabId) + void chrome.action.setTitle({ + tabId, + title: 'OpenClaw Browser Relay: attached (click to detach)', + }) + + if (!opts.skipAttachedEvent) { + sendToRelay({ + method: 'forwardCDPEvent', + params: { + method: 'Target.attachedToTarget', + params: { + sessionId, + targetInfo: { ...targetInfo, attached: true }, + waitingForDebugger: false, + }, + }, + }) + } + + setBadge(tabId, 'on') + return { sessionId, targetId } +} + +async function detachTab(tabId, reason) { + const tab = tabs.get(tabId) + if (tab?.sessionId && tab?.targetId) { + try { + sendToRelay({ + method: 'forwardCDPEvent', + params: { + method: 'Target.detachedFromTarget', + params: { sessionId: tab.sessionId, targetId: tab.targetId, reason }, + }, + }) + } catch { + // ignore + } + } + + if (tab?.sessionId) tabBySession.delete(tab.sessionId) + tabs.delete(tabId) + + for (const [childSessionId, parentTabId] of childSessionToTab.entries()) { + if (parentTabId === tabId) childSessionToTab.delete(childSessionId) + } + + try { + await chrome.debugger.detach({ tabId }) + } catch { + // ignore + } + + setBadge(tabId, 'off') + void chrome.action.setTitle({ + tabId, + title: 'OpenClaw Browser Relay (click to attach/detach)', + }) +} + +async function connectOrToggleForActiveTab() { + const [active] = await chrome.tabs.query({ active: true, currentWindow: true }) + const tabId = active?.id + if (!tabId) return + + const existing = tabs.get(tabId) + if (existing?.state === 'connected') { + await detachTab(tabId, 'toggle') + return + } + + tabs.set(tabId, { state: 'connecting' }) + setBadge(tabId, 'connecting') + void chrome.action.setTitle({ + tabId, + title: 'OpenClaw Browser Relay: connecting to local relay…', + }) + + try { + await ensureRelayConnection() + await attachTab(tabId) + } catch (err) { + tabs.delete(tabId) + setBadge(tabId, 'error') + void chrome.action.setTitle({ + tabId, + title: 'OpenClaw Browser Relay: relay not running (open options for setup)', + }) + void maybeOpenHelpOnce() + // Extra breadcrumbs in chrome://extensions service worker logs. + const message = err instanceof Error ? err.message : String(err) + console.warn('attach failed', message, nowStack()) + } +} + +async function handleForwardCdpCommand(msg) { + const method = String(msg?.params?.method || '').trim() + const params = msg?.params?.params || undefined + const sessionId = typeof msg?.params?.sessionId === 'string' ? msg.params.sessionId : undefined + + // Map command to tab + const bySession = sessionId ? getTabBySessionId(sessionId) : null + const targetId = typeof params?.targetId === 'string' ? params.targetId : undefined + const tabId = + bySession?.tabId || + (targetId ? getTabByTargetId(targetId) : null) || + (() => { + // No sessionId: pick the first connected tab (stable-ish). + for (const [id, tab] of tabs.entries()) { + if (tab.state === 'connected') return id + } + return null + })() + + if (!tabId) throw new Error(`No attached tab for method ${method}`) + + /** @type {chrome.debugger.DebuggerSession} */ + const debuggee = { tabId } + + if (method === 'Runtime.enable') { + try { + await chrome.debugger.sendCommand(debuggee, 'Runtime.disable') + await new Promise((r) => setTimeout(r, 50)) + } catch { + // ignore + } + return await chrome.debugger.sendCommand(debuggee, 'Runtime.enable', params) + } + + if (method === 'Target.createTarget') { + const url = typeof params?.url === 'string' ? params.url : 'about:blank' + const tab = await chrome.tabs.create({ url, active: false }) + if (!tab.id) throw new Error('Failed to create tab') + await new Promise((r) => setTimeout(r, 100)) + const attached = await attachTab(tab.id) + return { targetId: attached.targetId } + } + + if (method === 'Target.closeTarget') { + const target = typeof params?.targetId === 'string' ? params.targetId : '' + const toClose = target ? getTabByTargetId(target) : tabId + if (!toClose) return { success: false } + try { + await chrome.tabs.remove(toClose) + } catch { + return { success: false } + } + return { success: true } + } + + if (method === 'Target.activateTarget') { + const target = typeof params?.targetId === 'string' ? params.targetId : '' + const toActivate = target ? getTabByTargetId(target) : tabId + if (!toActivate) return {} + const tab = await chrome.tabs.get(toActivate).catch(() => null) + if (!tab) return {} + if (tab.windowId) { + await chrome.windows.update(tab.windowId, { focused: true }).catch(() => {}) + } + await chrome.tabs.update(toActivate, { active: true }).catch(() => {}) + return {} + } + + const tabState = tabs.get(tabId) + const mainSessionId = tabState?.sessionId + const debuggerSession = + sessionId && mainSessionId && sessionId !== mainSessionId + ? { ...debuggee, sessionId } + : debuggee + + return await chrome.debugger.sendCommand(debuggerSession, method, params) +} + +function onDebuggerEvent(source, method, params) { + const tabId = source.tabId + if (!tabId) return + const tab = tabs.get(tabId) + if (!tab?.sessionId) return + + if (method === 'Target.attachedToTarget' && params?.sessionId) { + childSessionToTab.set(String(params.sessionId), tabId) + } + + if (method === 'Target.detachedFromTarget' && params?.sessionId) { + childSessionToTab.delete(String(params.sessionId)) + } + + try { + sendToRelay({ + method: 'forwardCDPEvent', + params: { + sessionId: source.sessionId || tab.sessionId, + method, + params, + }, + }) + } catch { + // ignore + } +} + +function onDebuggerDetach(source, reason) { + const tabId = source.tabId + if (!tabId) return + if (!tabs.has(tabId)) return + void detachTab(tabId, reason) +} + +chrome.action.onClicked.addListener(() => void connectOrToggleForActiveTab()) + +chrome.runtime.onInstalled.addListener(() => { + // Useful: first-time instructions. + void chrome.runtime.openOptionsPage() +}) diff --git a/assets/chrome-extension/icons/icon128.png b/assets/chrome-extension/icons/icon128.png new file mode 100644 index 0000000..533cc81 Binary files /dev/null and b/assets/chrome-extension/icons/icon128.png differ diff --git a/assets/chrome-extension/icons/icon16.png b/assets/chrome-extension/icons/icon16.png new file mode 100644 index 0000000..1be23ae Binary files /dev/null and b/assets/chrome-extension/icons/icon16.png differ diff --git a/assets/chrome-extension/icons/icon32.png b/assets/chrome-extension/icons/icon32.png new file mode 100644 index 0000000..f4c1be8 Binary files /dev/null and b/assets/chrome-extension/icons/icon32.png differ diff --git a/assets/chrome-extension/icons/icon48.png b/assets/chrome-extension/icons/icon48.png new file mode 100644 index 0000000..d2a278a Binary files /dev/null and b/assets/chrome-extension/icons/icon48.png differ diff --git a/assets/chrome-extension/manifest.json b/assets/chrome-extension/manifest.json new file mode 100644 index 0000000..d6b5939 --- /dev/null +++ b/assets/chrome-extension/manifest.json @@ -0,0 +1,25 @@ +{ + "manifest_version": 3, + "name": "OpenClaw Browser Relay", + "version": "0.1.0", + "description": "Attach OpenClaw to your existing Chrome tab via a local CDP relay server.", + "icons": { + "16": "icons/icon16.png", + "32": "icons/icon32.png", + "48": "icons/icon48.png", + "128": "icons/icon128.png" + }, + "permissions": ["debugger", "tabs", "activeTab", "storage"], + "host_permissions": ["http://127.0.0.1/*", "http://localhost/*"], + "background": { "service_worker": "background.js", "type": "module" }, + "action": { + "default_title": "OpenClaw Browser Relay (click to attach/detach)", + "default_icon": { + "16": "icons/icon16.png", + "32": "icons/icon32.png", + "48": "icons/icon48.png", + "128": "icons/icon128.png" + } + }, + "options_ui": { "page": "options.html", "open_in_tab": true } +} diff --git a/assets/chrome-extension/options.html b/assets/chrome-extension/options.html new file mode 100644 index 0000000..17fc6a7 --- /dev/null +++ b/assets/chrome-extension/options.html @@ -0,0 +1,200 @@ + + + + + + OpenClaw Browser Relay + + + +
+
+ +
+

OpenClaw Browser Relay

+

Click the toolbar button on a tab to attach / detach.

+
+
+ +
+
+

Getting started

+

+ If you see a red ! badge on the extension icon, the relay server is not reachable. + Start OpenClaw’s browser relay on this machine (Gateway or node host), then click the toolbar button again. +

+

+ Full guide (install, remote Gateway, security): docs.openclaw.ai/tools/chrome-extension +

+
+ +
+

Relay connection

+ +
+ +
+ +
+ + +
+
+ Default port: 18792. Extension connects to: http://127.0.0.1:<port>/. + Gateway token must match gateway.auth.token (or OPENCLAW_GATEWAY_TOKEN). +
+
+
+
+ + +
+ + diff --git a/assets/chrome-extension/options.js b/assets/chrome-extension/options.js new file mode 100644 index 0000000..e4252cc --- /dev/null +++ b/assets/chrome-extension/options.js @@ -0,0 +1,83 @@ +const DEFAULT_PORT = 18792 + +function clampPort(value) { + const n = Number.parseInt(String(value || ''), 10) + if (!Number.isFinite(n)) return DEFAULT_PORT + if (n <= 0 || n > 65535) return DEFAULT_PORT + return n +} + +function updateRelayUrl(port) { + const el = document.getElementById('relay-url') + if (!el) return + el.textContent = `http://127.0.0.1:${port}/` +} + +function relayHeaders(token) { + const t = String(token || '').trim() + if (!t) return {} + return { 'x-openclaw-relay-token': t } +} + +function setStatus(kind, message) { + const status = document.getElementById('status') + if (!status) return + status.dataset.kind = kind || '' + status.textContent = message || '' +} + +async function checkRelayReachable(port, token) { + const url = `http://127.0.0.1:${port}/json/version` + const trimmedToken = String(token || '').trim() + if (!trimmedToken) { + setStatus('error', 'Gateway token required. Save your gateway token to connect.') + return + } + const ctrl = new AbortController() + const t = setTimeout(() => ctrl.abort(), 1200) + try { + const res = await fetch(url, { + method: 'GET', + headers: relayHeaders(trimmedToken), + signal: ctrl.signal, + }) + if (res.status === 401) { + setStatus('error', 'Gateway token rejected. Check token and save again.') + return + } + if (!res.ok) throw new Error(`HTTP ${res.status}`) + setStatus('ok', `Relay reachable and authenticated at http://127.0.0.1:${port}/`) + } catch { + setStatus( + 'error', + `Relay not reachable/authenticated at http://127.0.0.1:${port}/. Start OpenClaw browser relay and verify token.`, + ) + } finally { + clearTimeout(t) + } +} + +async function load() { + const stored = await chrome.storage.local.get(['relayPort', 'gatewayToken']) + const port = clampPort(stored.relayPort) + const token = String(stored.gatewayToken || '').trim() + document.getElementById('port').value = String(port) + document.getElementById('token').value = token + updateRelayUrl(port) + await checkRelayReachable(port, token) +} + +async function save() { + const portInput = document.getElementById('port') + const tokenInput = document.getElementById('token') + const port = clampPort(portInput.value) + const token = String(tokenInput.value || '').trim() + await chrome.storage.local.set({ relayPort: port, gatewayToken: token }) + portInput.value = String(port) + tokenInput.value = token + updateRelayUrl(port) + await checkRelayReachable(port, token) +} + +document.getElementById('save').addEventListener('click', () => void save()) +void load() diff --git a/assets/dmg-background-small.png b/assets/dmg-background-small.png new file mode 100644 index 0000000..74fc56a Binary files /dev/null and b/assets/dmg-background-small.png differ diff --git a/assets/dmg-background.png b/assets/dmg-background.png new file mode 100644 index 0000000..a3bff03 Binary files /dev/null and b/assets/dmg-background.png differ diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f68b514 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,56 @@ +services: + # Cortex Gateway Service (Node.js/TypeScript) + gateway: + build: + context: . + dockerfile: Dockerfile + container_name: cortex-gateway + environment: + HOME: /home/node + TERM: xterm-256color + NODE_ENV: ${NODE_ENV:-development} + CORTEX_GATEWAY_TOKEN: ${CORTEX_GATEWAY_TOKEN} + FASTEMBED_URL: http://fastembed:8000 + # Matrix channel credentials + MATRIX_HOMESERVER: ${MATRIX_HOMESERVER} + MATRIX_USER_ID: ${MATRIX_USER_ID} + MATRIX_ACCESS_TOKEN: ${MATRIX_ACCESS_TOKEN} + MATRIX_PASSWORD: ${MATRIX_PASSWORD:-} + MATRIX_DEVICE_NAME: ${MATRIX_DEVICE_NAME:-Cortex Gateway} + volumes: + - ${CORTEX_CONFIG_DIR:-./data/config}:/home/node/.openclaw + - ${CORTEX_WORKSPACE_DIR:-./data/workspace}:/home/node/.openclaw/workspace + ports: + - "${CORTEX_GATEWAY_PORT:-18789}:18789" + networks: + - cortex + depends_on: + - fastembed + restart: unless-stopped + init: true + + # FastEmbed Service (Python) + fastembed: + build: + context: ./services/fastembed + dockerfile: Dockerfile + container_name: cortex-fastembed + environment: + PYTHONUNBUFFERED: 1 + ports: + - "${FASTEMBED_PORT:-8000}:8000" + networks: + - cortex + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + +networks: + cortex: + name: cortex + driver: bridge + diff --git a/docs.acp.md b/docs.acp.md new file mode 100644 index 0000000..cfe7349 --- /dev/null +++ b/docs.acp.md @@ -0,0 +1,197 @@ +# OpenClaw ACP Bridge + +This document describes how the OpenClaw ACP (Agent Client Protocol) bridge works, +how it maps ACP sessions to Gateway sessions, and how IDEs should invoke it. + +## Overview + +`openclaw acp` exposes an ACP agent over stdio and forwards prompts to a running +OpenClaw Gateway over WebSocket. It keeps ACP session ids mapped to Gateway +session keys so IDEs can reconnect to the same agent transcript or reset it on +request. + +Key goals: + +- Minimal ACP surface area (stdio, NDJSON). +- Stable session mapping across reconnects. +- Works with existing Gateway session store (list/resolve/reset). +- Safe defaults (isolated ACP session keys by default). + +## How can I use this + +Use ACP when an IDE or tooling speaks Agent Client Protocol and you want it to +drive a OpenClaw Gateway session. + +Quick steps: + +1. Run a Gateway (local or remote). +2. Configure the Gateway target (`gateway.remote.url` + auth) or pass flags. +3. Point the IDE to run `openclaw acp` over stdio. + +Example config: + +```bash +openclaw config set gateway.remote.url wss://gateway-host:18789 +openclaw config set gateway.remote.token +``` + +Example run: + +```bash +openclaw acp --url wss://gateway-host:18789 --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. + +## Zed editor setup + +Add a custom ACP agent in `~/.config/zed/settings.json`: + +```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. + +## Execution Model + +- ACP client spawns `openclaw acp` and speaks ACP messages over stdio. +- The bridge connects to the Gateway using existing auth config (or CLI flags). +- ACP `prompt` translates to Gateway `chat.send`. +- Gateway streaming events are translated back into ACP streaming events. +- ACP `cancel` maps to Gateway `chat.abort` for the active run. + +## Session Mapping + +By default each ACP session is mapped to a dedicated Gateway session key: + +- `acp:` unless overridden. + +You can override or reuse sessions in two ways: + +1. CLI defaults + +```bash +openclaw acp --session agent:main:main +openclaw acp --session-label "support inbox" +openclaw acp --reset-session +``` + +2. ACP metadata per session + +```json +{ + "_meta": { + "sessionKey": "agent:main:main", + "sessionLabel": "support inbox", + "resetSession": true, + "requireExisting": false + } +} +``` + +Rules: + +- `sessionKey`: direct Gateway session key. +- `sessionLabel`: resolve an existing session by label. +- `resetSession`: mint a new transcript for the key before first use. +- `requireExisting`: fail if the key/label does not exist. + +### Session Listing + +ACP `listSessions` maps to Gateway `sessions.list` and returns a filtered +summary suitable for IDE session pickers. `_meta.limit` can cap the number of +sessions returned. + +## Prompt Translation + +ACP prompt inputs are converted into a Gateway `chat.send`: + +- `text` and `resource` blocks become prompt text. +- `resource_link` with image mime types become attachments. +- The working directory can be prefixed into the prompt (default on, can be + disabled with `--no-prefix-cwd`). + +Gateway streaming events are translated into ACP `message` and `tool_call` +updates. Terminal Gateway states map to ACP `done` with stop reasons: + +- `complete` -> `stop` +- `aborted` -> `cancel` +- `error` -> `error` + +## Auth + Gateway Discovery + +`openclaw acp` resolves the Gateway URL and auth from CLI flags or config: + +- `--url` / `--token` / `--password` take precedence. +- Otherwise use configured `gateway.remote.*` settings. + +## Operational Notes + +- ACP sessions are stored in memory for the bridge process lifetime. +- Gateway session state is persisted by the Gateway itself. +- `--verbose` logs ACP/Gateway bridge events to stderr (never stdout). +- ACP runs can be canceled and the active run id is tracked per session. + +## Compatibility + +- ACP bridge uses `@agentclientprotocol/sdk` (currently 0.13.x). +- Works with ACP clients that implement `initialize`, `newSession`, + `loadSession`, `prompt`, `cancel`, and `listSessions`. + +## Testing + +- Unit: `src/acp/session.test.ts` covers run id lifecycle. +- Full gate: `pnpm build && pnpm check && pnpm test && pnpm docs:build`. + +## Related Docs + +- CLI usage: `docs/cli/acp.md` +- Session model: `docs/concepts/session.md` +- Session management internals: `docs/reference/session-management-compaction.md` diff --git a/docs/.i18n/README.md b/docs/.i18n/README.md new file mode 100644 index 0000000..8e751a1 --- /dev/null +++ b/docs/.i18n/README.md @@ -0,0 +1,31 @@ +# OpenClaw docs i18n assets + +This folder stores **generated** and **config** files for documentation translations. + +## 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`. diff --git a/docs/.i18n/glossary.ja-JP.json b/docs/.i18n/glossary.ja-JP.json new file mode 100644 index 0000000..f7c59a1 --- /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 0000000..bde1080 --- /dev/null +++ b/docs/.i18n/glossary.zh-CN.json @@ -0,0 +1,210 @@ +[ + { + "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": "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": "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": "install sanity", + "target": "安装完整性检查" + }, + { + "source": "get unstuck", + "target": "解决问题" + }, + { + "source": "troubleshooting", + "target": "故障排除" + }, + { + "source": "FAQ", + "target": "常见问题" + }, + { + "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": "环境变量" + } +] diff --git a/docs/.i18n/ja-JP.tm.jsonl b/docs/.i18n/ja-JP.tm.jsonl new file mode 100644 index 0000000..e69de29 diff --git a/docs/.i18n/zh-CN.tm.jsonl b/docs/.i18n/zh-CN.tm.jsonl new file mode 100644 index 0000000..24076e5 --- /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/CNAME b/docs/CNAME new file mode 100644 index 0000000..715bc9d --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +docs.openclaw.ai diff --git a/docs/assets/install-script.svg b/docs/assets/install-script.svg new file mode 100644 index 0000000..78a6f97 --- /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 0000000..255976f 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 0000000..0135e38 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 0000000..ca0dac9 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 0000000..4e0233c 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 0000000..910a5f8 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 0000000..b14e423 Binary files /dev/null and b/docs/assets/openclaw-logo-text-dark.png differ diff --git a/docs/assets/openclaw-logo-text.png b/docs/assets/openclaw-logo-text.png new file mode 100644 index 0000000..705d2c0 Binary files /dev/null and b/docs/assets/openclaw-logo-text.png differ diff --git a/docs/assets/pixel-lobster.svg b/docs/assets/pixel-lobster.svg new file mode 100644 index 0000000..7bfb7fc --- /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 0000000..ae6ab6d 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 0000000..046f627 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 0000000..43952b9 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 0000000..bd7cf07 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 0000000..4e19768 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 0000000..b1e9f70 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 0000000..61eb633 --- /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 0000000..eb1ae39 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 0000000..3e7af38 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 0000000..888a413 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 0000000..e31ba11 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 0000000..4708404 --- /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 0000000..3396f14 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 0000000..c82c47a 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 0000000..66af85d 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 0000000..8bdf5ae 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 0000000..7cd2016 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 0000000..c8b9954 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 0000000..7f7d86a Binary files /dev/null and b/docs/assets/showcase/xuezh-pronunciation.jpeg differ diff --git a/docs/assets/sponsors/blacksmith.svg b/docs/assets/sponsors/blacksmith.svg new file mode 100644 index 0000000..5bb1bc2 --- /dev/null +++ b/docs/assets/sponsors/blacksmith.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/assets/sponsors/openai.svg b/docs/assets/sponsors/openai.svg new file mode 100644 index 0000000..1c3491b --- /dev/null +++ b/docs/assets/sponsors/openai.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/automation/auth-monitoring.md b/docs/automation/auth-monitoring.md new file mode 100644 index 0000000..877a1c2 --- /dev/null +++ b/docs/automation/auth-monitoring.md @@ -0,0 +1,44 @@ +--- +summary: "Monitor OAuth expiry for model providers" +read_when: + - Setting up auth expiry monitoring or alerts + - Automating Claude Code / Codex OAuth refresh checks +title: "Auth Monitoring" +--- + +# Auth monitoring + +OpenClaw exposes OAuth expiry health via `openclaw models status`. Use that for +automation and alerting; scripts are optional extras for phone workflows. + +## Preferred: CLI check (portable) + +```bash +openclaw models status --check +``` + +Exit codes: + +- `0`: OK +- `1`: expired or missing credentials +- `2`: expiring soon (within 24h) + +This works in cron/systemd and requires no extra scripts. + +## Optional scripts (ops / phone workflows) + +These live under `scripts/` and are **optional**. They assume SSH access to the +gateway host and are tuned for systemd + Termux. + +- `scripts/claude-auth-status.sh` now uses `openclaw models status --json` as the + source of truth (falling back to direct file reads if the CLI is unavailable), + so keep `openclaw` on `PATH` for timers. +- `scripts/auth-monitor.sh`: cron/systemd timer target; sends alerts (ntfy or phone). +- `scripts/systemd/openclaw-auth-monitor.{service,timer}`: systemd user timer. +- `scripts/claude-auth-status.sh`: Claude Code + OpenClaw auth checker (full/json/simple). +- `scripts/mobile-reauth.sh`: guided re‑auth flow over SSH. +- `scripts/termux-quick-auth.sh`: one‑tap widget status + open auth URL. +- `scripts/termux-auth-widget.sh`: full guided widget flow. +- `scripts/termux-sync-widget.sh`: sync Claude Code creds → OpenClaw. + +If you don’t need phone automation or systemd timers, skip these scripts. diff --git a/docs/automation/cron-jobs.md b/docs/automation/cron-jobs.md new file mode 100644 index 0000000..aae5f58 --- /dev/null +++ b/docs/automation/cron-jobs.md @@ -0,0 +1,542 @@ +--- +summary: "Cron jobs + wakeups for the Gateway scheduler" +read_when: + - Scheduling background jobs or wakeups + - Wiring automation that should run with or alongside heartbeats + - Deciding between heartbeat and cron for scheduled tasks +title: "Cron Jobs" +--- + +# Cron jobs (Gateway scheduler) + +> **Cron vs Heartbeat?** See [Cron vs Heartbeat](/automation/cron-vs-heartbeat) for guidance on when to use each. + +Cron is the Gateway’s built-in scheduler. It persists jobs, wakes the agent at +the right time, and can optionally deliver output back to a chat. + +If you want _“run this every morning”_ or _“poke the agent in 20 minutes”_, +cron is the mechanism. + +Troubleshooting: [/automation/troubleshooting](/automation/troubleshooting) + +## TL;DR + +- Cron runs **inside the Gateway** (not inside the model). +- Jobs persist under `~/.openclaw/cron/` so restarts don’t lose schedules. +- Two execution styles: + - **Main session**: enqueue a system event, then run on the next heartbeat. + - **Isolated**: run a dedicated agent turn in `cron:`, with delivery (announce by default or none). +- Wakeups are first-class: a job can request “wake now” vs “next heartbeat”. +- Webhook posting is per job via `delivery.mode = "webhook"` + `delivery.to = ""`. +- Legacy fallback remains for stored jobs with `notify: true` when `cron.webhook` is set, migrate those jobs to webhook delivery mode. + +## Quick start (actionable) + +Create a one-shot reminder, verify it exists, and run it immediately: + +```bash +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 + +openclaw cron list +openclaw cron run +openclaw cron runs --id +``` + +Schedule a 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" +``` + +## Tool-call equivalents (Gateway cron tool) + +For the canonical JSON shapes and examples, see [JSON schema for tool calls](/automation/cron-jobs#json-schema-for-tool-calls). + +## Where cron jobs are stored + +Cron jobs are persisted on the Gateway host at `~/.openclaw/cron/jobs.json` by default. +The Gateway loads the file into memory and writes it back on changes, so manual edits +are only safe when the Gateway is stopped. Prefer `openclaw cron add/edit` or the cron +tool call API for changes. + +## Beginner-friendly overview + +Think of a cron job as: **when** to run + **what** to do. + +1. **Choose a schedule** + - One-shot reminder → `schedule.kind = "at"` (CLI: `--at`) + - Repeating job → `schedule.kind = "every"` or `schedule.kind = "cron"` + - If your ISO timestamp omits a timezone, it is treated as **UTC**. + +2. **Choose where it runs** + - `sessionTarget: "main"` → run during the next heartbeat with main context. + - `sessionTarget: "isolated"` → run a dedicated agent turn in `cron:`. + +3. **Choose the payload** + - Main session → `payload.kind = "systemEvent"` + - Isolated session → `payload.kind = "agentTurn"` + +Optional: one-shot jobs (`schedule.kind = "at"`) delete after success by default. Set +`deleteAfterRun: false` to keep them (they will disable after success). + +## Concepts + +### Jobs + +A cron job is a stored record with: + +- a **schedule** (when it should run), +- a **payload** (what it should do), +- optional **delivery mode** (`announce`, `webhook`, or `none`). +- optional **agent binding** (`agentId`): run the job under a specific agent; if + missing or unknown, the gateway falls back to the default agent. + +Jobs are identified by a stable `jobId` (used by CLI/Gateway APIs). +In agent tool calls, `jobId` is canonical; legacy `id` is accepted for compatibility. +One-shot jobs auto-delete after success by default; set `deleteAfterRun: false` to keep them. + +### Schedules + +Cron supports three schedule kinds: + +- `at`: one-shot timestamp via `schedule.at` (ISO 8601). +- `every`: fixed interval (ms). +- `cron`: 5-field cron expression (or 6-field with seconds) with optional IANA timezone. + +Cron expressions use `croner`. If a timezone is omitted, the Gateway host’s +local timezone is used. + +To reduce top-of-hour load spikes across many gateways, OpenClaw applies a +deterministic per-job stagger window of up to 5 minutes for recurring +top-of-hour expressions (for example `0 * * * *`, `0 */2 * * *`). Fixed-hour +expressions such as `0 7 * * *` remain exact. + +For any cron schedule, you can set an explicit stagger window with `schedule.staggerMs` +(`0` keeps exact timing). CLI shortcuts: + +- `--stagger 30s` (or `1m`, `5m`) to set an explicit stagger window. +- `--exact` to force `staggerMs = 0`. + +### Main vs isolated execution + +#### Main session jobs (system events) + +Main jobs enqueue a system event and optionally wake the heartbeat runner. +They must use `payload.kind = "systemEvent"`. + +- `wakeMode: "now"` (default): event triggers an immediate heartbeat run. +- `wakeMode: "next-heartbeat"`: event waits for the next scheduled heartbeat. + +This is the best fit when you want the normal heartbeat prompt + main-session context. +See [Heartbeat](/gateway/heartbeat). + +#### Isolated jobs (dedicated cron sessions) + +Isolated jobs run a dedicated agent turn in session `cron:`. + +Key behaviors: + +- Prompt is prefixed with `[cron: ]` for traceability. +- Each run starts a **fresh session id** (no prior conversation carry-over). +- Default behavior: if `delivery` is omitted, isolated jobs announce a summary (`delivery.mode = "announce"`). +- `delivery.mode` chooses what happens: + - `announce`: deliver a summary to the target channel and post a brief summary to the main session. + - `webhook`: POST the finished event payload to `delivery.to` when the finished event includes a summary. + - `none`: internal only (no delivery, no main-session summary). +- `wakeMode` controls when the main-session summary posts: + - `now`: immediate heartbeat. + - `next-heartbeat`: waits for the next scheduled heartbeat. + +Use isolated jobs for noisy, frequent, or "background chores" that shouldn't spam +your main chat history. + +### Payload shapes (what runs) + +Two payload kinds are supported: + +- `systemEvent`: main-session only, routed through the heartbeat prompt. +- `agentTurn`: isolated-session only, runs a dedicated agent turn. + +Common `agentTurn` fields: + +- `message`: required text prompt. +- `model` / `thinking`: optional overrides (see below). +- `timeoutSeconds`: optional timeout override. + +Delivery config: + +- `delivery.mode`: `none` | `announce` | `webhook`. +- `delivery.channel`: `last` or a specific channel. +- `delivery.to`: channel-specific target (announce) or webhook URL (webhook mode). +- `delivery.bestEffort`: avoid failing the job if announce delivery fails. + +Announce delivery suppresses messaging tool sends for the run; use `delivery.channel`/`delivery.to` +to target the chat instead. When `delivery.mode = "none"`, no summary is posted to the main session. + +If `delivery` is omitted for isolated jobs, OpenClaw defaults to `announce`. + +#### Announce delivery flow + +When `delivery.mode = "announce"`, cron delivers directly via the outbound channel adapters. +The main agent is not spun up to craft or forward the message. + +Behavior details: + +- Content: delivery uses the isolated run's outbound payloads (text/media) with normal chunking and + channel formatting. +- Heartbeat-only responses (`HEARTBEAT_OK` with no real content) are not delivered. +- If the isolated run already sent a message to the same target via the message tool, delivery is + skipped to avoid duplicates. +- Missing or invalid delivery targets fail the job unless `delivery.bestEffort = true`. +- A short summary is posted to the main session only when `delivery.mode = "announce"`. +- The main-session summary respects `wakeMode`: `now` triggers an immediate heartbeat and + `next-heartbeat` waits for the next scheduled heartbeat. + +#### Webhook delivery flow + +When `delivery.mode = "webhook"`, cron posts the finished event payload to `delivery.to` when the finished event includes a summary. + +Behavior details: + +- The endpoint must be a valid HTTP(S) URL. +- No channel delivery is attempted in webhook mode. +- No main-session summary is posted in webhook mode. +- If `cron.webhookToken` is set, auth header is `Authorization: Bearer `. +- Deprecated fallback: stored legacy jobs with `notify: true` still post to `cron.webhook` (if configured), with a warning so you can migrate to `delivery.mode = "webhook"`. + +### Model and thinking overrides + +Isolated jobs (`agentTurn`) can override the model and thinking level: + +- `model`: Provider/model string (e.g., `anthropic/claude-sonnet-4-20250514`) or alias (e.g., `opus`) +- `thinking`: Thinking level (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`; GPT-5.2 + Codex models only) + +Note: You can set `model` on main-session jobs too, but it changes the shared main +session model. We recommend model overrides only for isolated jobs to avoid +unexpected context shifts. + +Resolution priority: + +1. Job payload override (highest) +2. Hook-specific defaults (e.g., `hooks.gmail.model`) +3. Agent config default + +### Delivery (channel + target) + +Isolated jobs can deliver output to a channel via the top-level `delivery` config: + +- `delivery.mode`: `announce` (channel delivery), `webhook` (HTTP POST), or `none`. +- `delivery.channel`: `whatsapp` / `telegram` / `discord` / `slack` / `mattermost` (plugin) / `signal` / `imessage` / `last`. +- `delivery.to`: channel-specific recipient target. + +`announce` delivery is only valid for isolated jobs (`sessionTarget: "isolated"`). +`webhook` delivery is valid for both main and isolated jobs. + +If `delivery.channel` or `delivery.to` is omitted, cron can fall back to the main session’s +“last route” (the last place the agent replied). + +Target format reminders: + +- Slack/Discord/Mattermost (plugin) targets should use explicit prefixes (e.g. `channel:`, `user:`) to avoid ambiguity. +- Telegram topics should use the `:topic:` form (see below). + +#### Telegram delivery targets (topics / forum threads) + +Telegram supports forum topics via `message_thread_id`. For cron delivery, you can encode +the topic/thread into the `to` field: + +- `-1001234567890` (chat id only) +- `-1001234567890:topic:123` (preferred: explicit topic marker) +- `-1001234567890:123` (shorthand: numeric suffix) + +Prefixed targets like `telegram:...` / `telegram:group:...` are also accepted: + +- `telegram:group:-1001234567890:topic:123` + +## JSON schema for tool calls + +Use these shapes when calling Gateway `cron.*` tools directly (agent tool calls or RPC). +CLI flags accept human durations like `20m`, but tool calls should use an ISO 8601 string +for `schedule.at` and milliseconds for `schedule.everyMs`. + +### cron.add params + +One-shot, main session job (system event): + +```json +{ + "name": "Reminder", + "schedule": { "kind": "at", "at": "2026-02-01T16:00:00Z" }, + "sessionTarget": "main", + "wakeMode": "now", + "payload": { "kind": "systemEvent", "text": "Reminder text" }, + "deleteAfterRun": true +} +``` + +Recurring, isolated job with delivery: + +```json +{ + "name": "Morning brief", + "schedule": { "kind": "cron", "expr": "0 7 * * *", "tz": "America/Los_Angeles" }, + "sessionTarget": "isolated", + "wakeMode": "next-heartbeat", + "payload": { + "kind": "agentTurn", + "message": "Summarize overnight updates." + }, + "delivery": { + "mode": "announce", + "channel": "slack", + "to": "channel:C1234567890", + "bestEffort": true + } +} +``` + +Notes: + +- `schedule.kind`: `at` (`at`), `every` (`everyMs`), or `cron` (`expr`, optional `tz`). +- `schedule.at` accepts ISO 8601 (timezone optional; treated as UTC when omitted). +- `everyMs` is milliseconds. +- `sessionTarget` must be `"main"` or `"isolated"` and must match `payload.kind`. +- Optional fields: `agentId`, `description`, `enabled`, `deleteAfterRun` (defaults to true for `at`), + `delivery`. +- `wakeMode` defaults to `"now"` when omitted. + +### cron.update params + +```json +{ + "jobId": "job-123", + "patch": { + "enabled": false, + "schedule": { "kind": "every", "everyMs": 3600000 } + } +} +``` + +Notes: + +- `jobId` is canonical; `id` is accepted for compatibility. +- Use `agentId: null` in the patch to clear an agent binding. + +### cron.run and cron.remove params + +```json +{ "jobId": "job-123", "mode": "force" } +``` + +```json +{ "jobId": "job-123" } +``` + +## Storage & history + +- Job store: `~/.openclaw/cron/jobs.json` (Gateway-managed JSON). +- Run history: `~/.openclaw/cron/runs/.jsonl` (JSONL, auto-pruned). +- Override store path: `cron.store` in config. + +## Configuration + +```json5 +{ + cron: { + enabled: true, // default true + store: "~/.openclaw/cron/jobs.json", + maxConcurrentRuns: 1, // default 1 + webhook: "https://example.invalid/legacy", // deprecated fallback for stored notify:true jobs + webhookToken: "replace-with-dedicated-webhook-token", // optional bearer token for webhook mode + }, +} +``` + +Webhook behavior: + +- Preferred: set `delivery.mode: "webhook"` with `delivery.to: "https://..."` per job. +- Webhook URLs must be valid `http://` or `https://` URLs. +- When posted, payload is the cron finished event JSON. +- If `cron.webhookToken` is set, auth header is `Authorization: Bearer `. +- If `cron.webhookToken` is not set, no `Authorization` header is sent. +- Deprecated fallback: stored legacy jobs with `notify: true` still use `cron.webhook` when present. + +Disable cron entirely: + +- `cron.enabled: false` (config) +- `OPENCLAW_SKIP_CRON=1` (env) + +## CLI quickstart + +One-shot reminder (UTC ISO, auto-delete after success): + +```bash +openclaw cron add \ + --name "Send reminder" \ + --at "2026-01-12T18:00:00Z" \ + --session main \ + --system-event "Reminder: submit expense report." \ + --wake now \ + --delete-after-run +``` + +One-shot reminder (main session, wake immediately): + +```bash +openclaw cron add \ + --name "Calendar check" \ + --at "20m" \ + --session main \ + --system-event "Next heartbeat: check calendar." \ + --wake now +``` + +Recurring isolated job (announce to WhatsApp): + +```bash +openclaw cron add \ + --name "Morning status" \ + --cron "0 7 * * *" \ + --tz "America/Los_Angeles" \ + --session isolated \ + --message "Summarize inbox + calendar for today." \ + --announce \ + --channel whatsapp \ + --to "+15551234567" +``` + +Recurring cron job with explicit 30-second stagger: + +```bash +openclaw cron add \ + --name "Minute watcher" \ + --cron "0 * * * * *" \ + --tz "UTC" \ + --stagger 30s \ + --session isolated \ + --message "Run minute watcher checks." \ + --announce +``` + +Recurring isolated job (deliver to a Telegram topic): + +```bash +openclaw cron add \ + --name "Nightly summary (topic)" \ + --cron "0 22 * * *" \ + --tz "America/Los_Angeles" \ + --session isolated \ + --message "Summarize today; send to the nightly topic." \ + --announce \ + --channel telegram \ + --to "-1001234567890:topic:123" +``` + +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 \ + --channel whatsapp \ + --to "+15551234567" +``` + +Agent selection (multi-agent setups): + +```bash +# Pin a job to agent "ops" (falls back to default if that agent is missing) +openclaw cron add --name "Ops sweep" --cron "0 6 * * *" --session isolated --message "Check ops queue" --agent ops + +# Switch or clear the agent on an existing job +openclaw cron edit --agent ops +openclaw cron edit --clear-agent +``` + +Manual run (force is the default, use `--due` to only run when due): + +```bash +openclaw cron run +openclaw cron run --due +``` + +Edit an existing job (patch fields): + +```bash +openclaw cron edit \ + --message "Updated prompt" \ + --model "opus" \ + --thinking low +``` + +Force an existing cron job to run exactly on schedule (no stagger): + +```bash +openclaw cron edit --exact +``` + +Run history: + +```bash +openclaw cron runs --id --limit 50 +``` + +Immediate system event without creating a job: + +```bash +openclaw system event --mode now --text "Next heartbeat: check battery." +``` + +## Gateway API surface + +- `cron.list`, `cron.status`, `cron.add`, `cron.update`, `cron.remove` +- `cron.run` (force or due), `cron.runs` + For immediate system events without a job, use [`openclaw system event`](/cli/system). + +## Troubleshooting + +### “Nothing runs” + +- Check cron is enabled: `cron.enabled` and `OPENCLAW_SKIP_CRON`. +- Check the Gateway is running continuously (cron runs inside the Gateway process). +- For `cron` schedules: confirm timezone (`--tz`) vs the host timezone. + +### A recurring job keeps delaying after failures + +- OpenClaw applies exponential retry backoff for recurring jobs after consecutive errors: + 30s, 1m, 5m, 15m, then 60m between retries. +- Backoff resets automatically after the next successful run. +- One-shot (`at`) jobs disable after a terminal run (`ok`, `error`, or `skipped`) and do not retry. + +### Telegram delivers to the wrong place + +- For forum topics, use `-100…:topic:` so it’s explicit and unambiguous. +- If you see `telegram:...` prefixes in logs or stored “last route” targets, that’s normal; + cron delivery accepts them and still parses topic IDs correctly. + +### Subagent announce delivery retries + +- When a subagent run completes, the gateway announces the result to the requester session. +- If the announce flow returns `false` (e.g. requester session is busy), the gateway retries up to 3 times with tracking via `announceRetryCount`. +- Announces older than 5 minutes past `endedAt` are force-expired to prevent stale entries from looping indefinitely. +- If you see repeated announce deliveries in logs, check the subagent registry for entries with high `announceRetryCount` values. diff --git a/docs/automation/cron-vs-heartbeat.md b/docs/automation/cron-vs-heartbeat.md new file mode 100644 index 0000000..c25cbcb --- /dev/null +++ b/docs/automation/cron-vs-heartbeat.md @@ -0,0 +1,286 @@ +--- +summary: "Guidance for choosing between heartbeat and cron jobs for automation" +read_when: + - Deciding how to schedule recurring tasks + - Setting up background monitoring or notifications + - Optimizing token usage for periodic checks +title: "Cron vs Heartbeat" +--- + +# Cron vs Heartbeat: When to Use Each + +Both heartbeats and cron jobs let you run tasks on a schedule. This guide helps you choose the right mechanism for your use case. + +## Quick Decision Guide + +| Use Case | Recommended | Why | +| ------------------------------------ | ------------------- | ---------------------------------------- | +| Check inbox every 30 min | Heartbeat | Batches with other checks, context-aware | +| Send daily report at 9am sharp | Cron (isolated) | Exact timing needed | +| Monitor calendar for upcoming events | Heartbeat | Natural fit for periodic awareness | +| Run weekly deep analysis | Cron (isolated) | Standalone task, can use different model | +| Remind me in 20 minutes | Cron (main, `--at`) | One-shot with precise timing | +| Background project health check | Heartbeat | Piggybacks on existing cycle | + +## Heartbeat: Periodic Awareness + +Heartbeats run in the **main session** at a regular interval (default: 30 min). They're designed for the agent to check on things and surface anything important. + +### When to use heartbeat + +- **Multiple periodic checks**: Instead of 5 separate cron jobs checking inbox, calendar, weather, notifications, and project status, a single heartbeat can batch all of these. +- **Context-aware decisions**: The agent has full main-session context, so it can make smart decisions about what's urgent vs. what can wait. +- **Conversational continuity**: Heartbeat runs share the same session, so the agent remembers recent conversations and can follow up naturally. +- **Low-overhead monitoring**: One heartbeat replaces many small polling tasks. + +### Heartbeat advantages + +- **Batches multiple checks**: One agent turn can review inbox, calendar, and notifications together. +- **Reduces API calls**: A single heartbeat is cheaper than 5 isolated cron jobs. +- **Context-aware**: The agent knows what you've been working on and can prioritize accordingly. +- **Smart suppression**: If nothing needs attention, the agent replies `HEARTBEAT_OK` and no message is delivered. +- **Natural timing**: Drifts slightly based on queue load, which is fine for most monitoring. + +### Heartbeat example: HEARTBEAT.md checklist + +```md +# Heartbeat checklist + +- Check email for urgent messages +- Review calendar for events in next 2 hours +- If a background task finished, summarize results +- If idle for 8+ hours, send a brief check-in +``` + +The agent reads this on each heartbeat and handles all items in one turn. + +### Configuring heartbeat + +```json5 +{ + agents: { + defaults: { + heartbeat: { + every: "30m", // interval + target: "last", // where to deliver alerts + activeHours: { start: "08:00", end: "22:00" }, // optional + }, + }, + }, +} +``` + +See [Heartbeat](/gateway/heartbeat) for full configuration. + +## Cron: Precise Scheduling + +Cron jobs run at precise times and can run in isolated sessions without affecting main context. +Recurring top-of-hour schedules are automatically spread by a deterministic +per-job offset in a 0-5 minute window. + +### When to use cron + +- **Exact timing required**: "Send this at 9:00 AM every Monday" (not "sometime around 9"). +- **Standalone tasks**: Tasks that don't need conversational context. +- **Different model/thinking**: Heavy analysis that warrants a more powerful model. +- **One-shot reminders**: "Remind me in 20 minutes" with `--at`. +- **Noisy/frequent tasks**: Tasks that would clutter main session history. +- **External triggers**: Tasks that should run independently of whether the agent is otherwise active. + +### Cron advantages + +- **Precise timing**: 5-field or 6-field (seconds) cron expressions with timezone support. +- **Built-in load spreading**: recurring top-of-hour schedules are staggered by up to 5 minutes by default. +- **Per-job control**: override stagger with `--stagger ` or force exact timing with `--exact`. +- **Session isolation**: Runs in `cron:` without polluting main history. +- **Model overrides**: Use a cheaper or more powerful model per job. +- **Delivery control**: Isolated jobs default to `announce` (summary); choose `none` as needed. +- **Immediate delivery**: Announce mode posts directly without waiting for heartbeat. +- **No agent context needed**: Runs even if main session is idle or compacted. +- **One-shot support**: `--at` for precise future timestamps. + +### Cron example: Daily morning briefing + +```bash +openclaw cron add \ + --name "Morning briefing" \ + --cron "0 7 * * *" \ + --tz "America/New_York" \ + --session isolated \ + --message "Generate today's briefing: weather, calendar, top emails, news summary." \ + --model opus \ + --announce \ + --channel whatsapp \ + --to "+15551234567" +``` + +This runs at exactly 7:00 AM New York time, uses Opus for quality, and announces a summary directly to WhatsApp. + +### Cron example: One-shot reminder + +```bash +openclaw cron add \ + --name "Meeting reminder" \ + --at "20m" \ + --session main \ + --system-event "Reminder: standup meeting starts in 10 minutes." \ + --wake now \ + --delete-after-run +``` + +See [Cron jobs](/automation/cron-jobs) for full CLI reference. + +## Decision Flowchart + +``` +Does the task need to run at an EXACT time? + YES -> Use cron + NO -> Continue... + +Does the task need isolation from main session? + YES -> Use cron (isolated) + NO -> Continue... + +Can this task be batched with other periodic checks? + YES -> Use heartbeat (add to HEARTBEAT.md) + NO -> Use cron + +Is this a one-shot reminder? + YES -> Use cron with --at + NO -> Continue... + +Does it need a different model or thinking level? + YES -> Use cron (isolated) with --model/--thinking + NO -> Use heartbeat +``` + +## Combining Both + +The most efficient setup uses **both**: + +1. **Heartbeat** handles routine monitoring (inbox, calendar, notifications) in one batched turn every 30 minutes. +2. **Cron** handles precise schedules (daily reports, weekly reviews) and one-shot reminders. + +### Example: Efficient automation setup + +**HEARTBEAT.md** (checked every 30 min): + +```md +# Heartbeat checklist + +- Scan inbox for urgent emails +- Check calendar for events in next 2h +- Review any pending tasks +- Light check-in if quiet for 8+ hours +``` + +**Cron jobs** (precise timing): + +```bash +# Daily morning briefing at 7am +openclaw cron add --name "Morning brief" --cron "0 7 * * *" --session isolated --message "..." --announce + +# Weekly project review on Mondays at 9am +openclaw cron add --name "Weekly review" --cron "0 9 * * 1" --session isolated --message "..." --model opus + +# One-shot reminder +openclaw cron add --name "Call back" --at "2h" --session main --system-event "Call back the client" --wake now +``` + +## Lobster: Deterministic workflows with approvals + +Lobster is the workflow runtime for **multi-step tool pipelines** that need deterministic execution and explicit approvals. +Use it when the task is more than a single agent turn, and you want a resumable workflow with human checkpoints. + +### When Lobster fits + +- **Multi-step automation**: You need a fixed pipeline of tool calls, not a one-off prompt. +- **Approval gates**: Side effects should pause until you approve, then resume. +- **Resumable runs**: Continue a paused workflow without re-running earlier steps. + +### How it pairs with heartbeat and cron + +- **Heartbeat/cron** decide _when_ a run happens. +- **Lobster** defines _what steps_ happen once the run starts. + +For scheduled workflows, use cron or heartbeat to trigger an agent turn that calls Lobster. +For ad-hoc workflows, call Lobster directly. + +### Operational notes (from the code) + +- Lobster runs as a **local subprocess** (`lobster` CLI) in tool mode and returns a **JSON envelope**. +- If the tool returns `needs_approval`, you resume with a `resumeToken` and `approve` flag. +- The tool is an **optional plugin**; enable it additively via `tools.alsoAllow: ["lobster"]` (recommended). +- Lobster expects the `lobster` CLI to be available on `PATH`. + +See [Lobster](/tools/lobster) for full usage and examples. + +## Main Session vs Isolated Session + +Both heartbeat and cron can interact with the main session, but differently: + +| | Heartbeat | Cron (main) | Cron (isolated) | +| ------- | ------------------------------- | ------------------------ | -------------------------- | +| Session | Main | Main (via system event) | `cron:` | +| History | Shared | Shared | Fresh each run | +| Context | Full | Full | None (starts clean) | +| Model | Main session model | Main session model | Can override | +| Output | Delivered if not `HEARTBEAT_OK` | Heartbeat prompt + event | Announce summary (default) | + +### When to use main session cron + +Use `--session main` with `--system-event` when you want: + +- The reminder/event to appear in main session context +- The agent to handle it during the next heartbeat with full context +- No separate isolated run + +```bash +openclaw cron add \ + --name "Check project" \ + --every "4h" \ + --session main \ + --system-event "Time for a project health check" \ + --wake now +``` + +### When to use isolated cron + +Use `--session isolated` when you want: + +- A clean slate without prior context +- Different model or thinking settings +- Announce summaries directly to a channel +- History that doesn't clutter main session + +```bash +openclaw cron add \ + --name "Deep analysis" \ + --cron "0 6 * * 0" \ + --session isolated \ + --message "Weekly codebase analysis..." \ + --model opus \ + --thinking high \ + --announce +``` + +## Cost Considerations + +| Mechanism | Cost Profile | +| --------------- | ------------------------------------------------------- | +| Heartbeat | One turn every N minutes; scales with HEARTBEAT.md size | +| Cron (main) | Adds event to next heartbeat (no isolated turn) | +| Cron (isolated) | Full agent turn per job; can use cheaper model | + +**Tips**: + +- Keep `HEARTBEAT.md` small to minimize token overhead. +- Batch similar checks into heartbeat instead of multiple cron jobs. +- Use `target: "none"` on heartbeat if you only want internal processing. +- Use isolated cron with a cheaper model for routine tasks. + +## Related + +- [Heartbeat](/gateway/heartbeat) - full heartbeat configuration +- [Cron jobs](/automation/cron-jobs) - full cron CLI and API reference +- [System](/cli/system) - system events + heartbeat controls diff --git a/docs/automation/gmail-pubsub.md b/docs/automation/gmail-pubsub.md new file mode 100644 index 0000000..b853b99 --- /dev/null +++ b/docs/automation/gmail-pubsub.md @@ -0,0 +1,256 @@ +--- +summary: "Gmail Pub/Sub push wired into OpenClaw webhooks via gogcli" +read_when: + - Wiring Gmail inbox triggers to OpenClaw + - Setting up Pub/Sub push for agent wake +title: "Gmail PubSub" +--- + +# Gmail Pub/Sub -> OpenClaw + +Goal: Gmail watch -> Pub/Sub push -> `gog gmail watch serve` -> OpenClaw webhook. + +## Prereqs + +- `gcloud` installed and logged in ([install guide](https://docs.cloud.google.com/sdk/docs/install-sdk)). +- `gog` (gogcli) installed and authorized for the Gmail account ([gogcli.sh](https://gogcli.sh/)). +- OpenClaw hooks enabled (see [Webhooks](/automation/webhook)). +- `tailscale` logged in ([tailscale.com](https://tailscale.com/)). Supported setup uses Tailscale Funnel for the public HTTPS endpoint. + Other tunnel services can work, but are DIY/unsupported and require manual wiring. + Right now, Tailscale is what we support. + +Example hook config (enable Gmail preset mapping): + +```json5 +{ + hooks: { + enabled: true, + token: "OPENCLAW_HOOK_TOKEN", + path: "/hooks", + presets: ["gmail"], + }, +} +``` + +To deliver the Gmail summary to a chat surface, override the preset with a mapping +that sets `deliver` + optional `channel`/`to`: + +```json5 +{ + hooks: { + enabled: true, + token: "OPENCLAW_HOOK_TOKEN", + presets: ["gmail"], + mappings: [ + { + match: { path: "gmail" }, + action: "agent", + wakeMode: "now", + name: "Gmail", + sessionKey: "hook:gmail:{{messages[0].id}}", + messageTemplate: "New email from {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}\n{{messages[0].body}}", + model: "openai/gpt-5.2-mini", + deliver: true, + channel: "last", + // to: "+15551234567" + }, + ], + }, +} +``` + +If you want a fixed channel, set `channel` + `to`. Otherwise `channel: "last"` +uses the last delivery route (falls back to WhatsApp). + +To force a cheaper model for Gmail runs, set `model` in the mapping +(`provider/model` or alias). If you enforce `agents.defaults.models`, include it there. + +To set a default model and thinking level specifically for Gmail hooks, add +`hooks.gmail.model` / `hooks.gmail.thinking` in your config: + +```json5 +{ + hooks: { + gmail: { + model: "openrouter/meta-llama/llama-3.3-70b-instruct:free", + thinking: "off", + }, + }, +} +``` + +Notes: + +- Per-hook `model`/`thinking` in the mapping still overrides these defaults. +- Fallback order: `hooks.gmail.model` → `agents.defaults.model.fallbacks` → primary (auth/rate-limit/timeouts). +- If `agents.defaults.models` is set, the Gmail model must be in the allowlist. +- Gmail hook content is wrapped with external-content safety boundaries by default. + To disable (dangerous), set `hooks.gmail.allowUnsafeExternalContent: true`. + +To customize payload handling further, add `hooks.mappings` or a JS/TS transform module +under `~/.openclaw/hooks/transforms` (see [Webhooks](/automation/webhook)). + +## Wizard (recommended) + +Use the OpenClaw helper to wire everything together (installs deps on macOS via brew): + +```bash +openclaw webhooks gmail setup \ + --account openclaw@gmail.com +``` + +Defaults: + +- Uses Tailscale Funnel for the public push endpoint. +- Writes `hooks.gmail` config for `openclaw webhooks gmail run`. +- Enables the Gmail hook preset (`hooks.presets: ["gmail"]`). + +Path note: when `tailscale.mode` is enabled, OpenClaw automatically sets +`hooks.gmail.serve.path` to `/` and keeps the public path at +`hooks.gmail.tailscale.path` (default `/gmail-pubsub`) because Tailscale +strips the set-path prefix before proxying. +If you need the backend to receive the prefixed path, set +`hooks.gmail.tailscale.target` (or `--tailscale-target`) to a full URL like +`http://127.0.0.1:8788/gmail-pubsub` and match `hooks.gmail.serve.path`. + +Want a custom endpoint? Use `--push-endpoint ` or `--tailscale off`. + +Platform note: on macOS the wizard installs `gcloud`, `gogcli`, and `tailscale` +via Homebrew; on Linux install them manually first. + +Gateway auto-start (recommended): + +- 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 (useful if you run the daemon yourself). +- Do not run the manual daemon at the same time, or you will hit + `listen tcp 127.0.0.1:8788: bind: address already in use`. + +Manual daemon (starts `gog gmail watch serve` + auto-renew): + +```bash +openclaw webhooks gmail run +``` + +## One-time setup + +1. Select the GCP project **that owns the OAuth client** used by `gog`. + +```bash +gcloud auth login +gcloud config set project +``` + +Note: Gmail watch requires the Pub/Sub topic to live in the same project as the OAuth client. + +2. Enable APIs: + +```bash +gcloud services enable gmail.googleapis.com pubsub.googleapis.com +``` + +3. Create a topic: + +```bash +gcloud pubsub topics create gog-gmail-watch +``` + +4. Allow Gmail push to publish: + +```bash +gcloud pubsub topics add-iam-policy-binding gog-gmail-watch \ + --member=serviceAccount:gmail-api-push@system.gserviceaccount.com \ + --role=roles/pubsub.publisher +``` + +## Start the watch + +```bash +gog gmail watch start \ + --account openclaw@gmail.com \ + --label INBOX \ + --topic projects//topics/gog-gmail-watch +``` + +Save the `history_id` from the output (for debugging). + +## Run the push handler + +Local example (shared token auth): + +```bash +gog gmail watch serve \ + --account openclaw@gmail.com \ + --bind 127.0.0.1 \ + --port 8788 \ + --path /gmail-pubsub \ + --token \ + --hook-url http://127.0.0.1:18789/hooks/gmail \ + --hook-token OPENCLAW_HOOK_TOKEN \ + --include-body \ + --max-bytes 20000 +``` + +Notes: + +- `--token` protects the push endpoint (`x-gog-token` or `?token=`). +- `--hook-url` points to OpenClaw `/hooks/gmail` (mapped; isolated run + summary to main). +- `--include-body` and `--max-bytes` control the body snippet sent to OpenClaw. + +Recommended: `openclaw webhooks gmail run` wraps the same flow and auto-renews the watch. + +## Expose the handler (advanced, unsupported) + +If you need a non-Tailscale tunnel, wire it manually and use the public URL in the push +subscription (unsupported, no guardrails): + +```bash +cloudflared tunnel --url http://127.0.0.1:8788 --no-autoupdate +``` + +Use the generated URL as the push endpoint: + +```bash +gcloud pubsub subscriptions create gog-gmail-watch-push \ + --topic gog-gmail-watch \ + --push-endpoint "https:///gmail-pubsub?token=" +``` + +Production: use a stable HTTPS endpoint and configure Pub/Sub OIDC JWT, then run: + +```bash +gog gmail watch serve --verify-oidc --oidc-email +``` + +## Test + +Send a message to the watched inbox: + +```bash +gog gmail send \ + --account openclaw@gmail.com \ + --to openclaw@gmail.com \ + --subject "watch test" \ + --body "ping" +``` + +Check watch state and history: + +```bash +gog gmail watch status --account openclaw@gmail.com +gog gmail history --account openclaw@gmail.com --since +``` + +## Troubleshooting + +- `Invalid topicName`: project mismatch (topic not in the OAuth client project). +- `User not authorized`: missing `roles/pubsub.publisher` on the topic. +- Empty messages: Gmail push only provides `historyId`; fetch via `gog gmail history`. + +## Cleanup + +```bash +gog gmail watch stop --account openclaw@gmail.com +gcloud pubsub subscriptions delete gog-gmail-watch-push +gcloud pubsub topics delete gog-gmail-watch +``` diff --git a/docs/automation/hooks.md b/docs/automation/hooks.md new file mode 100644 index 0000000..66b96cd --- /dev/null +++ b/docs/automation/hooks.md @@ -0,0 +1,1001 @@ +--- +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 provide an extensible event-driven system for automating actions in response to agent commands and events. Hooks are automatically discovered from directories and can be managed via CLI commands, similar to how skills work in OpenClaw. + +## Getting Oriented + +Hooks are small scripts that run when something happens. There are two kinds: + +- **Hooks** (this page): run inside the Gateway when agent events fire, like `/new`, `/reset`, `/stop`, or lifecycle events. +- **Webhooks**: external HTTP webhooks that let other systems trigger work in OpenClaw. See [Webhook Hooks](/automation/webhook) or use `openclaw webhooks` for Gmail helper commands. + +Hooks can also be bundled inside plugins; see [Plugins](/tools/plugin#plugin-hooks). + +Common uses: + +- Save a memory snapshot when you reset a session +- Keep an audit trail of commands for troubleshooting or compliance +- Trigger follow-up automation when a session starts or ends +- Write files into the agent workspace or call external APIs when events fire + +If you can write a small TypeScript function, you can write a hook. Hooks are discovered automatically, and you enable or disable them via the CLI. + +## Overview + +The hooks system allows you to: + +- Save session context to memory when `/new` is issued +- Log all commands for auditing +- Trigger custom automations on agent lifecycle events +- Extend OpenClaw's behavior without modifying core code + +## Getting Started + +### Bundled Hooks + +OpenClaw ships with four bundled hooks that are automatically discovered: + +- **💾 session-memory**: Saves session context to your agent workspace (default `~/.openclaw/workspace/memory/`) when you issue `/new` +- **📎 bootstrap-extra-files**: Injects additional workspace bootstrap files from configured glob/path patterns during `agent:bootstrap` +- **📝 command-logger**: Logs all command events to `~/.openclaw/logs/commands.log` +- **🚀 boot-md**: Runs `BOOT.md` when the gateway starts (requires internal hooks enabled) + +List available hooks: + +```bash +openclaw hooks list +``` + +Enable a hook: + +```bash +openclaw hooks enable session-memory +``` + +Check hook status: + +```bash +openclaw hooks check +``` + +Get detailed information: + +```bash +openclaw hooks info session-memory +``` + +### Onboarding + +During onboarding (`openclaw onboard`), you'll be prompted to enable recommended hooks. The wizard automatically discovers eligible hooks and presents them for selection. + +## Hook Discovery + +Hooks are automatically discovered from three directories (in order of precedence): + +1. **Workspace hooks**: `/hooks/` (per-agent, highest precedence) +2. **Managed hooks**: `~/.openclaw/hooks/` (user-installed, shared across workspaces) +3. **Bundled hooks**: `/dist/hooks/bundled/` (shipped with OpenClaw) + +Managed hook directories can be either a **single hook** or a **hook pack** (package directory). + +Each hook is a directory containing: + +``` +my-hook/ +├── HOOK.md # Metadata + documentation +└── handler.ts # Handler implementation +``` + +## Hook Packs (npm/archives) + +Hook packs are standard npm packages that export one or more hooks via `openclaw.hooks` in +`package.json`. Install them with: + +```bash +openclaw hooks install +``` + +Npm specs are registry-only (package name + optional version/tag). Git/URL/file specs are rejected. + +Example `package.json`: + +```json +{ + "name": "@acme/my-hooks", + "version": "0.1.0", + "openclaw": { + "hooks": ["./hooks/my-hook", "./hooks/other-hook"] + } +} +``` + +Each entry points to a hook directory containing `HOOK.md` and `handler.ts` (or `index.ts`). +Hook packs can ship dependencies; they will be installed under `~/.openclaw/hooks/`. +Each `openclaw.hooks` entry must stay inside the package directory after symlink +resolution; entries that escape are rejected. + +Security note: `openclaw hooks install` installs dependencies with `npm install --ignore-scripts` +(no lifecycle scripts). Keep hook pack dependency trees "pure JS/TS" and avoid packages that rely +on `postinstall` builds. + +## Hook Structure + +### HOOK.md Format + +The `HOOK.md` file contains metadata in YAML frontmatter plus Markdown documentation: + +```markdown +--- +name: my-hook +description: "Short description of what this hook does" +homepage: https://docs.openclaw.ai/automation/hooks#my-hook +metadata: + { "openclaw": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } } +--- + +# My Hook + +Detailed documentation goes here... + +## What It Does + +- Listens for `/new` commands +- Performs some action +- Logs the result + +## Requirements + +- Node.js must be installed + +## Configuration + +No configuration needed. +``` + +### Metadata Fields + +The `metadata.openclaw` object supports: + +- **`emoji`**: Display emoji for CLI (e.g., `"💾"`) +- **`events`**: Array of events to listen for (e.g., `["command:new", "command:reset"]`) +- **`export`**: Named export to use (defaults to `"default"`) +- **`homepage`**: Documentation URL +- **`requires`**: Optional requirements + - **`bins`**: Required binaries on PATH (e.g., `["git", "node"]`) + - **`anyBins`**: At least one of these binaries must be present + - **`env`**: Required environment variables + - **`config`**: Required config paths (e.g., `["workspace.dir"]`) + - **`os`**: Required platforms (e.g., `["darwin", "linux"]`) +- **`always`**: Bypass eligibility checks (boolean) +- **`install`**: Installation methods (for bundled hooks: `[{"id":"bundled","kind":"bundled"}]`) + +### Handler Implementation + +The `handler.ts` file exports a `HookHandler` function: + +```typescript +import type { HookHandler } from "../../src/hooks/hooks.js"; + +const myHandler: HookHandler = async (event) => { + // Only trigger on 'new' command + if (event.type !== "command" || event.action !== "new") { + return; + } + + console.log(`[my-hook] New command triggered`); + console.log(` Session: ${event.sessionKey}`); + console.log(` Timestamp: ${event.timestamp.toISOString()}`); + + // Your custom logic here + + // Optionally send message to user + event.messages.push("✨ My hook executed!"); +}; + +export default myHandler; +``` + +#### Event Context + +Each event includes: + +```typescript +{ + type: 'command' | 'session' | 'agent' | 'gateway' | 'message', + action: string, // e.g., 'new', 'reset', 'stop', 'received', 'sent' + sessionKey: string, // Session identifier + timestamp: Date, // When the event occurred + messages: string[], // Push messages here to send to user + context: { + // Command events: + sessionEntry?: SessionEntry, + sessionId?: string, + sessionFile?: string, + commandSource?: string, // e.g., 'whatsapp', 'telegram' + senderId?: string, + workspaceDir?: string, + bootstrapFiles?: WorkspaceBootstrapFile[], + cfg?: OpenClawConfig, + // Message events (see Message Events section for full details): + from?: string, // message:received + to?: string, // message:sent + content?: string, + channelId?: string, + success?: boolean, // message:sent + } +} +``` + +## Event Types + +### Command Events + +Triggered when agent commands are issued: + +- **`command`**: All command events (general listener) +- **`command:new`**: When `/new` command is issued +- **`command:reset`**: When `/reset` command is issued +- **`command:stop`**: When `/stop` command is issued + +### Agent Events + +- **`agent:bootstrap`**: Before workspace bootstrap files are injected (hooks may mutate `context.bootstrapFiles`) + +### Gateway Events + +Triggered when the gateway starts: + +- **`gateway:startup`**: After channels start and hooks are loaded + +### Message Events + +Triggered when messages are received or sent: + +- **`message`**: All message events (general listener) +- **`message:received`**: When an inbound message is received from any channel +- **`message:sent`**: When an outbound message is successfully sent + +#### Message Event Context + +Message events include rich context about the message: + +```typescript +// message:received context +{ + from: string, // Sender identifier (phone number, user ID, etc.) + content: string, // Message content + timestamp?: number, // Unix timestamp when received + channelId: string, // Channel (e.g., "whatsapp", "telegram", "discord") + accountId?: string, // Provider account ID for multi-account setups + conversationId?: string, // Chat/conversation ID + messageId?: string, // Message ID from the provider + metadata?: { // Additional provider-specific data + to?: string, + provider?: string, + surface?: string, + threadId?: string, + senderId?: string, + senderName?: string, + senderUsername?: string, + senderE164?: string, + } +} + +// message:sent context +{ + to: string, // Recipient identifier + content: string, // Message content that was sent + success: boolean, // Whether the send succeeded + error?: string, // Error message if sending failed + channelId: string, // Channel (e.g., "whatsapp", "telegram", "discord") + accountId?: string, // Provider account ID + conversationId?: string, // Chat/conversation ID + messageId?: string, // Message ID returned by the provider +} +``` + +#### Example: Message Logger Hook + +```typescript +import type { HookHandler } from "../../src/hooks/hooks.js"; +import { isMessageReceivedEvent, isMessageSentEvent } from "../../src/hooks/internal-hooks.js"; + +const handler: HookHandler = async (event) => { + if (isMessageReceivedEvent(event)) { + console.log(`[message-logger] Received from ${event.context.from}: ${event.context.content}`); + } else if (isMessageSentEvent(event)) { + console.log(`[message-logger] Sent to ${event.context.to}: ${event.context.content}`); + } +}; + +export default handler; +``` + +### Tool Result Hooks (Plugin API) + +These hooks are not event-stream listeners; they let plugins synchronously adjust tool results before OpenClaw persists them. + +- **`tool_result_persist`**: transform tool results before they are written to the session transcript. Must be synchronous; return the updated tool result payload or `undefined` to keep it as-is. See [Agent Loop](/concepts/agent-loop). + +### Future Events + +Planned event types: + +- **`session:start`**: When a new session begins +- **`session:end`**: When a session ends +- **`agent:error`**: When an agent encounters an error + +## Creating Custom Hooks + +### 1. Choose Location + +- **Workspace hooks** (`/hooks/`): Per-agent, highest precedence +- **Managed hooks** (`~/.openclaw/hooks/`): Shared across workspaces + +### 2. Create Directory Structure + +```bash +mkdir -p ~/.openclaw/hooks/my-hook +cd ~/.openclaw/hooks/my-hook +``` + +### 3. Create HOOK.md + +```markdown +--- +name: my-hook +description: "Does something useful" +metadata: { "openclaw": { "emoji": "🎯", "events": ["command:new"] } } +--- + +# My Custom Hook + +This hook does something useful when you issue `/new`. +``` + +### 4. Create handler.ts + +```typescript +import type { HookHandler } from "../../src/hooks/hooks.js"; + +const handler: HookHandler = async (event) => { + if (event.type !== "command" || event.action !== "new") { + return; + } + + console.log("[my-hook] Running!"); + // Your logic here +}; + +export default handler; +``` + +### 5. Enable and Test + +```bash +# Verify hook is discovered +openclaw hooks list + +# Enable it +openclaw hooks enable my-hook + +# Restart your gateway process (menu bar app restart on macOS, or restart your dev process) + +# Trigger the event +# Send /new via your messaging channel +``` + +## Configuration + +### New Config Format (Recommended) + +```json +{ + "hooks": { + "internal": { + "enabled": true, + "entries": { + "session-memory": { "enabled": true }, + "command-logger": { "enabled": false } + } + } + } +} +``` + +### Per-Hook Configuration + +Hooks can have custom configuration: + +```json +{ + "hooks": { + "internal": { + "enabled": true, + "entries": { + "my-hook": { + "enabled": true, + "env": { + "MY_CUSTOM_VAR": "value" + } + } + } + } + } +} +``` + +### Extra Directories + +Load hooks from additional directories: + +```json +{ + "hooks": { + "internal": { + "enabled": true, + "load": { + "extraDirs": ["/path/to/more/hooks"] + } + } + } +} +``` + +### Legacy Config Format (Still Supported) + +The old config format still works for backwards compatibility: + +```json +{ + "hooks": { + "internal": { + "enabled": true, + "handlers": [ + { + "event": "command:new", + "module": "./hooks/handlers/my-handler.ts", + "export": "default" + } + ] + } + } +} +``` + +Note: `module` must be a workspace-relative path. Absolute paths and traversal outside the workspace are rejected. + +**Migration**: Use the new discovery-based system for new hooks. Legacy handlers are loaded after directory-based hooks. + +## CLI Commands + +### List Hooks + +```bash +# List all hooks +openclaw hooks list + +# Show only eligible hooks +openclaw hooks list --eligible + +# Verbose output (show missing requirements) +openclaw hooks list --verbose + +# JSON output +openclaw hooks list --json +``` + +### Hook Information + +```bash +# Show detailed info about a hook +openclaw hooks info session-memory + +# JSON output +openclaw hooks info session-memory --json +``` + +### Check Eligibility + +```bash +# Show eligibility summary +openclaw hooks check + +# JSON output +openclaw hooks check --json +``` + +### Enable/Disable + +```bash +# Enable a hook +openclaw hooks enable session-memory + +# Disable a hook +openclaw hooks disable command-logger +``` + +## Bundled hook reference + +### session-memory + +Saves session context to memory when you issue `/new`. + +**Events**: `command:new` + +**Requirements**: `workspace.dir` must be configured + +**Output**: `/memory/YYYY-MM-DD-slug.md` (defaults to `~/.openclaw/workspace`) + +**What it does**: + +1. Uses the pre-reset session entry to locate the correct transcript +2. Extracts the last 15 lines of conversation +3. Uses LLM to generate a descriptive filename slug +4. Saves session metadata to a dated memory file + +**Example output**: + +```markdown +# Session: 2026-01-16 14:30:00 UTC + +- **Session Key**: agent:main:main +- **Session ID**: abc123def456 +- **Source**: telegram +``` + +**Filename examples**: + +- `2026-01-16-vendor-pitch.md` +- `2026-01-16-api-design.md` +- `2026-01-16-1430.md` (fallback timestamp if slug generation fails) + +**Enable**: + +```bash +openclaw hooks enable session-memory +``` + +### bootstrap-extra-files + +Injects additional bootstrap files (for example monorepo-local `AGENTS.md` / `TOOLS.md`) during `agent:bootstrap`. + +**Events**: `agent:bootstrap` + +**Requirements**: `workspace.dir` must be configured + +**Output**: No files written; bootstrap context is modified in-memory only. + +**Config**: + +```json +{ + "hooks": { + "internal": { + "enabled": true, + "entries": { + "bootstrap-extra-files": { + "enabled": true, + "paths": ["packages/*/AGENTS.md", "packages/*/TOOLS.md"] + } + } + } + } +} +``` + +**Notes**: + +- Paths are resolved relative to workspace. +- Files must stay inside workspace (realpath-checked). +- Only recognized bootstrap basenames are loaded. +- Subagent allowlist is preserved (`AGENTS.md` and `TOOLS.md` only). + +**Enable**: + +```bash +openclaw hooks enable bootstrap-extra-files +``` + +### command-logger + +Logs all command events to a centralized audit file. + +**Events**: `command` + +**Requirements**: None + +**Output**: `~/.openclaw/logs/commands.log` + +**What it does**: + +1. Captures event details (command action, timestamp, session key, sender ID, source) +2. Appends to log file in JSONL format +3. Runs silently in the background + +**Example log entries**: + +```jsonl +{"timestamp":"2026-01-16T14:30:00.000Z","action":"new","sessionKey":"agent:main:main","senderId":"+1234567890","source":"telegram"} +{"timestamp":"2026-01-16T15:45:22.000Z","action":"stop","sessionKey":"agent:main:main","senderId":"user@example.com","source":"whatsapp"} +``` + +**View logs**: + +```bash +# View recent commands +tail -n 20 ~/.openclaw/logs/commands.log + +# Pretty-print with jq +cat ~/.openclaw/logs/commands.log | jq . + +# Filter by action +grep '"action":"new"' ~/.openclaw/logs/commands.log | jq . +``` + +**Enable**: + +```bash +openclaw hooks enable command-logger +``` + +### boot-md + +Runs `BOOT.md` when the gateway starts (after channels start). +Internal hooks must be enabled for this to run. + +**Events**: `gateway:startup` + +**Requirements**: `workspace.dir` must be configured + +**What it does**: + +1. Reads `BOOT.md` from your workspace +2. Runs the instructions via the agent runner +3. Sends any requested outbound messages via the message tool + +**Enable**: + +```bash +openclaw hooks enable boot-md +``` + +## Best Practices + +### Keep Handlers Fast + +Hooks run during command processing. Keep them lightweight: + +```typescript +// ✓ Good - async work, returns immediately +const handler: HookHandler = async (event) => { + void processInBackground(event); // Fire and forget +}; + +// ✗ Bad - blocks command processing +const handler: HookHandler = async (event) => { + await slowDatabaseQuery(event); + await evenSlowerAPICall(event); +}; +``` + +### Handle Errors Gracefully + +Always wrap risky operations: + +```typescript +const handler: HookHandler = async (event) => { + try { + await riskyOperation(event); + } catch (err) { + console.error("[my-handler] Failed:", err instanceof Error ? err.message : String(err)); + // Don't throw - let other handlers run + } +}; +``` + +### Filter Events Early + +Return early if the event isn't relevant: + +```typescript +const handler: HookHandler = async (event) => { + // Only handle 'new' commands + if (event.type !== "command" || event.action !== "new") { + return; + } + + // Your logic here +}; +``` + +### Use Specific Event Keys + +Specify exact events in metadata when possible: + +```yaml +metadata: { "openclaw": { "events": ["command:new"] } } # Specific +``` + +Rather than: + +```yaml +metadata: { "openclaw": { "events": ["command"] } } # General - more overhead +``` + +## Debugging + +### Enable Hook Logging + +The gateway logs hook loading at startup: + +``` +Registered hook: session-memory -> command:new +Registered hook: bootstrap-extra-files -> agent:bootstrap +Registered hook: command-logger -> command +Registered hook: boot-md -> gateway:startup +``` + +### Check Discovery + +List all discovered hooks: + +```bash +openclaw hooks list --verbose +``` + +### Check Registration + +In your handler, log when it's called: + +```typescript +const handler: HookHandler = async (event) => { + console.log("[my-handler] Triggered:", event.type, event.action); + // Your logic +}; +``` + +### Verify Eligibility + +Check why a hook isn't eligible: + +```bash +openclaw hooks info my-hook +``` + +Look for missing requirements in the output. + +## Testing + +### Gateway Logs + +Monitor gateway logs to see hook execution: + +```bash +# macOS +./scripts/clawlog.sh -f + +# Other platforms +tail -f ~/.openclaw/gateway.log +``` + +### Test Hooks Directly + +Test your handlers in isolation: + +```typescript +import { test } from "vitest"; +import { createHookEvent } from "./src/hooks/hooks.js"; +import myHandler from "./hooks/my-hook/handler.js"; + +test("my handler works", async () => { + const event = createHookEvent("command", "new", "test-session", { + foo: "bar", + }); + + await myHandler(event); + + // Assert side effects +}); +``` + +## Architecture + +### Core Components + +- **`src/hooks/types.ts`**: Type definitions +- **`src/hooks/workspace.ts`**: Directory scanning and loading +- **`src/hooks/frontmatter.ts`**: HOOK.md metadata parsing +- **`src/hooks/config.ts`**: Eligibility checking +- **`src/hooks/hooks-status.ts`**: Status reporting +- **`src/hooks/loader.ts`**: Dynamic module loader +- **`src/cli/hooks-cli.ts`**: CLI commands +- **`src/gateway/server-startup.ts`**: Loads hooks at gateway start +- **`src/auto-reply/reply/commands-core.ts`**: Triggers command events + +### Discovery Flow + +``` +Gateway startup + ↓ +Scan directories (workspace → managed → bundled) + ↓ +Parse HOOK.md files + ↓ +Check eligibility (bins, env, config, os) + ↓ +Load handlers from eligible hooks + ↓ +Register handlers for events +``` + +### Event Flow + +``` +User sends /new + ↓ +Command validation + ↓ +Create hook event + ↓ +Trigger hook (all registered handlers) + ↓ +Command processing continues + ↓ +Session reset +``` + +## Troubleshooting + +### Hook Not Discovered + +1. Check directory structure: + + ```bash + ls -la ~/.openclaw/hooks/my-hook/ + # Should show: HOOK.md, handler.ts + ``` + +2. Verify HOOK.md format: + + ```bash + cat ~/.openclaw/hooks/my-hook/HOOK.md + # Should have YAML frontmatter with name and metadata + ``` + +3. List all discovered hooks: + + ```bash + openclaw hooks list + ``` + +### Hook Not Eligible + +Check requirements: + +```bash +openclaw hooks info my-hook +``` + +Look for missing: + +- Binaries (check PATH) +- Environment variables +- Config values +- OS compatibility + +### Hook Not Executing + +1. Verify hook is enabled: + + ```bash + openclaw hooks list + # Should show ✓ next to enabled hooks + ``` + +2. Restart your gateway process so hooks reload. + +3. Check gateway logs for errors: + + ```bash + ./scripts/clawlog.sh | grep hook + ``` + +### Handler Errors + +Check for TypeScript/import errors: + +```bash +# Test import directly +node -e "import('./path/to/handler.ts').then(console.log)" +``` + +## Migration Guide + +### From Legacy Config to Discovery + +**Before**: + +```json +{ + "hooks": { + "internal": { + "enabled": true, + "handlers": [ + { + "event": "command:new", + "module": "./hooks/handlers/my-handler.ts" + } + ] + } + } +} +``` + +**After**: + +1. Create hook directory: + + ```bash + mkdir -p ~/.openclaw/hooks/my-hook + mv ./hooks/handlers/my-handler.ts ~/.openclaw/hooks/my-hook/handler.ts + ``` + +2. Create HOOK.md: + + ```markdown + --- + name: my-hook + description: "My custom hook" + metadata: { "openclaw": { "emoji": "🎯", "events": ["command:new"] } } + --- + + # My Hook + + Does something useful. + ``` + +3. Update config: + + ```json + { + "hooks": { + "internal": { + "enabled": true, + "entries": { + "my-hook": { "enabled": true } + } + } + } + } + ``` + +4. Verify and restart your gateway process: + + ```bash + openclaw hooks list + # Should show: 🎯 my-hook ✓ + ``` + +**Benefits of migration**: + +- Automatic discovery +- CLI management +- Eligibility checking +- Better documentation +- Consistent structure + +## See Also + +- [CLI Reference: hooks](/cli/hooks) +- [Bundled Hooks README](https://github.com/openclaw/openclaw/tree/main/src/hooks/bundled) +- [Webhook Hooks](/automation/webhook) +- [Configuration](/gateway/configuration#hooks) diff --git a/docs/automation/poll.md b/docs/automation/poll.md new file mode 100644 index 0000000..fab0b0e --- /dev/null +++ b/docs/automation/poll.md @@ -0,0 +1,69 @@ +--- +summary: "Poll sending via gateway + CLI" +read_when: + - Adding or modifying poll support + - Debugging poll sends from the CLI or gateway +title: "Polls" +--- + +# Polls + +## Supported channels + +- WhatsApp (web channel) +- Discord +- MS Teams (Adaptive Cards) + +## CLI + +```bash +# WhatsApp +openclaw message poll --target +15555550123 \ + --poll-question "Lunch today?" --poll-option "Yes" --poll-option "No" --poll-option "Maybe" +openclaw message poll --target 123456789@g.us \ + --poll-question "Meeting time?" --poll-option "10am" --poll-option "2pm" --poll-option "4pm" --poll-multi + +# Discord +openclaw message poll --channel discord --target channel:123456789 \ + --poll-question "Snack?" --poll-option "Pizza" --poll-option "Sushi" +openclaw message poll --channel discord --target channel:123456789 \ + --poll-question "Plan?" --poll-option "A" --poll-option "B" --poll-duration-hours 48 + +# MS Teams +openclaw message poll --channel msteams --target conversation:19:abc@thread.tacv2 \ + --poll-question "Lunch?" --poll-option "Pizza" --poll-option "Sushi" +``` + +Options: + +- `--channel`: `whatsapp` (default), `discord`, or `msteams` +- `--poll-multi`: allow selecting multiple options +- `--poll-duration-hours`: Discord-only (defaults to 24 when omitted) + +## Gateway RPC + +Method: `poll` + +Params: + +- `to` (string, required) +- `question` (string, required) +- `options` (string[], required) +- `maxSelections` (number, optional) +- `durationHours` (number, optional) +- `channel` (string, optional, default: `whatsapp`) +- `idempotencyKey` (string, required) + +## Channel differences + +- WhatsApp: 2-12 options, `maxSelections` must be within option count, ignores `durationHours`. +- Discord: 2-10 options, `durationHours` clamped to 1-768 hours (default 24). `maxSelections > 1` enables multi-select; Discord does not support a strict selection count. +- MS Teams: Adaptive Card polls (OpenClaw-managed). No native poll API; `durationHours` is ignored. + +## Agent tool (Message) + +Use the `message` tool with `poll` action (`to`, `pollQuestion`, `pollOption`, optional `pollMulti`, `pollDurationHours`, `channel`). + +Note: Discord has no “pick exactly N” mode; `pollMulti` maps to multi-select. +Teams polls are rendered as Adaptive Cards and require the gateway to stay online +to record votes in `~/.openclaw/msteams-polls.json`. diff --git a/docs/automation/troubleshooting.md b/docs/automation/troubleshooting.md new file mode 100644 index 0000000..9190855 --- /dev/null +++ b/docs/automation/troubleshooting.md @@ -0,0 +1,122 @@ +--- +summary: "Troubleshoot cron and heartbeat scheduling and delivery" +read_when: + - Cron did not run + - Cron ran but no message was delivered + - Heartbeat seems silent or skipped +title: "Automation Troubleshooting" +--- + +# Automation troubleshooting + +Use this page for scheduler and delivery issues (`cron` + `heartbeat`). + +## Command ladder + +```bash +openclaw status +openclaw gateway status +openclaw logs --follow +openclaw doctor +openclaw channels status --probe +``` + +Then run automation checks: + +```bash +openclaw cron status +openclaw cron list +openclaw system heartbeat last +``` + +## Cron not firing + +```bash +openclaw cron status +openclaw cron list +openclaw cron runs --id --limit 20 +openclaw logs --follow +``` + +Good output looks like: + +- `cron status` reports enabled and a future `nextWakeAtMs`. +- Job is enabled and has a valid schedule/timezone. +- `cron runs` shows `ok` or explicit skip reason. + +Common signatures: + +- `cron: scheduler disabled; jobs will not run automatically` → cron disabled in config/env. +- `cron: timer tick failed` → scheduler tick crashed; inspect surrounding stack/log context. +- `reason: not-due` in run output → manual run called without `--force` and job not due yet. + +## Cron fired but no delivery + +```bash +openclaw cron runs --id --limit 20 +openclaw cron list +openclaw channels status --probe +openclaw logs --follow +``` + +Good output looks like: + +- Run status is `ok`. +- Delivery mode/target are set for isolated jobs. +- Channel probe reports target channel connected. + +Common signatures: + +- Run succeeded but delivery mode is `none` → no external message is expected. +- Delivery target missing/invalid (`channel`/`to`) → run may succeed internally but skip outbound. +- Channel auth errors (`unauthorized`, `missing_scope`, `Forbidden`) → delivery blocked by channel credentials/permissions. + +## Heartbeat suppressed or skipped + +```bash +openclaw system heartbeat last +openclaw logs --follow +openclaw config get agents.defaults.heartbeat +openclaw channels status --probe +``` + +Good output looks like: + +- Heartbeat enabled with non-zero interval. +- Last heartbeat result is `ran` (or skip reason is understood). + +Common signatures: + +- `heartbeat skipped` with `reason=quiet-hours` → outside `activeHours`. +- `requests-in-flight` → main lane busy; heartbeat deferred. +- `empty-heartbeat-file` → interval heartbeat skipped because `HEARTBEAT.md` has no actionable content and no tagged cron event is queued. +- `alerts-disabled` → visibility settings suppress outbound heartbeat messages. + +## Timezone and activeHours gotchas + +```bash +openclaw config get agents.defaults.heartbeat.activeHours +openclaw config get agents.defaults.heartbeat.activeHours.timezone +openclaw config get agents.defaults.userTimezone || echo "agents.defaults.userTimezone not set" +openclaw cron list +openclaw logs --follow +``` + +Quick rules: + +- `Config path not found: agents.defaults.userTimezone` means the key is unset; heartbeat falls back to host timezone (or `activeHours.timezone` if set). +- Cron without `--tz` uses gateway host timezone. +- Heartbeat `activeHours` uses configured timezone resolution (`user`, `local`, or explicit IANA tz). +- ISO timestamps without timezone are treated as UTC for cron `at` schedules. + +Common signatures: + +- Jobs run at the wrong wall-clock time after host timezone changes. +- Heartbeat always skipped during your daytime because `activeHours.timezone` is wrong. + +Related: + +- [/automation/cron-jobs](/automation/cron-jobs) +- [/gateway/heartbeat](/gateway/heartbeat) +- [/automation/cron-vs-heartbeat](/automation/cron-vs-heartbeat) +- [/concepts/timezone](/concepts/timezone) diff --git a/docs/automation/webhook.md b/docs/automation/webhook.md new file mode 100644 index 0000000..8072b4a --- /dev/null +++ b/docs/automation/webhook.md @@ -0,0 +1,215 @@ +--- +summary: "Webhook ingress for wake and isolated agent runs" +read_when: + - Adding or changing webhook endpoints + - Wiring external systems into OpenClaw +title: "Webhooks" +--- + +# Webhooks + +Gateway can expose a small HTTP webhook endpoint for external triggers. + +## Enable + +```json5 +{ + hooks: { + enabled: true, + token: "shared-secret", + path: "/hooks", + // Optional: restrict explicit `agentId` routing to this allowlist. + // Omit or include "*" to allow any agent. + // Set [] to deny all explicit `agentId` routing. + allowedAgentIds: ["hooks", "main"], + }, +} +``` + +Notes: + +- `hooks.token` is required when `hooks.enabled=true`. +- `hooks.path` defaults to `/hooks`. + +## Auth + +Every request must include the hook token. Prefer headers: + +- `Authorization: Bearer ` (recommended) +- `x-openclaw-token: ` +- Query-string tokens are rejected (`?token=...` returns `400`). + +## Endpoints + +### `POST /hooks/wake` + +Payload: + +```json +{ "text": "System line", "mode": "now" } +``` + +- `text` **required** (string): The description of the event (e.g., "New email received"). +- `mode` optional (`now` | `next-heartbeat`): Whether to trigger an immediate heartbeat (default `now`) or wait for the next periodic check. + +Effect: + +- Enqueues a system event for the **main** session +- If `mode=now`, triggers an immediate heartbeat + +### `POST /hooks/agent` + +Payload: + +```json +{ + "message": "Run this", + "name": "Email", + "agentId": "hooks", + "sessionKey": "hook:email:msg-123", + "wakeMode": "now", + "deliver": true, + "channel": "last", + "to": "+15551234567", + "model": "openai/gpt-5.2-mini", + "thinking": "low", + "timeoutSeconds": 120 +} +``` + +- `message` **required** (string): The prompt or message for the agent to process. +- `name` optional (string): Human-readable name for the hook (e.g., "GitHub"), used as a prefix in session summaries. +- `agentId` optional (string): Route this hook to a specific agent. Unknown IDs fall back to the default agent. When set, the hook runs using the resolved agent's workspace and configuration. +- `sessionKey` optional (string): The key used to identify the agent's session. By default this field is rejected unless `hooks.allowRequestSessionKey=true`. +- `wakeMode` optional (`now` | `next-heartbeat`): Whether to trigger an immediate heartbeat (default `now`) or wait for the next periodic check. +- `deliver` optional (boolean): If `true`, the agent's response will be sent to the messaging channel. Defaults to `true`. Responses that are only heartbeat acknowledgments are automatically skipped. +- `channel` optional (string): The messaging channel for delivery. One of: `last`, `whatsapp`, `telegram`, `discord`, `slack`, `mattermost` (plugin), `signal`, `imessage`, `msteams`. Defaults to `last`. +- `to` optional (string): The recipient identifier for the channel (e.g., phone number for WhatsApp/Signal, chat ID for Telegram, channel ID for Discord/Slack/Mattermost (plugin), conversation ID for MS Teams). Defaults to the last recipient in the main session. +- `model` optional (string): Model override (e.g., `anthropic/claude-3-5-sonnet` or an alias). Must be in the allowed model list if restricted. +- `thinking` optional (string): Thinking level override (e.g., `low`, `medium`, `high`). +- `timeoutSeconds` optional (number): Maximum duration for the agent run in seconds. + +Effect: + +- Runs an **isolated** agent turn (own session key) +- Always posts a summary into the **main** session +- If `wakeMode=now`, triggers an immediate heartbeat + +## Session key policy (breaking change) + +`/hooks/agent` payload `sessionKey` overrides are disabled by default. + +- Recommended: set a fixed `hooks.defaultSessionKey` and keep request overrides off. +- Optional: allow request overrides only when needed, and restrict prefixes. + +Recommended config: + +```json5 +{ + hooks: { + enabled: true, + token: "${OPENCLAW_HOOKS_TOKEN}", + defaultSessionKey: "hook:ingress", + allowRequestSessionKey: false, + allowedSessionKeyPrefixes: ["hook:"], + }, +} +``` + +Compatibility config (legacy behavior): + +```json5 +{ + hooks: { + enabled: true, + token: "${OPENCLAW_HOOKS_TOKEN}", + allowRequestSessionKey: true, + allowedSessionKeyPrefixes: ["hook:"], // strongly recommended + }, +} +``` + +### `POST /hooks/` (mapped) + +Custom hook names are resolved via `hooks.mappings` (see configuration). A mapping can +turn arbitrary payloads into `wake` or `agent` actions, with optional templates or +code transforms. + +Mapping options (summary): + +- `hooks.presets: ["gmail"]` enables the built-in Gmail mapping. +- `hooks.mappings` lets you define `match`, `action`, and templates in config. +- `hooks.transformsDir` + `transform.module` loads a JS/TS module for custom logic. + - `hooks.transformsDir` (if set) must stay within the transforms root under your OpenClaw config directory (typically `~/.openclaw/hooks/transforms`). + - `transform.module` must resolve within the effective transforms directory (traversal/escape paths are rejected). +- Use `match.source` to keep a generic ingest endpoint (payload-driven routing). +- TS transforms require a TS loader (e.g. `bun` or `tsx`) or precompiled `.js` at runtime. +- Set `deliver: true` + `channel`/`to` on mappings to route replies to a chat surface + (`channel` defaults to `last` and falls back to WhatsApp). +- `agentId` routes the hook to a specific agent; unknown IDs fall back to the default agent. +- `hooks.allowedAgentIds` restricts explicit `agentId` routing. Omit it (or include `*`) to allow any agent. Set `[]` to deny explicit `agentId` routing. +- `hooks.defaultSessionKey` sets the default session for hook agent runs when no explicit key is provided. +- `hooks.allowRequestSessionKey` controls whether `/hooks/agent` payloads may set `sessionKey` (default: `false`). +- `hooks.allowedSessionKeyPrefixes` optionally restricts explicit `sessionKey` values from request payloads and mappings. +- `allowUnsafeExternalContent: true` disables the external content safety wrapper for that hook + (dangerous; only for trusted internal sources). +- `openclaw webhooks gmail setup` writes `hooks.gmail` config for `openclaw webhooks gmail run`. + See [Gmail Pub/Sub](/automation/gmail-pubsub) for the full Gmail watch flow. + +## Responses + +- `200` for `/hooks/wake` +- `202` for `/hooks/agent` (async run started) +- `401` on auth failure +- `429` after repeated auth failures from the same client (check `Retry-After`) +- `400` on invalid payload +- `413` on oversized payloads + +## Examples + +```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"}' +``` + +```bash +curl -X POST http://127.0.0.1:18789/hooks/agent \ + -H 'x-openclaw-token: SECRET' \ + -H 'Content-Type: application/json' \ + -d '{"message":"Summarize inbox","name":"Email","wakeMode":"next-heartbeat"}' +``` + +### Use a different model + +Add `model` to the agent payload (or mapping) to override the model for that run: + +```bash +curl -X POST http://127.0.0.1:18789/hooks/agent \ + -H 'x-openclaw-token: SECRET' \ + -H 'Content-Type: application/json' \ + -d '{"message":"Summarize inbox","name":"Email","model":"openai/gpt-5.2-mini"}' +``` + +If you enforce `agents.defaults.models`, make sure the override model is included there. + +```bash +curl -X POST http://127.0.0.1:18789/hooks/gmail \ + -H 'Authorization: Bearer SECRET' \ + -H 'Content-Type: application/json' \ + -d '{"source":"gmail","messages":[{"from":"Ada","subject":"Hello","snippet":"Hi"}]}' +``` + +## Security + +- Keep hook endpoints behind loopback, tailnet, or trusted reverse proxy. +- Use a dedicated hook token; do not reuse gateway auth tokens. +- Repeated auth failures are rate-limited per client address to slow brute-force attempts. +- If you use multi-agent routing, set `hooks.allowedAgentIds` to limit explicit `agentId` selection. +- Keep `hooks.allowRequestSessionKey=false` unless you require caller-selected sessions. +- If you enable request `sessionKey`, restrict `hooks.allowedSessionKeyPrefixes` (for example, `["hook:"]`). +- Avoid including sensitive raw payloads in webhook logs. +- Hook payloads are treated as untrusted and wrapped with safety boundaries by default. + If you must disable this for a specific hook, set `allowUnsafeExternalContent: true` + in that hook's mapping (dangerous). diff --git a/docs/brave-search.md b/docs/brave-search.md new file mode 100644 index 0000000..ba18a6c --- /dev/null +++ b/docs/brave-search.md @@ -0,0 +1,41 @@ +--- +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" +--- + +# Brave Search API + +OpenClaw uses Brave Search as the default provider for `web_search`. + +## 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 **Data for Search** plan and generate an API key. +3. Store the key in config (recommended) or set `BRAVE_API_KEY` in the Gateway environment. + +## Config example + +```json5 +{ + tools: { + web: { + search: { + provider: "brave", + apiKey: "BRAVE_API_KEY_HERE", + maxResults: 5, + timeoutSeconds: 30, + }, + }, + }, +} +``` + +## Notes + +- The Data for AI plan is **not** compatible with `web_search`. +- Brave provides a free tier plus paid plans; check the Brave API portal for current limits. + +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 0000000..8c82674 --- /dev/null +++ b/docs/channels/bluebubbles.md @@ -0,0 +1,346 @@ +--- +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. + +## 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. + +## 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 the interactive setup wizard: + +``` +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. + +### 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. + +## 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`) +- **sendAttachment**: 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. + +### 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` (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.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 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`. Requests from `localhost` are also accepted. +- Keep the API password and webhook endpoint secret (treat them like credentials). +- Localhost trust means a same-host reverse proxy can unintentionally bypass the password. If you proxy the gateway, require auth at the proxy and configure `gateway.trustedProxies`. 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. diff --git a/docs/channels/broadcast-groups.md b/docs/channels/broadcast-groups.md new file mode 100644 index 0000000..2d47d7c --- /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/pascal/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/pascal/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/sessions) diff --git a/docs/channels/channel-routing.md b/docs/channels/channel-routing.md new file mode 100644 index 0000000..49c4a61 --- /dev/null +++ b/docs/channels/channel-routing.md @@ -0,0 +1,118 @@ +--- +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**: `whatsapp`, `telegram`, `discord`, `slack`, `signal`, `imessage`, `webchat`. +- **AccountId**: per‑channel account instance (when supported). +- **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` + +## 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. + +## 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 0000000..334c6d7 --- /dev/null +++ b/docs/channels/discord.md @@ -0,0 +1,1044 @@ +--- +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 +openclaw config set channels.discord.token '"YOUR_BOT_TOKEN"' --json +openclaw config set channels.discord.enabled true --json +openclaw gateway +``` + + If OpenClaw is already running as a background service, use `openclaw gateway restart` instead. + + + + + + + + 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: "YOUR_BOT_TOKEN", + }, + }, +} +``` + + Env fallback for the default account: + +```bash +DISCORD_BOT_TOKEN=... +``` + + + + + + + + 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. + + +## 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). + + 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` (IDs or names) and `roles` (role IDs only); if either is configured, senders are allowed when they match `users` OR `roles` + - 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, + 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...`). + + 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`). + - `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). + + + + + 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 ttl ` inspect/update auto-unfocus TTL for focused bindings + + Config: + +```json5 +{ + session: { + threadBindings: { + enabled: true, + ttlHours: 24, + }, + }, + channels: { + discord: { + threadBindings: { + enabled: true, + ttlHours: 24, + 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 })`. + - If thread bindings are disabled for an account, `/focus` and related thread binding operations are unavailable. + + See [Sub-agents](/tools/subagents) and [Configuration Reference](/gateway/configuration-reference). + + + + + 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 + - 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 only when you set a status or activity field. + + 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 + + + + + Discord supports button-based exec approvals in DMs and can optionally post approval prompts in the originating channel. + + Config path: + + - `channels.discord.execApprovals.enabled` + - `channels.discord.execApprovals.approvers` + - `channels.discord.execApprovals.target` (`dm` | `channel` | `both`, default: `dm`) + - `agentFilter`, `sessionFilter`, `cleanupAfterResolve` + + When `target` is `channel` or `both`, the approval prompt is visible in the channel. Only configured 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. + + If approvals fail with unknown approval IDs, verify approver list and feature enablement. + + 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 Carbon component instances), 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", + }, + ], + tts: { + provider: "openai", + openai: { voice: "alloy" }, + }, + }, + }, + }, +} +``` + +Notes: + +- `voice.tts` overrides `messages.tts` for voice playback only. +- Voice is enabled by default; set `channels.discord.voice.enabled=false` to disable it. + +## 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 + + + + + `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. + + + + +## 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.*` +- reply/history: `replyToMode`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit` +- delivery: `textChunkLimit`, `chunkMode`, `maxLinesPerMessage` +- streaming: `streaming` (legacy alias: `streamMode`), `draftChunk`, `blockStreaming`, `blockStreamingCoalesce` +- media/retry: `mediaMaxMb`, `retry` +- actions: `actions.*` +- presence: `activity`, `status`, `activityType`, `activityUrl` +- UI: `ui.components.accentColor` +- features: `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) +- [Channel routing](/channels/channel-routing) +- [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 0000000..e92f844 --- /dev/null +++ b/docs/channels/feishu.md @@ -0,0 +1,586 @@ +--- +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. + +--- + +## Plugin required + +Install the Feishu plugin: + +```bash +openclaw plugins install @openclaw/feishu +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./extensions/feishu +``` + +--- + +## Quickstart + +There are two ways to add the Feishu channel: + +### Method 1: onboarding wizard (recommended) + +If you just installed OpenClaw, run the wizard: + +```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", + "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` + +⚠️ 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", + botName: "My AI assistant", + }, + }, + }, + }, +} +``` + +If you use `connectionMode: "webhook"`, set `verificationToken`. The Feishu webhook server binds to `127.0.0.1` by default; set `webhookHost` only if you intentionally need a different bind address. + +### 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", + }, + }, + }, + }, +} +``` + +--- + +## 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 (default) +- `"allowlist"` = only allow `groupAllowFrom` +- `"disabled"` = disable group messages + +**2. Mention requirement** (`channels.feishu.groups..requireMention`): + +- `true` = require @mention (default) +- `false` = respond without mentions + +--- + +## Group configuration examples + +### Allow all groups, require @mention (default) + +```json5 +{ + channels: { + feishu: { + groupPolicy: "open", + // Default requireMention: true + }, + }, +} +``` + +### Allow all groups, no @mention required + +```json5 +{ + channels: { + feishu: { + groups: { + oc_xxx: { requireMention: false }, + }, + }, + }, +} +``` + +### Allow specific users in groups only + +```json5 +{ + channels: { + feishu: { + groupPolicy: "allowlist", + groupAllowFrom: ["ou_xxx", "ou_yyy"], + }, + }, +} +``` + +--- + +## 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: { + accounts: { + main: { + appId: "cli_xxx", + appSecret: "xxx", + botName: "Primary bot", + }, + backup: { + appId: "cli_yyy", + appSecret: "yyy", + botName: "Backup bot", + enabled: false, + }, + }, + }, + }, +} +``` + +### 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. + +### 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.verificationToken` | 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 | `open` | +| `channels.feishu.groupAllowFrom` | Group allowlist | - | +| `channels.feishu.groups..requireMention` | Require @mention | `true` | +| `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 +- ✅ Stickers + +### Send + +- ✅ Text +- ✅ Images +- ✅ Files +- ✅ Audio +- ⚠️ Rich text (partial support) diff --git a/docs/channels/googlechat.md b/docs/channels/googlechat.md new file mode 100644 index 0000000..818a828 --- /dev/null +++ b/docs/channels/googlechat.md @@ -0,0 +1,253 @@ +--- +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. +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:dm:`. + - 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) or raw email `name@example.com` (mutable principal). +- 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", + audienceType: "app-url", + audience: "https://gateway.example.com/googlechat", + webhookPath: "/googlechat", + botUser: "users/1234567890", // optional; helps mention detection + dm: { + policy: "pairing", + allowFrom: ["users/1234567890", "name@example.com"], + }, + 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). +- Default webhook path is `/googlechat` if `webhookPath` isn’t set. +- Reactions are available via the `reactions` tool and `channels action` when `actions.reactions` is enabled. +- `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`). + +## 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) diff --git a/docs/channels/grammy.md b/docs/channels/grammy.md new file mode 100644 index 0000000..25c1971 --- /dev/null +++ b/docs/channels/grammy.md @@ -0,0 +1,31 @@ +--- +summary: "Telegram Bot API integration via grammY with setup notes" +read_when: + - Working on Telegram or grammY pathways +title: grammY +--- + +# grammY Integration (Telegram Bot API) + +# Why grammY + +- TS-first Bot API client with built-in long-poll + webhook helpers, middleware, error handling, rate limiter. +- Cleaner media helpers than hand-rolling fetch + FormData; supports all Bot API methods. +- Extensible: proxy support via custom fetch, session middleware (optional), type-safe context. + +# What we shipped + +- **Single client path:** fetch-based implementation removed; grammY is now the sole Telegram client (send + gateway) with the grammY throttler enabled by default. +- **Gateway:** `monitorTelegramProvider` builds a grammY `Bot`, wires mention/allowlist gating, media download via `getFile`/`download`, and delivers replies with `sendMessage/sendPhoto/sendVideo/sendAudio/sendDocument`. Supports long-poll or webhook via `webhookCallback`. +- **Proxy:** optional `channels.telegram.proxy` uses `undici.ProxyAgent` through grammY’s `client.baseFetch`. +- **Webhook support:** `webhook-set.ts` wraps `setWebhook/deleteWebhook`; `webhook.ts` hosts the callback with health + graceful shutdown. Gateway enables webhook mode when `channels.telegram.webhookUrl` + `channels.telegram.webhookSecret` are set (otherwise it long-polls). +- **Sessions:** direct chats collapse into the agent main session (`agent::`); groups use `agent::telegram:group:`; replies route back to the same channel. +- **Config knobs:** `channels.telegram.botToken`, `channels.telegram.dmPolicy`, `channels.telegram.groups` (allowlist + mention defaults), `channels.telegram.allowFrom`, `channels.telegram.groupAllowFrom`, `channels.telegram.groupPolicy`, `channels.telegram.mediaMaxMb`, `channels.telegram.linkPreview`, `channels.telegram.proxy`, `channels.telegram.webhookSecret`, `channels.telegram.webhookUrl`, `channels.telegram.webhookHost`. +- **Live stream preview:** `channels.telegram.streaming` (`off | partial | block | progress`) sends a temporary message and updates it with `editMessageText`. This is separate from channel block streaming. +- **Tests:** grammy mocks cover DM + group mention gating and outbound send; more media/webhook fixtures still welcome. + +Open questions + +- Optional grammY plugins (throttler) if we hit Bot API 429s. +- Add more structured media tests (stickers, voice notes). +- Make webhook listen port configurable (currently fixed to 8787 unless wired through the gateway). diff --git a/docs/channels/group-messages.md b/docs/channels/group-messages.md new file mode 100644 index 0000000..e6a00ab --- /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). + +## What’s implemented (2025-12-03) + +- Activation modes: `mention` (default) or `always`. `mention` requires a ping (real WhatsApp @-mentions via `mentionedJids`, 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 silent token `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; they cover a display-name ping like `@openclaw` and the raw number with or without `+`/spaces. +- 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 0000000..00118c5 --- /dev/null +++ b/docs/channels/groups.md @@ -0,0 +1,375 @@ +--- +summary: "Group chat behavior across surfaces (WhatsApp/Telegram/Discord/Slack/Signal/iMessage/Microsoft Teams)" +read_when: + - Changing group chat behavior or mention gating +title: "Groups" +--- + +# Groups + +OpenClaw treats group chats consistently across surfaces: WhatsApp, Telegram, Discord, Slack, Signal, iMessage, Microsoft Teams. + +## 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 +``` + +![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#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: use `groupAllowFrom` (fallback: explicit `allowFrom`). +- Discord: allowlist uses `channels.discord.guilds..channels`. +- Slack: allowlist uses `channels.slack.channels`. +- Matrix: allowlist uses `channels.matrix.groups` (room IDs, aliases, or names). 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 regexes. +- 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 (keys are sender IDs/usernames/emails/phone numbers depending on the channel). Use `"*"` as a wildcard. + +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: { + "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.*`, MS 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 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`. + +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 0000000..5720da1 --- /dev/null +++ b/docs/channels/imessage.md @@ -0,0 +1,367 @@ +--- +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). + + + + +## 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) diff --git a/docs/channels/index.md b/docs/channels/index.md new file mode 100644 index 0000000..181b8d0 --- /dev/null +++ b/docs/channels/index.md @@ -0,0 +1,47 @@ +--- +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 + +- [WhatsApp](/channels/whatsapp) — Most popular; uses Baileys and requires QR pairing. +- [Telegram](/channels/telegram) — Bot API via grammY; supports groups. +- [Discord](/channels/discord) — Discord Bot API + Gateway; supports servers, channels, and DMs. +- [IRC](/channels/irc) — Classic IRC servers; channels + DMs with pairing/allowlist controls. +- [Slack](/channels/slack) — Bolt SDK; workspace apps. +- [Feishu](/channels/feishu) — Feishu/Lark bot via WebSocket (plugin, installed separately). +- [Google Chat](/channels/googlechat) — Google Chat API app via HTTP webhook. +- [Mattermost](/channels/mattermost) — Bot API + WebSocket; channels, groups, DMs (plugin, installed separately). +- [Signal](/channels/signal) — signal-cli; privacy-focused. +- [BlueBubbles](/channels/bluebubbles) — **Recommended for iMessage**; uses the BlueBubbles macOS server REST API with full feature support (edit, unsend, effects, reactions, group management — edit currently broken on macOS 26 Tahoe). +- [iMessage (legacy)](/channels/imessage) — Legacy macOS integration via imsg CLI (deprecated, use BlueBubbles for new setups). +- [Microsoft Teams](/channels/msteams) — Bot Framework; enterprise support (plugin, installed separately). +- [LINE](/channels/line) — LINE Messaging API bot (plugin, installed separately). +- [Nextcloud Talk](/channels/nextcloud-talk) — Self-hosted chat via Nextcloud Talk (plugin, installed separately). +- [Matrix](/channels/matrix) — Matrix protocol (plugin, installed separately). +- [Nostr](/channels/nostr) — Decentralized DMs via NIP-04 (plugin, installed separately). +- [Tlon](/channels/tlon) — Urbit-based messenger (plugin, installed separately). +- [Twitch](/channels/twitch) — Twitch chat via IRC connection (plugin, installed separately). +- [Zalo](/channels/zalo) — Zalo Bot API; Vietnam's popular messenger (plugin, installed separately). +- [Zalo Personal](/channels/zalouser) — Zalo personal account via QR login (plugin, installed separately). +- [WebChat](/web/webchat) — Gateway WebChat UI over WebSocket. + +## 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). +- Telegram internals: [grammY notes](/channels/grammy). +- 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 0000000..2bf6fb4 --- /dev/null +++ b/docs/channels/irc.md @@ -0,0 +1,234 @@ +--- +title: IRC +description: Connect OpenClaw to IRC channels and direct messages. +--- + +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: + +```json +{ + "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 can use nick or `nick!user@host` forms. + +### 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"], + }, + eigen: { + deny: ["gateway", "nodes", "cron"], + }, + }, + }, + }, + }, + }, +} +``` + +Notes: + +- `toolsBySender` keys can be a nick (e.g. `"eigen"`) or a full hostmask (`"eigen!~eigen@174.127.248.171"`) for stronger identity matching. +- 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: + +```json +{ + "channels": { + "irc": { + "nickserv": { + "enabled": true, + "service": "NickServ", + "password": "your-nickserv-password" + } + } + } +} +``` + +Optional one-time registration on connect: + +```json +{ + "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. diff --git a/docs/channels/line.md b/docs/channels/line.md new file mode 100644 index 0000000..b87cbd3 --- /dev/null +++ b/docs/channels/line.md @@ -0,0 +1,187 @@ +--- +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 (plugin) + +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: supported via plugin. Direct messages, group chats, media, locations, Flex +messages, template messages, and quick replies are supported. Reactions and threads +are not supported. + +## Plugin required + +Install the LINE plugin: + +```bash +openclaw plugins install @openclaw/line +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./extensions/line +``` + +## 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. + +## 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", + }, + }, +} +``` + +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!" +``` + +## 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. diff --git a/docs/channels/location.md b/docs/channels/location.md new file mode 100644 index 0000000..103f576 --- /dev/null +++ b/docs/channels/location.md @@ -0,0 +1,56 @@ +--- +summary: "Inbound channel location parsing (Telegram + WhatsApp) 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 0000000..9bb56d1 --- /dev/null +++ b/docs/channels/matrix.md @@ -0,0 +1,303 @@ +--- +summary: "Matrix support status, capabilities, and configuration" +read_when: + - Working on Matrix channel features +title: "Matrix" +--- + +# Matrix (plugin) + +Matrix is an open, decentralized messaging protocol. OpenClaw connects as a Matrix **user** +on any homeserver, so you need a Matrix account for the bot. Once it is logged in, you can DM +the bot directly or invite it to rooms (Matrix "groups"). Beeper is a valid client option too, +but it requires E2EE to be enabled. + +Status: supported via plugin (@vector-im/matrix-bot-sdk). Direct messages, rooms, threads, media, reactions, +polls (send + poll-start as text), location, and E2EE (with crypto support). + +## Plugin required + +Matrix ships as a plugin and is not bundled with the core install. + +Install via CLI (npm registry): + +```bash +openclaw plugins install @openclaw/matrix +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./extensions/matrix +``` + +If you choose Matrix during configure/onboarding and a git checkout is detected, +OpenClaw will offer the local install path automatically. + +Details: [Plugins](/tools/plugin) + +## Setup + +1. Install the Matrix plugin: + - From npm: `openclaw plugins install @openclaw/matrix` + - From a local checkout: `openclaw plugins install ./extensions/matrix` +2. Create a Matrix account on a homeserver: + - Browse hosting options at [https://matrix.org/ecosystem/hosting/](https://matrix.org/ecosystem/hosting/) + - Or host it yourself. +3. Get an access token for the bot account: + - Use the Matrix login API with `curl` at your home server: + + ```bash + curl --request POST \ + --url https://matrix.example.org/_matrix/client/v3/login \ + --header 'Content-Type: application/json' \ + --data '{ + "type": "m.login.password", + "identifier": { + "type": "m.id.user", + "user": "your-user-name" + }, + "password": "your-password" + }' + ``` + + - Replace `matrix.example.org` with your homeserver URL. + - Or set `channels.matrix.userId` + `channels.matrix.password`: OpenClaw calls the same + login endpoint, stores the access token in `~/.openclaw/credentials/matrix/credentials.json`, + and reuses it on next start. + +4. Configure credentials: + - Env: `MATRIX_HOMESERVER`, `MATRIX_ACCESS_TOKEN` (or `MATRIX_USER_ID` + `MATRIX_PASSWORD`) + - Or config: `channels.matrix.*` + - If both are set, config takes precedence. + - With access token: user ID is fetched automatically via `/whoami`. + - When set, `channels.matrix.userId` should be the full Matrix ID (example: `@bot:example.org`). +5. Restart the gateway (or finish onboarding). +6. Start a DM with the bot or invite it to a room from any Matrix client + (Element, Beeper, etc.; see [https://matrix.org/ecosystem/clients/](https://matrix.org/ecosystem/clients/)). Beeper requires E2EE, + so set `channels.matrix.encryption: true` and verify the device. + +Minimal config (access token, user ID auto-fetched): + +```json5 +{ + channels: { + matrix: { + enabled: true, + homeserver: "https://matrix.example.org", + accessToken: "syt_***", + dm: { policy: "pairing" }, + }, + }, +} +``` + +E2EE config (end to end encryption enabled): + +```json5 +{ + channels: { + matrix: { + enabled: true, + homeserver: "https://matrix.example.org", + accessToken: "syt_***", + encryption: true, + dm: { policy: "pairing" }, + }, + }, +} +``` + +## Encryption (E2EE) + +End-to-end encryption is **supported** via the Rust crypto SDK. + +Enable with `channels.matrix.encryption: true`: + +- If the crypto module loads, encrypted rooms are decrypted automatically. +- Outbound media is encrypted when sending to encrypted rooms. +- On first connection, OpenClaw requests device verification from your other sessions. +- Verify the device in another Matrix client (Element, etc.) to enable key sharing. +- If the crypto module cannot be loaded, E2EE is disabled and encrypted rooms will not decrypt; + OpenClaw logs a warning. +- If you see missing crypto module errors (for example, `@matrix-org/matrix-sdk-crypto-nodejs-*`), + allow build scripts for `@matrix-org/matrix-sdk-crypto-nodejs` and run + `pnpm rebuild @matrix-org/matrix-sdk-crypto-nodejs` or fetch the binary with + `node node_modules/@matrix-org/matrix-sdk-crypto-nodejs/download-lib.js`. + +Crypto state is stored per account + access token in +`~/.openclaw/matrix/accounts//__//crypto/` +(SQLite database). Sync state lives alongside it in `bot-storage.json`. +If the access token (device) changes, a new store is created and the bot must be +re-verified for encrypted rooms. + +**Device verification:** +When E2EE is enabled, the bot will request verification from your other sessions on startup. +Open Element (or another client) and approve the verification request to establish trust. +Once verified, the bot can decrypt messages in encrypted rooms. + +## Multi-account + +Multi-account support: use `channels.matrix.accounts` with per-account credentials and optional `name`. See [`gateway/configuration`](/gateway/configuration#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts) for the shared pattern. + +Each account runs as a separate Matrix user on any homeserver. Per-account config +inherits from the top-level `channels.matrix` settings and can override any option +(DM policy, groups, encryption, etc.). + +```json5 +{ + channels: { + matrix: { + enabled: true, + dm: { policy: "pairing" }, + accounts: { + assistant: { + name: "Main assistant", + homeserver: "https://matrix.example.org", + accessToken: "syt_assistant_***", + encryption: true, + }, + alerts: { + name: "Alerts bot", + homeserver: "https://matrix.example.org", + accessToken: "syt_alerts_***", + dm: { policy: "allowlist", allowFrom: ["@admin:example.org"] }, + }, + }, + }, + }, +} +``` + +Notes: + +- Account startup is serialized to avoid race conditions with concurrent module imports. +- Env variables (`MATRIX_HOMESERVER`, `MATRIX_ACCESS_TOKEN`, etc.) only apply to the **default** account. +- Base channel settings (DM policy, group policy, mention gating, etc.) apply to all accounts unless overridden per account. +- Use `bindings[].match.accountId` to route each account to a different agent. +- Crypto state is stored per account + access token (separate key stores per account). + +## Routing model + +- Replies always go back to Matrix. +- DMs share the agent's main session; rooms map to group sessions. + +## Access control (DMs) + +- Default: `channels.matrix.dm.policy = "pairing"`. Unknown senders get a pairing code. +- Approve via: + - `openclaw pairing list matrix` + - `openclaw pairing approve matrix ` +- Public DMs: `channels.matrix.dm.policy="open"` plus `channels.matrix.dm.allowFrom=["*"]`. +- `channels.matrix.dm.allowFrom` accepts full Matrix user IDs (example: `@user:server`). The wizard resolves display names to user IDs when directory search finds a single exact match. +- Do not use display names or bare localparts (example: `"Alice"` or `"alice"`). They are ambiguous and are ignored for allowlist matching. Use full `@user:server` IDs. + +## Rooms (groups) + +- Default: `channels.matrix.groupPolicy = "allowlist"` (mention-gated). Use `channels.defaults.groupPolicy` to override the default when unset. +- Runtime note: if `channels.matrix` is completely missing, runtime falls back to `groupPolicy="allowlist"` for room checks (even if `channels.defaults.groupPolicy` is set). +- Allowlist rooms with `channels.matrix.groups` (room IDs or aliases; names are resolved to IDs when directory search finds a single exact match): + +```json5 +{ + channels: { + matrix: { + groupPolicy: "allowlist", + groups: { + "!roomId:example.org": { allow: true }, + "#alias:example.org": { allow: true }, + }, + groupAllowFrom: ["@owner:example.org"], + }, + }, +} +``` + +- `requireMention: false` enables auto-reply in that room. +- `groups."*"` can set defaults for mention gating across rooms. +- `groupAllowFrom` restricts which senders can trigger the bot in rooms (full Matrix user IDs). +- Per-room `users` allowlists can further restrict senders inside a specific room (use full Matrix user IDs). +- The configure wizard prompts for room allowlists (room IDs, aliases, or names) and resolves names only on an exact, unique match. +- On startup, OpenClaw resolves room/user names in allowlists to IDs and logs the mapping; unresolved entries are ignored for allowlist matching. +- Invites are auto-joined by default; control with `channels.matrix.autoJoin` and `channels.matrix.autoJoinAllowlist`. +- To allow **no rooms**, set `channels.matrix.groupPolicy: "disabled"` (or keep an empty allowlist). +- Legacy key: `channels.matrix.rooms` (same shape as `groups`). + +## Threads + +- Reply threading is supported. +- `channels.matrix.threadReplies` controls whether replies stay in threads: + - `off`, `inbound` (default), `always` +- `channels.matrix.replyToMode` controls reply-to metadata when not replying in a thread: + - `off` (default), `first`, `all` + +## Capabilities + +| Feature | Status | +| --------------- | ------------------------------------------------------------------------------------- | +| Direct messages | ✅ Supported | +| Rooms | ✅ Supported | +| Threads | ✅ Supported | +| Media | ✅ Supported | +| E2EE | ✅ Supported (crypto module required) | +| Reactions | ✅ Supported (send/read via tools) | +| Polls | ✅ Send supported; inbound poll starts are converted to text (responses/ends ignored) | +| Location | ✅ Supported (geo URI; altitude ignored) | +| Native commands | ✅ Supported | + +## 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 matrix +``` + +Common failures: + +- Logged in but room messages ignored: room blocked by `groupPolicy` or room allowlist. +- DMs ignored: sender pending approval when `channels.matrix.dm.policy="pairing"`. +- Encrypted rooms fail: crypto support or encryption settings mismatch. + +For triage flow: [/channels/troubleshooting](/channels/troubleshooting). + +## Configuration reference (Matrix) + +Full configuration: [Configuration](/gateway/configuration) + +Provider options: + +- `channels.matrix.enabled`: enable/disable channel startup. +- `channels.matrix.homeserver`: homeserver URL. +- `channels.matrix.userId`: Matrix user ID (optional with access token). +- `channels.matrix.accessToken`: access token. +- `channels.matrix.password`: password for login (token stored). +- `channels.matrix.deviceName`: device display name. +- `channels.matrix.encryption`: enable E2EE (default: false). +- `channels.matrix.initialSyncLimit`: initial sync limit. +- `channels.matrix.threadReplies`: `off | inbound | always` (default: inbound). +- `channels.matrix.textChunkLimit`: outbound text chunk size (chars). +- `channels.matrix.chunkMode`: `length` (default) or `newline` to split on blank lines (paragraph boundaries) before length chunking. +- `channels.matrix.dm.policy`: `pairing | allowlist | open | disabled` (default: pairing). +- `channels.matrix.dm.allowFrom`: DM allowlist (full Matrix user IDs). `open` requires `"*"`. The wizard resolves names to IDs when possible. +- `channels.matrix.groupPolicy`: `allowlist | open | disabled` (default: allowlist). +- `channels.matrix.groupAllowFrom`: allowlisted senders for group messages (full Matrix user IDs). +- `channels.matrix.allowlistOnly`: force allowlist rules for DMs + rooms. +- `channels.matrix.groups`: group allowlist + per-room settings map. +- `channels.matrix.rooms`: legacy group allowlist/config. +- `channels.matrix.replyToMode`: reply-to mode for threads/tags. +- `channels.matrix.mediaMaxMb`: inbound/outbound media cap (MB). +- `channels.matrix.autoJoin`: invite handling (`always | allowlist | off`, default: always). +- `channels.matrix.autoJoinAllowlist`: allowed room IDs/aliases for auto-join. +- `channels.matrix.accounts`: multi-account configuration keyed by account ID (each account inherits top-level settings). +- `channels.matrix.actions`: per-action tool gating (reactions/messages/pins/memberInfo/channelInfo). diff --git a/docs/channels/mattermost.md b/docs/channels/mattermost.md new file mode 100644 index 0000000..350fa84 --- /dev/null +++ b/docs/channels/mattermost.md @@ -0,0 +1,159 @@ +--- +summary: "Mattermost bot setup and OpenClaw config" +read_when: + - Setting up Mattermost + - Debugging Mattermost routing +title: "Mattermost" +--- + +# Mattermost (plugin) + +Status: supported via 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. + +## Plugin required + +Mattermost ships as a plugin and is not bundled with the core install. + +Install via CLI (npm registry): + +```bash +openclaw plugins install @openclaw/mattermost +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./extensions/mattermost +``` + +If you choose Mattermost during configure/onboarding and a git checkout is detected, +OpenClaw will offer the local install path automatically. + +Details: [Plugins](/tools/plugin) + +## Quick setup + +1. Install the Mattermost plugin. +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", + }, + }, +} +``` + +## 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. + +## 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 or `@username`). +- 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). + +## 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 IDs are treated as channels. + +## 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`. + +## 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. diff --git a/docs/channels/msteams.md b/docs/channels/msteams.md new file mode 100644 index 0000000..2232582 --- /dev/null +++ b/docs/channels/msteams.md @@ -0,0 +1,771 @@ +--- +summary: "Microsoft Teams bot support status, capabilities, and configuration" +read_when: + - Working on MS Teams channel features +title: "Microsoft Teams" +--- + +# Microsoft Teams (plugin) + +> "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. + +## Plugin required + +Microsoft Teams ships as a plugin and is not bundled with the core install. + +**Breaking change (2026.1.15):** MS Teams moved out of core. If you use it, you must install the plugin. + +Explainable: keeps core installs lighter and lets MS Teams dependencies update independently. + +Install via CLI (npm registry): + +```bash +openclaw plugins install @openclaw/msteams +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./extensions/msteams +``` + +If you choose Teams during configure/onboarding and a git checkout is detected, +OpenClaw will offer the local install path automatically. + +Details: [Plugins](/tools/plugin) + +## Quick setup (beginner) + +1. Install the Microsoft Teams plugin. +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` accepts AAD object IDs, UPNs, or display names. The wizard resolves 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 can be team IDs or names; channel keys can be conversation IDs or names. +- 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 entries are kept as typed. + +Example: + +```json5 +{ + channels: { + msteams: { + groupPolicy: "allowlist", + teams: { + "My Team": { + channels: { + General: { requireMention: true }, + }, + }, + }, + }, + }, +} +``` + +## How it works + +1. Install the Microsoft Teams plugin. +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. **Install the Microsoft Teams plugin** + - From npm: `openclaw plugins install @openclaw/msteams` + - From a local checkout: `openclaw plugins install ./extensions/msteams` + +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** + + ```json + { + "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 plugin is installed and `msteams` config exists with credentials. + +## 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). +- 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. + +```json +{ + "$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`: allowlist for DMs (AAD object IDs, UPNs, or display names). The wizard resolves names to IDs during setup when Graph access is available. +- `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). +- `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: + +```json +{ + "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. + +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:** + +```json +{ + "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:** + +```json +{ + "action": "send", + "channel": "msteams", + "target": "user:John Smith", + "message": "Hello!" +} +``` + +```json +{ + "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) diff --git a/docs/channels/nextcloud-talk.md b/docs/channels/nextcloud-talk.md new file mode 100644 index 0000000..d4ab9e2 --- /dev/null +++ b/docs/channels/nextcloud-talk.md @@ -0,0 +1,138 @@ +--- +summary: "Nextcloud Talk support status, capabilities, and configuration" +read_when: + - Working on Nextcloud Talk channel features +title: "Nextcloud Talk" +--- + +# Nextcloud Talk (plugin) + +Status: supported via plugin (webhook bot). Direct messages, rooms, reactions, and markdown messages are supported. + +## Plugin required + +Nextcloud Talk ships as a plugin and is not bundled with the core install. + +Install via CLI (npm registry): + +```bash +openclaw plugins install @openclaw/nextcloud-talk +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./extensions/nextcloud-talk +``` + +If you choose Nextcloud Talk during configure/onboarding and a git checkout is detected, +OpenClaw will offer the local install path automatically. + +Details: [Plugins](/tools/plugin) + +## Quick setup (beginner) + +1. Install the Nextcloud Talk plugin. +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 onboarding). + +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`: secret file path. +- `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). diff --git a/docs/channels/nostr.md b/docs/channels/nostr.md new file mode 100644 index 0000000..3368933 --- /dev/null +++ b/docs/channels/nostr.md @@ -0,0 +1,233 @@ +--- +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 plugin (disabled by default). + +Nostr is a decentralized protocol for social networking. This channel enables OpenClaw to receive and respond to encrypted direct messages (DMs) via NIP-04. + +## Install (on demand) + +### Onboarding (recommended) + +- The onboarding wizard (`openclaw onboard`) and `openclaw channels add` list optional channel plugins. +- Selecting Nostr prompts you to install the plugin on demand. + +Install defaults: + +- **Dev channel + git checkout available:** uses the local plugin path. +- **Stable/Beta:** downloads from npm. + +You can always override the choice in the prompt. + +### Manual install + +```bash +openclaw plugins install @openclaw/nostr +``` + +Use a local checkout (dev workflows): + +```bash +openclaw plugins install --link /extensions/nostr +``` + +Restart the Gateway after installing or enabling plugins. + +## Quick setup + +1. Generate a Nostr keypair (if needed): + +```bash +# Using nak +nak key generate +``` + +2. Add to config: + +```json +{ + "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: + +```json +{ + "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. + +### Allowlist example + +```json +{ + "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`. + +```json +{ + "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 +``` + +```json +{ + "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. + +## Limitations (MVP) + +- Direct messages only (no group chats). +- No media attachments. +- NIP-04 only (NIP-17 gift-wrap planned). diff --git a/docs/channels/pairing.md b/docs/channels/pairing.md new file mode 100644 index 0000000..4b575eb --- /dev/null +++ b/docs/channels/pairing.md @@ -0,0 +1,103 @@ +--- +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: `telegram`, `whatsapp`, `signal`, `imessage`, `discord`, `slack`, `feishu`. + +### Where the state lives + +Stored under `~/.openclaw/credentials/`: + +- Pending requests: `-pairing.json` +- Approved allowlist store: `-allowFrom.json` + +Treat these as sensitive (they gate access to your assistant). + +## 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 approve` + +The setup code is a base64-encoded JSON payload that contains: + +- `url`: the Gateway WebSocket URL (`ws://...` or `wss://...`) +- `token`: a short-lived pairing token + +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 +``` + +### 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`) is a + separate gateway-owned pairing store. WS nodes still require device pairing. + +## 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/signal.md b/docs/channels/signal.md new file mode 100644 index 0000000..b216af1 --- /dev/null +++ b/docs/channels/signal.md @@ -0,0 +1,325 @@ +--- +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#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts) 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 + +# 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. +- 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.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`. diff --git a/docs/channels/slack.md b/docs/channels/slack.md new file mode 100644 index 0000000..4a1bda6 --- /dev/null +++ b/docs/channels/slack.md @@ -0,0 +1,525 @@ +--- +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. + + + + + + +## Token model + +- `botToken` + `appToken` are required for Socket Mode. +- HTTP mode requires `botToken` + `signingSecret`. +- 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. + + +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. + + +## 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) + + Pairing in DMs uses `openclaw pairing approve slack `. + + + + + `channels.slack.groupPolicy` controls channel handling: + + - `open` + - `allowlist` + - `disabled` + + Channel allowlist lives under `channels.slack.channels`. + + 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 entries are kept as configured + + + + + 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.`): + + - `requireMention` + - `users` (allowlist) + - `allowBots` + - `skills` + - `systemPrompt` + - `tools`, `toolsBySender` + + + + +## 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). +- 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`). + +## 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 implicit reply threading. Explicit `[[reply_to_*]]` tags are still honored. + +## 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. + + + + +## 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 | + +## 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. +- Assistant thread status updates (for "is typing..." indicators in threads) use `assistant.threads.setStatus` and require bot scope `assistant:write`. +- `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. +- 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 + +## 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 a channel or account. + +## Manifest and scope checklist + + + + +```json +{ + "display_information": { + "name": "OpenClaw", + "description": "Slack connector for OpenClaw" + }, + "features": { + "bot_user": { + "display_name": "OpenClaw", + "always_online": false + }, + "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": [ + "chat:write", + "channels:history", + "channels:read", + "groups:history", + "im:history", + "mpim:history", + "users:read", + "app_mentions:read", + "assistant:write", + "reactions:read", + "reactions:write", + "pins:read", + "pins:write", + "emoji:read", + "commands", + "files:read", + "files:write" + ] + } + }, + "settings": { + "socket_mode_enabled": true, + "event_subscriptions": { + "bot_events": [ + "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" + ] + } + } +} +``` + + + + + 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) + + + + +## 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. + + + + Validate: + + - signing secret + - webhook path + - Slack Request URLs (Events + Interactivity + Slash Commands) + - unique `webhookPath` per HTTP account + + + + + 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. + + + + +## Text streaming + +OpenClaw supports Slack native text streaming via the Agents and AI Apps API. + +`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's native streaming API (`chat.startStream` / `chat.appendStream` / `chat.stopStream`) when `streaming` is `partial` (default: `true`). + +Disable native Slack streaming (keep draft preview behavior): + +```yaml +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`. + +### Requirements + +1. Enable **Agents and AI Apps** in your Slack app settings. +2. Ensure the app has the `assistant:write` scope. +3. A reply thread must be available for that message. Thread selection still follows `replyToMode`. + +### Behavior + +- First text chunk starts a stream (`chat.startStream`). +- Later text chunks append to the same stream (`chat.appendStream`). +- End of reply finalizes stream (`chat.stopStream`). +- Media and non-text payloads fall back to normal delivery. +- If streaming fails mid-reply, OpenClaw falls back to normal delivery for remaining payloads. + +## 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` + - 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` + +## Related + +- [Pairing](/channels/pairing) +- [Channel routing](/channels/channel-routing) +- [Troubleshooting](/channels/troubleshooting) +- [Configuration](/gateway/configuration) +- [Slash commands](/tools/slash-commands) diff --git a/docs/channels/telegram.md b/docs/channels/telegram.md new file mode 100644 index 0000000..138b2b2 --- /dev/null +++ b/docs/channels/telegram.md @@ -0,0 +1,769 @@ +--- +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). + + + + + +```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` + - `open` (requires `allowFrom` to include `"*"`) + - `disabled` + + `channels.telegram.allowFrom` accepts numeric Telegram user IDs. `telegram:` / `tg:` prefixes are accepted and normalized. + The onboarding wizard 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). + + ### 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`. + + + + + There are two independent controls: + + 1. **Which groups are allowed** (`channels.telegram.groups`) + - no `groups` config: all groups allowed + - `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 must be numeric Telegram user IDs. + Runtime note: if `channels.telegram` is completely missing, runtime falls back to `groupPolicy="allowlist"` for group policy evaluation (even if `channels.defaults.groupPolicy` is set). + + Example: allow any member in one specific group: + +```json5 +{ + channels: { + telegram: { + groups: { + "-1001234567890": { + groupPolicy: "open", + requireMention: false, + }, + }, + }, + }, +} +``` + + + + + 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 by sending a temporary Telegram message and editing it as text arrives. + + Requirement: + + - `channels.telegram.streaming` is `off | partial | block | progress` (default: `off`) + - `progress` maps to `partial` on Telegram (compat with cross-channel naming) + - legacy `channels.telegram.streamMode` and boolean `streaming` values are auto-mapped + + This works in direct chats and groups/topics. + + For text-only replies, 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. + + 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 failure: + + - `setMyCommands failed` 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 approve` approves latest pending request + + 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`) + + Channel message actions expose ergonomic aliases (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`). + + Gating controls: + + - `channels.telegram.actions.sendMessage` + - `channels.telegram.actions.editMessage` + - `channels.telegram.actions.deleteMessage` + - `channels.telegram.actions.reactions` + - `channels.telegram.actions.sticker` (default: disabled) + + 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`). + + 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). + - 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`) + + 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 5) caps inbound Telegram media download/processing 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. + - DM history controls: + - `channels.telegram.dmHistoryLimit` + - `channels.telegram.dms[""].historyLimit` + - outbound Telegram API retries are configurable via `channels.telegram.retry`. + + 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" +``` + + + + +## 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` 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://user:pass@proxy-host:1080 +``` + + - If DNS/IPv6 selection is unstable, force Node family selection behavior explicitly: + +```yaml +channels: + telegram: + network: + autoSelectFamily: false +``` + + - Environment override (temporary): set `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1`. + - 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 file path. +- `channels.telegram.dmPolicy`: `pairing | allowlist | open | disabled` (default: pairing). +- `channels.telegram.allowFrom`: DM allowlist (numeric Telegram user IDs). `open` requires `"*"`. `openclaw doctor --fix` can resolve legacy `@username` entries to IDs. +- `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. +- `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 (same fields as group). + - `channels.telegram.groups..topics..groupPolicy`: per-topic override for groupPolicy (`open | allowlist | disabled`). + - `channels.telegram.groups..topics..requireMention`: per-topic mention gating override. +- `channels.telegram.capabilities.inlineButtons`: `off | dm | group | all | allowlist` (default: allowlist). +- `channels.telegram.accounts..capabilities.inlineButtons`: per-account override. +- `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: `off`; `progress` maps to `partial`). +- `channels.telegram.mediaMaxMb`: inbound/outbound media cap (MB). +- `channels.telegram.retry`: retry policy for outbound Telegram API calls (attempts, minDelayMs, maxDelayMs, jitter). +- `channels.telegram.network.autoSelectFamily`: override Node autoSelectFamily (true=enable, false=disable). Defaults to disabled on Node 22 to avoid Happy Eyeballs timeouts. +- `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.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). + +- [Configuration reference - Telegram](/gateway/configuration-reference#telegram) + +Telegram-specific high-signal fields: + +- startup/auth: `enabled`, `botToken`, `tokenFile`, `accounts.*` +- access control: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*` +- command/menu: `commands.native`, `customCommands` +- threading/replies: `replyToMode` +- streaming: `streaming` (preview), `blockStreaming` +- formatting/delivery: `textChunkLimit`, `chunkMode`, `linkPreview`, `responsePrefix` +- media/network: `mediaMaxMb`, `timeoutSeconds`, `retry`, `network.autoSelectFamily`, `proxy` +- webhook: `webhookUrl`, `webhookSecret`, `webhookPath`, `webhookHost` +- actions/capabilities: `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker` +- reactions: `reactionNotifications`, `reactionLevel` +- writes/history: `configWrites`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit` + +## Related + +- [Pairing](/channels/pairing) +- [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 0000000..dbd2015 --- /dev/null +++ b/docs/channels/tlon.md @@ -0,0 +1,148 @@ +--- +summary: "Tlon/Urbit support status, capabilities, and configuration" +read_when: + - Working on Tlon/Urbit channel features +title: "Tlon" +--- + +# Tlon (plugin) + +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: supported via plugin. DMs, group mentions, thread replies, and text-only media fallback +(URL appended to caption). Reactions, polls, and native media uploads are not supported. + +## Plugin required + +Tlon ships as a plugin and is not bundled with the core install. + +Install via CLI (npm registry): + +```bash +openclaw plugins install @openclaw/tlon +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./extensions/tlon +``` + +Details: [Plugins](/tools/plugin) + +## Setup + +1. Install the Tlon plugin. +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", + }, + }, +} +``` + +Private/LAN ship URLs (advanced): + +By default, OpenClaw blocks private/internal hostnames and IP ranges for this plugin (SSRF hardening). +If your ship URL is on a private network (for example `http://192.168.1.50:8080` or `http://localhost:8080`), +you must explicitly opt in: + +```json5 +{ + channels: { + tlon: { + allowPrivateNetwork: true, + }, + }, +} +``` + +## 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 = allow all): + +```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", + }, + }, + }, + }, + }, +} +``` + +## 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` + +## 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. +- Media: `sendMedia` falls back to text + URL (no native upload). diff --git a/docs/channels/troubleshooting.md b/docs/channels/troubleshooting.md new file mode 100644 index 0000000..2848947 --- /dev/null +++ b/docs/channels/troubleshooting.md @@ -0,0 +1,117 @@ +--- +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 connected/ready + +## 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-quick](/channels/whatsapp#troubleshooting-quick) + +## 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`. | +| 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. | +| 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-macos-privacy-and-security-tcc](/channels/imessage#troubleshooting-macos-privacy-and-security-tcc) +- [/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) + +## Matrix + +### Matrix failure signatures + +| Symptom | Fastest check | Fix | +| ----------------------------------- | -------------------------------------------- | ----------------------------------------------- | +| Logged in but ignores room messages | `openclaw channels status --probe` | Check `groupPolicy` and room allowlist. | +| DMs do not process | `openclaw pairing list matrix` | Approve sender or adjust DM policy. | +| Encrypted rooms fail | Verify crypto module and encryption settings | Enable encryption support and rejoin/sync room. | + +Full troubleshooting: [/channels/matrix#troubleshooting](/channels/matrix#troubleshooting) diff --git a/docs/channels/twitch.md b/docs/channels/twitch.md new file mode 100644 index 0000000..32670f3 --- /dev/null +++ b/docs/channels/twitch.md @@ -0,0 +1,379 @@ +--- +summary: "Twitch chat bot configuration and setup" +read_when: + - Setting up Twitch chat integration for OpenClaw +title: "Twitch" +--- + +# Twitch (plugin) + +Twitch chat support via IRC connection. OpenClaw connects as a Twitch user (bot account) to receive and send messages in channels. + +## Plugin required + +Twitch ships as a plugin and is not bundled with the core install. + +Install via CLI (npm registry): + +```bash +openclaw plugins install @openclaw/twitch +``` + +Local checkout (when running from a git repo): + +```bash +openclaw plugins install ./extensions/twitch +``` + +Details: [Plugins](/tools/plugin) + +## Quick setup (beginner) + +1. Create a dedicated Twitch account for the bot (or use an existing account). +2. 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** +3. 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/) +4. 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). +5. 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-%20to-user-id/](https://www.streamweasels.com/tools/convert-twitch-username-%20to-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 doesn't 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) diff --git a/docs/channels/whatsapp.md b/docs/channels/whatsapp.md new file mode 100644 index 0000000..d92dfda --- /dev/null +++ b/docs/channels/whatsapp.md @@ -0,0 +1,444 @@ +--- +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). + + + + 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 onboarding 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 cap for auto-replies: `agents.defaults.mediaMaxMb` (default `5MB`) + - 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 + + + +## Acknowledgment reactions + +WhatsApp supports immediate ack reactions on inbound receipt via `channels.whatsapp.ackReaction`. + +```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` +- 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) +- [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 0000000..cda126f --- /dev/null +++ b/docs/channels/zalo.md @@ -0,0 +1,192 @@ +--- +summary: "Zalo bot support status, capabilities, and configuration" +read_when: + - Working on Zalo features or webhooks +title: "Zalo" +--- + +# Zalo (Bot API) + +Status: experimental. Direct messages only; groups coming soon per Zalo docs. + +## Plugin required + +Zalo ships as a plugin and is not bundled with the core install. + +- Install via CLI: `openclaw plugins install @openclaw/zalo` +- Or select **Zalo** during onboarding and confirm the install prompt +- Details: [Plugins](/tools/plugin) + +## Quick setup (beginner) + +1. Install the Zalo plugin: + - From a source checkout: `openclaw plugins install ./extensions/zalo` + - From npm (if published): `openclaw plugins install @openclaw/zalo` + - Or pick **Zalo** in onboarding and confirm the install prompt +2. Set the token: + - Env: `ZALO_BOT_TOKEN=...` + - Or config: `channels.zalo.botToken: "..."`. +3. Restart the gateway (or finish onboarding). +4. DM access is pairing by default; approve the pairing code on first contact. + +Minimal config: + +```json5 +{ + channels: { + zalo: { + enabled: true, + 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. + +- 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. +- Groups are not yet supported (Zalo docs state "coming soon"). + +## 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 bot token (format: `12345689:abc-xyz`). + +### 2) Configure the token (env or config) + +Example: + +```json5 +{ + channels: { + zalo: { + enabled: true, + botToken: "12345689:abc-xyz", + dmPolicy: "pairing", + }, + }, +} +``` + +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). + +## 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 + +- **Text messages**: Full support with 2000 character chunking. +- **Image messages**: Download and process inbound images; send images via `sendPhoto`. +- **Stickers**: Logged but not fully processed (no agent response). +- **Unsupported types**: Logged (e.g., messages from protected users). + +## Capabilities + +| Feature | Status | +| --------------- | ------------------------------ | +| Direct messages | ✅ Supported | +| Groups | ❌ Coming soon (per Zalo docs) | +| Media (images) | ✅ Supported | +| Reactions | ❌ Not supported | +| 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) + +Provider options: + +- `channels.zalo.enabled`: enable/disable channel startup. +- `channels.zalo.botToken`: bot token from Zalo Bot Platform. +- `channels.zalo.tokenFile`: read token from file path. +- `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.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 token file. +- `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..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. diff --git a/docs/channels/zalouser.md b/docs/channels/zalouser.md new file mode 100644 index 0000000..e93e71a --- /dev/null +++ b/docs/channels/zalouser.md @@ -0,0 +1,140 @@ +--- +summary: "Zalo personal account support via zca-cli (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 `zca-cli`. + +> **Warning:** This is an unofficial integration and may result in account suspension/ban. Use at your own risk. + +## Plugin required + +Zalo Personal ships as a plugin and is not bundled with the core install. + +- Install via CLI: `openclaw plugins install @openclaw/zalouser` +- Or from a source checkout: `openclaw plugins install ./extensions/zalouser` +- Details: [Plugins](/tools/plugin) + +## Prerequisite: zca-cli + +The Gateway machine must have the `zca` binary available in `PATH`. + +- Verify: `zca --version` +- If missing, install zca-cli (see `extensions/zalouser/README.md` or the upstream zca-cli docs). + +## Quick setup (beginner) + +1. Install the plugin (see above). +2. Login (QR, on the Gateway machine): + - `openclaw channels login --channel zalouser` + - Scan the QR code in the terminal with the Zalo mobile app. +3. Enable the channel: + +```json5 +{ + channels: { + zalouser: { + enabled: true, + dmPolicy: "pairing", + }, + }, +} +``` + +4. Restart the Gateway (or finish onboarding). +5. DM access defaults to pairing; approve the pairing code on first contact. + +## What it is + +- Uses `zca listen` to receive inbound messages. +- Uses `zca msg ...` to send replies (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. The wizard resolves names to IDs via `zca friend find` when available. + +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 are group IDs or names) +- 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; unresolved entries are kept as typed. + +Example: + +```json5 +{ + channels: { + zalouser: { + groupPolicy: "allowlist", + groups: { + "123456789": { allow: true }, + "Work Chat": { allow: true }, + }, + }, + }, +} +``` + +## Multi-account + +Accounts map to zca profiles. Example: + +```json5 +{ + channels: { + zalouser: { + enabled: true, + defaultAccount: "default", + accounts: { + work: { enabled: true, profile: "work" }, + }, + }, + }, +} +``` + +## Troubleshooting + +**`zca` not found:** + +- Install zca-cli and ensure it’s on `PATH` for the Gateway process. + +**Login doesn’t stick:** + +- `openclaw channels status --probe` +- Re-login: `openclaw channels logout --channel zalouser && openclaw channels login --channel zalouser` diff --git a/docs/ci.md b/docs/ci.md new file mode 100644 index 0000000..64d4df0 --- /dev/null +++ b/docs/ci.md @@ -0,0 +1,50 @@ +--- +title: CI Pipeline +description: How the OpenClaw CI pipeline works +--- + +# CI Pipeline + +The CI runs on every push to `main` and every pull request. It uses smart scoping to skip expensive jobs when only docs or native code changed. + +## Job Overview + +| Job | Purpose | When it runs | +| ----------------- | ----------------------------------------------- | ------------------------- | +| `docs-scope` | Detect docs-only changes | Always | +| `changed-scope` | Detect which areas changed (node/macos/android) | Non-docs PRs | +| `check` | TypeScript types, lint, format | Non-docs changes | +| `check-docs` | Markdown lint + broken link check | Docs changed | +| `code-analysis` | LOC threshold check (1000 lines) | PRs only | +| `secrets` | Detect leaked secrets | Always | +| `build-artifacts` | Build dist once, share with other jobs | Non-docs, node changes | +| `release-check` | Validate npm pack contents | After build | +| `checks` | Node/Bun tests + protocol check | Non-docs, node changes | +| `checks-windows` | Windows-specific tests | Non-docs, node changes | +| `macos` | Swift lint/build/test + TS tests | PRs with macos changes | +| `android` | Gradle build + tests | Non-docs, android changes | + +## Fail-Fast Order + +Jobs are ordered so cheap checks fail before expensive ones run: + +1. `docs-scope` + `code-analysis` + `check` (parallel, ~1-2 min) +2. `build-artifacts` (blocked on above) +3. `checks`, `checks-windows`, `macos`, `android` (blocked on build) + +## Runners + +| Runner | Jobs | +| -------------------------------- | ------------------------------------------ | +| `blacksmith-16vcpu-ubuntu-2404` | Most Linux jobs, including scope detection | +| `blacksmith-16vcpu-windows-2025` | `checks-windows` | +| `macos-latest` | `macos`, `ios` | + +## Local Equivalents + +```bash +pnpm check # types + lint + format +pnpm test # vitest tests +pnpm check:docs # docs format + lint + broken links +pnpm release:check # validate npm pack +``` diff --git a/docs/cli/acp.md b/docs/cli/acp.md new file mode 100644 index 0000000..9535509 --- /dev/null +++ b/docs/cli/acp.md @@ -0,0 +1,182 @@ +--- +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 ACP (Agent Client Protocol) bridge that talks to a 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. + +## 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 +``` + +## How to use this + +Use ACP when an IDE (or other client) speaks Agent Client Protocol and you want +it to drive a 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. + +## 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