Auto backup: 2026-02-20 13:01

This commit is contained in:
Krilly
2026-02-20 13:01:46 +00:00
parent fa9191136f
commit 6337dac343
24 changed files with 13594 additions and 149 deletions

View File

@@ -52,6 +52,10 @@
"playwright-scraper-skill": {
"version": "1.2.0",
"installedAt": 1771420763721
},
"youtube-transcript-analyzer": {
"version": "1.0.0",
"installedAt": 1771592050250
}
}
}

View File

@@ -32,7 +32,6 @@
- **Token:** AGKnHafW3FGzBlt
### ⛔ NEVER USE - Cost Warnings
- **`openrouter/anthropic/*` — BANNED** — caused $96 bill in 1 hour (2026-02-19)
- Always use `anthropic/claude-*` direct, never via openrouter
- OpenRouter is fine for deepseek, qwen, and other non-Anthropic models

View File

@@ -21,6 +21,12 @@
- **Tools:** MS Office Suite, FreshRSS, Notion, Home Assistant, n8n, Gitea, Telegram
- **Goals:** Make things "just work" — reduce friction, automate repetitive tasks
## Email Preference
- **Primary inbox + outgoing account for agent email:** `krillyclaw@gmail.com`
- **Secondary/backup:** `krilly@agentmail.to`
- **Use primary by default unless Anthony says otherwise**
## Family
- **Mother:** Grace Martin (born June 1951)

View File

@@ -0,0 +1,29 @@
# Auto-Backup Verifier — Runbook
## Purpose
Verify daily that backup pushed to Gitea includes critical files.
## Import
1. Open n8n → Workflows → Import from file
2. Import `backup-verifier-workflow.json`
3. Configure credentials:
- HTTP Header Auth for Gitea API (Authorization: token <YOUR_GITEA_TOKEN>)
- Telegram credential named `Telegram account`
4. Set env var in n8n for Gotify:
- `GOTIFY_TOKEN=<your token>`
## What it checks
- AGENTS.md
- MEMORY.md
- TOOLS.md
- state-backup/openclaw.json
- state-backup/cron/jobs.json
- state-backup/devices/paired.json
## Alerts
- Success: Gotify priority 2
- Failure: Gotify priority 9 + Telegram alert
## Notes
- Schedule is 02:20 AWST by default (after backup)
- Keep workflow inactive until credentials are confirmed

View File

@@ -0,0 +1,169 @@
{
"name": "Auto-Backup Verifier",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "20 2 * * *"
}
]
},
"timezone": "Australia/Perth"
},
"id": "cron-trigger",
"name": "Daily 02:20 AWST",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [200, 300]
},
{
"parameters": {
"assignments": {
"assignments": [
{ "name": "repoOwner", "type": "string", "value": "Anthony" },
{ "name": "repoName", "type": "string", "value": "openclaw-backups" },
{ "name": "branch", "type": "string", "value": "main" },
{ "name": "requiredPaths", "type": "string", "value": "AGENTS.md,MEMORY.md,TOOLS.md,state-backup/openclaw.json,state-backup/cron/jobs.json,state-backup/devices/paired.json" }
]
}
},
"id": "set-context",
"name": "Set Context",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [420, 300]
},
{
"parameters": {
"url": "=http://gitea.kangaroo-eel.ts.net:3000/api/v1/repos/{{$json.repoOwner}}/{{$json.repoName}}/branches/{{$json.branch}}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": { "timeout": 10000 }
},
"id": "get-branch",
"name": "Get Branch Head",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [660, 300],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 2000
},
{
"parameters": {
"url": "=http://gitea.kangaroo-eel.ts.net:3000/api/v1/repos/{{$node[\"Set Context\"].json.repoOwner}}/{{$node[\"Set Context\"].json.repoName}}/git/trees/{{$json.commit.id}}?recursive=1",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"options": { "timeout": 10000 }
},
"id": "get-tree",
"name": "Get Repo Tree",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [900, 300],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 2000
},
{
"parameters": {
"jsCode": "const required = $node['Set Context'].json.requiredPaths.split(',').map(s => s.trim());\nconst tree = $json.tree || [];\nconst existing = new Set(tree.map(t => t.path));\nconst missing = required.filter(p => !existing.has(p));\nreturn [{ json: {\n status: missing.length ? 'failed' : 'ok',\n missing,\n checked: required.length,\n headSha: ($node['Get Branch Head'].json.commit || {}).id || '',\n repo: `${$node['Set Context'].json.repoOwner}/${$node['Set Context'].json.repoName}`\n}}];"
},
"id": "validate",
"name": "Validate Required Files",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [1140, 300]
},
{
"parameters": {
"conditions": {
"string": [
{ "value1": "={{$json.status}}", "operation": "equals", "value2": "ok" }
]
}
},
"id": "if-ok",
"name": "Backup OK?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [1360, 300]
},
{
"parameters": {
"url": "=http://runtipi.kangaroo-eel.ts.net:8129/message?token={{$env.GOTIFY_TOKEN}}",
"sendBody": true,
"contentType": "json",
"bodyParameters": {
"parameters": [
{ "name": "title", "value": "✅ Backup Verified" },
{ "name": "message", "value": "={{`Repo ${$json.repo} verified. SHA: ${$json.headSha.slice(0,7)}. Checked ${$json.checked} required files.`}}" },
{ "name": "priority", "value": "2" }
]
},
"options": { "timeout": 10000 }
},
"id": "notify-ok",
"name": "Gotify Success",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [1600, 200]
},
{
"parameters": {
"url": "=http://runtipi.kangaroo-eel.ts.net:8129/message?token={{$env.GOTIFY_TOKEN}}",
"sendBody": true,
"contentType": "json",
"bodyParameters": {
"parameters": [
{ "name": "title", "value": "🚨 Backup Verification Failed" },
{ "name": "message", "value": "={{`Repo ${$json.repo} failed verification. Missing: ${$json.missing.join(', ')}. SHA: ${$json.headSha.slice(0,7)}`}}" },
{ "name": "priority", "value": "9" }
]
},
"options": { "timeout": 10000 }
},
"id": "notify-fail-gotify",
"name": "Gotify Failure",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [1600, 360]
},
{
"parameters": {
"chatId": "1793951355",
"text": "={{`🦀 Backup verifier failed\nRepo: ${$json.repo}\nMissing: ${$json.missing.join(', ')}\nSHA: ${$json.headSha.slice(0,7)}`}}",
"additionalFields": {}
},
"id": "notify-fail-telegram",
"name": "Telegram Failure",
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [1810, 360],
"credentials": {
"telegramApi": {
"name": "Telegram account"
}
}
}
],
"connections": {
"Daily 02:20 AWST": { "main": [[{ "node": "Set Context", "type": "main", "index": 0 }]] },
"Set Context": { "main": [[{ "node": "Get Branch Head", "type": "main", "index": 0 }]] },
"Get Branch Head": { "main": [[{ "node": "Get Repo Tree", "type": "main", "index": 0 }]] },
"Get Repo Tree": { "main": [[{ "node": "Validate Required Files", "type": "main", "index": 0 }]] },
"Validate Required Files": { "main": [[{ "node": "Backup OK?", "type": "main", "index": 0 }]] },
"Backup OK?": {
"main": [
[{ "node": "Gotify Success", "type": "main", "index": 0 }],
[{ "node": "Gotify Failure", "type": "main", "index": 0 }]
]
},
"Gotify Failure": { "main": [[{ "node": "Telegram Failure", "type": "main", "index": 0 }]] }
},
"settings": { "executionOrder": "v1" },
"active": false
}

View File

@@ -0,0 +1,98 @@
{
"name": "Newsletter Compressor",
"nodes": [
{
"parameters": {
"rule": {"interval": [{"field": "cronExpression", "expression": "15 7 * * *"}]},
"timezone": "Australia/Perth"
},
"id": "cron",
"name": "Daily 07:15 AWST",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [220, 300]
},
{
"parameters": {
"httpMethod": "POST",
"path": "newsletter-compressor-run",
"responseMode": "onReceived",
"options": {}
},
"id": "webhook",
"name": "Webhook Execute (POST)",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [220, 460]
},
{
"parameters": {
"assignments": {
"assignments": [
{
"name": "wakeText",
"type": "string",
"value": "Create a morning newsletter compressor briefing for Anthony. Collect latest unread/recent newsletter-style items (AI/news/tech), cluster into themes, and send a concise Telegram brief to telegram:1793951355 with: (1) Top 5 bullets, (2) Why it matters in one line each, (3) One recommended read. Keep it tight and useful. If nothing meaningful, send NO_REPLY."
}
]
}
},
"id": "set",
"name": "Set Prompt",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [470, 380]
},
{
"parameters": {
"url": "http://openclaw.kangaroo-eel.ts.net:18789/api/wake",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"contentType": "json",
"bodyParameters": {
"parameters": [
{"name": "text", "value": "={{$json.wakeText}}"},
{"name": "mode", "value": "now"}
]
},
"options": {"timeout": 15000}
},
"id": "wake",
"name": "Trigger OpenClaw Briefing",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [730, 380],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 2000
},
{
"parameters": {
"url": "http://runtipi.kangaroo-eel.ts.net:8129/message?token=AGKnHafW3FGzBlt",
"sendBody": true,
"contentType": "json",
"bodyParameters": {
"parameters": [
{"name": "title", "value": "📰 Newsletter Compressor Triggered"},
{"name": "message", "value": "Morning newsletter compression job was triggered via n8n."},
{"name": "priority", "value": "3"}
]
}
},
"id": "gotify",
"name": "Gotify Status",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [980, 380]
}
],
"connections": {
"Daily 07:15 AWST": {"main": [[{"node": "Set Prompt", "type": "main", "index": 0}]]},
"Webhook Execute (POST)": {"main": [[{"node": "Set Prompt", "type": "main", "index": 0}]]},
"Set Prompt": {"main": [[{"node": "Trigger OpenClaw Briefing", "type": "main", "index": 0}]]},
"Trigger OpenClaw Briefing": {"main": [[{"node": "Gotify Status", "type": "main", "index": 0}]]}
},
"settings": {"executionOrder": "v1"},
"active": false
}

View File

@@ -0,0 +1,142 @@
{
"name": "OpenClaw Drift Detector",
"nodes": [
{
"parameters": {
"rule": {"interval": [{"field": "cronExpression", "expression": "45 6 * * *"}]},
"timezone": "Australia/Perth"
},
"id": "cron",
"name": "Daily 06:45 AWST",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [220, 320]
},
{
"parameters": {
"assignments": {
"assignments": [
{"name": "repoOwner", "type": "string", "value": "Anthony"},
{"name": "repoName", "type": "string", "value": "openclaw-backups"},
{"name": "branch", "type": "string", "value": "main"}
]
}
},
"id": "set",
"name": "Set Repo Context",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [440, 320]
},
{
"parameters": {
"url": "=http://gitea.kangaroo-eel.ts.net:3000/api/v1/repos/{{$json.repoOwner}}/{{$json.repoName}}/commits?sha={{$json.branch}}&limit=2",
"options": {"timeout": 10000}
},
"id": "commits",
"name": "Get Last 2 Commits",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [680, 320],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 1500
},
{
"parameters": {
"jsCode": "const commits = Array.isArray($json) ? $json : ($json.data || []);\nif (commits.length < 2) {\n return [{json:{status:'insufficient_history', message:'Not enough commits to compare'}}];\n}\nreturn [{json:{status:'ok', head: commits[0].sha, base: commits[1].sha, headMsg: commits[0].commit?.message || '', baseMsg: commits[1].commit?.message || ''}}];"
},
"id": "prep",
"name": "Prepare Compare SHAs",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [920, 320]
},
{
"parameters": {
"conditions": {"string": [{"value1": "={{$json.status}}", "operation": "equals", "value2": "ok"}]}
},
"id": "if-ready",
"name": "Ready to Compare?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [1140, 320]
},
{
"parameters": {
"url": "=http://gitea.kangaroo-eel.ts.net:3000/api/v1/repos/Anthony/openclaw-backups/compare/{{$json.base}}...{{$json.head}}",
"options": {"timeout": 10000}
},
"id": "compare",
"name": "Compare Commits",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [1360, 260],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 1500
},
{
"parameters": {
"jsCode": "const files = $json.files || [];\nconst watch = [\n 'state-backup/openclaw.json',\n 'state-backup/cron/jobs.json',\n 'state-backup/devices/paired.json',\n 'AGENTS.md','SOUL.md','USER.md','TOOLS.md','MEMORY.md','HEARTBEAT.md'\n];\nconst changed = files.map(f => f.filename).filter(f => watch.some(w => f===w));\nconst critical = changed.filter(f => f.startsWith('state-backup/'));\nreturn [{json:{drift: changed.length>0, changed, critical, changedCount: changed.length, criticalCount: critical.length}}];"
},
"id": "analyze",
"name": "Analyze Drift",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [1580, 260]
},
{
"parameters": {
"conditions": {"boolean": [{"value1": "={{$json.drift}}", "operation": "true"}]}
},
"id": "if-drift",
"name": "Drift Detected?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [1800, 260]
},
{
"parameters": {
"url": "http://runtipi.kangaroo-eel.ts.net:8129/message?token=AGKnHafW3FGzBlt",
"sendBody": true,
"contentType": "json",
"bodyParameters": {"parameters": [
{"name": "title", "value": "🦀 OpenClaw Drift Detected"},
{"name": "message", "value": "={{`Changed files: ${$json.changed.join(', ')}${$json.criticalCount>0 ? '\nCritical state changed.' : ''}`}}"},
{"name": "priority", "value": "={{$json.criticalCount>0 ? 9 : 6}}"}
]}
},
"id": "gotify",
"name": "Gotify Drift Alert",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [2020, 220]
},
{
"parameters": {
"chatId": "1793951355",
"text": "={{`🦀 OpenClaw drift detected\nChanged: ${$json.changed.join(', ')}${$json.criticalCount>0 ? '\n⚠ Critical state changed' : ''}`}}"
},
"id": "tg",
"name": "Telegram Drift Alert",
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [2240, 220],
"credentials": {"telegramApi": {"name": "Telegram account"}}
}
],
"connections": {
"Daily 06:45 AWST": {"main": [[{"node": "Set Repo Context", "type": "main", "index": 0}]]},
"Set Repo Context": {"main": [[{"node": "Get Last 2 Commits", "type": "main", "index": 0}]]},
"Get Last 2 Commits": {"main": [[{"node": "Prepare Compare SHAs", "type": "main", "index": 0}]]},
"Prepare Compare SHAs": {"main": [[{"node": "Ready to Compare?", "type": "main", "index": 0}]]},
"Ready to Compare?": {"main": [[{"node": "Compare Commits", "type": "main", "index": 0}], []]},
"Compare Commits": {"main": [[{"node": "Analyze Drift", "type": "main", "index": 0}]]},
"Analyze Drift": {"main": [[{"node": "Drift Detected?", "type": "main", "index": 0}]]},
"Drift Detected?": {"main": [[{"node": "Gotify Drift Alert", "type": "main", "index": 0}], []]},
"Gotify Drift Alert": {"main": [[{"node": "Telegram Drift Alert", "type": "main", "index": 0}]]}
},
"settings": {"executionOrder": "v1"},
"active": false
}

View File

@@ -0,0 +1,106 @@
{
"name": "Weekend Planner 2.0 (HITL)",
"nodes": [
{
"parameters": {
"rule": {"interval": [{"field": "cronExpression", "expression": "0 16 * * 5"}]},
"timezone": "Australia/Perth"
},
"id": "cron",
"name": "Friday 4:00 PM AWST",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [220, 280]
},
{
"parameters": {
"httpMethod": "POST",
"path": "weekend-planner-2-run",
"responseMode": "onReceived",
"options": {}
},
"id": "webhook-run",
"name": "Webhook Execute (POST)",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [220, 430]
},
{
"parameters": {
"assignments": {
"assignments": [
{"name": "draftPrompt", "type": "string", "value": "Create a weekend plan draft for Anthony in Perth. Use: calendar items next 3 days, Perth weather, and practical recommendations. Output concise sections: Saturday, Sunday, Prep List, and one fun optional idea. Keep it useful and warm."},
{"name": "approvalHint", "type": "string", "value": "Reply APPROVE to send full plan, or REGEN to regenerate."}
]
}
},
"id": "set",
"name": "Set Planner Prompt",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [450, 350]
},
{
"parameters": {
"url": "http://openclaw.kangaroo-eel.ts.net:18789/api/wake",
"sendBody": true,
"contentType": "json",
"bodyParameters": {
"parameters": [
{"name": "text", "value": "={{$json.draftPrompt}}"},
{"name": "mode", "value": "now"}
]
},
"options": {"timeout": 15000}
},
"id": "wake-draft",
"name": "Generate Plan Draft",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [700, 350],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 2000
},
{
"parameters": {
"url": "http://runtipi.kangaroo-eel.ts.net:8129/message?token=AGKnHafW3FGzBlt",
"sendBody": true,
"contentType": "json",
"bodyParameters": {
"parameters": [
{"name": "title", "value": "🗓️ Weekend Planner Draft Ready"},
{"name": "message", "value": "={{`Draft generated. ${$node['Set Planner Prompt'].json.approvalHint}`}}"},
{"name": "priority", "value": "5"}
]
}
},
"id": "gotify-draft",
"name": "Gotify Draft Ready",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [940, 350]
},
{
"parameters": {
"chatId": "1793951355",
"text": "🦀 Weekend Planner draft is ready. Reply here with APPROVE to send final plan, or REGEN to regenerate."
},
"id": "telegram-review",
"name": "Telegram Review Prompt",
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [1160, 350],
"credentials": {"telegramApi": {"name": "Telegram account"}}
}
],
"connections": {
"Friday 4:00 PM AWST": {"main": [[{"node": "Set Planner Prompt", "type": "main", "index": 0}]]},
"Webhook Execute (POST)": {"main": [[{"node": "Set Planner Prompt", "type": "main", "index": 0}]]},
"Set Planner Prompt": {"main": [[{"node": "Generate Plan Draft", "type": "main", "index": 0}]]},
"Generate Plan Draft": {"main": [[{"node": "Gotify Draft Ready", "type": "main", "index": 0}]]},
"Gotify Draft Ready": {"main": [[{"node": "Telegram Review Prompt", "type": "main", "index": 0}]]}
},
"settings": {"executionOrder": "v1"},
"active": false
}

6
memory/2026-02-20.md Normal file
View File

@@ -0,0 +1,6 @@
# 2026-02-20
- Anthony confirmed email preference: use `krilly@agentmail.to` as the main inbox and outgoing account for agent email.
- Keep `krilly@sendclaw.com` secondary unless explicitly requested.
- Anthony created a dedicated Gmail for me: `krillyclaw@gmail.com` and confirmed it should now be my primary inbox/outgoing account.
- `krilly@agentmail.to` is now secondary/backup.

View File

@@ -1,9 +1,9 @@
{
"lastChecks": {
"email": 1771494000,
"email": 1771542780,
"calendar": null,
"weather": null,
"news": 1771444800
},
"notes": "Calendar check unavailable - iMac does not support system.run. Email at krilly@agentmail.to - no new messages."
"notes": "7:13 AM Perth (Fri Feb 20). Morning briefing cron fired at 7:05 AM. No new emails. Calendar check unavailable - iMac does not support system.run."
}

Binary file not shown.

View File

@@ -17,9 +17,12 @@ class N8nClient:
"""n8n API client"""
def __init__(self, base_url: str = None, api_key: str = None):
self.base_url = base_url or os.getenv('N8N_BASE_URL')
raw_base = base_url or os.getenv('N8N_BASE_URL')
self.base_url = raw_base.rstrip('/') if raw_base else None
self.api_key = api_key or os.getenv('N8N_API_KEY')
if not self.base_url:
raise ValueError("N8N_BASE_URL not found in environment")
if not self.api_key:
raise ValueError("N8N_API_KEY not found in environment")

View File

@@ -0,0 +1,7 @@
{
"version": 1,
"registry": "https://clawhub.ai",
"slug": "youtube-transcript-analyzer",
"installedVersion": "1.0.0",
"installedAt": 1771592050248
}

View File

@@ -0,0 +1,82 @@
---
name: youtube-transcript
description: Extract and analyze YouTube video transcripts without watching the video. Use when users request video summaries, ask to "analyze this YouTube video", want transcripts extracted, or need to understand video content quickly. Handles any YouTube URL and provides cleaned transcripts plus AI analysis.
---
# YouTube Transcript Analysis
Extract, clean, and analyze YouTube video transcripts to understand content without watching.
## Overview
This skill enables rapid analysis of YouTube videos by extracting transcripts and providing comprehensive summaries. Perfect for research, content review, or understanding video material without time investment.
## Quick Workflow
1. **Extract**: Use `scripts/extract_transcript.sh` to get clean text from YouTube URL
2. **Read**: Load the extracted transcript file
3. **Analyze**: Provide structured summary based on content type
4. **Format**: Present findings in scannable, organized format
## Extraction Process
Use the bundled script for any YouTube video:
```bash
scripts/extract_transcript.sh "https://www.youtube.com/watch?v=VIDEO_ID" output.txt
```
The script automatically:
- Downloads yt-dlp if not present
- Extracts captions (auto-generated or manual)
- Cleans VTT formatting to plain text
- Provides character count and preview
## Analysis Approach
### Content Type Recognition
Identify video type first, then tailor analysis:
**Educational/Tutorial**: Step-by-step breakdown, key concepts, prerequisites
**Product Review**: Comparisons, pros/cons, recommendations, specifications
**News/Commentary**: Main topics, key arguments, sources cited
**Entertainment**: Highlights, key moments, recurring themes
### Structure Your Analysis
**For any video type:**
- **Title/Topic**: Clear description of video content
- **Duration insight**: Brief/detailed based on transcript length
- **Key points**: 3-7 main takeaways in bullet format
- **Notable quotes**: Important statements (if applicable)
- **Action items**: Next steps or recommendations (if present)
**For technical content:**
- Include specific terminology, version numbers, tools mentioned
- Note any code examples or configurations discussed
- Identify prerequisites or dependencies
### Quality Considerations
**Auto-generated transcripts may have:**
- Repetitive phrases
- Transcription errors for technical terms
- Missing punctuation
- Filler words ("um", "uh", "you know")
Filter and interpret accordingly - focus on clear, coherent content.
## Advanced Analysis
For detailed analysis patterns and content-specific approaches, see [analysis-patterns.md](references/analysis-patterns.md).
## Error Handling
**If extraction fails:**
- Video may lack captions
- May be private/restricted
- Network connectivity issues
- Age-restricted content
**Fallback approach:** Use web_fetch on the YouTube URL to get basic video information, then inform user about transcript limitations.

View File

@@ -0,0 +1,6 @@
{
"ownerId": "kn70p7web844540j9h6pt290sd818htj",
"slug": "youtube-transcript-analyzer",
"version": "1.0.0",
"publishedAt": 1771206844131
}

View File

@@ -0,0 +1,53 @@
# YouTube Transcript Analysis Patterns
## Common Analysis Tasks
### Video Summaries
- **Structure**: Intro → Main Points → Key Takeaways
- **Focus on**: Numbered lists, major topics, specific recommendations
- **Include**: Timestamps for longer videos, action items if present
### Educational Content
- **Extract**: Core concepts, steps in processes, key facts
- **Format**: Bullet points for easy scanning
- **Highlight**: Definitions, formulas, examples
### Product Reviews/Comparisons
- **Organize by**: Products compared, pros/cons, final verdict
- **Include**: Specific features mentioned, pricing if discussed
- **Note**: Personal opinions vs objective facts
### Tutorial/How-to Videos
- **Structure**: Step-by-step instructions
- **Include**: Prerequisites, tools needed, common mistakes
- **Format**: Numbered steps with key details
## Text Cleaning Notes
### Common Transcript Issues
- **Repetition**: Auto-generated transcripts often repeat phrases
- **Music tags**: `[music]` tags indicate background music
- **Filler words**: "uh", "um", "you know" are common
- **Missing punctuation**: Transcripts lack proper sentence structure
### Quality Indicators
- **Good quality**: Clear sentences, proper nouns correctly transcribed
- **Medium quality**: Some repetition, occasional word errors
- **Poor quality**: Heavy repetition, many transcription errors, missing words
## Analysis Tips
### For Technical Content
- Look for specific terminology, model names, version numbers
- Note any code examples or configuration details
- Identify prerequisites and dependencies mentioned
### For Opinion/Commentary
- Distinguish between facts and opinions
- Note sources cited or referenced
- Identify main arguments and supporting evidence
### For Entertainment Content
- Focus on key moments, reactions, highlights
- Note recurring themes or running jokes
- Identify guest appearances or special segments

View File

@@ -0,0 +1,69 @@
#!/bin/bash
# YouTube Transcript Extractor
# Extracts and cleans transcript from YouTube video URL
set -e
if [ $# -eq 0 ]; then
echo "Usage: $0 <youtube-url> [output-file]"
echo "Example: $0 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' transcript.txt"
exit 1
fi
VIDEO_URL="$1"
OUTPUT_FILE="${2:-transcript.txt}"
# Check if yt-dlp exists
if ! command -v yt-dlp &> /dev/null; then
# Try to find it in home directory
if [ -f "$HOME/yt-dlp" ]; then
YT_DLP="$HOME/yt-dlp"
else
echo "Error: yt-dlp not found. Installing to ~/yt-dlp..."
curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o "$HOME/yt-dlp"
chmod +x "$HOME/yt-dlp"
YT_DLP="$HOME/yt-dlp"
fi
else
YT_DLP="yt-dlp"
fi
echo "Extracting transcript from: $VIDEO_URL"
# Extract transcript as VTT subtitle file
$YT_DLP --write-auto-sub --write-sub --sub-lang en --skip-download --sub-format vtt "$VIDEO_URL" -o "temp_transcript" --quiet 2>/dev/null || {
echo "Warning: Some warnings occurred during extraction, but continuing..."
}
# Check if transcript was extracted
if [ ! -f "temp_transcript.en.vtt" ]; then
echo "Error: Failed to extract transcript. Video may not have captions available."
exit 1
fi
echo "Cleaning transcript..."
# Clean up the VTT format to extract just the text
grep -v "^[0-9]" temp_transcript.en.vtt | \
grep -v "^WEBVTT" | \
grep -v "^Kind:" | \
grep -v "^Language:" | \
grep -v "^\s*$" | \
grep -v "align:start" | \
sed 's/<[^>]*>//g' | \
tr '\n' ' ' | \
sed 's/ */ /g' | \
sed 's/^ *//g' | \
sed 's/ *$//g' > "$OUTPUT_FILE"
# Clean up temporary file
rm -f temp_transcript.en.vtt
echo "Transcript saved to: $OUTPUT_FILE"
echo "Character count: $(wc -c < "$OUTPUT_FILE")"
# Show first few lines as preview
echo -e "\nPreview:"
head -c 200 "$OUTPUT_FILE"
echo -e "...\n"

View File

@@ -8,4 +8,4 @@ Included state:
- devices/paired.json
- skills/*.json
Generated at: 2026-02-19T12:13:47Z
Generated at: 2026-02-20T13:01:46Z

View File

@@ -8,7 +8,7 @@
"enabled": true,
"notify": false,
"createdAtMs": 1771343375836,
"updatedAtMs": 1771477124683,
"updatedAtMs": 1771524040705,
"schedule": {
"kind": "cron",
"expr": "0 2 * * *",
@@ -22,10 +22,10 @@
"model": "opencode/kimi-k2.5-free"
},
"state": {
"nextRunAtMs": 1771524000000,
"lastRunAtMs": 1771437600016,
"nextRunAtMs": 1771610400000,
"lastRunAtMs": 1771524000006,
"lastStatus": "ok",
"lastDurationMs": 12483,
"lastDurationMs": 40699,
"consecutiveErrors": 0
},
"delivery": {
@@ -38,7 +38,7 @@
"name": "Morning Briefing",
"enabled": true,
"createdAtMs": 1771343566895,
"updatedAtMs": 1771474066604,
"updatedAtMs": 1771542423170,
"schedule": {
"expr": "5 7 * * *",
"kind": "cron",
@@ -52,10 +52,10 @@
"model": "opencode/kimi-k2.5-free"
},
"state": {
"nextRunAtMs": 1771542300000,
"lastRunAtMs": 1771455900004,
"nextRunAtMs": 1771628700000,
"lastRunAtMs": 1771542300004,
"lastStatus": "ok",
"lastDurationMs": 15170,
"lastDurationMs": 123166,
"consecutiveErrors": 0
},
"delivery": {
@@ -68,7 +68,7 @@
"name": "Weekend Briefing",
"enabled": true,
"createdAtMs": 1771343574470,
"updatedAtMs": 1771463024946,
"updatedAtMs": 1771573673222,
"schedule": {
"expr": "0 8 * * 0,6",
"kind": "cron",
@@ -78,14 +78,19 @@
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"message": "Generate weekend briefing:\n\n1. Get Perth weekend weather: curl -s \"wttr.in/Perth+Australia?format=%l:+%c+%t+%h+%w\"\n2. Get weekend forecast: curl -s \"wttr.in/Perth+Australia?F\"\n3. Run AI newsletter digest: /home/openclaw/.openclaw/workspace/automations/ai-newsletter-digest/daily-digest.sh\n4. Create weekend digest with weather + top AI/Tech stories\n5. Send via Telegram to Anthony",
"message": "Generate weekend briefing:\n\n1. Get Perth weekend weather: curl -s \"wttr.in/Perth+Australia?format=%l:+%c+%t+%h+%w\"\n2. Get weekend forecast: curl -s \"wttr.in/Perth+Australia?F\"\n3. Run AI newsletter digest: /home/openclaw/.openclaw/workspace/automations/ai-newsletter-digest/daily-digest.sh\n4. Create weekend digest with weather + top AI/Tech stories\n5. Send via Telegram to Anthony (channel: telegram, to: telegram:1793951355)\n\nSign off as Krilly the Crab 🦀",
"model": "opencode/kimi-k2.5-free"
},
"delivery": {
"mode": "announce"
},
"state": {
"nextRunAtMs": 1771632000000
"nextRunAtMs": 1771632000000,
"lastError": "cron announce delivery failed",
"lastRunAtMs": 1771573496349,
"lastStatus": "error",
"lastDurationMs": 176873,
"consecutiveErrors": 1
}
},
{
@@ -95,7 +100,7 @@
"enabled": true,
"notify": true,
"createdAtMs": 1771392667779,
"updatedAtMs": 1771477114198,
"updatedAtMs": 1771557508458,
"schedule": {
"expr": "30 6 * * *",
"kind": "cron",
@@ -105,7 +110,7 @@
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"message": "## OpenClaw Daily Intelligence Briefing\n\nRun a comprehensive search for OpenClaw news and information, then deliver a curated digest to Anthony.\n\n---\n\n### Step 1 — Search all sources\n\n#### 🔍 Web searches (run all of these via web_search)\n- `openclaw AI agent`\n- `clawdbot`\n- `clawhub new skills`\n- `clawflows automation`\n- `openclaw update release`\n- `openclaw site:reddit.com`\n- `openclaw site:github.com`\n- `openclaw site:discord.com`\n\n#### 📰 FreshRSS (last 24h)\nUse the freshrss skill: `/home/openclaw/.openclaw/workspace/skills/freshrss-reader/scripts/freshrss.sh headlines --hours 24 --count 100`\n- FRESHRSS_URL: `http://freshrss.kangaroo-eel.ts.net`\n- Filter results for: openclaw, clawdbot, clawhub, clawflows, AI agent, autonomous agent, self-hosted AI\n- If credentials are missing or it fails, skip gracefully\n\n#### 🤖 Reddit — fetch all of these with web_fetch and extract interesting posts:\n\n**Dedicated communities:**\n- `https://www.reddit.com/r/openclaw/new.json?limit=10`\n- `https://www.reddit.com/r/clawdbot/new.json?limit=10`\n- `https://www.reddit.com/r/OpenClaw/new.json?limit=10`\n\n**Broader AI agent & self-hosted communities (search within for openclaw/clawdbot):**\n- `https://www.reddit.com/r/selfhosted/search.json?q=openclaw+OR+clawdbot&sort=new&t=week&limit=10`\n- `https://www.reddit.com/r/homeserver/search.json?q=openclaw+OR+clawdbot&sort=new&t=week&limit=10`\n- `https://www.reddit.com/r/LocalLLaMA/search.json?q=openclaw+OR+clawdbot&sort=new&t=week&limit=10`\n- `https://www.reddit.com/r/artificial/search.json?q=openclaw&sort=new&t=week&limit=10`\n- `https://www.reddit.com/r/AIAssistants/search.json?q=openclaw&sort=new&t=week&limit=10`\n- `https://www.reddit.com/r/homeautomation/search.json?q=openclaw+OR+clawdbot&sort=new&t=week&limit=10`\n\n**Sitewide Reddit search:**\n- `https://www.reddit.com/search.json?q=openclaw&sort=new&t=day&limit=15`\n- `https://www.reddit.com/search.json?q=clawdbot&sort=new&t=week&limit=10`\n\n#### 🐙 GitHub\n- Fetch `https://api.github.com/search/repositories?q=openclaw&sort=updated&order=desc&per_page=5` for new/updated repos\n- Fetch `https://api.github.com/search/issues?q=openclaw&sort=updated&order=desc&per_page=5` for recent issues/PRs\n\n#### 📦 ClawHub\n- Fetch `https://clawhub.com` and look for recently added or updated skills\n\n#### 🗞️ Hacker News\n- `https://hn.algolia.com/api/v1/search?query=openclaw&tags=story&numericFilters=created_at_i>` + (current unix timestamp minus 604800 for last 7 days)\n\n---\n\n### Step 2 — Curate\n\nFrom everything collected, select the most noteworthy items. Prioritise:\n- New OpenClaw features, releases, or changelogs\n- New skills published on ClawHub\n- Community tips, tutorials, or showcase posts\n- Bug reports or known issues worth flagging\n- Interesting automations or use cases shared by the community\n- Any news from the broader AI agent ecosystem that's relevant to OpenClaw users\n\nBe honest: if it's been a quiet day, say so. Don't pad the digest.\n\n---\n\n### Step 3 — Telegram message\n\nSend a punchy Telegram message (channel: telegram, to: telegram:1793951355):\n- Header: 🦀 *OpenClaw Daily Digest* — [date]\n- Top 3-5 items as bullets with links\n- One-line summary at the bottom\n- Keep it tight — this is a highlights reel, not a report\n\n---\n\n### Step 4 — Email\n\nSend a full HTML email via the SendClaw API:\n- **From:** krilly@sendclaw.com\n- **To:** anthony@martinwa.org\n- **Subject:** 🦀 OpenClaw Daily Digest — [date]\n- **API:** POST https://sendclaw.com/api/send\n- **Auth:** Bearer sk_15000b789ec9a820f785681a4115396bd22c028e08c652e0\n- **Body:** Rich HTML with all findings grouped by source, links, and a short Krilly editorial note on anything particularly interesting or exciting\n\n---\n\n### Step 5 — Gotify Notification (High Priority)\n\nSend a Gotify notification with high priority to wake the screen:\n- **URL:** http://runtipi.kangaroo-eel.ts.net:8129\n- **Token:** AGKnHafW3FGzBlt\n- **Title:** 🦀 OpenClaw Daily Digest\n- **Message:** Brief summary of top items (1-2 sentences)\n- **Priority:** 8 (high - will wake screen)\n- Use curl to POST to /message?token=AGKnHafW3FGzBlt with JSON: {\"title\": \"...\", \"message\": \"...\", \"priority\": 8}\n\n---\n\n### Notes\n- Get the current date/time via session_status\n- If a subreddit doesn't exist (404), skip it silently\n- Be concise on Telegram, thorough in email\n- Sign off as Krilly the Crab 🦀",
"message": "## OpenClaw Daily Intelligence Briefing\n\nRun a comprehensive OpenClaw news scan (web_search + web_fetch + any available RSS sources), curate the best items, and deliver:\n\n1) Telegram highlights to Anthony (channel: telegram, to: telegram:1793951355)\n- Header: 🦀 OpenClaw Daily Digest — [date]\n- Top 35 items with links\n- One-line summary\n\n2) Full HTML email via Anthony's AgentInbox account (NOT SendClaw)\n- From: Anthony's AgentInbox sender address\n- To: anthony@martinwa.org\n- Subject: 🦀 OpenClaw Daily Digest — [date]\n- Use whatever AgentInbox sending method is already configured on this machine/account.\n- If AgentInbox credentials/config are missing, include that failure clearly in the Telegram note.\n\n3) Gotify high-priority notification\n- URL: http://runtipi.kangaroo-eel.ts.net:8129\n- Token: AGKnHafW3FGzBlt\n- Title: 🦀 OpenClaw Daily Digest\n- Message: 12 sentence summary\n- Priority: 8\n\nNotes:\n- Be concise on Telegram, detailed in email.\n- Sign off as Krilly the Crab 🦀",
"model": "opencode/kimi-k2.5-free"
},
"delivery": {
@@ -113,10 +118,10 @@
"channel": "telegram"
},
"state": {
"nextRunAtMs": 1771540200000,
"lastRunAtMs": 1771444800011,
"nextRunAtMs": 1771626600000,
"lastRunAtMs": 1771557459820,
"lastStatus": "ok",
"lastDurationMs": 326100,
"lastDurationMs": 48638,
"consecutiveErrors": 0
}
},
@@ -127,7 +132,7 @@
"enabled": true,
"notify": false,
"createdAtMs": 1771410489851,
"updatedAtMs": 1771502437803,
"updatedAtMs": 1771592433663,
"schedule": {
"kind": "cron",
"expr": "*/15 * * * *",
@@ -141,15 +146,47 @@
"model": "opencode/kimi-k2.5-free"
},
"state": {
"lastRunAtMs": 1771502400006,
"lastRunAtMs": 1771592400007,
"lastStatus": "ok",
"lastDurationMs": 37797,
"lastDurationMs": 33656,
"consecutiveErrors": 0,
"nextRunAtMs": 1771503300000
"nextRunAtMs": 1771593300000
},
"delivery": {
"mode": "none"
}
},
{
"id": "5128ea89-27cc-4e44-94e9-ba01161bdb70",
"agentId": "main",
"sessionKey": "agent:main:main:thread:15152",
"name": "Weekend Planner 2.0 (OpenClaw Native)",
"enabled": true,
"createdAtMs": 1771550432144,
"updatedAtMs": 1771574430914,
"schedule": {
"kind": "cron",
"expr": "0 16 * * 5",
"tz": "Australia/Perth"
},
"sessionTarget": "isolated",
"wakeMode": "now",
"payload": {
"kind": "agentTurn",
"model": "openrouter/arcee-ai/trinity-large-preview:free",
"message": "It's Friday 4:00 PM Perth. Create a concise weekend plan DRAFT for Anthony.\n\nRequirements:\n- Use available context/tools to include weather and any upcoming calendar items.\n- Structure: Saturday, Sunday, Prep List, Optional Fun Idea.\n- Keep it practical, warm, and short.\n- End with: \"Reply APPROVE to lock this in, or REGEN for another version.\"\n- Send the draft as your final user-facing response."
},
"delivery": {
"mode": "announce"
},
"state": {
"nextRunAtMs": 1772179200000,
"lastRunAtMs": 1771574430912,
"lastStatus": "error",
"lastDurationMs": 2,
"lastError": "model not allowed: openrouter/arcee-ai/trinity-large-preview:free",
"consecutiveErrors": 1
}
}
]
}

View File

@@ -3,41 +3,8 @@
"deviceId": "19bdb6c4b8bb95b961a08e9783c4e8c693470c326520e52abb4de73a21ec3035",
"publicKey": "eq45m_VEXdw-ulThS_kVxZqBWrOP7G-uofOfFHlruFY",
"platform": "linux",
"clientId": "gateway-client",
"clientMode": "backend",
"role": "operator",
"roles": [
"operator"
],
"scopes": [
"operator.admin",
"operator.approvals",
"operator.pairing"
],
"tokens": {
"operator": {
"token": "Nn7S7lrqMyoaLySzumT9OxT5jd8wKhwNio4cXSVJrVA",
"role": "operator",
"scopes": [
"operator.admin",
"operator.approvals",
"operator.pairing"
],
"createdAtMs": 1771335715448,
"lastUsedAtMs": 1771458588334
}
},
"createdAtMs": 1771335715448,
"approvedAtMs": 1771335715448,
"displayName": "agent"
},
"3e9fdd7e77c4f83fde9c33d63b0724f4b35ddf3a9730751e3ce20a15d539227f": {
"deviceId": "3e9fdd7e77c4f83fde9c33d63b0724f4b35ddf3a9730751e3ce20a15d539227f",
"publicKey": "zrrGT5HsReUmZ7UXVaqMrIyhONL58_JtXyPtPPSBmGQ",
"displayName": "Anthonys iMac",
"platform": "macOS 15.5.0",
"clientId": "openclaw-macos",
"clientMode": "ui",
"clientId": "cli",
"clientMode": "cli",
"role": "operator",
"roles": [
"operator",
@@ -46,11 +13,48 @@
"scopes": [
"operator.admin",
"operator.approvals",
"operator.pairing"
"operator.pairing",
"operator.read"
],
"tokens": {
"operator": {
"token": "pOqkzFQ9AUu_W2agKki6NzBzhoyMGY2NKkAz1tZHr-s",
"token": "VtY4O_93oKn3Zw2jslr49Ru9HOSm0xLZNvJ1BBmfssc",
"role": "operator",
"scopes": [
"operator.admin",
"operator.approvals",
"operator.pairing"
],
"createdAtMs": 1771335715448,
"rotatedAtMs": 1771591592155,
"lastUsedAtMs": 1771458588334
},
"node": {
"token": "xsomVS1NV3_jQOFvYX-n6EuZGWusY4Z1SxVg6mqXJEE",
"role": "node",
"scopes": [],
"createdAtMs": 1771566631762
}
},
"createdAtMs": 1771335715448,
"approvedAtMs": 1771566631762
},
"3e9fdd7e77c4f83fde9c33d63b0724f4b35ddf3a9730751e3ce20a15d539227f": {
"deviceId": "3e9fdd7e77c4f83fde9c33d63b0724f4b35ddf3a9730751e3ce20a15d539227f",
"publicKey": "zrrGT5HsReUmZ7UXVaqMrIyhONL58_JtXyPtPPSBmGQ",
"displayName": "Anthonys iMac",
"platform": "macOS 15.5.0",
"clientId": "openclaw-macos",
"clientMode": "node",
"role": "node",
"roles": [
"operator",
"node"
],
"scopes": [],
"tokens": {
"operator": {
"token": "ULjzNVJMuMLiUUy9hTM5_oqFxvCTySATPc41KAdBX_M",
"role": "operator",
"scopes": [
"operator.admin",
@@ -58,15 +62,15 @@
"operator.pairing"
],
"createdAtMs": 1771336202780,
"rotatedAtMs": 1771460386339,
"rotatedAtMs": 1771576681916,
"lastUsedAtMs": 1771431155136
},
"node": {
"token": "175K58mkmsdlFXJ8p_Kc8XpD6cUGQ1E7NAkdCgSpC5w",
"token": "1MH05UyLCNqXqHSoEkeR4RYTdKr5eYahKrUs9qV561s",
"role": "node",
"scopes": [],
"createdAtMs": 1771337393947,
"rotatedAtMs": 1771459788915,
"rotatedAtMs": 1771576685320,
"lastUsedAtMs": 1771459616261
}
},
@@ -164,5 +168,43 @@
},
"createdAtMs": 1771343754932,
"approvedAtMs": 1771343754932
},
"33bea54cec104bf88bd44cff623e1e8126ff9676c5b0e00139029611d63558e1": {
"deviceId": "33bea54cec104bf88bd44cff623e1e8126ff9676c5b0e00139029611d63558e1",
"publicKey": "7NCqxCMjZ0rCLPvB6XEUcy67DKJZHpqWO08YleAnaY8",
"displayName": "Anthonys iMac",
"platform": "macOS 15.5.0",
"clientId": "openclaw-macos",
"clientMode": "ui",
"role": "operator",
"roles": [
"operator",
"node"
],
"scopes": [
"operator.admin",
"operator.approvals",
"operator.pairing"
],
"tokens": {
"operator": {
"token": "I00TuT4vmBRY2jiWehW7mCaBQlf116BSiH2UCqUbc8M",
"role": "operator",
"scopes": [
"operator.admin",
"operator.approvals",
"operator.pairing"
],
"createdAtMs": 1771583776575
},
"node": {
"token": "dybLF_PYfno2mqzN-1ueDlYXP1P0ZQFWRay19d6SQdU",
"role": "node",
"scopes": [],
"createdAtMs": 1771583787059
}
},
"createdAtMs": 1771583776575,
"approvedAtMs": 1771583787059
}
}

View File

@@ -1,7 +1,7 @@
{
"meta": {
"lastTouchedVersion": "2026.2.17",
"lastTouchedAt": "2026-02-19T11:24:31.677Z"
"lastTouchedVersion": "2026.2.19-2",
"lastTouchedAt": "2026-02-20T11:17:43.761Z"
},
"env": {
"shellEnv": {
@@ -26,11 +26,25 @@
"CEREBRAS_API_KEY": "csk-hpp5jf3dw4myrhnyrv3jcn9npp83ffdt56xd3mfkjktjx4fd"
},
"wizard": {
"lastRunAt": "2026-02-19T09:16:46.931Z",
"lastRunVersion": "2026.2.17",
"lastRunCommand": "doctor",
"lastRunAt": "2026-02-20T11:17:43.720Z",
"lastRunVersion": "2026.2.19-2",
"lastRunCommand": "configure",
"lastRunMode": "local"
},
"diagnostics": {
"otel": {
"traces": true
},
"cacheTrace": {
"includeMessages": true,
"includePrompt": true,
"includeSystem": true
}
},
"update": {
"channel": "stable",
"checkOnStart": true
},
"browser": {
"enabled": true,
"evaluateEnabled": true,
@@ -62,27 +76,76 @@
"nim": {
"baseUrl": "https://integrate.api.nvidia.com/v1",
"apiKey": "",
"auth": "api-key",
"api": "openai-completions",
"authHeader": true,
"models": [
{
"id": "nvidia/llama-3.1-nemotron-70b-instruct",
"name": "Nemotron 70B",
"contextWindow": 131072
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 131072,
"maxTokens": 8192
},
{
"id": "nvidia/nemotron-3-nano-30b-a3b",
"name": "Nemotron Nano 30B",
"contextWindow": 1048576
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 1048576,
"maxTokens": 8192,
"compat": {
"thinkingFormat": "openai"
}
},
{
"id": "meta/llama-3.3-70b-instruct",
"name": "Llama 3.3 70B (NIM)",
"contextWindow": 131072
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 131072,
"maxTokens": 8192
},
{
"id": "qwen/qwen3-next-80b-a3b-thinking",
"name": "Qwen3 80B Thinking (NIM)",
"contextWindow": 131072
"reasoning": true,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 131072,
"maxTokens": 8192
}
]
}
@@ -93,10 +156,8 @@
},
"nodeHost": {
"browserProxy": {
"enabled": true,
"allowProfiles": [
"*"
]
"enabled": false,
"allowProfiles": []
}
},
"agents": {
@@ -104,43 +165,84 @@
"model": {
"primary": "openai-codex/gpt-5.3-codex",
"fallbacks": [
"anthropic/claude-sonnet-4-6",
"anthropic/claude-opus-4-6",
"opencode/minimax-m2.5-free",
"opencode/kimi-k2.5-free",
"opencode/glm-5-free",
"zai/glm-5",
"zai/glm-4.7",
"azure-openai-responses/gpt-5-nano",
"anthropic/claude-sonnet-4-6",
"google-antigravity/gemini-3-pro-low",
"google-antigravity/gemini-3-flash",
"huggingface/Qwen/Qwen3.5-397B-A17B",
"google-antigravity/claude-opus-4-6-thinking",
"openrouter/qwen/qwen3-coder:free",
"openrouter/openai/gpt-oss-120b:free",
"openrouter/stepfun/step-3.5-flash:free",
"nim/nvidia/llama-3.1-nemotron-70b-instruct",
"nim/nvidia/nemotron-3-nano-30b-a3b",
"nim/meta/llama-3.3-70b-instruct",
"nim/qwen/qwen3-next-80b-a3b-thinking",
"opencode/big-pickle",
"opencode/minimax-m2.5-free"
"groq/openai/gpt-oss-120b",
"groq/moonshotai/kimi-k2-instruct-0905",
"groq/llama-3.3-70b-versatile",
"groq/meta-llama/llama-4-maverick-17b-128e-instruct",
"groq/meta-llama/llama-4-scout-17b-16e-instruct",
"groq/qwen/qwen3-32b",
"groq/openai/gpt-oss-20b",
"github-copilot/claude-sonnet-4.5",
"openai-codex/gpt-5.2",
"openrouter/arcee-ai/trinity-large-preview:free"
]
},
"models": {
"anthropic/claude-opus-4-6": {
"alias": "opus"
"alias": "opus",
"streaming": true
},
"opencode/minimax-m2.5-free": {
"streaming": true
},
"opencode/kimi-k2.5-free": {
"streaming": true
},
"opencode/minimax-m2.5-free": {},
"opencode/kimi-k2.5-free": {},
"opencode/glm-5-free": {
"alias": "glm5-free"
"alias": "glm5-free",
"streaming": true
},
"zai/glm-5": {
"alias": "zai-glm5"
"alias": "zai-glm5",
"streaming": true
},
"zai/glm-4.7": {
"alias": "nvidia-glm47"
"alias": "nvidia-glm47",
"streaming": true
},
"azure-openai-responses/gpt-5-nano": {
"streaming": true
},
"anthropic/claude-sonnet-4-6": {
"streaming": true
},
"google-antigravity/gemini-3-pro-low": {
"streaming": true
},
"google-antigravity/gemini-3-flash": {
"streaming": true
},
"huggingface/Qwen/Qwen3.5-397B-A17B": {
"streaming": true
},
"azure-openai-responses/gpt-5-nano": {},
"anthropic/claude-sonnet-4-6": {},
"openai/gpt-5.3-codex": {},
"google-antigravity/gemini-3-pro-low": {},
"google-antigravity/gemini-3-flash": {},
"huggingface/Qwen/Qwen3.5-397B-A17B": {},
"openai-codex/gpt-5.3-codex": {
"alias": "codex53"
"alias": "codex53",
"streaming": true
},
"google-antigravity/claude-opus-4-6-thinking": {},
"openrouter/qwen/qwen3-coder:free": {
"alias": "qwen-coder-free"
},
"openrouter/z-ai/glm-4.5-air:free": {
"alias": "glm45-free"
"alias": "qwen-coder-free",
"streaming": true
},
"openrouter/openai/gpt-oss-120b:free": {
"alias": "gpt-oss-free"
@@ -184,18 +286,9 @@
"groq/openai/gpt-oss-20b": {
"alias": "gpt-oss-20b"
},
"cerebras/zai-glm-4.7": {
"alias": "glm47-cerebras"
},
"cerebras/qwen-3-235b-a22b-instruct-2507": {
"alias": "qwen3-235b-cerebras"
},
"cerebras/gpt-oss-120b": {
"alias": "gpt-oss-120b-cerebras"
},
"cerebras/llama3.1-8b": {
"alias": "llama8b-cerebras"
}
"github-copilot/claude-sonnet-4.5": {},
"openai-codex/gpt-5.2": {},
"openrouter/arcee-ai/trinity-large-preview:free": {}
},
"workspace": "/home/openclaw/.openclaw/workspace",
"timeFormat": "12",
@@ -208,7 +301,8 @@
"provider": "openai",
"remote": {
"batch": {
"enabled": true
"enabled": true,
"wait": true
}
},
"store": {
@@ -221,7 +315,10 @@
},
"query": {
"hybrid": {
"enabled": true
"enabled": true,
"mmr": {
"enabled": true
}
}
},
"cache": {
@@ -245,7 +342,9 @@
},
"heartbeat": {
"every": "1h",
"model": "opencode/kimi-k2.5-free"
"model": "anthropic/claude-3-5-haiku-latest",
"target": "last",
"suppressToolErrorWarnings": true
},
"maxConcurrent": 4,
"subagents": {
@@ -258,7 +357,7 @@
"scope": "shared",
"perSession": true,
"browser": {
"enabled": false,
"enabled": true,
"headless": true,
"enableNoVnc": true,
"allowHostControl": true,
@@ -269,9 +368,7 @@
},
"tools": {
"profile": "full",
"allow": [
"*"
],
"allow": [],
"byProvider": {},
"web": {
"search": {
@@ -287,18 +384,15 @@
"enabled": true,
"scope": {
"default": "allow",
"rules": [
{
"action": "allow"
}
]
"rules": []
},
"models": []
},
"sessions": {
"visibility": "all"
"visibility": "tree"
},
"loopDetection": {
"enabled": false,
"detectors": {
"genericRepeat": true,
"knownPollNoProgress": true,
@@ -308,8 +402,11 @@
"message": {
"crossContext": {
"allowWithinProvider": true,
"allowAcrossProviders": false,
"marker": {
"enabled": true
"enabled": true,
"prefix": "{channel}",
"suffix": "{channel}"
}
},
"broadcast": {
@@ -318,9 +415,7 @@
},
"agentToAgent": {
"enabled": true,
"allow": [
"*"
]
"allow": []
},
"elevated": {
"enabled": true,
@@ -330,10 +425,12 @@
"host": "gateway",
"security": "full",
"ask": "off",
"node": "19bdb6c4b8bb95b961a08e9783c4e8c693470c326520e52abb4de73a21ec3035",
"notifyOnExit": true,
"applyPatch": {
"enabled": true,
"workspaceOnly": false
"workspaceOnly": false,
"allowModels": []
}
},
"subagents": {
@@ -359,27 +456,30 @@
"config": true,
"debug": true,
"restart": true,
"useAccessGroups": true,
"allowFrom": {}
},
"approvals": {
"exec": {
"enabled": false,
"mode": "targets",
"agentFilter": [
""
],
"mode": "both",
"agentFilter": [],
"sessionFilter": [],
"targets": []
}
},
"session": {
"scope": "per-sender",
"dmScope": "main",
"typingMode": "thinking",
"sendPolicy": {
"default": "allow",
"rules": []
}
},
"cron": {
"enabled": true
},
"hooks": {
"enabled": true,
"token": "ec571440175e3740975119ba8b6b97ba3a46b1f8e797cb924dc5c63c98050142",
@@ -414,6 +514,7 @@
},
"channels": {
"telegram": {
"name": "Anthony",
"markdown": {
"tables": "code"
},
@@ -426,27 +527,79 @@
"configWrites": true,
"dmPolicy": "pairing",
"botToken": "8598508497:AAHmTMbnR7un2ADtmsjJr8moQkDOU9ILBps",
"replyToMode": "off",
"groups": {
"custom-1": {
"requireMention": true,
"groupPolicy": "allowlist",
"skills": [],
"enabled": true,
"allowFrom": [
1793951355
],
"topics": {
"Topic": {
"groupPolicy": "allowlist",
"enabled": true,
"allowFrom": [
61410349137
]
}
}
}
},
"allowFrom": [
1793951355
],
"groupAllowFrom": [
1793951355
],
"groupPolicy": "allowlist",
"dms": {},
"chunkMode": "length",
"draftChunk": {
"minChars": 200,
"maxChars": 800,
"breakPreference": "paragraph"
},
"streamMode": "partial",
"network": {
"autoSelectFamily": true
"autoSelectFamily": false
},
"actions": {
"reactions": true,
"sendMessage": true
},
"heartbeat": {
"useIndicator": true
},
"linkPreview": true
},
"bluebubbles": {
"name": "Anthony",
"markdown": {
"tables": "off"
},
"enabled": true,
"serverUrl": "http://anthonys-imac.kangaroo-eel.ts.net:1234",
"password": "RecOvery2026!",
"webhookPath": "/bluebubbles-webhook",
"dmPolicy": "pairing",
"groupPolicy": "allowlist"
"allowFrom": [
"anthony@martinwa.org"
],
"groupPolicy": "allowlist",
"chunkMode": "length",
"mediaLocalRoots": [
""
],
"blockStreaming": true,
"accounts": {}
}
},
"discovery": {
"wideArea": {
"enabled": true
}
},
"canvasHost": {
@@ -459,32 +612,48 @@
"gateway": {
"port": 18789,
"mode": "local",
"bind": "loopback",
"bind": "tailnet",
"controlUi": {
"allowedOrigins": [
"https://web.telegram.org",
"https://openclaw-ai.kangaroo-eel.ts.net"
],
"enabled": true,
"allowedOrigins": [],
"allowInsecureAuth": true,
"dangerouslyDisableDeviceAuth": true
},
"auth": {
"mode": "token",
"token": "e48f4335fff0f5254eda0e984ca79ed61d90df5d70d95165"
"token": "f5635aeb21763071b4e9beb862618f351995766d851b28dd",
"allowTailscale": true
},
"trustedProxies": [
"127.0.0.1",
"100.64.0.0/10"
],
"tools": {
"allow": [
""
]
"allow": []
},
"tailscale": {
"mode": "serve",
"resetOnExit": false
"mode": "off"
},
"remote": {
"url": "wss://openclaw-ai.kangaroo-eel.ts.net",
"transport": "direct",
"token": "8943b9da4975ba000b919cbf403b83c2f99df03c169ac4aa",
"password": "admin",
"sshTarget": "openclaw@openclaw-ai",
"sshIdentity": "openclaw"
},
"reload": {
"mode": "hybrid"
},
"tls": {
"autoGenerate": true,
"domain": "openclaw-ai.kangaroo-eel.ts.net"
},
"http": {
"endpoints": {
"chatCompletions": {
"enabled": true
},
"responses": {
"enabled": true,
"files": {
@@ -508,9 +677,10 @@
"citations": "auto"
},
"skills": {
"allowBundled": [
""
],
"allowBundled": [],
"load": {
"watch": true
},
"install": {
"nodeManager": "npm"
},
@@ -528,15 +698,19 @@
"enabled": true
},
"n8n": {
"enabled": true,
"apiKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjNDMwMjUzNS1hNWMzLTRkZjAtODIzNi1lZmE5YmVmNTAxMjQiLCJpc3MiOiJuOG4iLCJhdWQiOiJwdWJsaWMtYXBpIiwiaWF0IjoxNzY1NTk1MzkyfQ.RrwOyN27-F3Pztxtv4IAyBt1MKKU1l5lWb6nMGpGNic"
},
"notion": {
"enabled": true,
"apiKey": "secret_WbYevYCbHRpMngedlRaVXA8rCj0nlVPefciUzr1GWna"
},
"openai-whisper-api": {
"enabled": true,
"apiKey": "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"
},
"goplaces": {
"enabled": true,
"apiKey": "AIzaSyDSxyVL5fv3RstiY3YUV76pavuhiZMMXAA"
}
}
@@ -567,4 +741,4 @@
}
}
}
}
}

11336
tmp_vte.en.vtt Normal file

File diff suppressed because it is too large Load Diff

1076
tmp_vte_from11.txt Normal file

File diff suppressed because it is too large Load Diff

1
tmp_vte_transcript.txt Normal file

File diff suppressed because one or more lines are too long