You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
275 lines
30 KiB
275 lines
30 KiB
{ |
|
"version": 2, |
|
"updatedAt": "2026-11-07T05:58:15.566Z", |
|
"entries": [ |
|
{ |
|
"id": "0f90dcf0-5d43-4ca4-bf86-ad8b3ee20382", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "protocol_marker_format", |
|
"text": "ФОРМАТ ВЫЗОВА DSH — главная ошибка.\n\nСкобки это ДВОЙНЫЕ КВАДРАТНЫЕ (белые), НЕ угловые и НЕ обычные.\n открывающая: ⟦ U+27E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET\n закрывающая: ⟧ U+27E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET\nВизуально: как квадрат с горизонтальной чертой внутри. Не путать с угловыми.\n\nПример правильного маркера (скопируй эти скобки):\n ⟦DSH⟧{\"tool\":\"dsh_read\",\"args\":{\"path\":\"note.txt\"}}⟦/DSH⟧\n\nСтруктура: ⟦ DSH ⟧ JSON ⟦ /DSH ⟧. Две пары скобок, JSON между ними.\n\nНЕ РАБОТАЕТ — частая ошибка:\n Угловые скобки U+27E8 и U+27E9 (математические острые, похожи на птичку). НЕ ТЕ. Модель часто их путает.\n Обычные угловые < >. НЕ ТЕ.\n Квадратные ASCII [ ]. НЕ ТЕ.\n Кавычки-ёлочки « ». НЕ ТЕ.\n CJK угловые 〈 〉. НЕ ТЕ.\n Одна пара без /DSH. Не работает.\n\nЕсли клавиатура не даёт правильные скобки — String.fromCharCode(10214) и String.fromCharCode(10215).\n\nНИКОГДА не писать живые скобки в обычном тексте ответа. Только в реальных вызовах. В прозе — ASCII-описание.", |
|
"importance": "always", |
|
"tags": [ |
|
"protocol", |
|
"marker" |
|
], |
|
"version": 2, |
|
"createdAt": "2026-11-02T23:35:16.258Z", |
|
"updatedAt": "2026-11-03T13:09:07.319Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 1545 |
|
}, |
|
{ |
|
"id": "027b58a0-cf63-4f15-bc95-1ccbef0250d7", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "protocol_tools_and_rules", |
|
"text": "ИНСТРУМЕНТЫ И ПАРАМЕТРЫ\n\ndsh_tree: path, depth. Дерево папки.\ndsh_read: path, offset, limit. Читать файл (512 КБ прямо, 2 МБ с offset/limit).\ndsh_write: path, content. Записать файл (content до 2 МБ).\ndsh_edit: path, oldText, newText. Заменить одно вхождение.\ndsh_search: path, query. Найти подстроку.\ndsh_bash: command. Только whitelist. Блокируются: powershell, rm, del, sed, символы вертикальной черты, амперсанда, угловых скобок, точки с запятой, доллара, переносы строк.\ndsh_git_status: path. Статус. Передавать path явно, если репозиторий не в корне workspace.\ndsh_git_diff: path. Различия.\n\nПРАВИЛА\nМаксимум 10 вызовов в сообщении, рекомендуется 3-4 (rate limit моста 60/min, задержка 3 сек на вызов). Пути относительные от workspace. Абсолютные запрещены. Rate limit 60 req/min, задержка 3 сек на вызов.", |
|
"importance": "always", |
|
"tags": [ |
|
"protocol", |
|
"tools" |
|
], |
|
"version": 2, |
|
"createdAt": "2026-11-02T23:35:16.258Z", |
|
"updatedAt": "2026-11-02T23:46:25.799Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 1186 |
|
}, |
|
{ |
|
"id": "f03151af-0efc-426b-8e8d-80573bc2f613", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "protocol_pitfalls", |
|
"text": "КРИТИЧЕСКИЕ ГРАБЛИ\n\n1 ДЕДУП. Повторный вызов того же tool с теми же args отбрасывается молча. Симптом: статус зелёный idle, ошибок нет, в логе dup call skipped. Лечение: сменить файл или аргументы. Reset не помогает.\n\n2 ЛИНКИФИКАЦИЯ (только DOM). Рендерер превращает домены и URL в ссылки, collectText вставляет переводы строк. JSON ломается. В SSE этой проблемы нет.\n\n3 МНОГОСТРОЧНЫЙ OLD TEXT (только DOM). В dsh_edit не находится из-за разницы переводов. В SSE работает.\n\n4 BASH TIMEOUT. Поле timeout иногда приводит к молчанию. Вызывать без него. Команды вне whitelist требуют подтверждения в панели.\n\n5 ПРОВЕРКА ПОСЛЕ ЗАПИСИ. Отправил не значит записалось. После критичной записи читать файл обратно через dsh_read.\n\n6 JSON. Внутри маркера обязан быть валидным. Кавычки двойные.\n\n7 СМЕШАННЫЕ CRLF. Если в файле часть строк CRLF, часть LF — патчи по номерам съезжают. Нормализовать к LF перед патчем.\n\n8 ДВОЙНОЕ ПРИМЕНЕНИЕ ПАТЧА. Anchor не должен присутствовать в замене. Проверять повторным запуском: должен быть SKIP или fixed 0.", |
|
"importance": "always", |
|
"tags": [ |
|
"protocol", |
|
"pitfalls" |
|
], |
|
"version": 1, |
|
"createdAt": "2026-11-02T23:35:16.258Z", |
|
"updatedAt": "2026-11-02T23:35:16.258Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 1715 |
|
}, |
|
{ |
|
"id": "2c416cb6-7f41-48fb-a2e0-fd2a1219974c", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "protocol_recovery", |
|
"text": "ВОССТАНОВЛЕНИЕ И ПРОВЕРКА МОСТА (dsh-memory 1.0.0)\n\nШаг 1. Проверка моста. Вызови dsh_read на любой путь, например .dsh-memory/notes/START.md.\nТри исхода:\n- пришёл dsh-result с ok true — мост жив, файл есть\n- пришёл dsh-result с E_ARGS_INVALID File not found — мост жив, файла нет, это тоже успех калибровки\n- ответа нет вообще, статус idle, ошибок нет — мост выключен или вызов отброшен дедупом (не повторяй тот же tool с теми же args)\n\nШаг 2. Если мост жив — прочитай .dsh-memory/notes/START.md. Он ведёт на актуальный чекпоинт (PART16), RECOVERY_CHECKLIST, PROTOCOLS_DSH.\n\nШаг 3. Короткий отчёт: мост жив, что прочитано, следующий шаг, готов продолжать.\n\nПроверка папки моста: .dsh-memory/logs/execution-log.jsonl создаётся на первом же tool-вызове. Если он есть — мост точно работал.\n\nВерсия приложения 1.0.0 (функционально завершено). Этапы 1-5 закрыты: SSE основной, память v2, директивы, .dsh-memory/, STG. Этап 6 калибровка отложен.\n\nНаличие блока в сообщении не доказывает что мост жив. Единственное доказательство — успешный dsh_read.", |
|
"importance": "always", |
|
"tags": [ |
|
"protocol", |
|
"recovery" |
|
], |
|
"version": 3, |
|
"createdAt": "2026-11-02T23:35:16.258Z", |
|
"updatedAt": "2026-11-03T07:44:54.590Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 1639 |
|
}, |
|
{ |
|
"id": "c545a8d5-f6ae-4644-b760-1e0b570c12ad", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "protocol_memory_system", |
|
"text": "МЕХАНИЗМ ПАМЯТИ dsh-memory v2\n\nСлои. Protocol (track agent, importance always) инжектится в первый ход. Session (directive scope workspace) инжектится в первый ход текущего чата. Reference (called) и Archive (state archive) только по запросу.\n\nЧто инжектится всегда: все track agent + importance always, плюс directive_ scope workspace state active для текущего chatId с проверкой workspaceKey. Fingerprint: если тот же набор уже в истории чата — пропуск всего блока.\n\nЗапросы через dsh_memory (op):\nlist track scope importance state since limit — items с preview и bytes, totalBytes, matched\nget ids — items с content, totalBytes\nrecent since — items\nunread chatId — новее lastInjectAt\nsearch query track — plain substring, totalBytes\ndirectives chatId state active|done|archive|all — директивы\nbudgets — used по track и scope, alwaysCount, лимиты\nadd entry — новая запись, entry включает track scope workspaceKey key text importance tags\nreplace id text tags importance state chatId — правка\nremove id — удаление\n\nСервер ВСЕГДА отдаёт totalBytes в meta ДО контента. Модель видит объём и решает: взять всё, взять по ids, взять preview, отложить.\n\nТаксономия ключей: user_ факты о пользователе, project_ проекты, directive_ правила и шаги, pref_ привычки, tech_ стек, interest_ интересы, pitfall_ грабли и обходы, decision_ архитектурные решения. Префикс задаёт группу, программа не решает релевантность.\n\nКОГДА ПИСАТЬ (триггеры, важнее чем формат):\n1. Завершён этап работы (коммит, фича, интеграция) -> project_<тема> или decision_<тема>, importance called. Что сделано, где код, какие грабли.\n2. Наступил на грабли второй раз -> pitfall_<тема>, called. Симптом + обход.\n3. Изменилось правило поведения (новая политика, новый лимит) -> replace существующего protocol_*, всегда. Не дубликат.\n4. Появился новый инструмент/команда/приложение -> protocol_*, always. Чтобы модель в новом чате знала.\n5. Пользователь сказал факт о себе или предпочтение -> user_/pref_, called.\n6. Проект/сервис добавлен или изменён -> project_*, called.\n\nПравило записи: после каждого завершённого этапа (2+ коммита или значимая правка) — записать хотя бы одну project_ или decision_ запись. Если этап был без грабель и без новых правил — всё равно project_: что сделано, где смотреть. Иначе через неделю память не отражает реальность.\n\nЛимиты: always записей 10, tags 5 на запись по 32 символа, директив на чат 5, preview 200. Калибровать по обратной связи.\n\nОбновление факта: replace по тому же id, не дубликат. AUTHENTIC EXTRACTION ONLY: только явно сказанное пользователем. NEVER cite memory tags в ответе.", |
|
"importance": "always", |
|
"tags": [ |
|
"protocol", |
|
"memory", |
|
"triggers" |
|
], |
|
"version": 5, |
|
"createdAt": "2026-11-02T23:35:16.258Z", |
|
"updatedAt": "2026-11-07T05:57:12.533Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 3807 |
|
}, |
|
{ |
|
"id": "2853ce0e-de50-455c-bd5a-ebbf9a3fe337", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "protocol_modes", |
|
"text": "РЕЖИМЫ DOM И SSE\n\nSSE — основной. Текст идёт из XHR через extractAssistant, минуя DOM-рендерер. Все грабли DOM (линкификация, многострочный oldText, переэкранирование, .mjs-обход) в SSE не действуют. Писать напрямую dsh_write и dsh_edit с любой пунктуацией, юникодом, многострочным текстом.\n\nDOM — резервный. Годится для простых команд без доменов, URL и спецсимволов. При падении смотреть sse-debug.jsonl: сравнить packet.text (правильный XHR) и dom-parse-fail.msgText (искажённый collectText). Расхождение покажет какой узел испортил рендерер.\n\nПереключатель в панели: кнопка DOM / SSE. Ключ storage dshmem-transport.\n\nПолные детали в _ai_notes/PROTOCOLS_DSH.md (в репозитории dsh-memory).\n\nЛИМИТЫ: в SSE максимум 10 вызовов, рекомендуется 3-4. В DOM ОБЯЗАТЕЛЬНО 3-4 максимум — накладные расходы на обходы и диагностику растут, при 10 вызовах риск срыва резко выше. Если нужно больше — переключиться на SSE или разбить на два хода.", |
|
"importance": "always", |
|
"tags": [ |
|
"protocol", |
|
"modes" |
|
], |
|
"version": 2, |
|
"createdAt": "2026-11-02T23:35:16.258Z", |
|
"updatedAt": "2026-11-02T23:51:10.669Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 1487 |
|
}, |
|
{ |
|
"id": "e1d4985b-3ea5-4c99-bebc-f909d6687df5", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "protocol_mcp", |
|
"text": "MCP: УПРАВЛЕНИЕ ПРИЛОЖЕНИЯМИ ARTCRAFT\n\nМост умеет управлять приложениями ArtCraft через MCP. Инструменты: <app>_mcp_tools (список инструментов приложения, params: filter, brief) и <app>_mcp_call (вызов инструмента, params: tool, arguments).\n\nПриложения (имя инструмента = префикс): vectorcraft, photocraft, figcraft, designcraft, deckcraft, cadcraft, craftanything, effectcraft, filmcraft, gridcraft, lightcraft, materialcraft, pdfcraft, solidcraft, soundcraft, texturecraft, wordcraft.\n\nСХЕМА. Не гадать с полями: vectorcraft_mcp_tools {\"filter\":\"draw_shape\"} вернёт inputSchema. Движок строгий, лишнее поле = unknown argument.\n\nПРИМЕРЫ. vectorcraft_mcp_call {\"tool\":\"inspect_document\",\"arguments\":{}}. {\"tool\":\"draw_shape\",\"arguments\":{\"shape\":\"rectangle\",\"x\":100,\"y\":100,\"width\":400,\"height\":240,\"radius\":28,\"fill\":\"#4f80ff\",\"stroke\":\"#1a2b55\"}}. add_text: color, не fill. export: {\"format\":\"png\",\"path\":\"...\",\"scale\":2}.\n\nПАНЕЛЬ. Бокс ArtCraft в панели: запуск окна приложения (⏻), stop/close, статус, порты 7979-7995. Live-режим: приложение запущено с --control <порт>, тогда действия видны в окне. Headless: результат только файлом.\n\nГРАБЛИ. 1) Мост выбрасывает inline-картинки — всегда просить path. 2) ui_screenshot не принимает path, файл пишет screenshot {window:true, path}. 3) Дедуп: повторный вызов с теми же аргументами отбрасывается. 4) Live-режим требует перезапуска моста, если окно подняли после старта CLI.", |
|
"importance": "always", |
|
"tags": [ |
|
"protocol", |
|
"mcp", |
|
"artcraft" |
|
], |
|
"version": 1, |
|
"createdAt": "2026-11-06T14:35:00.000Z", |
|
"updatedAt": "2026-11-06T14:35:00.000Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 1893 |
|
}, |
|
{ |
|
"id": "a7c3f1e2-9b4d-4e8a-b5c6-d7e8f9a0b1c2", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "protocol_policy", |
|
"text": "ПОЛИТИКА BASH: ОБЪЯВЛЯЙ ДО ОТПРАВКИ\n\nПеред вызовом dsh_bash с любым из признаков ниже — ОСТАНОВИСЬ, напиши в тексте объявление и НЕ отправляй вызов. Жди явного «да» пользователя в следующем сообщении.\n\nПРИЗНАКИ (policy flags):\n- shell: символы | & > < ; ` $\n- destructive: rm, del, format, mv, cp, git push/commit/reset/clean, taskkill, reg, sc, schtasks\n- network: curl, wget, ssh, scp, ftp, powershell, iwr\n- absolute-path: C:/, //, /path\n- parent-path: ..\n- multiline: перенос строки\n- script: node/python/bash <файл> (содержимое неизвестно)\n\nФОРМАТ ОБЪЯВЛЕНИЯ:\n⚠ Policy: <флаги>\nСобираюсь выполнить (нужно ваше «да»):\n 1. <команда целиком>\n 2. ...\nНе отправляю вызовы, жду подтверждения.\n\nЕсли пользователь ответил «да» — выполняй. «Нет» — не выполняй, предложи альтернативу.\n\nСЛОЙ 2 (страховка): если забыл объявить и всё-таки отправил dsh_bash с флагами — мост вернёт E_NEEDS_CONFIRM, панель покажет Allow/Deny. Это fallback, не норма. Норма — pre-flight.\n\nSAFE-LIST (без объявления): pwd, dir, ls, tree, where, whoami, git status/diff/log/show/branch/remote/ls-files/rev-parse/describe, npm/pnpm/yarn/bun test/run/build/lint/check/ls, node --version. В safe-list метасимволы запрещены.", |
|
"importance": "always", |
|
"tags": [ |
|
"protocol", |
|
"policy", |
|
"bash" |
|
], |
|
"version": 1, |
|
"createdAt": "2026-11-07T00:00:00.000Z", |
|
"updatedAt": "2026-11-07T00:00:00.000Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 2117 |
|
}, |
|
{ |
|
"id": "3e51562d-a56b-4919-9720-cf36597553b6", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "project_mcp_integration", |
|
"text": "MCP-интеграция ArtCraft в dsh-memory. Сделано 06.11.2026, коммиты 45222a0, 93504ed, fe9c4eb, f03dd76, 45ace2c, 4090ba0.\n\nЧТО СДЕЛАНО. Мост научился управлять приложениями ArtCraft через MCP (stdio JSON-RPC). 17 приложений: vectorcraft, photocraft, figcraft, designcraft, deckcraft, cadcraft, craftanything, effectcraft, filmcraft, gridcraft, lightcraft, materialcraft, pdfcraft, solidcraft, soundcraft, texturecraft, wordcraft. Порты 7979-7995, у каждого свой. Клиент поднимается лениво при первом вызове. Инструменты <app>_mcp_tools и <app>_mcp_call.\n\nФАЙЛЫ. bridge/mcp-client.js (JSON-RPC по stdio), bridge/mcp-registry.js (discovery, порты, флаги коннекта), bridge/mcp-tools.js (менеджер, ленивый старт, launchGui, stop), bridge/server.js (маршруты /mcp/apps, /mcp/launch, /mcp/stop, /mcp/rescan, /mcp/root).\n\nLIVE РЕЖИМ. vectorcraft.exe --control 7979, CLI коннектится через --connect 127.0.0.1:7979. Флаги у приложений разные: --connect ADDR (vectorcraft, designcraft, gridcraft, wordcraft, cadcraft, solidcraft, soundcraft, deckcraft), --bridge (photocraft, effectcraft, filmcraft, materialcraft, texturecraft), --attach (figcraft). pdfcraft и craftanything live не умеют.\n\nГРАБЛИ. Мост кэширует CLI-клиент: если окно подняли после старта клиента, он не переподключится. launchGui это лечит (закрывает старый клиент). Мост выбрасывает inline-картинки из MCP-ответов (mcp-client.js:81) — всегда просить path. ui_screenshot не принимает path, файл пишет screenshot {window:true, path}. draw_shape поле shape не kind, add_text color не fill — схемы через _mcp_tools {filter}.", |
|
"importance": "called", |
|
"tags": [ |
|
"project", |
|
"mcp", |
|
"artcraft" |
|
], |
|
"state": null, |
|
"chatId": "", |
|
"version": 1, |
|
"createdAt": "2026-11-07T05:57:38.065Z", |
|
"updatedAt": "2026-11-07T05:57:38.065Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 2024 |
|
}, |
|
{ |
|
"id": "4bcc17ab-cc89-4877-8695-63042b0aeaab", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "decision_bash_policy", |
|
"text": "Bash-политика dsh-memory: safe-list вместо блоков. Решение принято 07.11.2026, коммиты c2cf419, 69602ec, a298e6d.\n\nПОЧЕМУ. Раньше метасимволы (| & > < ; обратный апостроф $) и blacklist-паттерны блокировали команду намертво. Это создавало видимость защиты: обход через node script.mjs был тривиален, не логировался, а модель обходила блоки через .mjs-файлы. Пользователь сформулировал: программа не должна запрещать, она должна спрашивать.\n\nКАК СЕЙЧАС. Жёстко блокируются только пустая команда и >2000 символов. Safe-list (без подтверждения): pwd, dir, ls, tree, where, which, whoami, hostname, uname, ver, cd, echo, date, time, git status/diff/log/show/branch/rev-parse/ls-files/describe/remote/config (с пропуском -C, -c, --no-pager), npm/pnpm/yarn/bun test/run/build/lint/typecheck/check/ls/list/why/outdated/info/view (с пропуском --prefix, --workspace, -w), npx tsc/eslint/prettier/vitest/jest/mocha, node/npm/npx --version, tsc, eslint. Не включены сознательно: cat, head, tail, type, more, less — читают файлы в обход validatePath.\n\nPOLICY-ФЛАГИ (confirm): shell (метасимволы), multiline, destructive (rm, del, format, mv, cp, git push/commit/reset/clean, taskkill, reg, sc, schtasks), network (curl, wget, ssh, scp, ftp, powershell, iwr), absolute-path, parent-path. Любой флаг отменяет allow.\n\nДВА СЛОЯ. Pre-flight: модель объявляет в тексте до отправки, ждёт да (protocol_policy). Панельный confirm: Allow/Deny с ожиданием клика (content.js executeOne), fail-closed при недоступной панели (E_CONFIRM_UNAVAILABLE).\n\nГРАБЛИ. git -C path status раньше уходил в confirm (skipGlobalFlags лечит). Двойной E_NEEDS_CONFIRM в логе (server.js: при confirmToken сразу call(true)).", |
|
"importance": "called", |
|
"tags": [ |
|
"decision", |
|
"bash", |
|
"policy", |
|
"security" |
|
], |
|
"state": null, |
|
"chatId": "", |
|
"version": 1, |
|
"createdAt": "2026-11-07T05:57:41.076Z", |
|
"updatedAt": "2026-11-07T05:57:41.076Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 2252 |
|
}, |
|
{ |
|
"id": "917a3647-9bb5-4283-8eff-f59dfa1c3648", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "pitfall_eol_normalize", |
|
"text": "dsh_edit не находит oldText в файлах со смешанными CRLF/LF. Наступал многократно за 06-07.11.2026 на server.js, tools.js, panel.js, overlay.css, background.js.\n\nСИМПТОМ. E_ARGS_INVALID oldText not found (0 matches), хотя текст визуально совпадает. Причина: файл в CRLF, а oldText в LF (или наоборот).\n\nОБХОД. Перед правкой проверить EOL скриптом (посчитать CRLF vs LF), нормализовать файл к LF: fs.readFileSync -> replace(CRLF, LF) -> writeFileSync. Потом dsh_edit. После правки node -c для проверки синтаксиса. Для больших блоков (десятки строк) надёжнее не dsh_edit, а отдельный скрипт замены по маркерам: найти индексы start/end, собрать merged = before + section + after.", |
|
"importance": "called", |
|
"tags": [ |
|
"pitfall", |
|
"eol", |
|
"crlf", |
|
"dsh_edit" |
|
], |
|
"state": null, |
|
"chatId": "", |
|
"version": 1, |
|
"createdAt": "2026-11-07T05:57:44.088Z", |
|
"updatedAt": "2026-11-07T05:57:44.088Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 972 |
|
}, |
|
{ |
|
"id": "1c3a7d4c-fef0-4575-ab7c-d6cf1978e9d0", |
|
"track": "agent", |
|
"scope": "user-global", |
|
"workspaceKey": "", |
|
"key": "pitfall_dsh_edit_large_oldtext", |
|
"text": "dsh_edit с очень большим oldText (десятки строк) может применить замену криво: вставить новый блок, но не удалить старый, или задвоить содержимое. Произошло 07.11.2026 с README.md: файл раздулся с 690 до 1396 строк (дубли всех разделов).\n\nПРИЧИНА. Не подтверждена достоверно, но воспроизводилось.\n\nОБХОД. Для блоков больше 15-20 строк не использовать dsh_edit. Писать новый блок в отдельный .md/.txt файл, затем скрипт: прочитать целевой файл, найти indexOf(startMark) и indexOf(endMark), собрать merged = lines.slice(0,start) + sectionLines + lines.slice(end), записать. Это детерминированно. После — проверить размер (bytes, lines) и посчитать вхождения ключевых заголовков (должно быть по 1). При сомнениях git checkout -- file и повторить.", |
|
"importance": "called", |
|
"tags": [ |
|
"pitfall", |
|
"dsh_edit", |
|
"large-block" |
|
], |
|
"state": null, |
|
"chatId": "", |
|
"version": 1, |
|
"createdAt": "2026-11-07T05:57:47.096Z", |
|
"updatedAt": "2026-11-07T05:57:47.096Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 1176 |
|
}, |
|
{ |
|
"id": "06442ed5-f07c-4beb-bbaf-6084b5b2dddc", |
|
"track": "agent", |
|
"scope": "workspace", |
|
"workspaceKey": "V:/Site", |
|
"key": "project_warp_cz", |
|
"text": "WARP на чешском VPS (cvetochny, 85.137.166.251): скрыть IP VPS от клиентов российского туннеля. Спроектировано 06.11.2026, скрипты написаны, на сервер не выкатывалось.\n\nЗАЧЕМ. Клиенты site-to-site туннеля Россия-Чехия (RU 188.127.239.17, CZ 85.137.166.251) выходят в интернет с чешского IP. WARP завернёт только клиентов (10.8.1.0/24) в Cloudflare, сервисы на самом VPS (3proxy :3128 для Telegram-бота starvery, nginx :8443) останутся на чешском IP.\n\nФАЙЛЫ. backup-20261104/warp-cz/: warp-on.sh (wg-quick up wgcf, таблица warp id 201, правило from 10.8.1.0/24 priority 50, NAT на wgcf, TCPMSS clamp, проверка trace), warp-off.sh, warp-status.sh, wgcf.conf.example, README.md. Раздел 18 в backup-20261104/RECOVERY-AWG-SITE-TO-SITE.md.\n\nРЕЖИМ. Fail-open: старый NAT -s 10.8.1.0/24 -o ens3 MASQUERADE не удаляется. При падении WARP клиенты получают чешский IP, не теряют связь. Геолокация не важна.\n\nГРАБЛИ. Table = off в wgcf.conf обязателен (иначе wg-quick перезапишет default route, SSH умрёт). DNS = закомментировать (иначе /etc/resolv.conf перепишется, 3proxy/nginx/apt начнут резолвить через 1.1.1.1). WARP-адреса общие, Google/банки дают капчу. Геолокация не привязана к Чехии (Cloudflare выходит через ближайший DC). Хостинг может блокировать WARP — проверять curl --interface wgcf https://www.cloudflare.com/cdn-cgi/trace до включения.", |
|
"importance": "called", |
|
"tags": [ |
|
"project", |
|
"vpn", |
|
"warp", |
|
"czech" |
|
], |
|
"state": null, |
|
"chatId": "", |
|
"version": 1, |
|
"createdAt": "2026-11-07T05:57:50.110Z", |
|
"updatedAt": "2026-11-07T05:57:50.110Z", |
|
"lastRecalled": null, |
|
"recallCount": 0, |
|
"bytes": 1880 |
|
} |
|
], |
|
"chats": {} |
|
}
|
|
|