fix(portable): Gemini keys, Telegram pairing UI, and config durability

Improve first-run and channel setup for non-technical users: detect newer
Gemini key formats, pin Node 22.22.3, add Control Panel Telegram approve
flow, and keep channels/models when config is rewritten. Persist uclaw
wizard state via uclaw-meta.json so restarts skip language/persona prompts.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-18 18:45:03 +08:00
parent 0be8c3e3fe
commit dd8e0f55c3
35 changed files with 2673 additions and 34 deletions

View File

@@ -0,0 +1,65 @@
---
name: pdf-toolkit
description: "PDF toolkit - merge, split, extract text, convert to images. Runs locally."
metadata: { "openclaw": { "emoji": "📄" } }
---
# PDF Toolkit
Common operations on local PDF files: merge, split, extract text, convert. Prefers
tools already on the system, otherwise uses Python's `pypdf` (lightweight, pure
Python, installed on first use with `pip install pypdf`).
Everything runs on this machine. Nothing is uploaded.
## What it does
- **Merge**: combine several PDFs into one
- **Split**: break into pages, or pull out a page range
- **Extract text**: export contents as plain text for summarising or searching
- **Inspect**: page count and document metadata
## How to run it
Use the Bash tool. These examples use `pypdf` — cross-platform, no Office or
Acrobat needed.
```bash
# Ensure the dependency (first run only)
python -c "import pypdf" 2>/dev/null || pip install -q pypdf
# Merge a.pdf and b.pdf into merged.pdf
python - <<'PY'
from pypdf import PdfWriter
w = PdfWriter()
for f in ["a.pdf", "b.pdf"]:
w.append(f)
w.write("merged.pdf"); w.close()
print("merged -> merged.pdf")
PY
# Extract all text
python - <<'PY'
from pypdf import PdfReader
r = PdfReader("input.pdf")
print("\n".join((p.extract_text() or "") for p in r.pages))
PY
# Pull out pages 1-3 into sub.pdf
python - <<'PY'
from pypdf import PdfReader, PdfWriter
r = PdfReader("input.pdf"); w = PdfWriter()
for i in range(0, 3):
w.add_page(r.pages[i])
w.write("sub.pdf"); w.close()
print("extracted pages 1-3 -> sub.pdf")
PY
```
## Working notes
- Check the file exists first with `ls`, and get the page count with
`python -c "from pypdf import PdfReader; print(len(PdfReader('x.pdf').pages))"`
- Scanned PDFs are images — text extraction returning nothing is expected.
Tell the user it needs OCR rather than reporting an empty result as success.
- Write output next to the source file, and tell the user the filename you created.