From 0d9afaf05a185934a7a1eabe183cef62f556d6d3 Mon Sep 17 00:00:00 2001 From: Stream AI Date: Fri, 10 Apr 2026 20:14:25 +0000 Subject: [PATCH] Initial wiki push - 2026-04-10 --- .openclaw-wiki/cache/agent-digest.json | 430 +++++++++++++++++++++++++ .openclaw-wiki/cache/claims.jsonl | 1 + .openclaw-wiki/log.jsonl | 84 +++++ .openclaw-wiki/source-sync.json | 4 + .openclaw-wiki/state.json | 5 + AGENTS.md | 7 + WIKI.md | 16 + concepts/index.md | 10 + concepts/skill-diagram.md | 36 +++ concepts/skill-ontology.md | 42 +++ concepts/skill-search.md | 34 ++ concepts/skill-telegram-collector.md | 32 ++ concepts/skill-voice-tts.md | 36 +++ entities/index.md | 15 + entities/project-apps-portal.md | 32 ++ entities/project-flightradar24.md | 45 +++ entities/project-ha.md | 43 +++ entities/project-internet-orders.md | 42 +++ entities/project-proxy-vm.md | 48 +++ entities/project-snowbike-rag.md | 48 +++ entities/project-tapo.md | 37 +++ entities/project-telegram-collector.md | 42 +++ entities/project-video-notes.md | 32 ++ entities/project-wiki-memory.md | 178 ++++++++++ inbox.md | 3 + index.md | 53 +++ reports/claim-health.md | 14 + reports/contradictions.md | 14 + reports/index.md | 11 + reports/lint.md | 13 + reports/low-confidence.md | 14 + reports/open-questions.md | 14 + reports/stale-pages.md | 14 + sources/2026-04-09.md | 106 ++++++ sources/2026-04-10.md | 272 ++++++++++++++++ sources/brd.md | 132 ++++++++ sources/dev-task.md | 99 ++++++ sources/index.md | 13 + sources/memory.md | 250 ++++++++++++++ sources/project.md | 258 +++++++++++++++ sources/skill.md | 171 ++++++++++ sources/tz.md | 252 +++++++++++++++ syntheses/index.md | 6 + 43 files changed, 3008 insertions(+) create mode 100644 .openclaw-wiki/cache/agent-digest.json create mode 100644 .openclaw-wiki/cache/claims.jsonl create mode 100644 .openclaw-wiki/log.jsonl create mode 100644 .openclaw-wiki/source-sync.json create mode 100644 .openclaw-wiki/state.json create mode 100644 AGENTS.md create mode 100644 WIKI.md create mode 100644 concepts/index.md create mode 100644 concepts/skill-diagram.md create mode 100644 concepts/skill-ontology.md create mode 100644 concepts/skill-search.md create mode 100644 concepts/skill-telegram-collector.md create mode 100644 concepts/skill-voice-tts.md create mode 100644 entities/index.md create mode 100644 entities/project-apps-portal.md create mode 100644 entities/project-flightradar24.md create mode 100644 entities/project-ha.md create mode 100644 entities/project-internet-orders.md create mode 100644 entities/project-proxy-vm.md create mode 100644 entities/project-snowbike-rag.md create mode 100644 entities/project-tapo.md create mode 100644 entities/project-telegram-collector.md create mode 100644 entities/project-video-notes.md create mode 100644 entities/project-wiki-memory.md create mode 100644 inbox.md create mode 100644 index.md create mode 100644 reports/claim-health.md create mode 100644 reports/contradictions.md create mode 100644 reports/index.md create mode 100644 reports/lint.md create mode 100644 reports/low-confidence.md create mode 100644 reports/open-questions.md create mode 100644 reports/stale-pages.md create mode 100644 sources/2026-04-09.md create mode 100644 sources/2026-04-10.md create mode 100644 sources/brd.md create mode 100644 sources/dev-task.md create mode 100644 sources/index.md create mode 100644 sources/memory.md create mode 100644 sources/project.md create mode 100644 sources/skill.md create mode 100644 sources/tz.md create mode 100644 syntheses/index.md diff --git a/.openclaw-wiki/cache/agent-digest.json b/.openclaw-wiki/cache/agent-digest.json new file mode 100644 index 0000000..38f7a90 --- /dev/null +++ b/.openclaw-wiki/cache/agent-digest.json @@ -0,0 +1,430 @@ +{ + "pageCounts": { + "entity": 10, + "concept": 5, + "source": 8, + "synthesis": 0, + "report": 6 + }, + "claimCount": 0, + "claimHealth": { + "freshness": { + "fresh": 0, + "aging": 0, + "stale": 0, + "unknown": 0 + }, + "contested": 0, + "lowConfidence": 0, + "missingEvidence": 0 + }, + "contradictionClusters": [], + "pages": [ + { + "id": "concept.skill-diagram", + "title": "Skills: diagram-png & diagram-table", + "kind": "concept", + "path": "concepts/skill-diagram.md", + "sourceIds": [ + "source.skill" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:21:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "concept.skill-ontology", + "title": "Skill: ontology", + "kind": "concept", + "path": "concepts/skill-ontology.md", + "sourceIds": [ + "source.skill" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:21:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "concept.skill-search", + "title": "Skills: youtube-search & yandex-search", + "kind": "concept", + "path": "concepts/skill-search.md", + "sourceIds": [ + "source.skill" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:21:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "concept.skill-telegram-collector", + "title": "Skill: telegram-collector", + "kind": "concept", + "path": "concepts/skill-telegram-collector.md", + "sourceIds": [ + "source.skill" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:21:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "concept.skill-voice-tts", + "title": "Skill: voice-tts", + "kind": "concept", + "path": "concepts/skill-voice-tts.md", + "sourceIds": [ + "source.skill" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:21:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "entity.project-apps-portal", + "title": "Apps Portal", + "kind": "entity", + "path": "entities/project-apps-portal.md", + "sourceIds": [ + "source.dev-task" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:33:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "entity.project-flightradar24", + "title": "Карта шумового загрязнения FR24", + "kind": "entity", + "path": "entities/project-flightradar24.md", + "sourceIds": [ + "source.project" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:21:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "entity.project-ha", + "title": "Home Assistant", + "kind": "entity", + "path": "entities/project-ha.md", + "sourceIds": [ + "source.project" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:21:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "entity.project-internet-orders", + "title": "Интернет-заказы", + "kind": "entity", + "path": "entities/project-internet-orders.md", + "sourceIds": [ + "source.project" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:21:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "entity.project-proxy-vm", + "title": "Proxy VM (vpn-srv)", + "kind": "entity", + "path": "entities/project-proxy-vm.md", + "sourceIds": [ + "source.project" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:21:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "entity.project-snowbike-rag", + "title": "Snowbike RAG", + "kind": "entity", + "path": "entities/project-snowbike-rag.md", + "sourceIds": [ + "source.project" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:33:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "entity.project-tapo", + "title": "Tapo Camera Monitor", + "kind": "entity", + "path": "entities/project-tapo.md", + "sourceIds": [ + "source.project" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:21:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "entity.project-telegram-collector", + "title": "Telegram Collector", + "kind": "entity", + "path": "entities/project-telegram-collector.md", + "sourceIds": [ + "source.project" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:21:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "entity.project-video-notes", + "title": "Видеокружочки", + "kind": "entity", + "path": "entities/project-video-notes.md", + "sourceIds": [ + "source.tz" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:33:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "entity.project-wiki-memory", + "title": "Wiki & Memory", + "kind": "entity", + "path": "entities/project-wiki-memory.md", + "sourceIds": [ + "source.memory" + ], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:48:00.000Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "report.claim-health", + "title": "Claim Health", + "kind": "report", + "path": "reports/claim-health.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-09T22:04:02.263Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "report.contradictions", + "title": "Contradictions", + "kind": "report", + "path": "reports/contradictions.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-09T22:04:02.263Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "report.lint", + "title": "Lint Report", + "kind": "report", + "path": "reports/lint.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "unknown", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "report.low-confidence", + "title": "Low Confidence", + "kind": "report", + "path": "reports/low-confidence.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-09T22:04:02.263Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "report.open-questions", + "title": "Open Questions", + "kind": "report", + "path": "reports/open-questions.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-09T22:04:02.263Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "report.stale-pages", + "title": "Stale Pages", + "kind": "report", + "path": "reports/stale-pages.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:25:24.905Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "source.2026-04-09", + "title": "2026 04 09", + "kind": "source", + "path": "sources/2026-04-09.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-09T22:04:56.932Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "source.2026-04-10", + "title": "2026 04 10", + "kind": "source", + "path": "sources/2026-04-10.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T15:43:24.102Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "source.brd", + "title": "BRD", + "kind": "source", + "path": "sources/brd.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-09T22:22:18.682Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "source.dev-task", + "title": "DEV TASK", + "kind": "source", + "path": "sources/dev-task.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:37:41.693Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "source.memory", + "title": "MEMORY", + "kind": "source", + "path": "sources/memory.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T15:42:43.804Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "source.project", + "title": "PROJECT", + "kind": "source", + "path": "sources/project.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T15:41:41.998Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "source.skill", + "title": "SKILL", + "kind": "source", + "path": "sources/skill.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:17:08.264Z", + "claimCount": 0, + "topClaims": [] + }, + { + "id": "source.tz", + "title": "TZ", + "kind": "source", + "path": "sources/tz.md", + "sourceIds": [], + "questions": [], + "contradictions": [], + "freshnessLevel": "fresh", + "lastTouchedAt": "2026-04-10T13:36:51.302Z", + "claimCount": 0, + "topClaims": [] + } + ] +} diff --git a/.openclaw-wiki/cache/claims.jsonl b/.openclaw-wiki/cache/claims.jsonl new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.openclaw-wiki/cache/claims.jsonl @@ -0,0 +1 @@ + diff --git a/.openclaw-wiki/log.jsonl b/.openclaw-wiki/log.jsonl new file mode 100644 index 0000000..3111a78 --- /dev/null +++ b/.openclaw-wiki/log.jsonl @@ -0,0 +1,84 @@ +{"type":"init","timestamp":"2026-04-09T22:02:40.331Z","details":{"createdDirectories":[".","entities","concepts","syntheses","sources","reports","_attachments","_views",".openclaw-wiki",".openclaw-wiki/locks",".openclaw-wiki/cache"],"createdFiles":["AGENTS.md","WIKI.md","index.md","inbox.md",".openclaw-wiki/state.json",".openclaw-wiki/log.jsonl"]}} +{"type":"compile","timestamp":"2026-04-09T22:04:02.293Z","details":{"pageCounts":{"entity":0,"concept":0,"source":0,"synthesis":0,"report":5},"updatedFiles":["reports/open-questions.md","reports/contradictions.md","reports/low-confidence.md","reports/claim-health.md","reports/stale-pages.md",".openclaw-wiki/cache/agent-digest.json",".openclaw-wiki/cache/claims.jsonl","index.md","sources/index.md","entities/index.md","concepts/index.md","syntheses/index.md","reports/index.md"]}} +{"type":"ingest","timestamp":"2026-04-09T22:04:31.399Z","details":{"inputPath":"/home/node/.openclaw/workspace/MEMORY.md","pageId":"source.memory","pagePath":"sources/memory.md","bytes":11705,"created":true}} +{"type":"compile","timestamp":"2026-04-09T22:04:31.431Z","details":{"pageCounts":{"entity":0,"concept":0,"source":1,"synthesis":0,"report":5},"updatedFiles":["sources/memory.md",".openclaw-wiki/cache/agent-digest.json","index.md","sources/index.md"]}} +{"type":"ingest","timestamp":"2026-04-09T22:04:56.932Z","details":{"inputPath":"/home/node/.openclaw/workspace/memory/2026-04-09.md","pageId":"source.2026-04-09","pagePath":"sources/2026-04-09.md","bytes":4183,"created":true}} +{"type":"compile","timestamp":"2026-04-09T22:04:56.969Z","details":{"pageCounts":{"entity":0,"concept":0,"source":2,"synthesis":0,"report":5},"updatedFiles":["sources/2026-04-09.md",".openclaw-wiki/cache/agent-digest.json","index.md","sources/index.md"]}} +{"type":"ingest","timestamp":"2026-04-09T22:16:05.170Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/flightradar24/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":2949,"created":true}} +{"type":"compile","timestamp":"2026-04-09T22:16:05.214Z","details":{"pageCounts":{"entity":0,"concept":0,"source":3,"synthesis":0,"report":5},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json","index.md","sources/index.md"]}} +{"type":"ingest","timestamp":"2026-04-09T22:16:30.227Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/ha/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":4244,"created":false}} +{"type":"compile","timestamp":"2026-04-09T22:16:30.263Z","details":{"pageCounts":{"entity":0,"concept":0,"source":3,"synthesis":0,"report":5},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-09T22:16:55.754Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/internet-orders/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":4933,"created":false}} +{"type":"compile","timestamp":"2026-04-09T22:16:55.794Z","details":{"pageCounts":{"entity":0,"concept":0,"source":3,"synthesis":0,"report":5},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-09T22:17:21.034Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/telegram-collector/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":2344,"created":false}} +{"type":"compile","timestamp":"2026-04-09T22:17:21.070Z","details":{"pageCounts":{"entity":0,"concept":0,"source":3,"synthesis":0,"report":5},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-09T22:22:18.682Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/snowbike-rag/BRD.md","pageId":"source.brd","pagePath":"sources/brd.md","bytes":5102,"created":true}} +{"type":"compile","timestamp":"2026-04-09T22:22:18.719Z","details":{"pageCounts":{"entity":0,"concept":0,"source":4,"synthesis":0,"report":5},"updatedFiles":["sources/brd.md",".openclaw-wiki/cache/agent-digest.json","index.md","sources/index.md"]}} +{"type":"ingest","timestamp":"2026-04-09T22:22:44.441Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/snowbike-rag/DEV-TASK.md","pageId":"source.dev-task","pagePath":"sources/dev-task.md","bytes":3372,"created":true}} +{"type":"compile","timestamp":"2026-04-09T22:22:44.483Z","details":{"pageCounts":{"entity":0,"concept":0,"source":5,"synthesis":0,"report":5},"updatedFiles":["sources/dev-task.md",".openclaw-wiki/cache/agent-digest.json","index.md","sources/index.md"]}} +{"type":"ingest","timestamp":"2026-04-09T22:23:09.779Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/apps-portal/DEV-TASK.md","pageId":"source.dev-task","pagePath":"sources/dev-task.md","bytes":2574,"created":false}} +{"type":"compile","timestamp":"2026-04-09T22:23:09.820Z","details":{"pageCounts":{"entity":0,"concept":0,"source":5,"synthesis":0,"report":5},"updatedFiles":["sources/dev-task.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-09T22:23:35.509Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/video-notes/TZ.md","pageId":"source.tz","pagePath":"sources/tz.md","bytes":8806,"created":true}} +{"type":"compile","timestamp":"2026-04-09T22:23:35.547Z","details":{"pageCounts":{"entity":0,"concept":0,"source":6,"synthesis":0,"report":5},"updatedFiles":["sources/tz.md",".openclaw-wiki/cache/agent-digest.json","index.md","sources/index.md"]}} +{"type":"ingest","timestamp":"2026-04-09T22:25:47.780Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/proxy-vm/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":1165,"created":false}} +{"type":"compile","timestamp":"2026-04-09T22:25:47.818Z","details":{"pageCounts":{"entity":0,"concept":0,"source":6,"synthesis":0,"report":5},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-09T22:26:13.374Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/tapo/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":524,"created":false}} +{"type":"compile","timestamp":"2026-04-09T22:26:13.419Z","details":{"pageCounts":{"entity":0,"concept":0,"source":6,"synthesis":0,"report":5},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"lint","timestamp":"2026-04-10T07:09:42.554Z","details":{"issueCount":0,"reportPath":"reports/lint.md"}} +{"type":"compile","timestamp":"2026-04-10T07:16:23.292Z","details":{"pageCounts":{"entity":0,"concept":0,"source":6,"synthesis":0,"report":6},"updatedFiles":[".openclaw-wiki/cache/agent-digest.json","index.md","reports/index.md"]}} +{"type":"lint","timestamp":"2026-04-10T08:37:22.445Z","details":{"issueCount":0,"reportPath":"reports/lint.md"}} +{"type":"ingest","timestamp":"2026-04-10T13:05:53.981Z","details":{"inputPath":"/home/node/.openclaw/workspace/MEMORY.md","pageId":"source.memory","pagePath":"sources/memory.md","bytes":13897,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:05:54.063Z","details":{"pageCounts":{"entity":0,"concept":0,"source":6,"synthesis":0,"report":6},"updatedFiles":["sources/memory.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:06:37.656Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/internet-orders/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":4933,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:06:37.702Z","details":{"pageCounts":{"entity":0,"concept":0,"source":6,"synthesis":0,"report":6},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:07:17.907Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/telegram-collector/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":2344,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:07:17.985Z","details":{"pageCounts":{"entity":0,"concept":0,"source":6,"synthesis":0,"report":6},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:07:58.581Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/flightradar24/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":2949,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:07:58.658Z","details":{"pageCounts":{"entity":0,"concept":0,"source":6,"synthesis":0,"report":6},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:08:39.062Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/proxy-vm/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":1165,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:08:39.099Z","details":{"pageCounts":{"entity":0,"concept":0,"source":6,"synthesis":0,"report":6},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:09:19.902Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/tapo/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":524,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:09:19.984Z","details":{"pageCounts":{"entity":0,"concept":0,"source":6,"synthesis":0,"report":6},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:10:01.102Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/ha/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":4244,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:10:01.181Z","details":{"pageCounts":{"entity":0,"concept":0,"source":6,"synthesis":0,"report":6},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:10:59.081Z","details":{"inputPath":"/home/node/.openclaw/workspace/skills/ontology/SKILL.md","pageId":"source.skill","pagePath":"sources/skill.md","bytes":6703,"created":true}} +{"type":"compile","timestamp":"2026-04-10T13:10:59.293Z","details":{"pageCounts":{"entity":0,"concept":0,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/skill.md",".openclaw-wiki/cache/agent-digest.json","index.md","sources/index.md"]}} +{"type":"ingest","timestamp":"2026-04-10T13:12:15.696Z","details":{"inputPath":"/home/node/.openclaw/workspace/skills/youtube-search/SKILL.md","pageId":"source.skill","pagePath":"sources/skill.md","bytes":1565,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:12:15.804Z","details":{"pageCounts":{"entity":0,"concept":0,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/skill.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:12:58.401Z","details":{"inputPath":"/home/node/.openclaw/workspace/skills/telegram-collector/SKILL.md","pageId":"source.skill","pagePath":"sources/skill.md","bytes":6707,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:12:58.478Z","details":{"pageCounts":{"entity":0,"concept":0,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/skill.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:13:38.508Z","details":{"inputPath":"/home/node/.openclaw/workspace/skills/yandex-search/SKILL.md","pageId":"source.skill","pagePath":"sources/skill.md","bytes":1317,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:13:38.591Z","details":{"pageCounts":{"entity":0,"concept":0,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/skill.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:14:21.288Z","details":{"inputPath":"/home/node/.openclaw/workspace/skills/heygen-video/SKILL.md","pageId":"source.skill","pagePath":"sources/skill.md","bytes":5499,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:14:21.368Z","details":{"pageCounts":{"entity":0,"concept":0,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/skill.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:15:02.705Z","details":{"inputPath":"/home/node/.openclaw/workspace/skills/diagram-table/SKILL.md","pageId":"source.skill","pagePath":"sources/skill.md","bytes":3890,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:15:02.785Z","details":{"pageCounts":{"entity":0,"concept":0,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/skill.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:15:45.383Z","details":{"inputPath":"/home/node/.openclaw/skills/voice-tts/SKILL.md","pageId":"source.skill","pagePath":"sources/skill.md","bytes":3207,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:15:45.463Z","details":{"pageCounts":{"entity":0,"concept":0,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/skill.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:16:27.500Z","details":{"inputPath":"/home/node/.openclaw/skills/diagram-png/SKILL.md","pageId":"source.skill","pagePath":"sources/skill.md","bytes":12695,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:16:27.586Z","details":{"pageCounts":{"entity":0,"concept":0,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/skill.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:17:08.264Z","details":{"inputPath":"/home/node/.openclaw/skills/diagram-table/SKILL.md","pageId":"source.skill","pagePath":"sources/skill.md","bytes":3890,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:17:08.311Z","details":{"pageCounts":{"entity":0,"concept":0,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/skill.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"lint","timestamp":"2026-04-10T13:21:39.597Z","details":{"issueCount":0,"reportPath":"reports/lint.md"}} +{"type":"compile","timestamp":"2026-04-10T13:23:49.284Z","details":{"pageCounts":{"entity":6,"concept":5,"source":7,"synthesis":0,"report":6},"updatedFiles":["entities/project-ha.md","sources/project.md","entities/project-proxy-vm.md","sources/skill.md","concepts/skill-ontology.md","concepts/skill-telegram-collector.md","concepts/skill-voice-tts.md","concepts/skill-diagram.md","concepts/skill-search.md","entities/project-tapo.md","entities/project-telegram-collector.md","entities/project-internet-orders.md","entities/project-flightradar24.md","reports/stale-pages.md",".openclaw-wiki/cache/agent-digest.json","index.md","entities/index.md","concepts/index.md"]}} +{"type":"lint","timestamp":"2026-04-10T13:24:29.750Z","details":{"issueCount":22,"reportPath":"reports/lint.md"}} +{"type":"compile","timestamp":"2026-04-10T13:25:24.966Z","details":{"pageCounts":{"entity":6,"concept":5,"source":7,"synthesis":0,"report":6},"updatedFiles":["reports/stale-pages.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"lint","timestamp":"2026-04-10T13:26:05.292Z","details":{"issueCount":0,"reportPath":"reports/lint.md"}} +{"type":"compile","timestamp":"2026-04-10T13:34:23.302Z","details":{"pageCounts":{"entity":9,"concept":5,"source":7,"synthesis":0,"report":6},"updatedFiles":["entities/project-apps-portal.md","entities/project-ha.md","sources/project.md","entities/project-proxy-vm.md","entities/project-snowbike-rag.md","entities/project-tapo.md","entities/project-telegram-collector.md","entities/project-video-notes.md","entities/project-internet-orders.md","entities/project-flightradar24.md",".openclaw-wiki/cache/agent-digest.json","index.md","entities/index.md"]}} +{"type":"lint","timestamp":"2026-04-10T13:35:05.759Z","details":{"issueCount":2,"reportPath":"reports/lint.md"}} +{"type":"ingest","timestamp":"2026-04-10T13:36:51.302Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/video-notes/TZ.md","pageId":"source.tz","pagePath":"sources/tz.md","bytes":8806,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:36:51.409Z","details":{"pageCounts":{"entity":9,"concept":5,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/tz.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T13:37:41.693Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/apps-portal/DEV-TASK.md","pageId":"source.dev-task","pagePath":"sources/dev-task.md","bytes":2574,"created":false}} +{"type":"compile","timestamp":"2026-04-10T13:37:41.794Z","details":{"pageCounts":{"entity":9,"concept":5,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/dev-task.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"compile","timestamp":"2026-04-10T13:38:30.284Z","details":{"pageCounts":{"entity":9,"concept":5,"source":7,"synthesis":0,"report":6},"updatedFiles":["entities/project-apps-portal.md","sources/dev-task.md","sources/tz.md","entities/project-video-notes.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"lint","timestamp":"2026-04-10T13:39:11.453Z","details":{"issueCount":0,"reportPath":"reports/lint.md"}} +{"type":"compile","timestamp":"2026-04-10T13:49:57.707Z","details":{"pageCounts":{"entity":10,"concept":5,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/memory.md","entities/project-wiki-memory.md",".openclaw-wiki/cache/agent-digest.json","index.md","entities/index.md"]}} +{"type":"lint","timestamp":"2026-04-10T13:50:40.769Z","details":{"issueCount":0,"reportPath":"reports/lint.md"}} +{"type":"ingest","timestamp":"2026-04-10T14:25:18.403Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/proxy-vm/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":7374,"created":false}} +{"type":"compile","timestamp":"2026-04-10T14:25:18.509Z","details":{"pageCounts":{"entity":10,"concept":5,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T15:41:41.998Z","details":{"inputPath":"/home/node/.openclaw/workspace/tasks/proxy-vm/PROJECT.md","pageId":"source.project","pagePath":"sources/project.md","bytes":7909,"created":false}} +{"type":"compile","timestamp":"2026-04-10T15:41:42.100Z","details":{"pageCounts":{"entity":10,"concept":5,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/project.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T15:42:43.804Z","details":{"inputPath":"/home/node/.openclaw/workspace/MEMORY.md","pageId":"source.memory","pagePath":"sources/memory.md","bytes":15593,"created":false}} +{"type":"compile","timestamp":"2026-04-10T15:42:43.906Z","details":{"pageCounts":{"entity":10,"concept":5,"source":7,"synthesis":0,"report":6},"updatedFiles":["sources/memory.md",".openclaw-wiki/cache/agent-digest.json"]}} +{"type":"ingest","timestamp":"2026-04-10T15:43:24.102Z","details":{"inputPath":"/home/node/.openclaw/workspace/memory/2026-04-10.md","pageId":"source.2026-04-10","pagePath":"sources/2026-04-10.md","bytes":10904,"created":true}} +{"type":"compile","timestamp":"2026-04-10T15:43:24.202Z","details":{"pageCounts":{"entity":10,"concept":5,"source":8,"synthesis":0,"report":6},"updatedFiles":["sources/2026-04-10.md",".openclaw-wiki/cache/agent-digest.json","index.md","sources/index.md"]}} diff --git a/.openclaw-wiki/source-sync.json b/.openclaw-wiki/source-sync.json new file mode 100644 index 0000000..54c91ef --- /dev/null +++ b/.openclaw-wiki/source-sync.json @@ -0,0 +1,4 @@ +{ + "version": 1, + "entries": {} +} diff --git a/.openclaw-wiki/state.json b/.openclaw-wiki/state.json new file mode 100644 index 0000000..c18988b --- /dev/null +++ b/.openclaw-wiki/state.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "createdAt": "2026-04-09T22:02:40.331Z", + "renderMode": "native" +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..5e7b06f --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,7 @@ +# Memory Wiki Agent Guide + +- Treat generated blocks as plugin-owned. +- Preserve human notes outside managed markers. +- Prefer source-backed claims over wiki-to-wiki citation loops. +- Prefer structured `claims` with evidence over burying key beliefs only in prose. +- Use `.openclaw-wiki/cache/agent-digest.json` and `claims.jsonl` for machine reads; markdown pages are the human view. diff --git a/WIKI.md b/WIKI.md new file mode 100644 index 0000000..33531c0 --- /dev/null +++ b/WIKI.md @@ -0,0 +1,16 @@ +# Memory Wiki + +This vault is maintained by the OpenClaw memory-wiki plugin. + +- Vault mode: `bridge` +- Render mode: `native` +- Search corpus default: `all` + +## Architecture +- Raw sources remain the evidence layer. +- Wiki pages are the human-readable synthesis layer. +- `.openclaw-wiki/cache/agent-digest.json` is the agent-facing compiled digest. + +## Notes + + diff --git a/concepts/index.md b/concepts/index.md new file mode 100644 index 0000000..88b2ebc --- /dev/null +++ b/concepts/index.md @@ -0,0 +1,10 @@ +# Concepts + +## Generated + +- [Skill: ontology](concepts/skill-ontology.md) +- [Skill: telegram-collector](concepts/skill-telegram-collector.md) +- [Skill: voice-tts](concepts/skill-voice-tts.md) +- [Skills: diagram-png & diagram-table](concepts/skill-diagram.md) +- [Skills: youtube-search & yandex-search](concepts/skill-search.md) + diff --git a/concepts/skill-diagram.md b/concepts/skill-diagram.md new file mode 100644 index 0000000..1053823 --- /dev/null +++ b/concepts/skill-diagram.md @@ -0,0 +1,36 @@ +--- +pageType: concept +id: concept.skill-diagram +title: "Skills: diagram-png & diagram-table" +sourceIds: [source.skill] +updatedAt: 2026-04-10T13:21:00.000Z +tags: [skill, diagram, png, table, pillow] +--- + +# Skills: diagram-png & diagram-table + + +## diagram-png +Генерация PNG-диаграмм из JSON. Используй вместо ASCII-арта. `~/.openclaw/skills/diagram-png/` + +## diagram-table +Таблицы в PNG из JSON (Pillow, dark/light). Для Telegram — **обязательно** вместо markdown-таблиц. +- `generate_table.py` (stdin→PNG) +- `send_table.py` (PNG→Telegram) +- Требует `TELEGRAM_BOT_TOKEN` и `TELEGRAM_CHAT_ID` в `.env` +- Расположение: `~/.openclaw/skills/diagram-table/` и `~/.openclaw/workspace/skills/diagram-table/` + + +## Related + +### Sources + +- [SKILL](sources/skill.md) + +### Related Pages + +- [Skill: ontology](concepts/skill-ontology.md) +- [Skill: telegram-collector](concepts/skill-telegram-collector.md) +- [Skill: voice-tts](concepts/skill-voice-tts.md) +- [Skills: youtube-search & yandex-search](concepts/skill-search.md) + diff --git a/concepts/skill-ontology.md b/concepts/skill-ontology.md new file mode 100644 index 0000000..5dc68d8 --- /dev/null +++ b/concepts/skill-ontology.md @@ -0,0 +1,42 @@ +--- +pageType: concept +id: concept.skill-ontology +title: "Skill: ontology" +sourceIds: [source.skill] +updatedAt: 2026-04-10T13:21:00.000Z +tags: [skill, ontology, knowledge-graph, memory] +--- + +# Skill: ontology + + +## Описание +Граф знаний для структурированной памяти агента. Сущности: Person, Project, Task, Event, Document. CRUD + запросы. + +## Расположение +`~/.openclaw/workspace/skills/ontology/` + +## Ключевые файлы +- `memory/ontology/graph.jsonl` — граф +- `memory/ontology/schema.yaml` — схема типов +- `memory/ontology/RULES.md` — правила ведения + +## Правила +- Стрим — единственный writer +- Все изменения — только с ОК Славы +- Обязательно при работе с проектами/задачами + + +## Related + +### Sources + +- [SKILL](sources/skill.md) + +### Related Pages + +- [Skill: telegram-collector](concepts/skill-telegram-collector.md) +- [Skill: voice-tts](concepts/skill-voice-tts.md) +- [Skills: diagram-png & diagram-table](concepts/skill-diagram.md) +- [Skills: youtube-search & yandex-search](concepts/skill-search.md) + diff --git a/concepts/skill-search.md b/concepts/skill-search.md new file mode 100644 index 0000000..76fad6f --- /dev/null +++ b/concepts/skill-search.md @@ -0,0 +1,34 @@ +--- +pageType: concept +id: concept.skill-search +title: "Skills: youtube-search & yandex-search" +sourceIds: [source.skill] +updatedAt: 2026-04-10T13:21:00.000Z +tags: [skill, search, youtube, yandex, api] +--- + +# Skills: youtube-search & yandex-search + + +## youtube-search +YouTube Data API v3. Поиск видео, метаданные каналов. Ключ: `YOUTUBE_API_KEY` в `.env`. +`~/.openclaw/workspace/skills/youtube-search/` + +## yandex-search +Yandex Search API v2. Для русскоязычных запросов, российских магазинов (Ozon, Перекрёсток, Яндекс.Маркет). Ключ: `YANDEX_API_KEY` в `.env`. +`~/.openclaw/workspace/skills/yandex-search/` + + +## Related + +### Sources + +- [SKILL](sources/skill.md) + +### Related Pages + +- [Skill: ontology](concepts/skill-ontology.md) +- [Skill: telegram-collector](concepts/skill-telegram-collector.md) +- [Skill: voice-tts](concepts/skill-voice-tts.md) +- [Skills: diagram-png & diagram-table](concepts/skill-diagram.md) + diff --git a/concepts/skill-telegram-collector.md b/concepts/skill-telegram-collector.md new file mode 100644 index 0000000..15c09e0 --- /dev/null +++ b/concepts/skill-telegram-collector.md @@ -0,0 +1,32 @@ +--- +pageType: concept +id: concept.skill-telegram-collector +title: "Skill: telegram-collector" +sourceIds: [source.skill] +updatedAt: 2026-04-10T13:21:00.000Z +tags: [skill, telegram, collector, data] +--- + +# Skill: telegram-collector + + +## Описание +Сбор и анализ информации из Telegram-групп и каналов. Построение тематических баз знаний, интеграция в память. + +## Расположение +`~/.openclaw/workspace/skills/telegram-collector/` + + +## Related + +### Sources + +- [SKILL](sources/skill.md) + +### Related Pages + +- [Skill: ontology](concepts/skill-ontology.md) +- [Skill: voice-tts](concepts/skill-voice-tts.md) +- [Skills: diagram-png & diagram-table](concepts/skill-diagram.md) +- [Skills: youtube-search & yandex-search](concepts/skill-search.md) + diff --git a/concepts/skill-voice-tts.md b/concepts/skill-voice-tts.md new file mode 100644 index 0000000..f0ec8e4 --- /dev/null +++ b/concepts/skill-voice-tts.md @@ -0,0 +1,36 @@ +--- +pageType: concept +id: concept.skill-voice-tts +title: "Skill: voice-tts" +sourceIds: [source.skill] +updatedAt: 2026-04-10T13:21:00.000Z +tags: [skill, voice, tts, elevenlabs, yandex] +--- + +# Skill: voice-tts + + +## Описание +Голосовые сообщения через ElevenLabs TTS с fallback на Yandex SpeechKit. Генерирует OGG Opus для Telegram. + +## Расположение +`~/.openclaw/skills/voice-tts/` + +## Когда использовать +- "отправь голосовым", "озвучь", "say it with voice" +- Когда Слава отправляет голосовое — отвечать И текстом, И голосом + + +## Related + +### Sources + +- [SKILL](sources/skill.md) + +### Related Pages + +- [Skill: ontology](concepts/skill-ontology.md) +- [Skill: telegram-collector](concepts/skill-telegram-collector.md) +- [Skills: diagram-png & diagram-table](concepts/skill-diagram.md) +- [Skills: youtube-search & yandex-search](concepts/skill-search.md) + diff --git a/entities/index.md b/entities/index.md new file mode 100644 index 0000000..b279803 --- /dev/null +++ b/entities/index.md @@ -0,0 +1,15 @@ +# Entities + +## Generated + +- [Apps Portal](entities/project-apps-portal.md) +- [Home Assistant](entities/project-ha.md) +- [Proxy VM (vpn-srv)](entities/project-proxy-vm.md) +- [Snowbike RAG](entities/project-snowbike-rag.md) +- [Tapo Camera Monitor](entities/project-tapo.md) +- [Telegram Collector](entities/project-telegram-collector.md) +- [Wiki & Memory](entities/project-wiki-memory.md) +- [Видеокружочки](entities/project-video-notes.md) +- [Интернет-заказы](entities/project-internet-orders.md) +- [Карта шумового загрязнения FR24](entities/project-flightradar24.md) + diff --git a/entities/project-apps-portal.md b/entities/project-apps-portal.md new file mode 100644 index 0000000..f18b57e --- /dev/null +++ b/entities/project-apps-portal.md @@ -0,0 +1,32 @@ +--- +pageType: entity +id: entity.project-apps-portal +title: "Apps Portal" +entityType: Project +status: active +updatedAt: 2026-04-10T13:33:00.000Z +sourceIds: [source.dev-task] +tags: [project, portal, web] +--- + +# Apps Portal + + +## Ключевые факты +- **Статус:** active +- **Папка:** `tasks/apps-portal/` +- **URL:** apps.mva154.duckdns.org + +## Описание +Портал-лендинг с карточками веб-приложений. + +## Открытые задачи +- Запустить Apps Portal (medium, dev) + + +## Related + +### Sources + +- [DEV TASK](sources/dev-task.md) + diff --git a/entities/project-flightradar24.md b/entities/project-flightradar24.md new file mode 100644 index 0000000..6138a33 --- /dev/null +++ b/entities/project-flightradar24.md @@ -0,0 +1,45 @@ +--- +pageType: entity +id: entity.project-flightradar24 +title: "Карта шумового загрязнения FR24" +entityType: Project +status: paused +sourceIds: [source.project] +updatedAt: 2026-04-10T13:21:00.000Z +tags: [project, flightradar24, noisemap] +--- + +# Карта шумового загрязнения FR24 + + +## Ключевые факты +- **Старт:** 22 марта 2026 +- **Статус:** прототип v0.3 работает, FR24 кредиты закончились +- **URL:** https://openclaw.mva154.duckdns.org/noisemap/ +- **Порт:** 5555 (Flask) +- **Папка:** `tasks/flightradar24/` +- **Следующий шаг:** переход на RTL-SDR + +## Описание +Карта шумового загрязнения от авиации на базе данных Flightradar24. Flask-приложение визуализирует плотность полётов над районом. + +## Связи +- Watchdog: HEARTBEAT.md проверяет порт 5555 +- API: FR24 Explorer, 60K кредитов/мес (промо до 31.05.2026: 120K) + + +## Related + +### Sources + +- [PROJECT](sources/project.md) + +### Related Pages + +- [Home Assistant](entities/project-ha.md) +- [Proxy VM (vpn-srv)](entities/project-proxy-vm.md) +- [Snowbike RAG](entities/project-snowbike-rag.md) +- [Tapo Camera Monitor](entities/project-tapo.md) +- [Telegram Collector](entities/project-telegram-collector.md) +- [Интернет-заказы](entities/project-internet-orders.md) + diff --git a/entities/project-ha.md b/entities/project-ha.md new file mode 100644 index 0000000..4696b4f --- /dev/null +++ b/entities/project-ha.md @@ -0,0 +1,43 @@ +--- +pageType: entity +id: entity.project-ha +title: "Home Assistant" +entityType: Project +status: active +sourceIds: [source.project] +updatedAt: 2026-04-10T13:21:00.000Z +tags: [project, home-assistant, automation] +--- + +# Home Assistant + + +## Ключевые факты +- **URL:** https://ha.homenet542.keenetic.pro +- **IP:** 192.168.2.139:8123 +- **Папка:** `tasks/ha/` +- **Платформа:** Proxmox VM + +## Описание +Локальное управление умным домом через Home Assistant. Zigbee через Sonoff донгл + Zigbee2MQTT. + +## Правила +- Любые изменения конфигов — только с ОК Славы +- Читать состояния/логи — без подтверждения + + +## Related + +### Sources + +- [PROJECT](sources/project.md) + +### Related Pages + +- [Proxy VM (vpn-srv)](entities/project-proxy-vm.md) +- [Snowbike RAG](entities/project-snowbike-rag.md) +- [Tapo Camera Monitor](entities/project-tapo.md) +- [Telegram Collector](entities/project-telegram-collector.md) +- [Интернет-заказы](entities/project-internet-orders.md) +- [Карта шумового загрязнения FR24](entities/project-flightradar24.md) + diff --git a/entities/project-internet-orders.md b/entities/project-internet-orders.md new file mode 100644 index 0000000..120998d --- /dev/null +++ b/entities/project-internet-orders.md @@ -0,0 +1,42 @@ +--- +pageType: entity +id: entity.project-internet-orders +title: "Интернет-заказы" +entityType: Project +status: active +sourceIds: [source.project] +updatedAt: 2026-04-10T13:21:00.000Z +tags: [project, orders, vprok] +--- + +# Интернет-заказы + + +## Ключевые факты +- **Старт:** 31 марта 2026 +- **Статус:** relay-сервер запущен (185.130.212.192:5000), Windows-клиент готов, ожидает первого теста +- **Папка:** `tasks/internet-orders/` + +## Описание +Голосовое управление заказом продуктов. Слава говорит → ИИ подбирает товары → скрипт заполняет корзину на vprok.ru → Слава только оплачивает. + +## Компоненты +- Relay-сервер: 185.130.212.192:5000 +- Windows-клиент: windows_client.py + + +## Related + +### Sources + +- [PROJECT](sources/project.md) + +### Related Pages + +- [Home Assistant](entities/project-ha.md) +- [Proxy VM (vpn-srv)](entities/project-proxy-vm.md) +- [Snowbike RAG](entities/project-snowbike-rag.md) +- [Tapo Camera Monitor](entities/project-tapo.md) +- [Telegram Collector](entities/project-telegram-collector.md) +- [Карта шумового загрязнения FR24](entities/project-flightradar24.md) + diff --git a/entities/project-proxy-vm.md b/entities/project-proxy-vm.md new file mode 100644 index 0000000..d375e13 --- /dev/null +++ b/entities/project-proxy-vm.md @@ -0,0 +1,48 @@ +--- +pageType: entity +id: entity.project-proxy-vm +title: "Proxy VM (vpn-srv)" +entityType: Project +status: active +sourceIds: [source.project] +updatedAt: 2026-04-10T13:21:00.000Z +tags: [project, vpn, proxy, frp] +--- + +# Proxy VM (vpn-srv) + + +## Ключевые факты +- **Статус:** работает +- **IP:** 192.168.2.200 (внутренний), туннель через 185.130.212.192:3322 +- **Папка:** `tasks/proxy-vm/` + +## Описание +Ubuntu VM для прокси HA Telegram + прозрачный шлюз для Wi-Fi ТВ (Homenet_vpn). + +## Компоненты +- FRP туннель: relay 185.130.212.192:7000, port 3322 → vpn-srv:22 +- Xray VLESS Reality: port 12345 tproxy → 43.245.226.231:53903 +- Wi-Fi сеть: Homenet_vpn, 192.168.4.0/24 +- Watchdog: HEARTBEAT.md проверяет port 3322 + +## Доступ +- SSH: `ssh -i ha_ssh_key -o Port=3322 vpn@185.130.212.192` +- Пароль: meNt85doC + + +## Related + +### Sources + +- [PROJECT](sources/project.md) + +### Related Pages + +- [Home Assistant](entities/project-ha.md) +- [Snowbike RAG](entities/project-snowbike-rag.md) +- [Tapo Camera Monitor](entities/project-tapo.md) +- [Telegram Collector](entities/project-telegram-collector.md) +- [Интернет-заказы](entities/project-internet-orders.md) +- [Карта шумового загрязнения FR24](entities/project-flightradar24.md) + diff --git a/entities/project-snowbike-rag.md b/entities/project-snowbike-rag.md new file mode 100644 index 0000000..5a3505c --- /dev/null +++ b/entities/project-snowbike-rag.md @@ -0,0 +1,48 @@ +--- +pageType: entity +id: entity.project-snowbike-rag +title: "Snowbike RAG" +entityType: Project +status: active +updatedAt: 2026-04-10T13:33:00.000Z +sourceIds: [source.project] +tags: [project, snowbike, rag, meilisearch, chromadb] +--- + +# Snowbike RAG + + +## Ключевые факты +- **Старт:** 20 марта 2026 +- **Статус:** active +- **Папка:** `tasks/snowbike-rag/` +- **URL:** https://openclaw.mva154.duckdns.org/snowbike-rag/ +- **Порт:** 5557 + +## Описание +База знаний сноубайков — Telegram коллектор + RAG поиск. Источник: @snowbikerussia (155K сообщений). + +## Компоненты +- Meilisearch: localhost:7700, 140059 документов (UP) +- ChromaDB: localhost:8000, 136428 документов +- Watchdog: HEARTBEAT.md проверяет порт 5557 + +## Открытые задачи +- Регулярное инкрементальное обновление RAG (high, dev) + + +## Related + +### Sources + +- [PROJECT](sources/project.md) + +### Related Pages + +- [Home Assistant](entities/project-ha.md) +- [Proxy VM (vpn-srv)](entities/project-proxy-vm.md) +- [Tapo Camera Monitor](entities/project-tapo.md) +- [Telegram Collector](entities/project-telegram-collector.md) +- [Интернет-заказы](entities/project-internet-orders.md) +- [Карта шумового загрязнения FR24](entities/project-flightradar24.md) + diff --git a/entities/project-tapo.md b/entities/project-tapo.md new file mode 100644 index 0000000..ebeeedb --- /dev/null +++ b/entities/project-tapo.md @@ -0,0 +1,37 @@ +--- +pageType: entity +id: entity.project-tapo +title: "Tapo Camera Monitor" +entityType: Project +status: active +sourceIds: [source.project] +updatedAt: 2026-04-10T13:21:00.000Z +tags: [project, camera, tapo, ai] +--- + +# Tapo Camera Monitor + + +## Ключевые факты +- **Папка:** `tasks/tapo/` +- **Камеры:** TP-Link Tapo C520WS / C320WS + +## Описание +Мониторинг камер TP-Link Tapo с анализом через AI и уведомлениями в Telegram. + + +## Related + +### Sources + +- [PROJECT](sources/project.md) + +### Related Pages + +- [Home Assistant](entities/project-ha.md) +- [Proxy VM (vpn-srv)](entities/project-proxy-vm.md) +- [Snowbike RAG](entities/project-snowbike-rag.md) +- [Telegram Collector](entities/project-telegram-collector.md) +- [Интернет-заказы](entities/project-internet-orders.md) +- [Карта шумового загрязнения FR24](entities/project-flightradar24.md) + diff --git a/entities/project-telegram-collector.md b/entities/project-telegram-collector.md new file mode 100644 index 0000000..de206cb --- /dev/null +++ b/entities/project-telegram-collector.md @@ -0,0 +1,42 @@ +--- +pageType: entity +id: entity.project-telegram-collector +title: "Telegram Collector" +entityType: Project +status: active +sourceIds: [source.project] +updatedAt: 2026-04-10T13:21:00.000Z +tags: [project, telegram, collector] +--- + +# Telegram Collector + + +## Ключевые факты +- **Старт:** 20 марта 2026 +- **Статус:** активен, ежедневный инкремент +- **Папка:** `tasks/telegram-collector/`, `skills/telegram-collector/` +- **Загружено:** @snowbikerussia (155K сообщений) + +## Описание +Сбор, анализ и структурирование сообщений из Telegram-групп и каналов. Builds topic databases, integrates with memory. + +## Связи +- Skill: telegram-collector + + +## Related + +### Sources + +- [PROJECT](sources/project.md) + +### Related Pages + +- [Home Assistant](entities/project-ha.md) +- [Proxy VM (vpn-srv)](entities/project-proxy-vm.md) +- [Snowbike RAG](entities/project-snowbike-rag.md) +- [Tapo Camera Monitor](entities/project-tapo.md) +- [Интернет-заказы](entities/project-internet-orders.md) +- [Карта шумового загрязнения FR24](entities/project-flightradar24.md) + diff --git a/entities/project-video-notes.md b/entities/project-video-notes.md new file mode 100644 index 0000000..11312c9 --- /dev/null +++ b/entities/project-video-notes.md @@ -0,0 +1,32 @@ +--- +pageType: entity +id: entity.project-video-notes +title: "Видеокружочки" +entityType: Project +status: active +updatedAt: 2026-04-10T13:33:00.000Z +sourceIds: [source.tz] +tags: [project, video, tts, heygen, telegram] +--- + +# Видеокружочки + + +## Ключевые факты +- **Статус:** active +- **Папка:** `tasks/video-notes/` + +## Описание +Генерация video notes: ElevenLabs TTS + fal.ai (lip sync) → Telegram. Текущая реализация: fal.ai Fabric 1.0. + +## Открытые задачи +- Переделать с fal.ai на HeyGen (medium, Слава) + - Создать talking photo в HeyGen → сохранить HEYGEN_TALKING_PHOTO_ID в .env + + +## Related + +### Sources + +- [TZ](sources/tz.md) + diff --git a/entities/project-wiki-memory.md b/entities/project-wiki-memory.md new file mode 100644 index 0000000..7fd5f5a --- /dev/null +++ b/entities/project-wiki-memory.md @@ -0,0 +1,178 @@ +--- +pageType: entity +id: entity.project-wiki-memory +title: "Wiki & Memory" +entityType: Project +status: active +updatedAt: 2026-04-10T13:48:00.000Z +sourceIds: [source.memory] +tags: [project, wiki, memory, qmd, setup] +--- + +# Wiki & Memory + + +## Ключевые факты +- **Дата настройки:** 10 апреля 2026 +- **Статус:** active +- **Папка:** `tasks/wiki-memory/` + +## Описание +Комплексная настройка системы памяти OpenClaw: замена встроенного SQLite на QMD sidecar + инициализация Memory Wiki vault с entities/concepts для всех проектов и скиллов. + +--- + +## Архитектура системы памяти + +### Схема работы + +``` +Файлы workspace/ QMD sidecar (Gemma-300M) Агент +─────────────────── ──────────────────────── ────── +MEMORY.md memory-root-main (159 docs) memory_search +memory/YYYY-MM-DD.md → memory-dir-main (33 docs) → BM25 + vector +tasks/**/*.md tasks-main (104 docs) reranking +skills/**/*.md skills-main (10 docs) ↓ +agents/main/sessions/ sessions-main (111 docs) релевантные чанки +``` + +``` +Wiki vault Агент (каждый запрос) +───────────────────── ────────────────────── +sources/ (ingest файлов) includeCompiledDigestPrompt: true +entities/ (проекты, люди) → → → agent-digest.json → системный промпт +concepts/ (скиллы, правила) wiki_search / wiki_get (по запросу) +syntheses/ +reports/ (lint, health) +``` + +### Два независимых слоя памяти + +| Слой | Инструмент | Для чего | +|------|-----------|----------| +| **QMD** | `memory_search` | Полнотекстовый + семантический поиск по всем файлам | +| **Wiki** | `wiki_search`, digest в промпте | Структурированные знания: entities, concepts | + +--- + +## QMD Backend + +### Конфигурация (openclaw.json, корневой ключ `memory`) +```json +{ + "memory": { + "backend": "qmd", + "qmd": { + "command": "/home/node/.local/bin/qmd", + "paths": [ + { "name": "tasks", "path": "~/.openclaw/workspace/tasks", "pattern": "**/*.md" }, + { "name": "skills", "path": "~/.openclaw/workspace/skills", "pattern": "**/*.md" } + ], + "sessions": { "enabled": true } + } + } +} +``` + +### Коллекции (main агент) +| Коллекция | Документов | +|---|---| +| memory-root-main (workspace/) | 159 | +| sessions-main (транскрипты) | 111 | +| tasks-main (workspace/tasks/) | 104 | +| memory-dir-main (workspace/memory/) | 33 | +| skills-main (workspace/skills/) | 10 | +| **Итого** | **417 документов** | + +### Эмбеддинги +- Модель: `embeddinggemma-300M-Q8_0.gguf` (~328MB) +- Только CPU → индексация ~30-60 мин на 400+ чанков +- После завершения: Vector: ready автоматически +- Все агенты (main, dev, legal, feda): Vector ready ✅ + +### Известная проблема: memory-alt-main +QMD создаёт `memory-root-main` с `**/*.md`, OpenClaw ищет `memory-alt-main`. + +**Фикс:** +```yaml +# ~/.openclaw/agents/main/qmd/xdg-config/qmd/index.yml +memory-alt-main: + path: /home/node/.openclaw/workspace + pattern: "memory.md" +``` +Затем: `rm ~/.openclaw/agents/main/qmd/xdg-cache/qmd/index.sqlite* && openclaw memory index --force` + +--- + +## Memory Wiki + +### Конфигурация (openclaw.json) +```json +// plugins.entries.memory-wiki.config: +{ + "bridge": { "enabled": true, "readMemoryArtifacts": true, ... }, + "context": { "includeCompiledDigestPrompt": true } +} + +// agents.list[main].tools.allow: +["wiki_status", "wiki_search", "wiki_get", "wiki_apply", "wiki_lint"] +``` + +### Bridge mode — не работает (known limitation) +OpenClaw использует jiti vm-контексты для изоляции плагинов. memory-core и memory-wiki +загружаются в разных контекстах → `memoryPluginState` разные объекты → capability не видна. + +`openclaw wiki bridge import` всегда возвращает 0 артефактов. Это архитектурная проблема +версии 2026.4.9, не баг конфига. Workaround: ручной ingest. + +### Как пополнять wiki (рабочий процесс) +```bash +# 1. Добавить источник +openclaw wiki ingest ~/.openclaw/workspace/MEMORY.md +openclaw wiki ingest ~/.openclaw/workspace/tasks/*/PROJECT.md + +# 2. Создать entity/concept страницу (wiki_apply или вручную в vault) +# Файл: ~/.openclaw/wiki/main/entities/project-xxx.md + +# 3. Скомпилировать и проверить +openclaw wiki compile +openclaw wiki lint +``` + +### Текущий vault (10.04.2026) +- **Vault:** `/home/node/.openclaw/wiki/main` +- **Режим:** bridge (формально), фактически manual ingest +- **Страниц:** 27 (9 entities, 5 concepts, 7 sources, 6 reports) +- **Lint:** 0 issues ✅ + +### Entities (проекты) +- Snowbike RAG, Telegram Collector, Карта шумового загрязнения FR24 +- Интернет-заказы, Home Assistant, Proxy VM, Tapo Camera Monitor +- Apps Portal, Видеокружочки + +### Concepts (скиллы) +- voice-tts, telegram-collector, ontology, diagram-png/table, youtube/yandex-search + +--- + +## Задачи + +### ✅ Первичная настройка (done, 10.04.2026) +- Установка QMD, настройка коллекций, эмбеддинги +- Инициализация wiki vault, добавление wiki_* инструментов +- Ingest ключевых файлов (MEMORY.md, PROJECT.md × 6, SKILL.md × 9) +- Создание 9 entities + 5 concepts +- Синхронизация с онтологией + +### Открытые вопросы +- Bridge mode: ждём фикса в OpenClaw (jiti-изоляция плагинов) +- Wiki не обновляется автоматически — нужен ручной `ingest + compile` при изменениях +- Dreaming отключён (можно включить для ночной синтез-генерации) + + +## Related + +### Sources + +- [MEMORY](sources/memory.md) + diff --git a/inbox.md b/inbox.md new file mode 100644 index 0000000..d5fdd35 --- /dev/null +++ b/inbox.md @@ -0,0 +1,3 @@ +# Inbox + +Drop raw ideas, questions, and source links here. diff --git a/index.md b/index.md new file mode 100644 index 0000000..de71bf3 --- /dev/null +++ b/index.md @@ -0,0 +1,53 @@ +# Wiki Index + +## Generated + +- Render mode: `native` +- Total pages: 29 +- Claims: 0 +- Sources: 8 +- Entities: 10 +- Concepts: 5 +- Syntheses: 0 +- Reports: 6 + +### Sources +- [2026 04 09](sources/2026-04-09.md) +- [2026 04 10](sources/2026-04-10.md) +- [BRD](sources/brd.md) +- [DEV TASK](sources/dev-task.md) +- [MEMORY](sources/memory.md) +- [PROJECT](sources/project.md) +- [SKILL](sources/skill.md) +- [TZ](sources/tz.md) + +### Entities +- [Apps Portal](entities/project-apps-portal.md) +- [Home Assistant](entities/project-ha.md) +- [Proxy VM (vpn-srv)](entities/project-proxy-vm.md) +- [Snowbike RAG](entities/project-snowbike-rag.md) +- [Tapo Camera Monitor](entities/project-tapo.md) +- [Telegram Collector](entities/project-telegram-collector.md) +- [Wiki & Memory](entities/project-wiki-memory.md) +- [Видеокружочки](entities/project-video-notes.md) +- [Интернет-заказы](entities/project-internet-orders.md) +- [Карта шумового загрязнения FR24](entities/project-flightradar24.md) + +### Concepts +- [Skill: ontology](concepts/skill-ontology.md) +- [Skill: telegram-collector](concepts/skill-telegram-collector.md) +- [Skill: voice-tts](concepts/skill-voice-tts.md) +- [Skills: diagram-png & diagram-table](concepts/skill-diagram.md) +- [Skills: youtube-search & yandex-search](concepts/skill-search.md) + +### Syntheses +- No syntheses yet. + +### Reports +- [Claim Health](reports/claim-health.md) +- [Contradictions](reports/contradictions.md) +- [Lint Report](reports/lint.md) +- [Low Confidence](reports/low-confidence.md) +- [Open Questions](reports/open-questions.md) +- [Stale Pages](reports/stale-pages.md) + diff --git a/reports/claim-health.md b/reports/claim-health.md new file mode 100644 index 0000000..7ca9e20 --- /dev/null +++ b/reports/claim-health.md @@ -0,0 +1,14 @@ +--- +pageType: report +id: report.claim-health +title: Claim Health +status: active +updatedAt: 2026-04-09T22:04:02.263Z +--- + +# Claim Health + +## Generated + +- No claim health issues right now. + diff --git a/reports/contradictions.md b/reports/contradictions.md new file mode 100644 index 0000000..40b8be4 --- /dev/null +++ b/reports/contradictions.md @@ -0,0 +1,14 @@ +--- +pageType: report +id: report.contradictions +title: Contradictions +status: active +updatedAt: 2026-04-09T22:04:02.263Z +--- + +# Contradictions + +## Generated + +- No contradictions flagged right now. + diff --git a/reports/index.md b/reports/index.md new file mode 100644 index 0000000..51e4a18 --- /dev/null +++ b/reports/index.md @@ -0,0 +1,11 @@ +# Reports + +## Generated + +- [Claim Health](reports/claim-health.md) +- [Contradictions](reports/contradictions.md) +- [Lint Report](reports/lint.md) +- [Low Confidence](reports/low-confidence.md) +- [Open Questions](reports/open-questions.md) +- [Stale Pages](reports/stale-pages.md) + diff --git a/reports/lint.md b/reports/lint.md new file mode 100644 index 0000000..9acf9b4 --- /dev/null +++ b/reports/lint.md @@ -0,0 +1,13 @@ +--- +pageType: report +id: report.lint +title: Lint Report +status: active +--- + +# Lint Report + +## Generated + +No issues found. + diff --git a/reports/low-confidence.md b/reports/low-confidence.md new file mode 100644 index 0000000..c6a4d60 --- /dev/null +++ b/reports/low-confidence.md @@ -0,0 +1,14 @@ +--- +pageType: report +id: report.low-confidence +title: Low Confidence +status: active +updatedAt: 2026-04-09T22:04:02.263Z +--- + +# Low Confidence + +## Generated + +- No low-confidence pages or claims right now. + diff --git a/reports/open-questions.md b/reports/open-questions.md new file mode 100644 index 0000000..efbdfd0 --- /dev/null +++ b/reports/open-questions.md @@ -0,0 +1,14 @@ +--- +pageType: report +id: report.open-questions +title: Open Questions +status: active +updatedAt: 2026-04-09T22:04:02.263Z +--- + +# Open Questions + +## Generated + +- No open questions right now. + diff --git a/reports/stale-pages.md b/reports/stale-pages.md new file mode 100644 index 0000000..aa8a444 --- /dev/null +++ b/reports/stale-pages.md @@ -0,0 +1,14 @@ +--- +pageType: report +id: report.stale-pages +title: Stale Pages +status: active +updatedAt: 2026-04-10T13:25:24.905Z +--- + +# Stale Pages + +## Generated + +- No aging or stale pages older than 30 days. + diff --git a/sources/2026-04-09.md b/sources/2026-04-09.md new file mode 100644 index 0000000..b26745d --- /dev/null +++ b/sources/2026-04-09.md @@ -0,0 +1,106 @@ +--- +pageType: source +id: source.2026-04-09 +title: 2026 04 09 +sourceType: local-file +sourcePath: /home/node/.openclaw/workspace/memory/2026-04-09.md +ingestedAt: 2026-04-09T22:04:56.932Z +updatedAt: 2026-04-09T22:04:56.932Z +status: active +--- + +# 2026 04 09 + +## Source +- Type: `local-file` +- Path: `/home/node/.openclaw/workspace/memory/2026-04-09.md` +- Bytes: 4183 +- Updated: 2026-04-09T22:04:56.932Z + +## Content +```text +# 2026-04-09 — Дневник + +## Анекдоты голосом +Слава просил анекдоты голосом — несколько раундов: +1. IT-шники (весело, грустно, соблазнительно) — 6 штук +2. Новый набор (весело, грозно, соблазнительно) — Python/JS, production down, git pull +3. Про айтишников: баги в баре, float-пиво, дежавю у врача +4. Про гастроном: хлеба нет +5. Про мотоциклиста и гаишника +6. Про кота который пьёт водку перед работой + +## windows_client.py +Отправлен Славе в Telegram (message_id=4146) для теста на Windows + +## Онтология — мелкие правки +- Видеокружочки → status: active (было planned) +- Добавлена таска: «Переделать с fal.ai на HeyGen» (medium, Dev) +- Добавлен description с реализацией через fal.ai + +## Отправлены голосовые: message_id 4127, 4134, 4136, 4138, 4175, 4178, 4181, 4184, 4187 +# 2026-04-09 — Дневник + +## Анекдоты голосом +Слава просил анекдоты голосом — несколько раундов: +1. IT-шники (весело, грустно, соблазнительно) — 6 штук +2. Новый набор (весело, грозно, соблазнительно) — Python/JS, production down, git pull +3. Про айтишников: баги в баре, float-пиво, дежавю у врача +4. Про гастроном: хлеба нет +5. Про мотоциклиста и гаишника +6. Про кота который пьёт водку перед работой + +## windows_client.py +Отправлен Славе в Telegram (message_id=4146) для теста на Windows + +## Онтология — мелкие правки +- Видеокружочки → status: active (было planned) +- Добавлена таска: «Переделать с fal.ai на HeyGen» (medium, Dev) +- Добавлен description с реализацией через fal.ai + +## Отправлены голосовые: message_id 4127, 4134, 4136, 4138, 4175, 4178, 4181, 4184, 4187 + +## Онтология — RULES.md и правила ведения +Создан файл `memory/ontology/RULES.md` — правила ведения онтологии: +- Когда использовать (обязательно для проектов/задач) +- Стрим = единственный writer, остальные агенты через sessions_send +- Изменения — только после подтверждения Славы +- Привязан к AGENTS.md (секция Session Startup) + +**Структура:** +- SKILL.md — техдокументация для агентов +- RULES.md — правила ведения (для куратора) +- schema.yaml — структура данных (типы и поля) + +## SSH доступ к хосту mva154 +- Работает через ha_ssh_key → slin@82.22.50.71 +- Команды: `ssh -i /home/node/.openclaw/ha_ssh_key slin@82.22.50.71 "команда"` +- Вижу контейнеры: openclaw-gateway, xray, n8n +- Стрим может управлять контейнерами на хосте через SSH + +## Таблица задач (обновлена) +- Добавлены колонки: Статус, Описание +- 12 задач, 9 проектов +- Snowbike RAG: ChromaDB и incremental — DONE + +## Новые таски в онтологии: +- «Упорядочить SSH ключи доступа» (medium, Слава) — pending + +## Добавлен атрибут folder в Project +- Путь к документации: `tasks/{project}/` +- Добавлен в schema.yaml (строка 28) +- Все 9 проектов получили свои folder + +## Сессия с control-ui +Вопрос от control-ui про обновление OpenClaw через контейнер — ответ дан + +``` + +## Notes + + + +## Related + +- No related pages yet. + diff --git a/sources/2026-04-10.md b/sources/2026-04-10.md new file mode 100644 index 0000000..b9a017f --- /dev/null +++ b/sources/2026-04-10.md @@ -0,0 +1,272 @@ +--- +pageType: source +id: source.2026-04-10 +title: 2026 04 10 +sourceType: local-file +sourcePath: /home/node/.openclaw/workspace/memory/2026-04-10.md +ingestedAt: 2026-04-10T15:43:24.102Z +updatedAt: 2026-04-10T15:43:24.102Z +status: active +--- + +# 2026 04 10 + +## Source +- Type: `local-file` +- Path: `/home/node/.openclaw/workspace/memory/2026-04-10.md` +- Bytes: 10904 +- Updated: 2026-04-10T15:43:24.102Z + +## Content +````text +# 2026-04-10 — Настройка Memory Wiki + QMD + +## Что делали + +Полный аудит и реконфигурация системы памяти OpenClaw. Сессия ~5 часов (07:05–12:57 UTC) через webchat. + +--- + +## Memory Wiki (memory-wiki plugin) + +### Диагноз bridge mode + +Обнаружили что `openclaw wiki bridge import` всегда возвращает 0 артефактов. Провели глубокое расследование: + +- Bridge mode требует что memory-core зарегистрировал capability через `api.registerMemoryCapability()` +- `listActiveMemoryPublicArtifacts()` читает из `memoryPluginState` в `memory-state-BqTSwHeB.js` +- **Root cause:** OpenClaw использует jiti vm-контексты для изоляции плагинов. memory-core и memory-wiki загружаются в разных jiti-контекстах → их `memoryPluginState` — разные объекты → capability не видна +- CLI-команда дополнительно запускается в новом процессе без gateway-контекста +- **Вывод:** bridge mode в 2026.4.9 для bundled plugins не работает — архитектурная проблема, не баг конфига + +### Что настроили в openclaw.json + +```json +// plugins.entries.memory-wiki.config: +"bridge": { + "enabled": true, + "readMemoryArtifacts": true, + "indexDailyNotes": true, + "indexMemoryRoot": true, + "indexDreamReports": true, // добавлено + "followMemoryEvents": true // добавлено +}, +"context": { + "includeCompiledDigestPrompt": true // добавлено — wiki digest в промптах +} + +// agents.list[main].tools.allow — добавлены: +"wiki_status", "wiki_search", "wiki_get", "wiki_apply", "wiki_lint" +``` + +### Текущий статус wiki + +- Vault: `/home/node/.openclaw/wiki/main` +- Mode: bridge (формально), фактически работает через manual ingest +- Sources: 6 (MEMORY.md, PROJECT.md файлы) +- Entities/Concepts/Syntheses: 0 (не наполнено) +- `openclaw wiki compile` и `openclaw wiki lint` работают +- `wiki_*` инструменты добавлены в allowed tools main агента + +--- + +## QMD — установка и настройка + +### Конфиг (добавлен корневой ключ `memory` в openclaw.json) + +```json +"memory": { + "backend": "qmd", + "qmd": { + "command": "/home/node/.local/bin/qmd", + "paths": [ + { "name": "tasks", "path": "~/.openclaw/workspace/tasks", "pattern": "**/*.md" }, + { "name": "skills", "path": "~/.openclaw/workspace/skills", "pattern": "**/*.md" } + ], + "sessions": { "enabled": true } + } +} +``` + +Ключевой момент: `memory` — корневой ключ, НЕ под `agents.defaults`. `agents.defaults.memory` — невалидный ключ (проверено). + +### Проблема с коллекциями + +QMD создавал `memory-root-main` с паттерном `**/*.md`, хотя OpenClaw ожидает `MEMORY.md`. Затем не мог создать `memory-alt-main` для того же пути. + +**Фикс:** вручную добавить `memory-alt-main` в `~/.openclaw/agents/main/qmd/xdg-config/qmd/index.yml`: + +```yaml +memory-alt-main: + path: /home/node/.openclaw/workspace + pattern: "memory.md" +``` + +После этого удалить sqlite и переиндексировать: +```bash +rm ~/.openclaw/agents/main/qmd/xdg-cache/qmd/index.sqlite* +openclaw memory index --force +``` + +### Эмбеддинги + +- Модель: `embeddinggemma-300M-Q8_0.gguf` (~328MB, скачана) +- Только CPU, без GPU → embed одного батча занимает 30+ минут +- OpenClaw таймаутит на 120 сек и помечает Vector: unavailable, но фоновый процесс продолжает +- После завершения: Vector: ready автоматически + +### Итоговые коллекции (main агент) + +| Коллекция | Путь | Документов | +|---|---|---| +| memory-root-main | workspace/ | 159 | +| sessions-main | agents/main/qmd/sessions/ | 111 | +| tasks-main | workspace/tasks/ | 104 | +| memory-dir-main | workspace/memory/ | 33 | +| skills-main | workspace/skills/ | 10 | +| memory-alt-main | workspace/ (memory.md) | 0 (Linux, нет файла) | + +Итого: 417 документов, 448+ векторов (>100% — чанкинг больших файлов) + +### Статус всех агентов + +- main: Vector ready ✅ +- dev: Vector ready ✅ +- legal: Vector ready ✅ +- feda: Vector ready ✅ + +### Тест поиска (результат) + +``` +openclaw memory search --query "vprok интернет заказы relay" +→ 0.96 tasks/internet-orders/project.md ✅ + +memory_search (через инструмент) "vprok интернет заказы relay" +→ provider: qmd, score: 0.96 ✅ +``` + +--- + +## Итог дня + +### До +- builtin SQLite, 33 файла, 101 чанк +- Только BM25 + vector (OpenAI API) +- Нет sessions, нет tasks/, нет skills/ +- Нет wiki инструментов + +### После +- QMD sidecar, 417 документов, 448+ векторов +- BM25 + Gemma-300M (локально) + reranking +- Sessions, tasks/, skills/ проиндексированы +- wiki_* инструменты подключены +- includeCompiledDigestPrompt включён + +### Открытые вопросы +- Bridge mode не работает (jiti-изоляция) — ждём фикса в OpenClaw или переходим на unsafe-local +- Wiki не наполнена (0 entities/concepts) — следующий шаг +- Dreaming отключён — можно включить +- embed медленный на CPU — при следующем полном сбросе индекса ждать 30-60 мин + +--- + +## Сессия вечер: Прозрачный прокси (Wi-Fi + HA Telegram) — 13:00–15:00 UTC + +### Задача #1: Wi-Fi homenet-vpn (192.168.4.0/24) через VLESS tproxy + +**Статус:** НЕ ЗАВЕРШЕНА. TCP через tproxy не работает. + +**Причина проблемы:** +- Ключевой конфликт: `flow: "xtls-rprx-vision"` несовместим с redirect/tproxy mode на принятых сокетах +- Без flow — VLESS не соединяется (сервер требует xtls-rprx-vision) +- С flow — Xray падает `failed to set IP_TRANSPARENT` для redirect mode +- **Итог:** tproxy redirect mode + xtls-rprx-vision = incompatible + +**Текущее состояние iptables на vpn-srv:** +- `TV_REDIRECT` в nat PREROUTING — REDIRECT src 192.168.4.0/24 tcp → port 12345 +- `REDSOCKS_HA` в nat PREROUTING — REDIRECT src 192.168.2.0/24 tcp → port 12350 (redsocks → SOCKS5 1080) +- `MASQUERADE` для 192.168.2.0/24 и 192.168.4.0/24 в POSTROUTING + +**Xray config текущий:** +- flow: `xtls-rprx-vision` (ВОССТАНОВЛЕН) +- loglevel: debug +- tproxy-in: port 12345, mode redirect +- HTTP proxy: 8888, SOCKS5: 1080 + +**Что работает:** HTTP proxy (8888) и SOCKS5 (1080) через Xray → VLESS → работают (проверено curl 200) + +--- + +### Задача #2: HA Telegram через SOCKS5 прокси + +**HA:** `ha.homenet542.keenetic.pro`, IP 192.168.2.139, HAOS 17.1, gateway → Keenetic (192.168.2.1) + +**SSH доступ к HA:** через vpn-srv → HA SSH add-on +``` +ssh -i /tmp/ha_key -o StrictHostKeyChecking=no root@192.168.2.139 +``` +(ha_ssh_key скопирован на vpn-srv как /tmp/ha_key) + +**Что сделали:** +- Добавили в `/homeassistant/configuration.yaml` блок telegram_bot с `proxy_url: socks5://192.168.2.200:1080` +- Удалили UI-configured config entry (01K6SDHYX559FSXC1M25ATSSYE) +- Перезапустили HA Core +- `notify.telegram_notifier` появился, `telegram_bot/send_message` → HTTP 200 ✅ + +**Бот:** `ha542_bot`, token: `8251509944:AAGkRr_5ZIIQNd4XrlI5QI9DYZS8JUPhcxY` + +**❗ ЗАМЕЧАНИЕ Славы (голосовое, 14:44 UTC):** +- Через прокси должен ходить ТОЛЬКО Telegram, не весь трафик HA +- Прокси для Telegram настраивается через UI интеграции в HA (не через кастомные компоненты) +- Нужно найти proxy_url настройку в UI telegram_bot интеграции +- Текущая YAML-конфигурация может быть корректной (proxy_url только для telegram_bot), но нужно проверить + +**Статус на 15:00 UTC:** Telegram работает через SOCKS5, но Слава указал что подход должен быть через UI. Нужно уточнить. + +--- + +### SSH доступ к инфраструктуре (актуально) + +- **vpn-srv:** `ssh -i /home/node/.openclaw/ha_ssh_key -o StrictHostKeyChecking=no -p 3322 vpn@185.130.212.192` +- **HA (через vpn-srv):** `ssh -i /tmp/ha_key root@192.168.2.139` (с vpn-srv) +- **mva154:** `ssh -i /home/node/.openclaw/ha_ssh_key slin@82.22.50.71` + +### Конфиги + +- Xray: `/etc/xray/config.json` (bak5 = последний бэкап до удаления flow, bak3/bak4 старые) +- iptables: `/etc/iptables/rules.v4` (outdated — не пересохранены после сегодняшних изменений!) +- HA config: `/homeassistant/configuration.yaml` (бэкап: `.bak-20260410-XXXXXX`) + +### TODO + +- [ ] Сохранить текущие iptables rules.v4 (сегодняшние изменения не сохранены!) +- [ ] Проверить как настраивается proxy в UI telegram_bot интеграции +- [ ] Либо оставить YAML-config с proxy_url (только Telegram через прокси), либо вернуть UI с proxy +- [ ] Задача Wi-Fi tproxy для 192.168.4.0/24 — остаётся незакрытой + +--- + +## Задача #2 ЗАВЕРШЕНА — 15:25 UTC + +**HA Telegram через VLESS работает!** Слава подтвердил получение сообщений. + +**Финальная конфигурация:** +- UI-интеграция telegram_bot с `proxy_url: socks5://192.168.2.200:1080` +- Только Telegram через прокси, остальное напрямую +- Config entry ID: `01KNVZDDM3ZNJS1WX309K7E1EN` +- Notify entity: `notify.telegram_bot_8251509944_126472752` + +**Задокументировано в:** `tasks/proxy-vm/PROJECT.md` + +**Задача #1** (Wi-Fi transparent proxy) продолжится когда Слава вернётся домой. + +```` + +## Notes + + + +## Related + +- No related pages yet. + diff --git a/sources/brd.md b/sources/brd.md new file mode 100644 index 0000000..f85ffae --- /dev/null +++ b/sources/brd.md @@ -0,0 +1,132 @@ +--- +pageType: source +id: source.brd +title: BRD +sourceType: local-file +sourcePath: /home/node/.openclaw/workspace/tasks/snowbike-rag/BRD.md +ingestedAt: 2026-04-09T22:22:18.682Z +updatedAt: 2026-04-09T22:22:18.682Z +status: active +--- + +# BRD + +## Source +- Type: `local-file` +- Path: `/home/node/.openclaw/workspace/tasks/snowbike-rag/BRD.md` +- Bytes: 5102 +- Updated: 2026-04-09T22:22:18.682Z + +## Content +```text +# Бизнес-требования: Семантический поиск по данным Telegram (Сноубайк Россия) + +## 1. Проблема + +У нас есть 155 000 сообщений из Telegram-группы «Сноубайк Россия» (12 топиков). Сейчас поиск работает только по точным словам внутри Telegram — найти нужный ответ среди тысяч сообщений практически невозможно. + +**Пример:** чтобы узнать, какое масло рекомендуют для Polaris 850, нужно: +- Знать точную формулировку +- Листать сотни сообщений вручную +- Объединять ответы из разных обсуждений + +--- + +## 2. Что хотим получить + +Систему, которая **отвечает на вопросы** по базе знаний, а не просто ищет сообщения. + +**Примеры запросов:** +• «Какое масло рекомендуют для Polaris 850?» +• «Где лучше кататься зимой в Подмосковье?» +• «Какие гусеницы подходят на Timber S800?» +• «Кто продавал запчасти для Lynx в Китае?» +• «Какие проблемы бывают с Yamaha Mountain Max?» + +--- + +## 3. Как должен работать + +1. Пользователь задаёт вопрос на русском языке +2. Система находит 10–20 самых релевантных сообщений (по смыслу, не по точным словам) +3. LLM формирует ответ на основе найденных сообщений +4. В ответе указаны источники: дата, автор, топик +5. Если информации недостаточно — система честно говорит об этом + +--- + +## 4. Ключевые требования + +### 4.1 Поиск +• Понимать смысл запроса (не только точные слова) +• Допускать опечатки и синонимы +• Искать по всем 12 топикам одновременно +• Фильтровать по конкретному топику (опционально) +• Сортировать по релевантности или дате + +### 4.2 Ответы +• На русском языке +• Краткие и по существу +• С указанием источников (кто, когда, в каком топике) +• Агрегированные (если 5 человек рекомендуют одно масло — обобщить) + +### 4.3 Данные +• Работать с сырыми данными Telegram Collector +• Обновляться ежедневно после загрузки новых сообщений +• Не ломать существующую систему сбора данных + +### 4.4 Скорость +• Ответ на запрос: до 3 секунд +• Индексация новых сообщений: до 1 минуты в день + +### 4.5 Стоимость +• LLM: ~$0.005 за запрос (приемлемо) +• Embeddings: бесплатно (локальная модель) +• Хранение: ~1.5 ГБ дополнительно (приемлемо) + +--- + +## 5. Что НЕ входит в эту задачу + +• Голосовой интерфейс (добавим позже) +• Поиск по медиа-файлам (фото, видео) +• Учёт пользователей и авторизация +• Мобильное приложение +• Перевод на другие языки + +--- + +## 6. Пользователи + +• **Слава** — основной пользователь +• Потенциально: друзья, участники группы (позже, через веб-интерфейс) + +--- + +## 7. Критерии приёмки + +✅ Ответ на вопрос «какое масло для Polaris 850» — содержит конкретные рекомендации с источниками +✅ Ответ на вопрос «где кататься в Подмосковье» — содержит локации из чата +✅ Система честно говорит «не знаю», когда информации нет +✅ Ежедневно обновляется после cron-загрузки +✅ Работает без интернета (embeddings), кроме LLM + +--- + +## 8. Приоритет и этапы + +**Этап 1 (MVP):** Индексация + поиск + LLM ответ — **сейчас** +**Этап 2:** Веб-интерфейс (Flask UI) — **позже** +**Этап 3:** Голосовой запрос — **позже** +**Этап 4:** Множественные источники (другие каналы) — **когда понадобится** + +``` + +## Notes + + + +## Related + +- No related pages yet. + diff --git a/sources/dev-task.md b/sources/dev-task.md new file mode 100644 index 0000000..3faa069 --- /dev/null +++ b/sources/dev-task.md @@ -0,0 +1,99 @@ +--- +pageType: source +id: source.dev-task +title: DEV TASK +sourceType: local-file +sourcePath: /home/node/.openclaw/workspace/tasks/apps-portal/DEV-TASK.md +ingestedAt: 2026-04-10T13:37:41.693Z +updatedAt: 2026-04-10T13:37:41.693Z +status: active +--- + +# DEV TASK + +## Source +- Type: `local-file` +- Path: `/home/node/.openclaw/workspace/tasks/apps-portal/DEV-TASK.md` +- Bytes: 2574 +- Updated: 2026-04-10T13:37:41.693Z + +## Content +```text +# DEV-TASK: Портал приложений (apps.mva154.duckdns.org) + +## Контекст + +Нужен портал-лендинг с карточками веб-приложений. Светлая тема, автогенерация аватарок. + +**Документация:** +- Бизнес-требования: `tasks/apps-portal/docs/BRD.md` +- Техническое задание: `tasks/apps-portal/docs/TZ.md` + +--- + +## Задача + +### Шаг 1: Инфраструктура +1. Создать `config/apps.json` с двумя приложениями (noisemap, snowbike-rag) +2. Создать `requirements.txt` (flask, pillow) + +### Шаг 2: Автогенерация аватарок +3. Реализовать функцию `generate_avatars()`: + - Читает `config/apps.json` + - Для каждого приложения проверяет `static/avatars/{id}.png` + - Если файла нет — генерирует: градиентный фон (по хэшу name) + emoji/icon по центру + - PNG 200×200 + +### Шаг 3: Flask сервер +4. Создать `server.py`: + - GET `/` — главная (рендерит index.html с apps) + - GET `/api/apps` — JSON + - GET `/static/avatars/` — файлы + - При старте: `generate_avatars()` + +### Шаг 4: Главная страница +5. Создать `templates/index.html`: + - Светлая тема (#F8FAFC фон, белые карточки) + - Tailwind CSS через CDN, шрифт Inter + - Карточки: аватарка 80×80, название, описание + - Клик → переход на url приложения + - Адаптивно: 4 → 2 → 1 колонка + - Hover: lift-эффект, синяя рамка + +### Шаг 5: Тест +6. Запустить `python server.py` +7. Проверить http://localhost:5560/ +8. Добавить третье приложение в apps.json — проверить автогенерацию аватарки + +--- + +## Критерии приёмки + +- [ ] http://localhost:5560/ — портал с карточками +- [ ] Клик — переход на приложение +- [ ] Аватарки в static/avatars/ сгенерированы +- [ ] Светлая тема, красиво +- [ ] Адаптивно на мобильном +- [ ] /api/apps — JSON + +--- + +## Важно + +• Всё в `tasks/apps-portal/` +• Порт 5560 +• Pillow для аватарок (pip install pillow) +• Не трогать другие приложения + +``` + +## Notes + + + +## Related + +### Referenced By + +- [Apps Portal](entities/project-apps-portal.md) + diff --git a/sources/index.md b/sources/index.md new file mode 100644 index 0000000..08fbc81 --- /dev/null +++ b/sources/index.md @@ -0,0 +1,13 @@ +# Sources + +## Generated + +- [2026 04 09](sources/2026-04-09.md) +- [2026 04 10](sources/2026-04-10.md) +- [BRD](sources/brd.md) +- [DEV TASK](sources/dev-task.md) +- [MEMORY](sources/memory.md) +- [PROJECT](sources/project.md) +- [SKILL](sources/skill.md) +- [TZ](sources/tz.md) + diff --git a/sources/memory.md b/sources/memory.md new file mode 100644 index 0000000..dd61a43 --- /dev/null +++ b/sources/memory.md @@ -0,0 +1,250 @@ +--- +pageType: source +id: source.memory +title: MEMORY +sourceType: local-file +sourcePath: /home/node/.openclaw/workspace/MEMORY.md +ingestedAt: 2026-04-10T15:42:43.804Z +updatedAt: 2026-04-10T15:42:43.804Z +status: active +--- + +# MEMORY + +## Source +- Type: `local-file` +- Path: `/home/node/.openclaw/workspace/MEMORY.md` +- Bytes: 15593 +- Updated: 2026-04-10T15:42:43.804Z + +## Content +````text +# MEMORY.md - Долгосрочная память + +## О себе +- Имя: Стрим 🌊 +- Стиль: дружелюбная ассистентка с юмором +- Фокус: работа с потоками информации - сбор, анализ, структурирование + +## Правила форматирования + +### Телеграм +- **Таблицы — через diagram-table** (PNG картинка), НЕ markdown-таблицы — они криво отображаются +- Вместо таблиц: списки с буллетами, нумерованные списки, или структурированный текст с разделителями +- Эмодзи для наглядности: ✅❌⚠️🔥💡🎯🌊 +- **Голосовые сообщения:** когда Слава отправляет голосовое — отвечать И текстом, И голосовым сообщением (через voice-tts) + +## Люди + +### Слава +- Имя: Слава +- Обращение: неформальное, дружеское, с юмором +- Интересы: сбор, анализ и суммаризация информации из разных источников (Телеграм-чаты, интернет) +- Предпочитает общение на русском языке +- Первая встреча: 18 марта 2026 + +## Правила работы + +### 🏠 Home Assistant — только с подтверждения +- **Любое изменение в HA** (конфиги, автоматизации, настройки, перезапуски) — только после явного подтверждения Славы +- Читать состояния, логи, статусы — можно без подтверждения +- Отправка сообщений через telegram_bot — можно без подтверждения (тесты) +- Всё остальное: объяснить что хочу сделать → получить ОК → действовать + +### ⛔ Разработка — только через Dev-агента +- **Стрим НЕ пишет код самостоятельно.** Никогда. Даже если задача кажется мелкой. +- Роль Стрим: обсуждение, постановка задачи, ТЗ, проверка результата, документация +- Роль Dev: вся реализация (новые файлы, правки кода, скрипты) +- Когда задача дошла до «приступай» → передать ТЗ Dev-агенту через `sessions_spawn` +- Нарушение зафиксировано: 27.03.2026 — слой плотности noisemap реализован Стримом напрямую + +### Документация +- **Обязательно**: при любом изменении функционала немедленно обновлять документацию +- Документация всегда должна быть в актуальном состоянии - не "потом", а сразу после изменения +- Порядок работы: изменение → тест → документация → упаковка/коммит + +### Управление ключами и секретами +- Ключи в `openclaw.json` (botToken, gateway.auth.token, tools.web.search.apiKey) — НЕ ТРОГАТЬ +- **Все остальные секреты** — только в `~/.openclaw/.env` +- Никогда не дублировать ключи в SKILL.md, скриптах или других файлах + +### Структура workspace +- `tasks/{project}/` — каждый проект в своей папке, там же `PROJECT.md` с деталями +- `tasks/scripts/` и `tasks/reports/` — общие скрипты и отчёты +- `skills/` — готовые AgentSkills с полной документацией +- `data/` — выходные данные (`data/{skill-name}/`) +- `memory/` — дневные записи (`YYYY-MM-DD.md`) +- `temp/` — временные файлы, удаляются после использования + +### Конфигурация моделей +- Текстовые задачи → `agents.defaults.model.primary` +- Анализ изображений → `agents.defaults.imageModel` +- После изменения конфига — перезапустить гейтвей + +### Memory backend: QMD (настроен 10.04.2026) +- Конфиг: корневой ключ `memory` в openclaw.json (НЕ под `agents.defaults`!) +- QMD бинарник: `/home/node/.local/bin/qmd` — явно прописан в `memory.qmd.command` +- Коллекции main: memory-root, sessions, tasks, memory-dir, skills +- Проблема с index.yml: QMD создаёт `memory-root-main` с `**/*.md`, OpenClaw ищет `memory-alt-main` + - Фикс: вручную добавить в `~/.openclaw/agents/main/qmd/xdg-config/qmd/index.yml` запись `memory-alt-main` + - После фикса: `rm ~/.openclaw/agents/main/qmd/xdg-cache/qmd/index.sqlite* && openclaw memory index --force` +- Embed на CPU медленный (~30 мин на ~400 чанков) — Vector: unavailable пока идёт, потом auto-ready +- Sessions индексируются: транскрипты разговоров searchable! + +### Memory Wiki (настроен 10.04.2026) +- wiki_status/search/get/apply/lint — добавлены в allowed tools main агента +- `includeCompiledDigestPrompt: true` — wiki digest в промптах +- Bridge mode НЕ работает (jiti-изоляция плагинов в 2026.4.9) — known limitation + - `openclaw wiki bridge import` всегда 0 артефактов — не баг конфига + - Workaround: ручной ingest (`openclaw wiki ingest `) или unsafe-local режим +- Wiki пуста (0 entities/concepts) — нужно наполнять через `wiki_apply` +- Дневник по настройке: `memory/2026-04-10.md` + +### Учёт токенов Dev-агента +- Реальные данные — из OpenRouter dashboard +- Формула: `(input×$3 + output×$15) / 1M` (Sonnet 4.6) +- Лог: `tasks/token-log.md`, формат: `DEV-XXX | XK in / XK out → $X.XX` + +## Проекты + +## Proxy VM — vpn-srv (прокси-сервер) +- **Документация:** `tasks/proxy-vm/PROJECT.md` +- **vpn-srv:** 192.168.2.200, FRP туннель через 185.130.212.192:7000, SSH port 3322 +- **Доступ:** `ssh -i ha_ssh_key -o Port=3322 vpn@185.130.212.192`, sudo: `echo meNt85doC | sudo -S` +- **VLESS:** 43.245.226.231:53903, yahoo.com SNI, **flow: xtls-rprx-vision** (обязателен!) +- **Xray порты:** 12345 (tproxy), 1080 (SOCKS5), 8888 (HTTP proxy) + +### Задача #1: Homenet-VPN Wi-Fi (в работе 🔄) +- **Старт:** 05.04.2026 +- **Цель:** 192.168.4.0/24 → весь трафик через VLESS (прозрачный прокси) +- **Схема:** Device → iptables REDIRECT → redsocks:12350 → Xray SOCKS5:1080 → VLESS +- **Wi-Fi:** 192.168.4.0/24, шлюз 192.168.4.1 (ens19, netplan) +- **DNS:** UDP/53 → 1.1.1.1 напрямую (утечка допустима) +- **Проблема:** TCP через transparent proxy не работает — конфликт xtls-rprx-vision + redirect mode. Продолжение когда Слава дома. + +### Задача #2: HA Telegram через VLESS (готово ✅) +- **Дата:** 10.04.2026 +- **Схема:** HA telegram_bot → SOCKS5 (192.168.2.200:1080) → VLESS → api.telegram.org +- **Только Telegram** через прокси, остальной трафик HA — напрямую +- **HA:** `ha.homenet542.keenetic.pro` (HAOS 17.1, IP 192.168.2.139) +- **Бот:** `@ha542_bot` (8251509944), chat_id Славы: 126472752 +- **Entity:** `notify.telegram_bot_8251509944_126472752` +- **Сервис:** `notify.send_message` → `entity_id: notify.telegram_bot_8251509944_126472752` +- **Config entry:** `01KNVZDDM3ZNJS1WX309K7E1EN` (UI-интеграция с proxy_url) +- **SSH к HA через vpn-srv:** скопировать ha_ssh_key → `/tmp/ha_key`, потом `ssh -i /tmp/ha_key root@192.168.2.139` + +### Интернет-заказы (vprok.ru) +- **Старт:** 31 марта 2026 +- **Детали:** `tasks/internet-orders/PROJECT.md` +- **Статус:** relay-сервер запущен (185.130.212.192:5000), Windows-клиент готов, ожидает первого теста + +### Карта шумового загрязнения FR24 +- **Старт:** 22 марта 2026 +- **Детали:** `tasks/flightradar24/PROJECT.md` +- **Статус:** прототип v0.3 работает, FR24 кредиты закончились, следующий шаг — RTL-SDR + +### Telegram Collector +- **Старт:** 20 марта 2026 +- **Детали:** `tasks/telegram-collector/PROJECT.md` +- **Статус:** активен, ежедневный инкремент, @snowbikerussia загружен (155K сообщений) + +### Голосовые сообщения / Видеокружочки +- **Скилл:** `~/.openclaw/skills/voice-tts/SKILL.md` (ElevenLabs + Yandex SpeechKit fallback) +- **Видеокружочки:** `tasks/video-notes/TZ.md`, pipeline ElevenLabs → fal.ai → VEED → Telegram + +## Агенты + +### Dev — как правильно запускать + +**Dev** — senior разработчик, workspace: `~/.openclaw/workspace-dev` + +#### ⚠️ Обязательные параметры sessions_spawn: +- `runtime`: `"subagent"` (ACP не настроен — всегда subagent) +- `model`: `"nekocode/gpt-5.4"` (если Слава не указал другую) +- `cwd`: `"/home/node/.openclaw/workspace-dev"` — **критично!** Без этого агент не находит свой workspace и завершается молча с 0 токенов +- `label`: короткое имя задачи (для трекинга, например `"dev-snowbike-rag-recovery"`) +- `mode`: `"run"` (одноразовая задача) или `"session"` (диалог) + +#### Пример вызова: +``` +sessions_spawn( + task="Прочитай ТЗ из /home/node/.openclaw/workspace/tasks/...\n\nСделай X, Y, Z.\n\nВерни отчёт.", + runtime="subagent", + model="nekocode/gpt-5.4", + cwd="/home/node/.openclaw/workspace-dev", + label="dev-taskname" +) +``` + +#### Что включать в task: +1. Ссылка на ТЗ-файл (абсолютный путь) или полный текст задачи +2. Путь к проекту (где лежат исходники) +3. Ограничения (например: "полную переиндексацию не запускать") +4. Формат ожидаемого отчёта + +#### Модели: +- **Основная:** `nekocode/gpt-5.4` — если Слава не указал другую +- **Fallback при rate limit:** `openrouter/minimax/minimax-m2.7` — проверено, работает для dev-задач (2026-04-07) +- Rate limit gpt-5.4 проявляется как: агент стартует нормально, но отвечает `{"code":"rate_limited",...}` +- Если rate limit — не ждать, сразу переключаться на MiniMax или Sonnet 4.6 + +#### Частые ошибки: +- **Не указывать `cwd`** → агент завершается за 5 сек с 0 токенов (молчаливый фейл) +- **`streamTo: "parent"`** → работает только с `runtime=acp`, не с subagent +- **runtime=acp** → не настроен, всегда падает с ошибкой + +#### Dev vs Legal: +- **Dev** (id: `dev`) — разработка, дебаг, скрипты +- **Юрист** (id: `legal`) — юридические вопросы по РФ, workspace: `~/.openclaw/workspace-legal` +- **Федя (Fedia)** — агент, workspace: `~/.openclaw/workspace-fedia` + +## Скиллы + +### Общие (`~/.openclaw/skills/`) — доступны всем агентам +- **voice-tts** — голосовые сообщения (ElevenLabs + Yandex SpeechKit) +- **diagram-png** — генерация PNG-диаграмм из JSON +- **diagram-table** — таблицы в PNG из JSON (Pillow, dark/light). Скрипты: `generate_table.py` (stdin→PNG), `send_table.py` (PNG→Telegram). Требует `TELEGRAM_BOT_TOKEN` и `TELEGRAM_CHAT_ID` в `.env` + +### Мои личные (`workspace/skills/`) — только для Стрим +- **ontology** — граф знаний (сущности, связи, запросы) +- **telegram-collector** — сбор данных из Telegram-каналов +- **youtube-search** — YouTube Data API v3. Ключ: `YOUTUBE_API_KEY` +- **yandex-search** — Yandex Search API v2. Ключ: `YANDEX_API_KEY` +- **ontology** — граф знаний (сущности, связи, запросы) +- **Онтология — общая база знаний**: `memory/ontology/` + - `graph.jsonl` — сущности и связи + - `schema.yaml` — схема типов + - `RULES.md` — правила ведения (обязательны) +- **Стрим — единственный writer**: все изменения — только через Стрим +- ⚠️ **Правило (10.04.2026):** При работе с проектами всегда автоматически обновлять онтологию (create/update) и запускать `openclaw wiki ingest` для документации — без напоминания Славы +- **Другие агенты (Dev, Legal, Feda) — читатели**: запрашивают через `sessions_send` +- **Изменения — только с подтверждения Славы** +- **При работе с проектами/задачами — всегда использовать онтологию** (правила: `memory/ontology/RULES.md`) +- Запуск из workspace: `python3 skills/ontology/scripts/ontology.py ` +- Storage: `memory/ontology/graph.jsonl` + `memory/ontology/schema.yaml` +- PyYAML не установлен — validate暂时 не работает + +## Интеграции +- **Flightradar24 API** — тариф Explorer, 60K кредитов/мес (до 31.05.2026 промо 120K) +- **GigaChat API** — через gpt2giga прокси + - gpt2giga: `185.130.212.192:8443` (baseUrl в openclaw.json) + - Xray VLESS outbound: `43.245.226.231:15281` (Франкфурт), UUID b8d92081-..., Reality+chrome, SNI google.com + - Xray конфиг: `/home/slin/openclaw/xray-config.json` + - OpenClaw получает `HTTPS_PROXY=socks5://xray:10808` через docker-compose environment + - Цепочка: OpenClaw (mva154) → Xray VLESS → ??? → gpt2giga → GigaChat API + - Примечание: прямое подключение из контейнера к 185.130.212.192:8443 недоступно (timeout), трафик идёт через host-сеть + - ⚠️ **TODO:** Слава проверит схему — точно ли Xray участвует в цепочке к gpt2giga или это отдельный маршрут + - Локальный gpt2giga НЕ используется, удалён (08.04.2026) + +```` + +## Notes + + + +## Related + +### Referenced By + +- [Wiki & Memory](entities/project-wiki-memory.md) + diff --git a/sources/project.md b/sources/project.md new file mode 100644 index 0000000..b5984ba --- /dev/null +++ b/sources/project.md @@ -0,0 +1,258 @@ +--- +pageType: source +id: source.project +title: PROJECT +sourceType: local-file +sourcePath: /home/node/.openclaw/workspace/tasks/proxy-vm/PROJECT.md +ingestedAt: 2026-04-10T15:41:41.998Z +updatedAt: 2026-04-10T15:41:41.998Z +status: active +--- + +# PROJECT + +## Source +- Type: `local-file` +- Path: `/home/node/.openclaw/workspace/tasks/proxy-vm/PROJECT.md` +- Bytes: 7909 +- Updated: 2026-04-10T15:41:41.998Z + +## Content +````text +# ProxyVM — Документация проекта + +**Статус:** active +**Дата запуска:** 04.04.2026 +**Обновлено:** 10.04.2026 + +--- + +## Цели проекта + +1. **Задача #1: Homenet-VPN** — Wi-Fi сеть 192.168.4.0/24, весь TCP/UDP трафик через Xray VLESS Reality (прозрачный прокси). Статус: **в работе** 🔄 +2. **Задача #2: HA Telegram** — Home Assistant отправляет Telegram-уведомления через VLESS. Остальной трафик HA — напрямую. Статус: **ГОТОВО** ✅ + +--- + +## Задача #2 — HA Telegram через VLESS (ЗАВЕРШЕНА ✅) + +**Дата:** 10.04.2026 + +### Схема работы + +``` +Home Assistant (192.168.2.139, gateway = Keenetic 192.168.2.1) + │ + │ SOCKS5 proxy (только telegram_bot интеграция) + ▼ + vpn-srv SOCKS5 (192.168.2.200:1080) ← Xray + │ + │ VLESS Reality (xtls-rprx-vision) + ▼ + VLESS Server (43.245.226.231:53903) + │ + ▼ + api.telegram.org +``` + +Важно: только `telegram_bot` интеграция ходит через прокси. Остальной трафик HA идёт напрямую через Keenetic. + +### Конфигурация в HA + +Интеграция `telegram_bot` настроена через UI (Настройки → Интеграции → Telegram Bot): + +| Параметр | Значение | +|----------|----------| +| Platform | polling | +| API Key | `8251509944:AAGkRr_5ZIIQNd4XrlI5QI9DYZS8JUPhcxY` | +| Proxy URL | `socks5://192.168.2.200:1080` | +| API Endpoint | `https://api.telegram.org` | +| Allowed Chat ID | 126472752 (Слава) | +| Config Entry ID | `01KNVZDDM3ZNJS1WX309K7E1EN` | + +### Бот + +- **Username:** `@ha542_bot` +- **Bot ID:** 8251509944 +- **Notify Entity:** `notify.telegram_bot_8251509944_126472752` + +### Как отправить сообщение из HA + +```yaml +service: notify.send_message +target: + entity_id: notify.telegram_bot_8251509944_126472752 +data: + message: "Текст уведомления" +``` + +Или через Developer Tools → Services. + +### Доступ к HAOS + +- **URL:** `https://ha.homenet542.keenetic.pro` +- **IP в LAN:** 192.168.2.139 +- **HAOS Version:** 17.1 | HA Core: 2026.3.4 +- **HA Token:** `HA_TOKEN` в `~/.openclaw/.env` +- **SSH через vpn-srv:** + ```bash + # Шаг 1: Скопировать ключ на vpn-srv + scp -i /home/node/.openclaw/ha_ssh_key -P 3322 /home/node/.openclaw/ha_ssh_key vpn@185.130.212.192:/tmp/ha_key + # Шаг 2: SSH к HA + ssh -i /home/node/.openclaw/ha_ssh_key -p 3322 vpn@185.130.212.192 \ + "ssh -i /tmp/ha_key root@192.168.2.139" + ``` + +--- + +## Задача #1 — Wi-Fi Homenet_vpn transparent proxy (В РАБОТЕ 🔄) + +**Цель:** Устройства в сети 192.168.4.0/24 (телевизор и др.) автоматически используют VLESS прокси без настройки на устройстве. + +### Архитектура + +``` +Телевизор/телефон + │ + │ Wi-Fi "Homenet_vpn" (SSID) + ▼ + Keenetic (DHCP: gateway=192.168.4.1, DNS=192.168.4.1) + │ + │ VLAN/bridge → ens19 + ▼ + vpn-srv (192.168.4.1 на ens19) + │ + │ iptables REDIRECT → redsocks:12350 + ▼ + redsocks (localhost:12350, type=socks5) + │ + │ SOCKS5 → 127.0.0.1:1080 + ▼ + Xray (localhost:1080 SOCKS5 / 8888 HTTP / 12345 tproxy-in) + │ + │ VLESS Reality (xtls-rprx-vision) + ▼ + VLESS Server (43.245.226.231:53903) + │ + ▼ + 🌐 Internet +``` + +**Что работает:** DNS (UDP/53 → 1.1.1.1), ping, UDP +**Что не работает:** TCP через REDIRECT → ошибка на стороне HA/клиента +**Корень проблемы:** Конфликт `xtls-rprx-vision` flow + redirect/tproxy mode. Xray падает с `operation not supported` при установке IP_TRANSPARENT на принятых сокетах. Проверка продолжится когда Слава дома. + +--- + +## Инфраструктура vpn-srv + +### Доступ + +```bash +ssh -i /home/node/.openclaw/ha_ssh_key -o StrictHostKeyChecking=no -p 3322 vpn@185.130.212.192 +# sudo через пайп: +echo meNt85doC | sudo -S <команда> +``` + +| Параметр | Значение | +|----------|----------| +| IP (LAN) | 192.168.2.200/24 (ens18) | +| IP (VPN subnet) | 192.168.4.1/24 (ens19) | +| OS | Ubuntu 22.04 | +| Sudo password | meNt85doC | + +### Сервисы на vpn-srv + +| Сервис | Порт | Статус | +|--------|------|--------| +| frpc | → relay:7000 | ✅ enabled | +| xray | 12345 (tproxy), 1080 (socks5), 8888 (http) | ✅ enabled | +| redsocks | 12350 | запущен вручную | +| netfilter-persistent | — | ✅ enabled | + +### FRP туннель + +- **relay:** `185.130.212.192:7000`, token: `frp_vpnsrv_2026_secret` +- **SSH через relay:** порт 3322 → vpn-srv:22 +- **relay root SSH:** `root@185.130.212.192`, пароль `AR5f7_T-bA` + +### VLESS сервер + +``` +vless://009625cc-588f-4cba-941f-ab8c960efa04@43.245.226.231:53903 + ?type=tcp&encryption=none&security=reality + &pbk=fgKnOtQWS5FErVT8E-roZgQOG6XQzDxB9-N5pRoAyBI + &fp=chrome&sni=yahoo.com&sid=d00e60e4&spx=%2F + &flow=xtls-rprx-vision +``` + +### Конфигурационные файлы + +| Файл | Описание | +|------|----------| +| `/etc/xray/config.json` | Конфиг Xray (tproxy + SOCKS5 + HTTP + VLESS out) | +| `/etc/iptables/rules.v4` | iptables правила (⚠️ не актуальны после 10.04!) | +| `/etc/frp/frpc.toml` | FRP клиент | +| `/etc/netplan/99-vpn-alias.yaml` | IP 192.168.4.1 на ens19 | +| `/home/vpn/transparent-proxy.sh` | Скрипт настройки tproxy (устарел) | + +### iptables (текущее состояние на 10.04) + +```bash +# DNS для VPN-сети → 1.1.1.1 +iptables -t nat -A PREROUTING -s 192.168.4.0/24 -p udp --dport 53 -j DNAT --to-destination 1.1.1.1 + +# TCP для VPN-сети → redsocks (12350) +# Цепочка TV_REDIRECT: исключения для VLESS сервера и приватных сетей, затем REDIRECT +iptables -t nat -A PREROUTING -j TV_REDIRECT + +# TCP для HA-сети → redsocks (12350) +# Цепочка REDSOCKS_HA: исключения для приватных сетей, затем REDIRECT +iptables -t nat -A PREROUTING -s 192.168.2.0/24 -j REDSOCKS_HA + +# MASQUERADE +iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -j MASQUERADE +iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE +``` + +⚠️ **rules.v4 не обновлён** — нужно пересохранить после завершения отладки. + +--- + +## TODO + +- [ ] **Задача #1:** Разобраться с TCP через transparent proxy для 192.168.4.0/24 (конфликт xtls-rprx-vision + tproxy/redirect) +- [ ] Обновить `/etc/iptables/rules.v4` после финализации правил +- [ ] Убедиться что redsocks запускается при загрузке vpn-srv (добавить в systemd) +- [ ] Очистить `/homeassistant/custom_components/set_proxy/` (создан случайно, не нужен) + +--- + +## Хронология + +| Дата | Событие | +|------|---------| +| 04.04.2026 | Создан сегмент Homenet_vpn в Keenetic, настроен Proxmox VLAN | +| 05.04.2026 | Установлен Xray, настроен tproxy | +| 10.04.2026 | Полная отладка: frpc, redsocks, netplan, iptables-persistent | +| 10.04.2026 | DNS ✅, ping ✅, UDP ✅ — TCP через tproxy ❌ (конфликт flow) | +| 10.04.2026 | **Задача #2 DONE:** HA Telegram через SOCKS5 proxy → VLESS ✅ | + +```` + +## Notes + + + +## Related + +### Referenced By + +- [Home Assistant](entities/project-ha.md) +- [Proxy VM (vpn-srv)](entities/project-proxy-vm.md) +- [Snowbike RAG](entities/project-snowbike-rag.md) +- [Tapo Camera Monitor](entities/project-tapo.md) +- [Telegram Collector](entities/project-telegram-collector.md) +- [Интернет-заказы](entities/project-internet-orders.md) +- [Карта шумового загрязнения FR24](entities/project-flightradar24.md) + diff --git a/sources/skill.md b/sources/skill.md new file mode 100644 index 0000000..4f5228d --- /dev/null +++ b/sources/skill.md @@ -0,0 +1,171 @@ +--- +pageType: source +id: source.skill +title: SKILL +sourceType: local-file +sourcePath: /home/node/.openclaw/skills/diagram-table/SKILL.md +ingestedAt: 2026-04-10T13:17:08.264Z +updatedAt: 2026-04-10T13:17:08.264Z +status: active +--- + +# SKILL + +## Source +- Type: `local-file` +- Path: `/home/node/.openclaw/skills/diagram-table/SKILL.md` +- Bytes: 3890 +- Updated: 2026-04-10T13:17:08.264Z + +## Content +````text +# SKILL.md — diagram-table + +## Назначение + +Генерация таблиц в виде PNG-картинок для отправки в Telegram. Таблицы в текстовом формате плохо читаются в Telegram (моноширинный шрифт, смещения), поэтому конвертируем их в красивую картинку. + +--- + +## Архитектура + +``` +Вход: JSON/текстовая таблица + ↓ +Генерация PNG (Pillow) + ↓ +Отправка в Telegram (или сохранение в файл) +``` + +--- + +## Файлы + +- `SKILL.md` — этот файл +- `scripts/generate_table.py` — генерация PNG из таблицы +- `scripts/send_table.py` — отправка таблицы в Telegram + +--- + +## generate_table.py + +**Вход (JSON):** +```json +{ + "headers": ["Проект", "Статус", "Исполнитель"], + "rows": [ + ["Snowbike RAG", "active", "Dev-агент"], + ["Noisemap FR24", "paused", "Слава"] + ], + "title": "Бэклог проектов", + "width": 800, + "theme": "dark" +} +``` + +**Параметры:** +- `headers` — список заголовков (обязательно) +- `rows` — список строк (обязательно) +- `title` — заголовок таблицы (опционально) +- `width` — ширина картинки (по умолчанию 800) +- `theme` — `dark` (по умолчанию) или `light` + +**Выход:** PNG файл + +**Цвета (dark theme):** +- Фон: `#0d1117` +- Заголовок: `#1a3a2a` (зелёный) +- Чередование строк: `#161b22` / `#0d1117` +- Текст: `#e6edf3` +- Границы: `#30363d` + +**Цвета (light theme):** +- Фон: `#ffffff` +- Заголовок: `#238636` +- Чередование строк: `#f6f8fa` / `#ffffff` +- Текст: `#24292f` +- Границы: `#d0d7de` + +--- + +## send_table.py + +**Использование:** +```bash +./send_table.py "Бэклог" '{"headers":[...], "rows":[...]}' [BOT_TOKEN] [CHAT_ID] +``` + +**Или через stdin:** +```bash +echo '{"headers":[...], "rows":[...]}' | ./send_table.py "Заголовок" +``` + +**Параметры:** +- Аргумент 1: заголовок таблицы (или JSON, если 2 аргумента) +- Аргумент 2: JSON (если 1й аргумент — заголовок) +- BOT_TOKEN: из ~/.openclaw/.env если не передан +- CHAT_ID: из ~/.openclaw/.env если не передан + +--- + +## Пример использования в агенте + +```python +import subprocess +import json + +table_data = { + "headers": ["Проект", "Статус", "Исполнитель"], + "rows": [ + ["Snowbike RAG", "active", "Dev-агент"], + ["Noisemap FR24", "paused", "Слава"] + ], + "title": "Бэклог проектов" +} + +result = subprocess.run( + ["python3", "skills/diagram-table/scripts/generate_table.py"], + input=json.dumps(table_data), + capture_output=True +) +# result.stdout — путь к PNG файлу +``` + +--- + +## Шрифты + +- Заголовок: DejaVu Sans Bold, 16px +- Ячейки: DejaVu Sans, 14px +- Путь к шрифтам: системные `/usr/share/fonts/truetype/dejavu/` или встроенный fallback + +--- + +##Marginals + +- Минимум 1 колонка, 1 строка +- Максимум 20 колонок, 100 строк +- Если строк > 20 — разбивает на несколько страниц внутри одного PNG (часть N/M) +- Высота картинки — автоматическая (по количеству строк) + +## Ограничения send_table.py + +- BOT_TOKEN и CHAT_ID должны быть в `~/.openclaw/.env` +- Формат: `TELEGRAM_BOT_TOKEN=`, `TELEGRAM_CHAT_ID=` + +```` + +## Notes + + + +## Related + +### Referenced By + +- [Skill: ontology](concepts/skill-ontology.md) +- [Skill: telegram-collector](concepts/skill-telegram-collector.md) +- [Skill: voice-tts](concepts/skill-voice-tts.md) +- [Skills: diagram-png & diagram-table](concepts/skill-diagram.md) +- [Skills: youtube-search & yandex-search](concepts/skill-search.md) + diff --git a/sources/tz.md b/sources/tz.md new file mode 100644 index 0000000..b62e554 --- /dev/null +++ b/sources/tz.md @@ -0,0 +1,252 @@ +--- +pageType: source +id: source.tz +title: TZ +sourceType: local-file +sourcePath: /home/node/.openclaw/workspace/tasks/video-notes/TZ.md +ingestedAt: 2026-04-10T13:36:51.302Z +updatedAt: 2026-04-10T13:36:51.302Z +status: active +--- + +# TZ + +## Source +- Type: `local-file` +- Path: `/home/node/.openclaw/workspace/tasks/video-notes/TZ.md` +- Bytes: 8806 +- Updated: 2026-04-10T13:36:51.302Z + +## Content +````text +# ТЗ: Видеокружочки в Telegram (lip sync) + +## Общее описание + +Система генерации и отправки анимированных видеокружочков (video notes) в Telegram. +Аватарка «говорит» голосом ElevenLabs с синхронизацией губ через VEED Fabric 1.0. + +--- + +## Архитектура + +``` +Пользователь → Текст → send_video_note.sh → Telegram кружочек + │ + ├── Шаг 1: ElevenLabs TTS (текст → MP3) + ├── Шаг 2: fal.ai Upload (фото + MP3 → URLs) + ├── Шаг 3: VEED Fabric 1.0 (фото + MP3 → MP4 с lip sync) + ├── Шаг 4: FFmpeg (MP4 → 512×512 квадрат) + └── Шаг 5: Telegram sendVideoNote (MP4 → кружочек) +``` + +--- + +## Компоненты + +### 1. ElevenLabs TTS API +- **Назначение:** генерация голоса из текста +- **Endpoint:** `https://api.elevenlabs.io/v1/text-to-speech/{voice_id}` +- **Голос:** `TPIitICAZ8CqlGZ81AKm` (голос Стрим) +- **Модель:** `eleven_multilingual_v2` +- **Вход:** текст (до 5000 символов) +- **Выход:** MP3 файл +- **Ключ:** `ELEVENLABS_API_KEY` в `~/.openclaw/.env` + +### 2. fal.ai Upload API +- **Назначение:** загрузка файлов на storage fal.ai +- **Endpoint:** `https://gateway.fal.ai/storage/upload` +- **Аутентификация:** `Authorization: Key {key_id}:{key_secret}` +- **Вход:** файл (изображение или аудио) +- **Выход:** публичный URL файла на fal.ai storage +- **Ключ:** `FAL_KEY` в `~/.openclaw/.env` (формат: `key_id:key_secret`) +- **Fallback:** если upload не работает — кодирование в base64 и передача как data URL + +### 3. VEED Fabric 1.0 API (fal.ai) +- **Назначение:** генерация видео с lip sync из фото и аудио +- **Endpoint:** `https://queue.fal.run/veed/fabric-1.0` +- **Аутентификация:** `Authorization: Key {key_id}:{key_secret}` +- **Вход:** + - `image_url` — URL фото аватарки (или base64 data URL) + - `audio_url` — URL MP3 файла с голосом (или base64 data URL) + - `resolution` — разрешение видео (`"720p"` или `"480p"`) +- **Выход:** JSON с URL готового MP4 видео +- **Архитектура:** асинхронная (queue + poll) + 1. POST → получает `request_id` + статус `IN_QUEUE` + 2. GET poll → статусы: `IN_QUEUE` → `IN_PROGRESS` → `COMPLETED` + 3. GET result → URL MP4 файла +- **Таймаут:** 300 секунд (5 минут) +- **Стоимость:** ~$0.40 за минуту видео + +### 4. FFmpeg +- **Назначение:** конвертация видео в квадрат 512×512 +- **Путь:** `/home/node/bin/ffmpeg-7.0.2-amd64-static/ffmpeg` +- **Операции:** + - Масштабирование до 512×512 с обрезкой по центру + - Конвертация в MP4 (H.264) + - Округление длительности до целых секунд + +### 5. Telegram sendVideoNote API +- **Назначение:** отправка кружочка в Telegram +- **Endpoint:** `https://api.telegram.org/bot{token}/sendVideoNote` +- **Параметры:** + - `chat_id` — ID чата получателя + - `video_note` — MP4 файл + - `length` — размер кружочка (512 пикселей) + - `duration` — длительность в секундах +- **Токен бота:** читается из `~/.openclaw/openclaw.json` + +--- + +## Скрипт: send_video_note.sh + +**Расположение:** `/home/node/.openclaw/workspace/scripts/send_video_note.sh` + +**Использование:** +```bash +./send_video_note.sh "Текст для озвучки" +./send_video_note.sh "Текст" [VOICE_ID] [CHAT_ID] +``` + +**Параметры:** +- `Текст` — текст для озвучки (обязательный) +- `VOICE_ID` — ID голоса ElevenLabs (по умолчанию: `TPIitICAZ8CqlGZ81AKm`) +- `CHAT_ID` — ID Telegram чата (по умолчанию: `126472752`) + +**Зависимости:** +- curl +- python3 +- ffmpeg (статический, путь в переменной `FFMPEG_BIN`) +- Переменные в `~/.openclaw/.env`: `ELEVENLABS_API_KEY`, `FAL_KEY` + +**Временные файлы:** +- Все промежуточные файлы создаются в `/tmp/video_note_*` +- Автоматически удаляются после завершения + +--- + +## Pipeline (подробно) + +### Шаг 1: Генерация голоса (ElevenLabs TTS) +``` +POST https://api.elevenlabs.io/v1/text-to-speech/{voice_id} +Headers: xi-api-key, Content-Type: application/json +Body: {"text": "...", "model_id": "eleven_multilingual_v2"} +Output: MP3 файл +``` + +### Шаг 2: Определение длительности аудио +``` +ffprobe -v error -show_entries format=duration -of csv=p=0 tts.mp3 +Output: длительность в секундах (float) +``` + +### Шаг 3: Загрузка файлов на fal.ai +``` +POST https://gateway.fal.ai/storage/upload +Headers: Authorization: Key {key_id}:{key_secret}, Content-Type: application/octet-stream +Body: бинарные данные файла +Output: {"file_url": "https://..."} +``` +Для каждого файла: аватарка (JPG) и аудио (MP3). + +### Шаг 4: Отправка задачи VEED Fabric 1.0 +``` +POST https://queue.fal.run/veed/fabric-1.0 +Headers: Authorization: Key {key_id}:{key_secret}, Content-Type: application/json +Body: {"image_url": "...", "audio_url": "...", "resolution": "480p"} +Output: {"request_id": "...", "status": "IN_QUEUE"} +``` + +### Шаг 5: Ожидание результата (poll) +``` +GET https://queue.fal.run/veed/fabric-10/requests/{request_id}/status +Headers: Authorization: Key {key_id}:{key_secret} +Цикл: каждые 5 секунд, до 300 секунд +Статусы: IN_QUEUE → IN_PROGRESS → COMPLETED +``` + +### Шаг 6: Получение результата +``` +GET https://queue.fal.run/veed/fabric-1.0/requests/{request_id} +Headers: Authorization: Key {key_id}:{key_secret} +Output: {"video": {"url": "https://v3b.fal.media/..."}} +``` + +### Шаг 7: Скачивание видео +``` +curl -L -o lipsync_raw.mp4 "{video_url}" +``` + +### Шаг 8: Конвертация в квадрат 512×512 +``` +ffmpeg -i lipsync_raw.mp4 \ + -vf "crop='min(iw,ih)':'min(iw,ih)',scale=512:512" \ + -c:v libx264 -preset fast -crf 23 \ + -an -t {duration} -y video_note.mp4 +``` + +### Шаг 9: Отправка в Telegram +``` +POST https://api.telegram.org/bot{token}/sendVideoNote +Body (multipart): + - chat_id: 126472752 + - video_note: @video_note.mp4 + - length: 512 + - duration: {duration_int} +``` + +--- + +## Аватарка + +**Расположение:** `/home/node/.openclaw/workspace/data/avatars/stream-avatar.jpg` + +**Требования к аватарке:** +- Формат: JPG или PNG +- Лицо: анфас, хорошо видно +- Размер: не менее 512×512 пикселей +- Фон: нейтральный или любой + +**Для смены аватарки:** заменить файл `stream-avatar.jpg` + +--- + +## Ограничения + +- **Длительность:** до 60 секунд (лимит Telegram video note) +- **Размер:** до 50 МБ (лимит Telegram) +- **Стоимость VEED:** ~$0.40 за минуту видео +- **Стоимость ElevenLabs:** зависит от тарифа (символы) +- **Время обработки:** ~80 секунд на 8 секунд видео (VEED Fabric 1.0) +- **Разрешение:** 512×512 (квадрат, как требует Telegram) + +--- + +## Интеграция в OpenClaw + +**Через Стрим (координатор):** +- Стрим вызывает скрипт через `exec`: `send_video_note.sh "текст"` +- Или передаёт задачу Dev-агенту через `sessions_spawn` + +**Через Dev-агента:** +- Dev может вызывать скрипт из любого проекта +- Передаёт текст и получает отправленный кружочек + +**Стоимость за вызов:** +- ElevenLabs TTS: ~$0.01–0.03 за 10 секунд голоса +- VEED Fabric 1.0: ~$0.07 за 10 секунд видео +- **Итого: ~$0.10 за один кружочек** + +```` + +## Notes + + + +## Related + +### Referenced By + +- [Видеокружочки](entities/project-video-notes.md) + diff --git a/syntheses/index.md b/syntheses/index.md new file mode 100644 index 0000000..e9d3539 --- /dev/null +++ b/syntheses/index.md @@ -0,0 +1,6 @@ +# Syntheses + +## Generated + +- No syntheses yet. +