@thesashadev/girl-agent 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -8599,7 +8599,561 @@ init_llm();
8599
8599
  init_stages();
8600
8600
  init_communication();
8601
8601
  init_llm2();
8602
+ init_realism();
8602
8603
  init_runtime_bus();
8604
+
8605
+ // src/webui/assistant-knowledge.ts
8606
+ init_esm_shims();
8607
+ init_communication();
8608
+ init_llm2();
8609
+ init_mcp();
8610
+ init_stages();
8611
+ var CORE_KNOWLEDGE_BASE = [
8612
+ {
8613
+ category: "overview",
8614
+ subcategory: "product",
8615
+ title: "\u0427\u0442\u043E \u0442\u0430\u043A\u043E\u0435 girl-agent",
8616
+ keywords: ["\u043F\u0440\u043E\u0435\u043A\u0442", "girl-agent", "\u0431\u043E\u0442", "\u0447\u0442\u043E \u044D\u0442\u043E", "\u043A\u043E\u043D\u0446\u0435\u043F\u0446\u0438\u044F", "\u0430\u0440\u0445\u0438\u0442\u0435\u043A\u0442\u0443\u0440\u0430", "\u0438\u0434\u0435\u044F"],
8617
+ body: "girl-agent \u2014 \u0434\u0432\u0438\u0436\u043E\u043A Telegram-\u043F\u0435\u0440\u0441\u043E\u043D\u044B, \u0430 \u043D\u0435 \u043E\u0431\u044B\u0447\u043D\u044B\u0439 \u0447\u0430\u0442-\u0431\u043E\u0442. \u041E\u043D \u0441\u0438\u043C\u0443\u043B\u0438\u0440\u0443\u0435\u0442 \u0436\u0438\u0432\u043E\u0435 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0434\u0435\u0432\u0443\u0448\u043A\u0438: \u043E\u043D\u043B\u0430\u0439\u043D/\u043E\u0444\u043B\u0430\u0439\u043D, \u0441\u043E\u043D, \u0437\u0430\u043D\u044F\u0442\u043E\u0441\u0442\u044C, \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u0438\u0435, \u043F\u0430\u043C\u044F\u0442\u044C, \u0441\u0442\u0430\u0434\u0438\u0438 \u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u0439, \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u044B, \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438, \u0440\u0435\u0430\u043A\u0446\u0438\u0438, \u0441\u0442\u0438\u043A\u0435\u0440\u044B, \u043E\u043F\u0435\u0447\u0430\u0442\u043A\u0438 \u0438 \u043F\u0440\u043E\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F. README \u043F\u0440\u044F\u043C\u043E \u043F\u043E\u0434\u0447\u0451\u0440\u043A\u0438\u0432\u0430\u0435\u0442: \u043E\u043D\u0430 \u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043D\u0430 \u043A\u0430\u0436\u0434\u043E\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435, \u0438\u043D\u043E\u0433\u0434\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u0438 \u043C\u043E\u043B\u0447\u0438\u0442 \u2014 \u044D\u0442\u043E \u0437\u0430\u0434\u0443\u043C\u0430\u043D\u043E."
8618
+ },
8619
+ {
8620
+ category: "overview",
8621
+ subcategory: "layers",
8622
+ title: "\u0421\u043B\u043E\u0438\u0441\u0442\u0430\u044F \u0430\u0440\u0445\u0438\u0442\u0435\u043A\u0442\u0443\u0440\u0430",
8623
+ keywords: ["\u0441\u043B\u043E\u0438", "\u0430\u0440\u0445\u0438\u0442\u0435\u043A\u0442\u0443\u0440\u0430", "runtime", "prompt", "behavior", "presence", "memory"],
8624
+ body: "\u041F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u0438\u0437 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0441\u043B\u043E\u0451\u0432: Telegram adapter \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 \u0441\u043E\u0431\u044B\u0442\u0438\u044F; Runtime \u043E\u0440\u043A\u0435\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 state; presence \u0440\u0435\u0448\u0430\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0441\u0442\u044C; behavior-tick \u0432\u044B\u0431\u0438\u0440\u0430\u0435\u0442 intent/delay/reaction; prompt \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442 persona/speech/boundaries/relationship/memory; LLM \u043F\u0438\u0448\u0435\u0442 \u0442\u0435\u043A\u0441\u0442; storage \u0444\u0438\u043A\u0441\u0438\u0440\u0443\u0435\u0442 \u043B\u043E\u0433\u0438, score, memory, agenda. \u041F\u043E\u044D\u0442\u043E\u043C\u0443 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443 \u043D\u0435\u043B\u044C\u0437\u044F \u043E\u0431\u044A\u044F\u0441\u043D\u044F\u0442\u044C \u043E\u0434\u043D\u0438\u043C system prompt \u2014 \u043F\u043E\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043D\u0430\u0434\u043E \u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u043B\u043E\u0439, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0438\u043C\u043F\u0442\u043E\u043C."
8625
+ },
8626
+ {
8627
+ category: "overview",
8628
+ subcategory: "tech-stack",
8629
+ title: "\u0422\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u0430",
8630
+ keywords: ["\u0441\u0442\u0435\u043A", "typescript", "node", "react", "vite", "grammy", "gramjs", "tsup", "rust", "desktop"],
8631
+ body: "Runtime: Node.js >=20, TypeScript strict, ESM. Build: tsup \u0432 dist/cli.js. WebUI: React + Vite. Telegram: grammY \u0434\u043B\u044F bot mode \u0438 GramJS/telegram \u0434\u043B\u044F userbot. LLM: OpenAI-compatible \u0438 Anthropic SDK. Desktop: Rust/iced \u0432 desktop-rs. \u0418\u043C\u043F\u043E\u0440\u0442\u044B TypeScript \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442 .js extension."
8632
+ },
8633
+ {
8634
+ category: "overview",
8635
+ subcategory: "project-structure",
8636
+ title: "\u041A\u0430\u0440\u0442\u0430 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0439",
8637
+ keywords: ["\u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438", "\u0444\u0430\u0439\u043B\u044B", "\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0430", "src", "engine", "webui", "telegram", "storage"],
8638
+ body: "src/engine \u2014 \u044F\u0434\u0440\u043E \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u044F: runtime, presence, behavior-tick, prompt, memory-palace, conflict, agenda, daily-life. src/telegram \u2014 bot/userbot adapters. src/llm \u2014 \u043A\u043B\u0438\u0435\u043D\u0442\u044B \u043F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440\u043E\u0432. src/storage/md.ts \u2014 \u0444\u0430\u0439\u043B\u043E\u0432\u043E\u0435 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043F\u0440\u043E\u0444\u0438\u043B\u0435\u0439. src/webui \u2014 HTTP API, runtime bus, routes. webui/src \u2014 React \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B. src/presets \u2014 stages, llm, communication, mcp."
8639
+ },
8640
+ {
8641
+ category: "overview",
8642
+ subcategory: "commands",
8643
+ title: "\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0430",
8644
+ keywords: ["\u043A\u043E\u043C\u0430\u043D\u0434\u044B", "npm", "build", "typecheck", "dev", "start", "server", "update", "addon"],
8645
+ body: "\u041E\u0441\u043D\u043E\u0432\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B: npm install, npm run dev, npm run build, npm run typecheck, npm run start. CLI: npx girl-agent \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u0442 WebUI; --profile \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u0442 \u043F\u0440\u043E\u0444\u0438\u043B\u044C; server --print-config/--config/--headless \u0434\u043B\u044F \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u0432; update \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442 data-\u043C\u0438\u0433\u0440\u0430\u0446\u0438\u0438; addon init/pack \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0441 .gaa \u0430\u0434\u0434\u043E\u043D\u0430\u043C\u0438."
8646
+ },
8647
+ {
8648
+ category: "storage",
8649
+ subcategory: "data-root",
8650
+ title: "\u0413\u0434\u0435 \u043B\u0435\u0436\u0430\u0442 \u0434\u0430\u043D\u043D\u044B\u0435",
8651
+ keywords: ["data", "GIRL_AGENT_DATA", "\u043F\u0430\u043F\u043A\u0430", "\u043F\u0440\u043E\u0444\u0438\u043B\u0438", "windows", "macos", "linux", "\u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435"],
8652
+ body: "\u041A\u043E\u0440\u0435\u043D\u044C \u043F\u0440\u043E\u0444\u0438\u043B\u0435\u0439 \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 GIRL_AGENT_DATA, \u0438\u043D\u0430\u0447\u0435 \u0432 \u0438\u0441\u0445\u043E\u0434\u043D\u0438\u043A\u0430\u0445 \u044D\u0442\u043E ./data, \u0432 npm/global \u0437\u0430\u043F\u0443\u0441\u043A\u0435 \u2014 XDG data dir, \u043D\u0430 Windows %APPDATA%/girl-agent/data, \u043D\u0430 macOS ~/Library/Application Support/girl-agent/data. \u041A\u0430\u0436\u0434\u044B\u0439 \u043F\u0440\u043E\u0444\u0438\u043B\u044C \u0436\u0438\u0432\u0451\u0442 \u0432 data/<slug>/."
8653
+ },
8654
+ {
8655
+ category: "storage",
8656
+ subcategory: "profile-files",
8657
+ title: "\u0424\u0430\u0439\u043B\u044B \u043F\u0440\u043E\u0444\u0438\u043B\u044F",
8658
+ keywords: ["config.json", "persona.md", "speech.md", "boundaries.md", "communication.md", "relationship.md", "agenda.json"],
8659
+ body: "config.json \u0445\u0440\u0430\u043D\u0438\u0442 ProfileConfig. persona.md \u2014 \u043B\u0438\u0447\u043D\u043E\u0441\u0442\u044C, speech.md \u2014 \u0440\u0435\u0447\u044C, boundaries.md \u2014 \u0433\u0440\u0430\u043D\u0438\u0446\u044B, communication.md \u2014 \u0441\u0442\u0438\u043B\u044C \u043E\u0431\u0449\u0435\u043D\u0438\u044F. relationship.md \u0445\u0440\u0430\u043D\u0438\u0442 stage \u0438 score. agenda.json \u2014 \u0431\u0443\u0434\u0443\u0449\u0438\u0435 \u043F\u0440\u043E\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0435 \u043F\u0438\u043D\u0433\u0438. conflict.json \u2014 \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442 \u0438 coldUntil."
8660
+ },
8661
+ {
8662
+ category: "storage",
8663
+ subcategory: "memory-files",
8664
+ title: "\u0424\u0430\u0439\u043B\u044B \u043F\u0430\u043C\u044F\u0442\u0438",
8665
+ keywords: ["memory", "long-term", "facts", "uncertain", "timeline", "promises", "open-loops"],
8666
+ body: "\u0413\u043B\u0430\u0432\u043D\u044B\u0435 memory-\u0444\u0430\u0439\u043B\u044B: memory/long-term.md, memory/facts.md, memory/uncertain.md, relationship/timeline.md, time/open-loops.md, time/promises.md. \u0415\u0441\u0442\u044C legacy long-term.md. MemoryPage \u0438 assistant \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044E\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u044B\u0439 whitelist \u043F\u0443\u0442\u0435\u0439, \u043F\u043B\u044E\u0441 memory/daily/YYYY-MM-DD.md, memory/episodes/*.md, memory/palace/*."
8667
+ },
8668
+ {
8669
+ category: "storage",
8670
+ subcategory: "logs-and-days",
8671
+ title: "\u041B\u043E\u0433\u0438 \u0438 \u0434\u043D\u0435\u0432\u043D\u044B\u0435 summary",
8672
+ keywords: ["log", "daily", "summary", "session", "\u0434\u043D\u0435\u0432\u043D\u0438\u043A", "\u0434\u0430\u0442\u0430", "05:00"],
8673
+ body: "log/YYYY-MM-DD.md \u2014 \u0441\u0435\u0441\u0441\u0438\u043E\u043D\u043D\u044B\u0435 \u043B\u043E\u0433\u0438. sessionDate \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0435\u043D\u044C \u043F\u043E timezone \u043F\u0440\u043E\u0444\u0438\u043B\u044F; \u0434\u043E 05:00 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u043E\u0442\u043D\u043E\u0441\u044F\u0442\u0441\u044F \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0434\u043D\u044E. memory/daily/YYYY-MM-DD.md \u2014 \u0434\u043D\u0435\u0432\u043D\u044B\u0435 summary \u0434\u043B\u044F \u0434\u043E\u043B\u0433\u043E\u0433\u043E \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u043F\u043E \u043F\u0440\u043E\u0448\u043B\u044B\u043C \u0434\u043D\u044F\u043C."
8674
+ },
8675
+ {
8676
+ category: "config",
8677
+ subcategory: "profile-config",
8678
+ title: "ProfileConfig",
8679
+ keywords: ["ProfileConfig", "config", "slug", "name", "age", "nationality", "tz", "mode"],
8680
+ body: "ProfileConfig \u0432\u043A\u043B\u044E\u0447\u0430\u0435\u0442 slug, name, age, nationality RU/UA, timezone, mode bot/userbot, stage, llm, telegram, mcp, ownerId, privacy, sleepFrom/sleepTo, nightWakeChance, ignoreTendency, vibe, communication, personaNotes \u0438 busySchedule. \u041F\u0440\u0438 \u0447\u0442\u0435\u043D\u0438\u0438 storage \u043D\u043E\u0440\u043C\u0430\u043B\u0438\u0437\u0443\u0435\u0442 ownerId, communication \u0438 ignoreTendency."
8681
+ },
8682
+ {
8683
+ category: "config",
8684
+ subcategory: "sleep-and-schedule",
8685
+ title: "\u0421\u043E\u043D \u0438 \u0437\u0430\u043D\u044F\u0442\u043E\u0441\u0442\u044C",
8686
+ keywords: ["sleepFrom", "sleepTo", "nightWakeChance", "busySchedule", "\u0441\u043E\u043D", "\u0440\u0430\u0441\u043F\u0438\u0441\u0430\u043D\u0438\u0435", "\u0437\u0430\u043D\u044F\u0442\u043E\u0441\u0442\u044C"],
8687
+ body: "sleepFrom/sleepTo \u2014 \u0447\u0430\u0441\u044B \u0441\u043D\u0430 0..23, \u043C\u043E\u0433\u0443\u0442 \u043F\u0435\u0440\u0435\u0441\u0435\u043A\u0430\u0442\u044C \u043F\u043E\u043B\u043D\u043E\u0447\u044C. nightWakeChance \u2014 \u0448\u0430\u043D\u0441 \u043F\u0440\u043E\u0441\u043D\u0443\u0442\u044C\u0441\u044F \u043D\u043E\u0447\u044C\u044E \u0431\u0435\u0437 :wake. busySchedule \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 label, days, from/to \u0438 checkAfterMin; daily-life \u0438 presence \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442 \u0435\u0433\u043E, \u0447\u0442\u043E\u0431\u044B \u043E\u0431\u044A\u044F\u0441\u043D\u044F\u0442\u044C \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438 \u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0441\u0442\u044C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430."
8688
+ },
8689
+ {
8690
+ category: "telegram",
8691
+ subcategory: "bot-mode",
8692
+ title: "Bot mode",
8693
+ keywords: ["bot", "grammy", "Bot API", "\u0442\u043E\u043A\u0435\u043D", "message_reaction", "\u0431\u043E\u0442"],
8694
+ body: "bot mode \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 grammY \u0438 telegram.botToken. \u041F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 message \u0438 message_reaction, \u0443\u043C\u0435\u0435\u0442 sendMessage, typing action, setMessageReaction, editMessageText \u0438 sendSticker. \u041F\u0440\u043E\u0449\u0435 \u0432 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0435, \u043D\u043E \u0432\u044B\u0433\u043B\u044F\u0434\u0438\u0442 \u043A\u0430\u043A \u0431\u043E\u0442 \u0438 \u0438\u043C\u0435\u0435\u0442 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u044F Bot API."
8695
+ },
8696
+ {
8697
+ category: "telegram",
8698
+ subcategory: "userbot-mode",
8699
+ title: "Userbot mode",
8700
+ keywords: ["userbot", "gramjs", "mtproto", "apiId", "apiHash", "sessionString", "\u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0439 \u0430\u043A\u043A\u0430\u0443\u043D\u0442"],
8701
+ body: "userbot mode \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 GramJS/MTProto \u043A\u0430\u043A \u043E\u0431\u044B\u0447\u043D\u044B\u0439 Telegram \u0430\u043A\u043A\u0430\u0443\u043D\u0442. \u041D\u0443\u0436\u043D\u044B apiId/apiHash \u0438 sessionString, \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044B\u0439 \u0447\u0435\u0440\u0435\u0437 \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044E. \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 readHistory, typing, reactions, stickers, block/unblock/reportSpam \u0438 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0443 \u0443\u0434\u0430\u043B\u0451\u043D\u043D\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 raw updates."
8702
+ },
8703
+ {
8704
+ category: "telegram",
8705
+ subcategory: "wss-and-proxy",
8706
+ title: "WSS \u0438 proxy",
8707
+ keywords: ["wss", "useWSS", "proxy", "socks", "\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0438", "443"],
8708
+ body: "telegram.useWSS \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E true \u0438 \u0432\u043A\u043B\u044E\u0447\u0430\u0435\u0442 WebSocket \u0447\u0435\u0440\u0435\u0437 443 \u0432\u043C\u0435\u0441\u0442\u043E TCP 80 \u2014 \u044D\u0442\u043E \u043F\u043E\u043C\u043E\u0433\u0430\u0435\u0442 \u043F\u0440\u0438 \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0430\u0445 Telegram. \u0414\u043B\u044F userbot \u043C\u043E\u0436\u043D\u043E \u0437\u0430\u0434\u0430\u0442\u044C SOCKS proxy \u0432 config \u0438\u043B\u0438 \u0447\u0435\u0440\u0435\u0437 GIRL_AGENT_TG_PROXY."
8709
+ },
8710
+ {
8711
+ category: "telegram",
8712
+ subcategory: "privacy",
8713
+ title: "Privacy \u0438 owner",
8714
+ keywords: ["privacy", "owner", "ownerId", "allow-strangers", "strangers", "\u0447\u0443\u0436\u0438\u0435", "primary"],
8715
+ body: "privacy=owner-only \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E ownerId/primary owner. allow-strangers \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0438\u0435 \u043B\u0438\u0447\u043D\u044B\u0435 \u0447\u0430\u0442\u044B, \u043D\u043E \u0441 relationshipScope=acquaintance: \u0431\u0435\u0437 \u043F\u0430\u043C\u044F\u0442\u0438 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0433\u043E \u043F\u0430\u0440\u043D\u044F, \u0431\u0435\u0437 \u0440\u043E\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u0438 \u0441 \u0433\u0440\u0430\u043D\u0438\u0446\u0430\u043C\u0438, \u0435\u0441\u043B\u0438 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 relationship \u0443\u0436\u0435 committed."
8716
+ },
8717
+ {
8718
+ category: "runtime",
8719
+ subcategory: "runtime-bus",
8720
+ title: "RuntimeBus \u0432 WebUI",
8721
+ keywords: ["runtimebus", "runtime", "start", "stop", "pause", "resume", "restart", "logs"],
8722
+ body: "RuntimeBus \u0434\u0435\u0440\u0436\u0438\u0442 Runtime \u043D\u0430 \u043A\u0430\u0436\u0434\u044B\u0439 \u043F\u0440\u043E\u0444\u0438\u043B\u044C, \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F running/paused/stopped/error \u0438 ring-buffer \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0445 500 \u0441\u043E\u0431\u044B\u0442\u0438\u0439. WebUI \u0447\u0435\u0440\u0435\u0437 \u043D\u0435\u0433\u043E \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442/\u043E\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442 \u043F\u0440\u043E\u0444\u0438\u043B\u0438, \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 status \u0438 recentLogs, \u0430 WebSocket \u0440\u0430\u0437\u0434\u0430\u0451\u0442 \u0441\u043E\u0431\u044B\u0442\u0438\u044F UI."
8723
+ },
8724
+ {
8725
+ category: "runtime",
8726
+ subcategory: "message-flow",
8727
+ title: "\u041F\u0443\u0442\u044C \u0432\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F",
8728
+ keywords: ["handleIncoming", "incoming", "message flow", "\u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435", "\u043E\u0442\u0432\u0435\u0442"],
8729
+ body: "Telegram adapter \u0441\u043E\u0437\u0434\u0430\u0451\u0442 IncomingMessage. Runtime \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E\u0441\u0442\u044C/owner, media, deletion/reaction, \u0438\u0441\u0442\u043E\u0440\u0438\u044E, presence, conflict, active dialog \u0438 behavior-tick. \u0415\u0441\u043B\u0438 shouldReply=false \u2014 \u043B\u043E\u0433\u0438\u0440\u0443\u0435\u0442 ignored/read. \u0415\u0441\u043B\u0438 reply \u2014 scheduleReply \u0441 delay, \u043F\u043E\u0442\u043E\u043C generateAndSend \u0441\u043E\u0431\u0438\u0440\u0430\u0435\u0442 prompt, \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442 LLM, \u0441\u0430\u043D\u0438\u0442\u0430\u0439\u0437\u0438\u0442 \u043E\u0442\u0432\u0435\u0442, \u0440\u0435\u0436\u0435\u0442 \u043D\u0430 bubbles \u0438 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442."
8730
+ },
8731
+ {
8732
+ category: "runtime",
8733
+ subcategory: "behavior-tick",
8734
+ title: "Behavior tick",
8735
+ keywords: ["behavior", "intent", "reply", "ignore", "short", "left-on-read", "reaction-only", "delay", "moodDelta"],
8736
+ body: "behavior-tick \u2014 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0439 decision layer. \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 JSON: intent, shouldReply, shouldRead, delaySec, bubbles, typing, reaction, reactionTargetMessageId, ignoreReason \u0438 moodDelta. \u041E\u043D \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0435\u0442 stage defaults, score, ignoreTendency, presence, conflict, active dialog \u0438 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F."
8737
+ },
8738
+ {
8739
+ category: "runtime",
8740
+ subcategory: "presence",
8741
+ title: "Presence simulation",
8742
+ keywords: ["presence", "online", "offline", "phone-attached", "burst-checker", "rare-checker", "evening-only", "night"],
8743
+ body: "PresenceProfile \u0434\u0435\u0442\u0435\u0440\u043C\u0438\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E \u0432\u044B\u0431\u0438\u0440\u0430\u0435\u0442 pattern: phone-attached, burst-checker, rare-checker, evening-only \u0438\u043B\u0438 phone-attached-night. \u041E\u043D \u0437\u0430\u0434\u0430\u0451\u0442 checkEveryMin, onlineWindowMin, offlineReplyChance \u0438 nightWakeChance. Communication notifications \u0438 stage \u043C\u043E\u0433\u0443\u0442 \u0443\u0441\u043A\u043E\u0440\u044F\u0442\u044C/\u0437\u0430\u043C\u0435\u0434\u043B\u044F\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0441\u0442\u044C."
8744
+ },
8745
+ {
8746
+ category: "runtime",
8747
+ subcategory: "ignore-tendency",
8748
+ title: "ignoreTendency",
8749
+ keywords: ["ignoreTendency", "\u0438\u0433\u043D\u043E\u0440", "\u043C\u043E\u043B\u0447\u0438\u0442", "\u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442", "read", "left-on-read"],
8750
+ body: "ignoreTendency 0..100 \u2014 \u0445\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u043D\u044B\u0439 \u0432\u0435\u0441, \u0430 \u043D\u0435 \u043F\u0440\u044F\u043C\u043E\u0439 \u043F\u0440\u043E\u0446\u0435\u043D\u0442. 0 \u043F\u043E\u0447\u0442\u0438 \u043D\u0435 \u0438\u0433\u043D\u043E\u0440\u0438\u0442 \u0431\u0435\u0437 \u043F\u0440\u0438\u0447\u0438\u043D\u044B, 35 \u0434\u0435\u0444\u043E\u043B\u0442, 70+ \u0441\u0443\u0445\u0430\u044F \u0438 \u0447\u0430\u0441\u0442\u043E \u043F\u0440\u043E\u043F\u0430\u0434\u0430\u0435\u0442. \u0421\u043E\u043D, busy, \u0441\u0442\u0430\u0434\u0438\u044F, \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442 \u0438 score \u0441\u0438\u043B\u044C\u043D\u0435\u0435. \u041F\u0440\u0438 \u0436\u0430\u043B\u043E\u0431\u0435 '\u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442' \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0439 runtime state, recent logs, sleep/busy/conflict/stage/score."
8751
+ },
8752
+ {
8753
+ category: "runtime",
8754
+ subcategory: "active-dialog",
8755
+ title: "\u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0434\u0438\u0430\u043B\u043E\u0433",
8756
+ keywords: ["\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0434\u0438\u0430\u043B\u043E\u0433", "activeDialog", "\u0431\u0443\u0440\u0441\u0442", "\u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u043E\u0442\u0432\u0435\u0442", "\u043D\u0435 \u043F\u0440\u043E\u043F\u0430\u0434\u0430\u0435\u0442"],
8757
+ body: "\u0415\u0441\u043B\u0438 \u043E\u043D\u0430 \u0443\u0436\u0435 \u043D\u0435\u0434\u0430\u0432\u043D\u043E \u043E\u0442\u0432\u0435\u0442\u0438\u043B\u0430, \u0430 \u043E\u043D \u043D\u0430\u043F\u0438\u0441\u0430\u043B \u0432 \u0442\u0435\u0447\u0435\u043D\u0438\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u043C\u0438\u043D\u0443\u0442, Runtime \u043F\u043E\u043C\u0435\u0447\u0430\u0435\u0442 activeDialog. Behavior-layer \u0434\u043E\u043B\u0436\u0435\u043D \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0442\u044C \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0443 \u0438 \u043D\u0435 \u0443\u0445\u043E\u0434\u0438\u0442\u044C \u0432 \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u0439 \u0438\u0433\u043D\u043E\u0440 \u0431\u0435\u0437 \u0432\u0435\u0441\u043A\u043E\u0439 \u043F\u0440\u0438\u0447\u0438\u043D\u044B. \u042D\u0442\u043E \u0434\u0435\u043B\u0430\u0435\u0442 \u0434\u0438\u0430\u043B\u043E\u0433 \u043F\u043E\u0445\u043E\u0436\u0438\u043C \u043D\u0430 \u0440\u0435\u0430\u043B\u044C\u043D\u0443\u044E \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u043A\u0443, \u0430 \u043D\u0435 \u043D\u0430 \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0435 \u0437\u0430\u043F\u0440\u043E\u0441\u044B."
8758
+ },
8759
+ {
8760
+ category: "runtime",
8761
+ subcategory: "bubbles",
8762
+ title: "\u041F\u0443\u0437\u044B\u0440\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439",
8763
+ keywords: ["bubbles", "\u043F\u0443\u0437\u044B\u0440\u044C", "split", "---", "\u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F", "\u0434\u0440\u043E\u0431\u0438\u0442\u044C"],
8764
+ body: "LLM \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0435: \u0435\u0441\u043B\u0438 bubbles > 1, \u0440\u0430\u0437\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u043E\u0439 '---'. smartSplitBubbles \u0438 dedupeBubbles \u043F\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044E\u0442 \u043E\u0442\u0432\u0435\u0442 \u0432 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0435 TG-\u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F. \u041F\u0435\u0440\u0435\u043D\u043E\u0441\u044B \u0441\u0442\u0440\u043E\u043A \u0431\u0435\u0437 '---' \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D\u044B, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0432 Telegram \u044D\u0442\u043E \u043E\u0434\u043D\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0441\u0442\u043E\u043B\u0431\u0438\u043A\u043E\u043C \u0438 \u043F\u0430\u043B\u0438\u0442 \u0418\u0418."
8765
+ },
8766
+ {
8767
+ category: "runtime",
8768
+ subcategory: "typing-and-delays",
8769
+ title: "Typing \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438",
8770
+ keywords: ["typing", "delay", "\u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0430", "\u043F\u0435\u0447\u0430\u0442\u0430\u0435\u0442", "scheduleReply", "sendBubbles"],
8771
+ body: "delaySec \u043F\u0440\u0438\u0445\u043E\u0434\u0438\u0442 \u0438\u0437 behavior-tick \u0438 \u043C\u043E\u0436\u0435\u0442 \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u0438\u0437-\u0437\u0430 offline/busy. scheduleReply \u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0430\u0439\u043C\u0435\u0440. sendBubbles \u0438\u043C\u0438\u0442\u0438\u0440\u0443\u0435\u0442 typing: \u043F\u0435\u0440\u0435\u0434 \u043F\u0435\u0440\u0432\u044B\u043C \u043F\u0443\u0437\u044B\u0440\u0451\u043C \u043A\u043E\u0440\u043E\u0442\u043A\u0430\u044F \u043F\u0430\u0443\u0437\u0430, \u043C\u0435\u0436\u0434\u0443 \u043F\u0443\u0437\u044B\u0440\u044F\u043C\u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0430 \u043F\u043E \u0434\u043B\u0438\u043D\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u0438 WPM. \u0415\u0441\u043B\u0438 userbot \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D, \u043F\u0435\u0440\u0435\u0434 \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u043E\u0439 \u043C\u043E\u0436\u0435\u0442 readHistory."
8772
+ },
8773
+ {
8774
+ category: "runtime",
8775
+ subcategory: "anti-ai",
8776
+ title: "Anti-AI \u0438 \u0441\u0430\u043D\u0438\u0442\u0430\u0439\u0437\u0438\u043D\u0433",
8777
+ keywords: ["anti-ai", "sanitize", "markdown", "jailbreak", "system prompt", "chatgpt", "\u0442\u0435\u0445\u043D\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430"],
8778
+ body: "ANTI_AI_RULES \u0437\u0430\u043F\u0440\u0435\u0449\u0430\u044E\u0442 ChatGPT-\u043F\u043E\u0432\u0430\u0434\u043A\u0438, markdown \u0438 \u043C\u0435\u0442\u0430-\u0444\u0440\u0430\u0437\u044B. security.ts \u0432\u044B\u0447\u0438\u0449\u0430\u0435\u0442 code fences, action leak narration, system/developer labels, CJK \u043C\u0443\u0441\u043E\u0440 \u0438 technical error replies. Jailbreak-\u043F\u043E\u0434\u043E\u0431\u043D\u044B\u0435 \u0434\u043B\u0438\u043D\u043D\u044B\u0435 \u043E\u0442\u0432\u0435\u0442\u044B \u043E\u0442\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u044E\u0442\u0441\u044F; \u043F\u0440\u0438 \u0442\u0435\u0445\u043D\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043E\u0448\u0438\u0431\u043A\u0430\u0445 Runtime \u0443\u0445\u043E\u0434\u0438\u0442 \u0432 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u044B\u0439 fallback/ignored."
8779
+ },
8780
+ {
8781
+ category: "runtime",
8782
+ subcategory: "media",
8783
+ title: "\u041C\u0435\u0434\u0438\u0430",
8784
+ keywords: ["media", "photo", "voice", "video", "video_note", "sticker", "document", "\u0444\u043E\u0442\u043E", "\u0433\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0435"],
8785
+ body: "IncomingMedia \u043E\u043F\u0438\u0441\u044B\u0432\u0430\u0435\u0442 \u0444\u043E\u0442\u043E, \u0432\u0438\u0434\u0435\u043E, \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u043E\u0435, \u043A\u0440\u0443\u0436\u043E\u043A, \u0441\u0442\u0438\u043A\u0435\u0440 \u0438\u043B\u0438 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442. \u0424\u043E\u0442\u043E \u0441 base64 \u043F\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044F LLM \u043A\u0430\u043A image part, \u0435\u0441\u043B\u0438 \u043F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442. \u041D\u0430 \u0433\u043E\u043B\u043E\u0441\u043E\u0432\u044B\u0435 \u0431\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u043A\u0438 \u043F\u0435\u0440\u0441\u043E\u043D\u0430 \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u043F\u0440\u043E\u0441\u0438\u0442\u044C \u0442\u0435\u043A\u0441\u0442\u043E\u043C. \u041D\u0430 \u0438\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u0435 \u043F\u0440\u043E\u0441\u044C\u0431\u044B \u0444\u043E\u0442\u043E/\u0432\u0438\u0434\u0435\u043E/voice Runtime \u0447\u0430\u0449\u0435 \u0434\u0430\u0451\u0442 \u043E\u0442\u043A\u0430\u0437 \u0432\u0440\u043E\u0434\u0435 '\u043D\u0435 \u0445\u043E\u0447\u0443 \u0444\u043E\u0442\u043A\u0430\u0442\u044C\u0441\u044F \u0449\u0430'."
8786
+ },
8787
+ {
8788
+ category: "runtime",
8789
+ subcategory: "deleted-messages",
8790
+ title: "\u0423\u0434\u0430\u043B\u0451\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F",
8791
+ keywords: ["\u0443\u0434\u0430\u043B\u0438\u043B", "deleted", "delete", "saw-and-read", "saw-not-read", "missed"],
8792
+ body: "deletion-handler \u043A\u043B\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435: saw-and-read \u2014 \u043E\u043D\u0430 \u0443\u0436\u0435 \u043F\u0440\u043E\u0447\u043B\u0430 \u0438 \u043C\u043E\u0436\u0435\u0442 \u0441\u043A\u0430\u0437\u0430\u0442\u044C '\u043F\u043E\u0437\u0434\u043D\u043E, \u044F \u0432\u0438\u0434\u0435\u043B\u0430'; saw-not-read \u2014 \u0432\u0438\u0434\u0435\u043B\u0430 \u0444\u0430\u043A\u0442 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F, \u043D\u043E \u043D\u0435 \u043F\u0440\u043E\u0447\u043B\u0430 \u0438 \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u043F\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C; missed \u2014 \u043D\u0435 \u0437\u0430\u043C\u0435\u0442\u0438\u043B\u0430 \u0438 \u043C\u043E\u043B\u0447\u0438\u0442. Userbot \u043A\u044D\u0448\u0438\u0440\u0443\u0435\u0442 \u0432\u0445\u043E\u0434\u044F\u0449\u0438\u0435, \u0447\u0442\u043E\u0431\u044B \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u043F\u043E raw update."
8793
+ },
8794
+ {
8795
+ category: "runtime",
8796
+ subcategory: "emoji-reactions",
8797
+ title: "\u0420\u0435\u0430\u043A\u0446\u0438\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F",
8798
+ keywords: ["emoji", "reaction", "\u0440\u0435\u0430\u043A\u0446\u0438\u044F", "\u0442\u043E\u043A\u0441\u0438\u0447\u043D\u0430\u044F", "positive", "react-back", "silent-mood"],
8799
+ body: "emoji-reaction-handler \u0434\u0435\u043B\u0438\u0442 \u0440\u0435\u0430\u043A\u0446\u0438\u0438 \u043D\u0430 toxic, positive, funny, sad, neutral. \u0422\u043E\u043A\u0441\u0438\u0447\u043D\u044B\u0435 \u044D\u043C\u043E\u0434\u0437\u0438 \u043D\u0430 \u0435\u0451 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043E\u0431\u044B\u0447\u043D\u043E \u043C\u043E\u043B\u0447\u0430 \u0443\u0445\u0443\u0434\u0448\u0430\u044E\u0442 mood; \u043D\u043E \u0435\u0441\u043B\u0438 \u044D\u043C\u043E\u0434\u0437\u0438 \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0441\u044F \u043A \u0432\u043D\u0435\u0448\u043D\u0435\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0438\u0437 \u0435\u0451 \u0442\u0435\u043A\u0441\u0442\u0430, annoyance \u043D\u0435 \u0440\u0430\u0441\u0442\u0451\u0442. Positive \u0438\u043D\u043E\u0433\u0434\u0430 react-back/\u043A\u043E\u0440\u043E\u0442\u043A\u0438\u0439 \u0442\u0435\u043A\u0441\u0442, \u043D\u043E \u0447\u0430\u0449\u0435 \u043C\u043E\u043B\u0447\u0430. \u0421\u043D\u044F\u0442\u0438\u0435 \u0440\u0435\u0430\u043A\u0446\u0438\u0438 \u043E\u0431\u044B\u0447\u043D\u043E \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F."
8800
+ },
8801
+ {
8802
+ category: "runtime",
8803
+ subcategory: "typos",
8804
+ title: "\u0420\u0435\u0430\u043B\u0438\u0441\u0442\u0438\u0447\u043D\u044B\u0435 \u043E\u043F\u0435\u0447\u0430\u0442\u043A\u0438",
8805
+ keywords: ["typos", "\u043E\u043F\u0435\u0447\u0430\u0442\u043A\u0438", "\u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430", "qwerty", "\u0439\u0446\u0443\u043A\u0435\u043D", "\u043E\u0448\u0438\u0431\u043A\u0438"],
8806
+ body: "typos.ts \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u043F\u0435\u0447\u0430\u0442\u043A\u0438 \u043F\u043E\u0441\u043B\u0435 LLM, \u0447\u0442\u043E\u0431\u044B \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043B\u043E\u0442\u043D\u043E\u0441\u0442\u044C. \u0422\u0438\u043F\u044B: \u0441\u043E\u0441\u0435\u0434\u043D\u044F\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0430, \u043F\u0440\u043E\u043F\u0443\u0441\u043A, \u0434\u0443\u0431\u043B\u044C, \u043F\u0435\u0440\u0435\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0441\u043E\u0441\u0435\u0434\u043D\u0438\u0445 \u0431\u0443\u043A\u0432, \u0440\u0435\u0434\u043A\u0430\u044F \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0430\u044F \u0440\u0430\u0441\u043A\u043B\u0430\u0434\u043A\u0430 RU/EN. \u041D\u0435 \u043B\u043E\u043C\u0430\u0435\u0442 \u043A\u043E\u0440\u043E\u0442\u043A\u0438\u0435 \u0441\u043B\u043E\u0432\u0430, \u0441\u0441\u044B\u043B\u043A\u0438, \u0441\u043C\u0430\u0439\u043B\u044B \u0438 \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u044E. \u0418\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E\u0441\u0442\u044C \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 communication messageStyle \u0438 vibe."
8807
+ },
8808
+ {
8809
+ category: "relationship",
8810
+ subcategory: "stages",
8811
+ title: "\u0421\u0442\u0430\u0434\u0438\u0438 \u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u0439",
8812
+ keywords: ["stage", "\u0441\u0442\u0430\u0434\u0438\u044F", "\u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u044F", "\u043C\u0435\u0442", "cold", "warming", "dating", "long-term", "dumped"],
8813
+ body: "\u0421\u0442\u0430\u0434\u0438\u044F \u0437\u0430\u0434\u0430\u0451\u0442 \u0431\u043B\u0438\u0437\u043E\u0441\u0442\u044C, \u0442\u043E\u043D, \u0448\u0430\u043D\u0441 \u0438\u0433\u043D\u043E\u0440\u0430 \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438. \u041E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u043F\u043E\u0440\u044F\u0434\u043E\u043A: met-irl-got-tg \u2192 tg-given-cold \u2192 tg-given-warming \u2192 convinced \u2192 first-date-done \u2192 dating-early \u2192 dating-stable \u2192 long-term. dumped \u2014 \u0441\u043B\u0443\u0436\u0435\u0431\u043D\u0430\u044F \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0441\u0442\u0430\u0434\u0438\u044F \u0441 \u043F\u043E\u043B\u043D\u044B\u043C \u0438\u0433\u043D\u043E\u0440\u043E\u043C."
8814
+ },
8815
+ {
8816
+ category: "relationship",
8817
+ subcategory: "score",
8818
+ title: "Score \u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u0439",
8819
+ keywords: ["score", "interest", "trust", "attraction", "annoyance", "cringe", "\u043C\u0435\u0442\u0440\u0438\u043A\u0438"],
8820
+ body: "RelationshipScore: interest \u2014 \u0438\u043D\u0442\u0435\u0440\u0435\u0441, trust \u2014 \u0434\u043E\u0432\u0435\u0440\u0438\u0435, attraction \u2014 \u0440\u043E\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435/\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u043F\u0440\u0438\u0442\u044F\u0436\u0435\u043D\u0438\u0435, annoyance \u2014 \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0435\u043D\u0438\u0435, cringe \u2014 \u043D\u0430\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043E\u043D \u043A\u0440\u0438\u043D\u0436\u0443\u0435\u0442/\u0434\u0430\u0432\u0438\u0442. Score \u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437 moodDelta \u0438 reflection, \u0432\u043B\u0438\u044F\u0435\u0442 \u043D\u0430 conflict, stage transitions, stressLoad \u0433\u043E\u0440\u043C\u043E\u043D\u043E\u0432, ignore \u0438 \u0442\u043E\u043D."
8821
+ },
8822
+ {
8823
+ category: "relationship",
8824
+ subcategory: "stage-transitions",
8825
+ title: "\u0410\u0432\u0442\u043E\u0441\u043C\u0435\u043D\u0430 \u0441\u0442\u0430\u0434\u0438\u0439",
8826
+ keywords: ["stage transition", "\u0430\u0432\u0442\u043E\u0441\u043C\u0435\u043D\u0430", "\u043F\u043E\u0432\u044B\u0441\u0438\u0442\u044C", "\u043F\u043E\u043D\u0438\u0437\u0438\u0442\u044C", "\u0440\u0435\u0433\u0440\u0435\u0441\u0441", "upgrade", "downgrade"],
8827
+ body: "decideStageTransition \u043D\u0435 \u0440\u0430\u043D\u0434\u043E\u043C\u043D\u044B\u0439: \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442 downgrade, \u043F\u043E\u0442\u043E\u043C upgrade. \u0414\u043B\u044F upgrade \u043D\u0443\u0436\u043D\u043E \u043C\u0438\u043D\u0438\u043C\u0443\u043C 6 \u0435\u0451 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438, \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0435 score \u0438 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430. Downgrade \u0441\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0435\u0442 \u043F\u0440\u0438 \u0432\u044B\u0441\u043E\u043A\u043E\u043C annoyance, \u043D\u0438\u0437\u043A\u0438\u0445 interest/trust \u0438\u043B\u0438 \u0431\u043E\u043B\u044C\u0448\u043E\u043C \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0433\u043D\u043E\u0440\u043E\u0432 \u043D\u0430 \u0442\u0451\u043F\u043B\u043E\u0439 \u0441\u0442\u0430\u0434\u0438\u0438. dumped \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043D\u0435 \u043F\u043E\u0432\u044B\u0448\u0430\u0435\u0442\u0441\u044F."
8828
+ },
8829
+ {
8830
+ category: "relationship",
8831
+ subcategory: "dumped",
8832
+ title: "dumped",
8833
+ keywords: ["dumped", "\u043E\u0442\u0448\u0438\u043B\u0430", "\u0440\u0430\u0437\u0440\u044B\u0432", "\u0441\u0431\u0440\u043E\u0441", "reset", "\u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442"],
8834
+ body: "dumped \u2014 \u0441\u043B\u0443\u0436\u0435\u0431\u043D\u0430\u044F \u0441\u0442\u0430\u0434\u0438\u044F '\u043E\u0442\u0448\u0438\u043B\u0430': ignoreChance=1.0 \u0438 \u043E\u0433\u0440\u043E\u043C\u043D\u044B\u0435 delays. Runtime \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C dumped \u043F\u0440\u0438 annoyance > 80 \u0438 interest < -30. \u0412\u044B\u0445\u043E\u0434 \u2014 :reset \u0438\u043B\u0438 \u0440\u0443\u0447\u043D\u043E\u0439 set_stage. reset \u0447\u0438\u0441\u0442\u0438\u0442 score, long-term memory, conflict \u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0437 dumped \u0432 tg-given-cold."
8835
+ },
8836
+ {
8837
+ category: "relationship",
8838
+ subcategory: "timeline",
8839
+ title: "relationship/timeline.md",
8840
+ keywords: ["timeline", "\u0438\u0441\u0442\u043E\u0440\u0438\u044F \u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u0439", "relationship", "\u0441\u0442\u0430\u0434\u0438\u044F \u0438\u0437\u043C\u0435\u043D\u0438\u043B\u0430\u0441\u044C"],
8841
+ body: "maybeAdvanceRelationshipTimeline \u043F\u0440\u0438 \u0441\u043C\u0435\u043D\u0435 \u0441\u0442\u0430\u0434\u0438\u0438 \u043C\u0438\u0433\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0443\u044E \u043F\u0430\u043C\u044F\u0442\u044C \u0432 Memory Palace \u0438 \u043F\u0438\u0448\u0435\u0442 \u0432 relationship/timeline.md \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u0438\u0434\u0430 '\u0441\u0442\u0430\u0434\u0438\u044F \u0438\u0437\u043C\u0435\u043D\u0438\u043B\u0430\u0441\u044C previous \u2192 next'. \u042D\u0442\u043E \u0432\u0430\u0436\u043D\u043E \u0434\u043B\u044F \u043E\u0442\u0432\u0435\u0442\u0430 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430 \u043E \u0442\u043E\u043C, \u043A\u0430\u043A \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043B\u0438\u0441\u044C \u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u044F."
8842
+ },
8843
+ {
8844
+ category: "conflict",
8845
+ subcategory: "levels",
8846
+ title: "\u0423\u0440\u043E\u0432\u043D\u0438 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430",
8847
+ keywords: ["conflict", "\u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442", "coldUntil", "\u043E\u0431\u0438\u0434\u0430", "level", "\u043C\u043E\u043B\u0447\u0438\u0442"],
8848
+ body: "conflict.json \u0445\u0440\u0430\u043D\u0438\u0442 level 0..4, reason, since, coldUntil \u0438 history. level 1 \u2014 \u043B\u0451\u0433\u043A\u0430\u044F \u043E\u0431\u0438\u0434\u0430 \u043D\u0430 \u0447\u0430\u0441, 2 \u2014 \u043E\u0431\u0438\u0436\u0435\u043D\u0430 \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0447\u0430\u0441\u043E\u0432/\u0441\u0443\u0442\u043A\u0438, 3 \u2014 \u0441\u0435\u0440\u044C\u0451\u0437\u043D\u044B\u0439 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442 \u043D\u0430 \u0434\u043D\u0438, 4 \u2014 \u043D\u0430 \u0433\u0440\u0430\u043D\u0438 \u0440\u0430\u0437\u0440\u044B\u0432\u0430. \u041F\u043E\u043A\u0430 coldUntil \u0430\u043A\u0442\u0438\u0432\u0435\u043D, behavior \u043F\u043E\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 ignore \u0438\u043B\u0438 \u0441\u0443\u0445\u043E\u0439 short."
8849
+ },
8850
+ {
8851
+ category: "conflict",
8852
+ subcategory: "escalation",
8853
+ title: "\u042D\u0441\u043A\u0430\u043B\u0430\u0446\u0438\u044F \u0438 \u043F\u0440\u0438\u043C\u0438\u0440\u0435\u043D\u0438\u0435",
8854
+ keywords: ["escalate", "soften", "annoyance", "cringe", "interestDrop", "\u043F\u043E\u043C\u0438\u0440\u0438\u0442\u044C\u0441\u044F"],
8855
+ body: "escalateFromMood \u0441\u043C\u043E\u0442\u0440\u0438\u0442 \u043D\u0430 delta annoyance/cringe/interestDrop \u0438 \u0442\u0435\u043A\u0443\u0449\u0438\u0439 score. trigger >= 8 \u0434\u0430\u0451\u0442 \u043B\u0451\u0433\u043A\u0443\u044E \u043E\u0431\u0438\u0434\u0443, >=15 \u2014 \u0441\u0435\u0440\u044C\u0451\u0437\u043D\u0435\u0435, >=25 \u0438\u043B\u0438 annoyance >70 \u2014 level 3. annoyance >85 + cringe >70 + interest < -30 \u0432\u0435\u0434\u0451\u0442 \u043A level 4. softenFromMood \u0441\u043D\u0438\u0436\u0430\u0435\u0442 level, \u0435\u0441\u043B\u0438 positive delta attraction+trust+interest >=12."
8856
+ },
8857
+ {
8858
+ category: "memory",
8859
+ subcategory: "memory-palace",
8860
+ title: "Memory Palace",
8861
+ keywords: ["memory palace", "mempalace", "palace", "hall", "drawer", "\u043F\u0430\u043C\u044F\u0442\u044C", "\u0434\u0432\u043E\u0440\u0435\u0446"],
8862
+ body: "Memory Palace \u2014 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043D\u0430\u044F \u043F\u0430\u043C\u044F\u0442\u044C \u0432 memory/palace. \u041E\u043D\u0430 \u0440\u0430\u0437\u0431\u0438\u0442\u0430 \u043D\u0430 halls \u0438 drawers, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043A\u0430\u0442\u044C \u043F\u043E \u0432\u0445\u043E\u0434\u044F\u0449\u0435\u043C\u0443 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044E \u0438 \u043F\u043E\u0434\u043C\u0435\u0448\u0438\u0432\u0430\u0442\u044C \u0432 prompt. \u042D\u0442\u043E \u043D\u0435 \u0432\u0435\u043A\u0442\u043E\u0440\u043D\u0430\u044F \u0411\u0414: \u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u043E\u0432\u043E\u0435, \u0432\u044B\u0431\u043E\u0440 \u0440\u0435\u043B\u0435\u0432\u0430\u043D\u0442\u043D\u043E\u0433\u043E \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \u043B\u0451\u0433\u043A\u0438\u0439 \u0438 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0439."
8863
+ },
8864
+ {
8865
+ category: "memory",
8866
+ subcategory: "halls",
8867
+ title: "\u0417\u0430\u043B\u044B Memory Palace",
8868
+ keywords: ["hall_facts", "hall_events", "hall_discoveries", "hall_preferences", "hall_advice", "hall_promises", "hall_open_loops", "hall_feelings", "hall_uncertain"],
8869
+ body: "\u0417\u0430\u043B\u044B: hall_facts \u2014 \u0444\u0430\u043A\u0442\u044B; hall_events \u2014 \u0441\u043E\u0431\u044B\u0442\u0438\u044F; hall_discoveries \u2014 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u044F \u043E \u043D\u0451\u043C/\u043D\u0435\u0439; hall_preferences \u2014 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0435\u043D\u0438\u044F; hall_advice \u2014 \u0441\u043E\u0432\u0435\u0442\u044B; hall_promises \u2014 \u043E\u0431\u0435\u0449\u0430\u043D\u0438\u044F; hall_open_loops \u2014 \u043D\u0435\u0437\u0430\u043A\u0440\u044B\u0442\u044B\u0435 \u0442\u0435\u043C\u044B; hall_feelings \u2014 \u0447\u0443\u0432\u0441\u0442\u0432\u0430; hall_uncertain \u2014 \u0441\u043E\u043C\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0435/\u043D\u0435\u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043D\u043D\u043E\u0435."
8870
+ },
8871
+ {
8872
+ category: "memory",
8873
+ subcategory: "recording",
8874
+ title: "\u0417\u0430\u043F\u0438\u0441\u044C \u043F\u0430\u043C\u044F\u0442\u0438",
8875
+ keywords: ["recordInteractionMemory", "maybeReflect", "memory", "reflect", "interaction"],
8876
+ body: "\u041F\u043E\u0441\u043B\u0435 primary interaction Runtime \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442 recordInteractionMemory. \u041A\u0430\u0436\u0434\u044B\u0435 ~6 turns maybeReflect \u043C\u043E\u0436\u0435\u0442 \u0434\u043E\u043F\u0438\u0441\u0430\u0442\u044C \u043E\u0441\u043C\u044B\u0441\u043B\u0435\u043D\u0438\u0435 \u0432 \u0434\u043E\u043B\u0433\u0443\u044E \u043F\u0430\u043C\u044F\u0442\u044C \u0441 \u0443\u0447\u0451\u0442\u043E\u043C conflict. \u0414\u043B\u044F agenda \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u0431\u0443\u0434\u0443\u0449\u0438\u0435 \u0441\u043E\u0431\u044B\u0442\u0438\u044F \u0438\u0437 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439; \u0434\u043B\u044F daily summaries \u2014 \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435 stale/current sessions."
8877
+ },
8878
+ {
8879
+ category: "memory",
8880
+ subcategory: "retrieval",
8881
+ title: "\u0414\u043E\u0441\u0442\u0430\u0432\u0430\u043D\u0438\u0435 \u043F\u0430\u043C\u044F\u0442\u0438 \u0432 prompt",
8882
+ keywords: ["retrieval", "searchDailySummaries", "loadMemoryPalaceContext", "recall", "prompt"],
8883
+ body: "buildSystemPrompt \u0447\u0438\u0442\u0430\u0435\u0442 persona/speech/communication/relationship, legacy memory \u0438 \u043F\u0440\u0438 incoming \u0438\u0449\u0435\u0442 daily summaries. Runtime \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u0451\u0442 loadRealismContext=loadMemoryPalaceContext, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442 \u0440\u0435\u043B\u0435\u0432\u0430\u043D\u0442\u043D\u044B\u0435 palace drawers. \u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043E\u043B\u0436\u043D\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043F\u0430\u043C\u044F\u0442\u044C \u043A\u0430\u043A \u0444\u043E\u043D, \u043D\u0435 \u0446\u0438\u0442\u0438\u0440\u0443\u044F '\u0432 \u043B\u043E\u0433\u0435 \u043D\u0430\u043F\u0438\u0441\u0430\u043D\u043E'."
8884
+ },
8885
+ {
8886
+ category: "life",
8887
+ subcategory: "daily-life",
8888
+ title: "Daily-life",
8889
+ keywords: ["daily-life", "\u0436\u0438\u0437\u043D\u044C", "\u0434\u0435\u043D\u044C", "blocks", "events", "wants", "weather", "\u0440\u0430\u0441\u043F\u0438\u0441\u0430\u043D\u0438\u0435"],
8890
+ body: "daily-life \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043E\u0434\u0438\u043D \u0434\u0435\u043D\u044C \u0436\u0438\u0437\u043D\u0438: weather, vibe, blocks \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u0438, events \u0438 wants. \u041A\u044D\u0448 \u0445\u0440\u0430\u043D\u0438\u0442\u0441\u044F \u0432 data/<slug>/daily-life/YYYY-MM-DD.md. \u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0435\u0442 persona, \u0432\u043E\u0437\u0440\u0430\u0441\u0442, stage, timezone, sleep \u0438 busySchedule, \u0430 conflict \u0434\u0435\u043B\u0430\u0435\u0442 \u0434\u0435\u043D\u044C \u0442\u044F\u0436\u0435\u043B\u0435\u0435."
8891
+ },
8892
+ {
8893
+ category: "life",
8894
+ subcategory: "age-context",
8895
+ title: "\u0412\u043E\u0437\u0440\u0430\u0441\u0442 \u0438 \u0443\u0447\u0451\u0431\u0430",
8896
+ keywords: ["\u0432\u043E\u0437\u0440\u0430\u0441\u0442", "\u0448\u043A\u043E\u043B\u0430", "\u0443\u043D\u0438\u0432\u0435\u0440", "\u043A\u043E\u043B\u043B\u0435\u0434\u0436", "\u043F\u0430\u0440\u044B", "\u0443\u0440\u043E\u043A\u0438"],
8897
+ body: "prompt.ts \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0438\u0440\u0443\u0435\u0442 \u0443\u0447\u0435\u0431\u043D\u044B\u0439 \u044F\u0437\u044B\u043A. \u0414\u043E 17 \u043B\u0435\u0442 \u043E\u043D\u0430 \u0448\u043A\u043E\u043B\u044C\u043D\u0438\u0446\u0430: '\u0443\u0440\u043E\u043A', '\u0448\u043A\u043E\u043B\u0430', '\u043F\u0435\u0440\u0435\u043C\u0435\u043D\u0430', '\u0434\u043E\u043C\u0430\u0448\u043A\u0430', \u043D\u0435 '\u043F\u0430\u0440\u044B/\u0443\u043D\u0438\u0432\u0435\u0440/\u043B\u0435\u043A\u0446\u0438\u044F'. \u0412 17-22 \u043C\u043E\u0436\u043D\u043E \u043A\u043E\u043B\u043B\u0435\u0434\u0436/\u0443\u043D\u0438\u0432\u0435\u0440, \u0435\u0441\u043B\u0438 persona \u044D\u0442\u043E \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442. Daily-life \u0442\u043E\u0436\u0435 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0435\u0442 \u044D\u0442\u043E \u0432 blocks."
8898
+ },
8899
+ {
8900
+ category: "life",
8901
+ subcategory: "agenda",
8902
+ title: "\u041F\u0440\u043E\u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F agenda",
8903
+ keywords: ["agenda", "\u043F\u0440\u043E\u0430\u043A\u0442\u0438\u0432", "\u0441\u0430\u043C\u0430 \u043F\u0438\u0448\u0435\u0442", "\u043F\u0438\u043D\u0433", "\u043D\u0430\u043F\u043E\u043C\u043D\u0438\u0442\u044C", "\u0441\u043E\u0431\u044B\u0442\u0438\u0435"],
8904
+ body: "Agenda engine \u0434\u0435\u043B\u0430\u0435\u0442 mental notes \u043E \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0441\u043E\u0431\u044B\u0442\u0438\u044F\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0438 \u043F\u043E\u0432\u043E\u0434\u0430\u0445 \u043D\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0441\u0430\u043C\u043E\u0439. extractAgendaUpdates \u0441\u043E\u0437\u0434\u0430\u0451\u0442/update/cancel items \u043F\u043E\u0441\u043B\u0435 \u0435\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439; tickAgenda \u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E \u0440\u0430\u0437 \u0432 \u043C\u0438\u043D\u0443\u0442\u0443 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442 due items; handleResponseToProactive \u043F\u043E\u043D\u0438\u043C\u0430\u0435\u0442 \u0435\u0433\u043E \u0440\u0435\u0430\u043A\u0446\u0438\u044E. \u041D\u0430 cold \u0441\u0442\u0430\u0434\u0438\u044F\u0445 agenda \u043F\u043E\u0447\u0442\u0438 \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u0451\u0442."
8905
+ },
8906
+ {
8907
+ category: "life",
8908
+ subcategory: "autonomous-agenda",
8909
+ title: "\u0410\u0432\u0442\u043E\u043D\u043E\u043C\u043D\u044B\u0435 \u043F\u0438\u043D\u0433\u0438",
8910
+ keywords: ["autonomous", "\u0441\u0430\u043C\u043E\u0441\u0442\u043E\u044F\u0442\u0435\u043B\u044C\u043D\u043E", "\u043F\u0435\u0440\u0432\u043E\u0439", "initiative", "lifeSharing", "\u043F\u0438\u0448\u0435\u0442 \u0441\u0430\u043C\u0430"],
8911
+ body: "ensureAutonomousAgenda \u043C\u043E\u0436\u0435\u0442 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u0441\u0430\u043C\u043E\u0441\u0442\u043E\u044F\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u043E\u0432\u043E\u0434\u044B \u043D\u0430\u043F\u0438\u0441\u0430\u0442\u044C, \u043D\u0435 \u043F\u0440\u0438\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435 \u043A \u0435\u0433\u043E \u044F\u0432\u043D\u043E\u043C\u0443 \u0431\u0443\u0434\u0443\u0449\u0435\u043C\u0443 \u0441\u043E\u0431\u044B\u0442\u0438\u044E. \u042D\u0442\u043E \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 stage, communication initiative/lifeSharing, conflict \u0438 \u0434\u043D\u0435\u0432\u043D\u043E\u0433\u043E \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430. Runtime \u043D\u0435 \u0441\u043F\u0430\u043C\u0438\u0442: \u043F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 due item \u0437\u0430 \u0442\u0438\u043A \u0438 \u043D\u0435 \u043B\u0435\u0437\u0435\u0442, \u0435\u0441\u043B\u0438 \u043D\u0435\u0434\u0430\u0432\u043D\u043E \u0431\u044B\u043B\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C."
8912
+ },
8913
+ {
8914
+ category: "persona",
8915
+ subcategory: "prompt-files",
8916
+ title: "persona/speech/boundaries/communication",
8917
+ keywords: ["persona", "speech", "boundaries", "communication.md", "\u043F\u0435\u0440\u0441\u043E\u043D\u0430", "\u0440\u0435\u0447\u044C", "\u0433\u0440\u0430\u043D\u0438\u0446\u044B"],
8918
+ body: "persona.md \u043E\u043F\u0438\u0441\u044B\u0432\u0430\u0435\u0442 \u043B\u0438\u0447\u043D\u043E\u0441\u0442\u044C \u0438 \u0431\u0438\u043E\u0433\u0440\u0430\u0444\u0438\u044E, speech.md \u2014 \u043C\u0430\u043D\u0435\u0440\u0443 \u0440\u0435\u0447\u0438 \u0438 \u0441\u043B\u043E\u0432\u0435\u0447\u043A\u0438, boundaries.md \u2014 \u0437\u0430\u043F\u0440\u0435\u0442\u044B \u0438 \u043B\u0438\u0447\u043D\u044B\u0435 \u0433\u0440\u0430\u043D\u0438\u0446\u044B, communication.md \u2014 \u0441\u0442\u0438\u043B\u044C \u043A\u043E\u043C\u043C\u0443\u043D\u0438\u043A\u0430\u0446\u0438\u0438. buildSystemPrompt \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u044D\u0442\u0438 \u0444\u0430\u0439\u043B\u044B \u043A\u0430\u043A \u043E\u0441\u043D\u043E\u0432\u043D\u044B\u0435 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0438, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0438\u0445 \u043B\u0443\u0447\u0448\u0435 \u0447\u0435\u0440\u0435\u0437 MemoryPage \u0438\u043B\u0438 assistant tools, \u0430 \u043D\u0435 \u043C\u0435\u043D\u044F\u0442\u044C \u043A\u043E\u0434."
8919
+ },
8920
+ {
8921
+ category: "persona",
8922
+ subcategory: "generation",
8923
+ title: "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u043F\u0435\u0440\u0441\u043E\u043D\u044B",
8924
+ keywords: ["generatePersonaPack", "generate_persona", "\u0441\u043E\u0437\u0434\u0430\u0442\u044C \u043F\u0435\u0440\u0441\u043E\u043D\u0443", "setup", "personaNotes"],
8925
+ body: "generatePersonaPack \u0447\u0435\u0440\u0435\u0437 LLM \u0441\u043E\u0437\u0434\u0430\u0451\u0442 persona.md, speech.md, boundaries.md \u0438 communication.md. Assistant tool generate_persona \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0442\u0435\u043A\u0443\u0449\u0438\u0435 name/age/nationality/personaNotes. SetupFlow \u0438 CLI \u0442\u043E\u0436\u0435 \u043C\u043E\u0433\u0443\u0442 \u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0430\u0440\u0442\u043E\u0432\u044B\u0439 \u043F\u0440\u043E\u0444\u0438\u043B\u044C."
8926
+ },
8927
+ {
8928
+ category: "communication",
8929
+ subcategory: "fields",
8930
+ title: "CommunicationProfile",
8931
+ keywords: ["communication", "notifications", "messageStyle", "initiative", "lifeSharing"],
8932
+ body: "CommunicationProfile \u0441\u043E\u0441\u0442\u043E\u0438\u0442 \u0438\u0437 notifications muted/normal/priority, messageStyle one-liners/balanced/bursty/longform, initiative low/medium/high, lifeSharing low/medium/high. \u041E\u043D \u0432\u043B\u0438\u044F\u0435\u0442 \u043D\u0430 presence, agenda, typo density, prompt \u0438 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u0434\u0438\u0430\u043B\u043E\u0433\u0435."
8933
+ },
8934
+ {
8935
+ category: "communication",
8936
+ subcategory: "legacy-vibe",
8937
+ title: "legacy vibe",
8938
+ keywords: ["vibe", "short", "warm", "legacy", "deriveLegacyVibe"],
8939
+ body: "\u0421\u0442\u0430\u0440\u043E\u0435 \u043F\u043E\u043B\u0435 vibe \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0434\u043B\u044F \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u0438. vibe=warm \u043C\u0430\u043F\u0438\u0442\u0441\u044F \u043F\u0440\u0438\u043C\u0435\u0440\u043D\u043E \u0432 cute/\u0442\u0451\u043F\u043B\u044B\u0439 \u0441\u0442\u0438\u043B\u044C, vibe=short \u2014 \u0432 alt/one-liners/low initiative. \u041D\u043E\u0432\u0430\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u2014 communication, \u0430 vibe \u0442\u043E\u043B\u044C\u043A\u043E legacy."
8940
+ },
8941
+ {
8942
+ category: "llm",
8943
+ subcategory: "client",
8944
+ title: "LLM client",
8945
+ keywords: ["llm", "openai", "anthropic", "client", "timeout", "retries", "json"],
8946
+ body: "src/llm/index.ts \u0434\u0430\u0451\u0442 \u0435\u0434\u0438\u043D\u044B\u0439 LLMClient.chat \u0434\u043B\u044F OpenAI-compatible \u0438 Anthropic. \u0415\u0441\u0442\u044C timeout 120s, maxRetries=1 \u0438 \u0441\u0435\u0440\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0432\u044B\u0437\u043E\u0432\u043E\u0432 \u0447\u0435\u0440\u0435\u0437 \u043E\u0447\u0435\u0440\u0435\u0434\u044C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0433\u0440\u0443\u0437\u0438\u0442\u044C \u043F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u043F\u0430\u0440\u0430\u043B\u043B\u0435\u043B\u044C\u043D\u044B\u043C\u0438 \u0437\u0430\u043F\u0440\u043E\u0441\u0430\u043C\u0438. \u041E\u043F\u0446\u0438\u0438: temperature, maxTokens, json/jsonSchema."
8947
+ },
8948
+ {
8949
+ category: "llm",
8950
+ subcategory: "providers",
8951
+ title: "\u041F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440\u044B LLM",
8952
+ keywords: ["provider", "preset", "claudehub", "openrouter", "groq", "deepseek", "mistral", "gemini", "ollama"],
8953
+ body: "LLM presets \u0432\u043A\u043B\u044E\u0447\u0430\u044E\u0442 claudehub, openai, lmstudio, ollama, anthropic, openrouter, groq, deepseek, mistral, google, xai, together, fireworks, perplexity, cerebras \u0438 \u0434\u0440. \u0423 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0435\u0441\u0442\u044C proto openai/anthropic, baseURL, defaultModel, models, apiKeyRequired \u0438 hints. GirlAI \u0441\u0435\u0439\u0447\u0430\u0441 disabled."
8954
+ },
8955
+ {
8956
+ category: "llm",
8957
+ subcategory: "oauth",
8958
+ title: "OAuth GirlAI",
8959
+ keywords: ["oauth", "girlai", "refresh token", "access token", "expires"],
8960
+ body: "LLM config \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 oauthRefreshToken \u0438 oauthExpiresAt. OpenAILike \u043F\u0435\u0440\u0435\u0434 \u0432\u044B\u0437\u043E\u0432\u043E\u043C \u0434\u0435\u043B\u0430\u0435\u0442 ensureFreshToken: \u0435\u0441\u043B\u0438 \u0442\u043E\u043A\u0435\u043D \u0438\u0441\u0442\u0451\u043A, refreshAccessToken \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 access/refresh tokens. \u041F\u0440\u0438 \u043E\u0448\u0438\u0431\u043A\u0435 refresh \u043F\u043E\u043B\u044F oauth \u043E\u0447\u0438\u0449\u0430\u044E\u0442\u0441\u044F, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u043B\u043E\u043C\u0430\u0442\u044C \u043F\u043E\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438."
8961
+ },
8962
+ {
8963
+ category: "diagnostics",
8964
+ subcategory: "runtime-commands",
8965
+ title: "Runtime \u043A\u043E\u043C\u0430\u043D\u0434\u044B",
8966
+ keywords: ["status", "why", "wake", "debug", "reset", "stage", "sticker", "amnesia", "\u043A\u043E\u043C\u0430\u043D\u0434\u044B"],
8967
+ body: "send_command \u0432 assistant \u043C\u043E\u0436\u0435\u0442 \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C runtime-\u043A\u043E\u043C\u0430\u043D\u0434\u044B: status, why, wake, debug, reset. Runtime \u0442\u0430\u043A\u0436\u0435 \u0438\u043C\u0435\u0435\u0442 :stage, :sticker, :amnesia \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 CLI/chat commands. status \u2014 \u043E\u0431\u0449\u0438\u0439 \u0441\u043D\u0438\u043C\u043E\u043A, why \u2014 \u043F\u0440\u0438\u0447\u0438\u043D\u044B \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0433\u043E \u0440\u0435\u0448\u0435\u043D\u0438\u044F, debug \u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u0439 presence/stage/conflict/score/communication, wake \u2014 \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u0431\u0443\u0434\u0438\u0442, reset \u2014 \u0447\u0438\u0441\u0442\u0438\u0442 score/memory/conflict."
8968
+ },
8969
+ {
8970
+ category: "diagnostics",
8971
+ subcategory: "not-replying",
8972
+ title: "\u0415\u0441\u043B\u0438 \u043E\u043D\u0430 \u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442",
8973
+ keywords: ["\u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442", "\u043C\u043E\u043B\u0447\u0438\u0442", "ignore", "ignored", "\u043F\u043E\u0447\u0435\u043C\u0443", "why", "read_logs"],
8974
+ body: "\u0410\u043B\u0433\u043E\u0440\u0438\u0442\u043C: \u043F\u0440\u043E\u0432\u0435\u0440\u044C RuntimeBus state \u0438 lastError; read_logs \u043D\u0430 ignored/error; \u043A\u043E\u043C\u0430\u043D\u0434\u0443 why/debug; sleep/busy/presence; conflict coldUntil; stage defaults ignoreChance; ignoreTendency; score annoyance/cringe/interest; LLM/provider errors; Telegram mode/token/session. \u041D\u0435 \u043D\u0430\u0434\u043E \u0441\u0440\u0430\u0437\u0443 \u0441\u043E\u0432\u0435\u0442\u043E\u0432\u0430\u0442\u044C \u043C\u0435\u043D\u044F\u0442\u044C \u043C\u043E\u0434\u0435\u043B\u044C, \u0435\u0441\u043B\u0438 \u043F\u0440\u0438\u0447\u0438\u043D\u0430 \u0432 stage/sleep/conflict."
8975
+ },
8976
+ {
8977
+ category: "diagnostics",
8978
+ subcategory: "llm-errors",
8979
+ title: "\u041E\u0448\u0438\u0431\u043A\u0438 LLM",
8980
+ keywords: ["401", "403", "429", "quota", "billing", "timeout", "api key", "baseURL", "model", "\u043E\u0448\u0438\u0431\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0438"],
8981
+ body: "silentErrorLabel \u043A\u043B\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u0445\u043D\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043E\u0448\u0438\u0431\u043A\u0438 \u043A\u0430\u043A auth/quota/rate-limit/network/provider. \u041F\u0440\u0438 LLM \u043E\u0448\u0438\u0431\u043A\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0439 llm.presetId, proto, baseURL, apiKey, model, \u0431\u0430\u043B\u0430\u043D\u0441/\u043A\u0432\u043E\u0442\u044B \u0438 \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u044C max_tokens/max_completion_tokens. \u041B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0435 LM Studio/Ollama \u043C\u043E\u0433\u0443\u0442 \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u0431\u0435\u0437 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0433\u043E \u043A\u043B\u044E\u0447\u0430."
8982
+ },
8983
+ {
8984
+ category: "diagnostics",
8985
+ subcategory: "telegram-errors",
8986
+ title: "\u041E\u0448\u0438\u0431\u043A\u0438 Telegram",
8987
+ keywords: ["telegram error", "BOT_TOKEN", "API_ID", "API_HASH", "session", "connect", "timeout"],
8988
+ body: "bot mode \u0442\u0440\u0435\u0431\u0443\u0435\u0442 telegram.botToken. userbot \u0442\u0440\u0435\u0431\u0443\u0435\u0442 apiId/apiHash/sessionString \u0438 \u043C\u043E\u0436\u0435\u0442 \u043F\u0430\u0434\u0430\u0442\u044C \u043D\u0430 connect/getMe. \u0414\u043B\u044F \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043E\u043A \u0432\u043A\u043B\u044E\u0447\u0430\u0439 useWSS \u0438\u043B\u0438 proxy. GIRL_AGENT_DEBUG=1 \u043F\u0435\u0447\u0430\u0442\u0430\u0435\u0442 debug userbot connect/getMe/handlers."
8989
+ },
8990
+ {
8991
+ category: "webui",
8992
+ subcategory: "pages",
8993
+ title: "\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u044B WebUI",
8994
+ keywords: ["webui", "\u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B", "assistant", "configuration", "diagnostics", "logs", "memory", "relationship", "addons"],
8995
+ body: "WebUI React \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B: SetupFlow \u2014 \u043F\u0435\u0440\u0432\u0438\u0447\u043D\u0430\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430; ConfigurationPage \u2014 config; AssistantPage \u2014 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A \u0441 tool blocks \u0438 question buttons; DiagnosticsPage \u2014 runtime/system diagnostics; LogsPage \u2014 \u0441\u043E\u0431\u044B\u0442\u0438\u044F; MemoryPage \u2014 editing/preview memory; RelationshipPage \u2014 stage/score/timeline; AddonsPage \u2014 marketplace/installed."
8996
+ },
8997
+ {
8998
+ category: "webui",
8999
+ subcategory: "assistant",
9000
+ title: "WebUI assistant",
9001
+ keywords: ["assistant", "\u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A", "tool", "question", "\u043A\u043D\u043E\u043F\u043A\u0438", "assistant page"],
9002
+ body: "AssistantPage \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 /api/assistant/chat \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439. \u041E\u0442\u0432\u0435\u0442 \u043C\u043E\u0436\u0435\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C <tool> JSON-\u0431\u043B\u043E\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 UI \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u043A\u0430\u043A \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u043C\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F, \u0438 <question> \u0441 options, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0440\u0435\u043D\u0434\u0435\u0440\u044F\u0442\u0441\u044F \u043A\u043D\u043E\u043F\u043A\u0430\u043C\u0438. \u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 tool calls, \u043E\u043D\u0438 \u043D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u044E\u0442\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438."
9003
+ },
9004
+ {
9005
+ category: "webui",
9006
+ subcategory: "assistant-tools",
9007
+ title: "\u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430",
9008
+ keywords: ["set_field", "set_stage", "write_memory", "append_memory", "runtime_action", "read_logs", "read_memory", "list_presets"],
9009
+ body: "Backend assistant tools: set_field, set_stage, set_communication_preset, write_memory, append_memory, generate_persona, runtime_action, send_command, list_presets, read_logs, read_memory. ALLOWED_FIELDS \u0438 ALLOWED_MEMORY \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u044E\u0442, \u0447\u0442\u043E \u043C\u043E\u0436\u043D\u043E \u043C\u0435\u043D\u044F\u0442\u044C, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A \u043D\u0435 \u043F\u0438\u0441\u0430\u043B \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u043B\u044C\u043D\u044B\u0435 \u0444\u0430\u0439\u043B\u044B."
9010
+ },
9011
+ {
9012
+ category: "webui",
9013
+ subcategory: "theme-and-css",
9014
+ title: "\u0422\u0435\u043C\u044B \u0438 \u043A\u043D\u043E\u043F\u043A\u0438 WebUI",
9015
+ keywords: ["theme", "dark", "light", "css", "\u043A\u043D\u043E\u043F\u043A\u0438", "\u0446\u0432\u0435\u0442", "bone", "ink"],
9016
+ body: "styles.css \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 bone/ink \u043F\u0430\u043B\u0438\u0442\u0440\u0443 \u0438 CSS variables. \u0412 light/dark \u043C\u0435\u043D\u044F\u044E\u0442\u0441\u044F --bone \u0438 --ink, \u0430 app colors \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 --ga-text, --ga-bg-* \u0438 --ga-border. Button text \u0434\u043E\u043B\u0436\u0435\u043D \u044F\u0432\u043D\u043E \u043D\u0430\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u044C/inherit \u0438\u043B\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C --ga-text, \u0438\u043D\u0430\u0447\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043D\u044B\u0439 default \u043C\u043E\u0436\u0435\u0442 \u0434\u0430\u0442\u044C \u043F\u043B\u043E\u0445\u043E\u0439 \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442."
9017
+ },
9018
+ {
9019
+ category: "webui",
9020
+ subcategory: "api",
9021
+ title: "WebUI API",
9022
+ keywords: ["api", "routes", "profiles", "presets", "system", "tg-auth", "addons", "websocket"],
9023
+ body: "src/webui/routes \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 profiles, presets, assistant, addons, system, tg-auth. runtime-bus \u0434\u0430\u0451\u0442 runtime state/logs, websocket \u043E\u0442\u0434\u0430\u0451\u0442 live events. static.ts \u0440\u0430\u0437\u0434\u0430\u0451\u0442 webui/dist. system diagnostics \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 platform, arch, node, dataRoot, ipv4 \u0438 memory."
9024
+ },
9025
+ {
9026
+ category: "addons",
9027
+ subcategory: "format",
9028
+ title: "\u0424\u043E\u0440\u043C\u0430\u0442 .gaa \u0430\u0434\u0434\u043E\u043D\u043E\u0432",
9029
+ keywords: ["addon", "gaa", "manifest", "files", "config.patch", "theme.css", "install.sh"],
9030
+ body: ".gaa \u2014 zip-\u0430\u0440\u0445\u0438\u0432 \u043F\u0430\u043F\u043A\u0438 \u0430\u0434\u0434\u043E\u043D\u0430. manifest.json \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u0435\u043D. files/ \u043A\u043E\u043F\u0438\u0440\u0443\u044E\u0442\u0441\u044F \u0432 data/<slug>/, config.patch.json deep-merge \u0432 config, code.patch \u043C\u043E\u0436\u0435\u0442 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C\u0441\u044F git apply, theme.css \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442 CSS, install.sh \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u0435\u043D. Marketplace \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 GIRL_AGENT_ADDON_REGISTRY \u0438\u043B\u0438 GitHub raw registry."
9031
+ },
9032
+ {
9033
+ category: "addons",
9034
+ subcategory: "manifest",
9035
+ title: "manifest.json \u0430\u0434\u0434\u043E\u043D\u0430",
9036
+ keywords: ["manifest", "addon", "id", "version", "compatibility", "settings"],
9037
+ body: "Manifest \u0442\u0440\u0435\u0431\u0443\u0435\u0442 id/name/description/version. \u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E: author, compatibility semver range, tags, dependencies, settings, icon, homepage. Settings \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0442 string/number/boolean/select \u0441 default/options/required."
9038
+ },
9039
+ {
9040
+ category: "mcp",
9041
+ subcategory: "client",
9042
+ title: "MCP servers",
9043
+ keywords: ["mcp", "tools", "stdio", "exa", "spotify", "instagram", "weather", "calendar"],
9044
+ body: "startMcpServers \u0447\u0438\u0442\u0430\u0435\u0442 cfg.mcp, \u043D\u0430\u0445\u043E\u0434\u0438\u0442 preset, \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u0442 stdio transport, \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\u0435\u0442 MCP Client \u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 listTools. \u0421\u0435\u0439\u0447\u0430\u0441 \u0433\u043E\u0442\u043E\u0432 Exa Search \u0447\u0435\u0440\u0435\u0437 npx -y exa-mcp-server \u0438 EXA_API_KEY; spotify/instagram/weather/calendar \u043F\u043E\u043C\u0435\u0447\u0435\u043D\u044B soon."
9045
+ },
9046
+ {
9047
+ category: "migrations",
9048
+ subcategory: "data-migrations",
9049
+ title: "\u041C\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043D\u043D\u044B\u0445",
9050
+ keywords: ["migration", "update", "0112", "0113", "0114", "\u043C\u0438\u0433\u0440\u0430\u0446\u0438\u0438"],
9051
+ body: "src/migrations \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 versioned data migrations. RuntimeBus \u043F\u0435\u0440\u0435\u0434 \u0441\u0442\u0430\u0440\u0442\u043E\u043C \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442 pending migrations \u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u0442 runMigrations. CLI update [--verbose] \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442 \u043C\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0432\u0440\u0443\u0447\u043D\u0443\u044E. \u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435: 0112 useWSS default, 0113 communication.md, 0114 Memory Palace."
9052
+ },
9053
+ {
9054
+ category: "desktop",
9055
+ subcategory: "wrapper",
9056
+ title: "desktop-rs",
9057
+ keywords: ["desktop", "rust", "iced", "windows", "installer", "json-events"],
9058
+ body: "README \u043E\u043F\u0438\u0441\u044B\u0432\u0430\u0435\u0442 desktop-rs: \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 Rust/iced \u043A\u043B\u0438\u0435\u043D\u0442 \u0438 installer wizard \u0434\u043B\u044F Windows. \u041E\u043D \u0441\u0442\u0430\u0432\u0438\u0442 Node package, \u0441\u043E\u0437\u0434\u0430\u0451\u0442 \u043F\u0440\u043E\u0444\u0438\u043B\u044C \u0438 \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 WebUI \u043D\u0430 127.0.0.1:7777. CLI \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 --json-events/--headless \u0434\u043B\u044F desktop wrapper."
9059
+ },
9060
+ {
9061
+ category: "release",
9062
+ subcategory: "install",
9063
+ title: "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C",
9064
+ keywords: ["install", "\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430", "curl", "docker", "npx", "node", "server", "systemd"],
9065
+ body: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0430\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430: curl install.sh \u0441\u0442\u0430\u0432\u0438\u0442 docker wrapper \u0438\u043B\u0438 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0439 Node 22 LTS \u0432 ~/.local/share/girl-agent/runtime, \u043D\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 sudo. \u0410\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u044B: npx @thesashadev/girl-agent, docker run \u0441 volume /data, server --print-config/--print-systemd/--print-docker."
9066
+ }
9067
+ ];
9068
+ function generatedKnowledge() {
9069
+ return [
9070
+ ...STAGE_PRESETS.map((stage) => ({
9071
+ category: "relationship",
9072
+ subcategory: `stage-${stage.num}`,
9073
+ title: `${stage.num}. ${stage.id}`,
9074
+ keywords: ["stage", "\u0441\u0442\u0430\u0434\u0438\u044F", stage.id, stage.label, String(stage.num)],
9075
+ body: `${stage.label}: ${stage.description}. Defaults: interest=${stage.defaults.interest}, trust=${stage.defaults.trust}, attraction=${stage.defaults.attraction}, annoyance=${stage.defaults.annoyance}, cringeTolerance=${stage.defaults.cringeTolerance}, ignoreChance=${stage.defaults.ignoreChance}, replyDelaySec=${stage.defaults.replyDelaySec[0]}-${stage.defaults.replyDelaySec[1]}.`
9076
+ })),
9077
+ ...COMMUNICATION_PRESETS.map((preset) => ({
9078
+ category: "communication",
9079
+ subcategory: `preset-${preset.id}`,
9080
+ title: `Communication preset ${preset.id}`,
9081
+ keywords: ["communication", "preset", "\u043E\u0431\u0449\u0435\u043D\u0438\u0435", preset.id, preset.label],
9082
+ body: `${preset.label}: ${preset.description}. notifications=${preset.profile.notifications}, messageStyle=${preset.profile.messageStyle}, initiative=${preset.profile.initiative}, lifeSharing=${preset.profile.lifeSharing}.`
9083
+ })),
9084
+ {
9085
+ category: "llm",
9086
+ subcategory: "preset-index",
9087
+ title: "\u0418\u043D\u0434\u0435\u043A\u0441 LLM presets",
9088
+ keywords: ["llm", "preset", "\u043F\u0440\u043E\u0432\u0430\u0439\u0434\u0435\u0440\u044B", ...LLM_PRESETS.map((p) => p.id)],
9089
+ body: LLM_PRESETS.map((p) => `${p.id}: ${p.name}, proto=${p.proto}, default=${p.defaultModel || "custom"}${p.baseURL ? `, baseURL=${p.baseURL}` : ""}${p.disabled ? `, disabled=${p.disabledReason ?? "yes"}` : ""}${p.hint ? `, hint=${p.hint}` : ""}`).join("\n")
9090
+ },
9091
+ {
9092
+ category: "mcp",
9093
+ subcategory: "preset-index",
9094
+ title: "\u0418\u043D\u0434\u0435\u043A\u0441 MCP presets",
9095
+ keywords: ["mcp", "preset", "\u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438", ...MCP_PRESETS.map((p) => p.id)],
9096
+ body: MCP_PRESETS.map((p) => `${p.id}: ${p.name}, ready=${p.ready ? "yes" : "soon"} \u2014 ${p.description}`).join("\n")
9097
+ }
9098
+ ];
9099
+ }
9100
+ function knowledgeBase() {
9101
+ return [...CORE_KNOWLEDGE_BASE, ...generatedKnowledge()];
9102
+ }
9103
+ function renderRelevantKnowledge(query, limit = 8) {
9104
+ const articles = selectKnowledgeArticles(query, limit);
9105
+ return [
9106
+ "\u0411\u0430\u0437\u0430 \u0437\u043D\u0430\u043D\u0438\u0439 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 girl-agent:",
9107
+ renderKnowledgeIndex(),
9108
+ "\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0435 \u0440\u0435\u043B\u0435\u0432\u0430\u043D\u0442\u043D\u044B\u0435 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438/\u043F\u043E\u0434\u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438:",
9109
+ ...articles.map((a) => `## ${a.category} / ${a.subcategory}: ${a.title}
9110
+ ${a.body}`),
9111
+ "\u0415\u0441\u043B\u0438 \u0432\u043E\u043F\u0440\u043E\u0441 \u043D\u0435 \u043F\u043E\u043A\u0440\u044B\u0442 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u043C\u0438 \u0441\u0442\u0430\u0442\u044C\u044F\u043C\u0438 \u2014 \u0441\u043A\u0430\u0436\u0438 \u043E\u0441\u0442\u043E\u0440\u043E\u0436\u043D\u043E \u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u044B\u0439 \u043A\u043E\u043D\u0444\u0438\u0433, \u043F\u0430\u043C\u044F\u0442\u044C \u0438\u043B\u0438 runtime logs."
9112
+ ].join("\n\n");
9113
+ }
9114
+ function renderKnowledgeIndex() {
9115
+ const grouped = /* @__PURE__ */ new Map();
9116
+ for (const article of knowledgeBase()) {
9117
+ const list = grouped.get(article.category) ?? [];
9118
+ if (!list.includes(article.subcategory)) list.push(article.subcategory);
9119
+ grouped.set(article.category, list);
9120
+ }
9121
+ return [...grouped.entries()].map(([category, subcategories]) => `- ${category}: ${subcategories.join(", ")}`).join("\n");
9122
+ }
9123
+ function selectKnowledgeArticles(query, limit) {
9124
+ const normalized = normalizeSearchText(query);
9125
+ const terms = searchTerms(normalized);
9126
+ const scored = knowledgeBase().map((article) => ({ article, score: knowledgeScore(article, normalized, terms) })).filter((item) => item.score > 0).sort((a, b) => b.score - a.score).slice(0, limit).map((item) => item.article);
9127
+ if (scored.length) return scored;
9128
+ return knowledgeBase().filter((article) => article.category === "overview" || article.category === "diagnostics").slice(0, limit);
9129
+ }
9130
+ function knowledgeScore(article, normalizedQuery, terms) {
9131
+ const haystack = normalizeSearchText([
9132
+ article.category,
9133
+ article.subcategory,
9134
+ article.title,
9135
+ article.keywords.join(" "),
9136
+ article.body
9137
+ ].join(" "));
9138
+ let score = 0;
9139
+ for (const keyword of article.keywords) {
9140
+ const normalizedKeyword = normalizeSearchText(keyword);
9141
+ if (normalizedKeyword && normalizedQuery.includes(normalizedKeyword)) score += 6;
9142
+ }
9143
+ for (const term of terms) {
9144
+ if (article.category.includes(term) || article.subcategory.includes(term)) score += 3;
9145
+ if (haystack.includes(term)) score += 1;
9146
+ }
9147
+ return score;
9148
+ }
9149
+ function searchTerms(text) {
9150
+ return [...new Set(text.split(/[^a-zа-яё0-9]+/i).filter((t) => t.length >= 3))];
9151
+ }
9152
+ function normalizeSearchText(text) {
9153
+ return text.toLowerCase().replace(/ё/g, "\u0435");
9154
+ }
9155
+
9156
+ // src/webui/routes/assistant.ts
8603
9157
  var ASSISTANT_SYSTEM = `\u0422\u044B \u2014 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u0418\u0418-\u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A \u043F\u043E \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0435 girl-agent (\u0440\u0430\u043D\u0442\u0430\u0439\u043C \u0434\u043B\u044F Telegram-\u0434\u0435\u0432\u0443\u0448\u043A\u0438 \u0441 \u0447\u0435\u043B\u043E\u0432\u0435\u0447\u043D\u044B\u043C \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C). \u0422\u0435\u0431\u044F \u0437\u043E\u0432\u0443\u0442 "\u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A", \u043D\u0435 "\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442".
8604
9158
 
8605
9159
  \u0422\u0432\u043E\u044F \u0437\u0430\u0434\u0430\u0447\u0430:
@@ -8607,6 +9161,7 @@ var ASSISTANT_SYSTEM = `\u0422\u044B \u2014 \u0432\u0441\u0442\u0440\u043E\u0435
8607
9161
  - \u041C\u0435\u043D\u044F\u0442\u044C \u043A\u043E\u043D\u0444\u0438\u0433 \u043F\u0440\u043E\u0444\u0438\u043B\u044F \u0438 \u0444\u0430\u0439\u043B\u044B \u043F\u0430\u043C\u044F\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B (\u0441\u043C. \u043D\u0438\u0436\u0435).
8608
9162
  - \u041F\u043E\u043C\u043E\u0433\u0430\u0442\u044C \u0441 \u043F\u0435\u0440\u0432\u0438\u0447\u043D\u043E\u0439 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u043E\u0439 \u0438 \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u043E\u0439 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F.
8609
9163
  - \u041E\u0431\u044A\u044F\u0441\u043D\u044F\u0442\u044C \u043E\u0448\u0438\u0431\u043A\u0438 \u0438\u0437 \u043B\u043E\u0433\u043E\u0432 \u0438 \u043F\u0440\u0435\u0434\u043B\u0430\u0433\u0430\u0442\u044C \u043F\u043E\u0447\u0438\u043D\u043A\u0443.
9164
+ - \u0414\u0430\u0432\u0430\u0442\u044C \u043E\u0442\u0432\u0435\u0442\u044B, \u043E\u043F\u0438\u0440\u0430\u044F\u0441\u044C \u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0435 \u0441\u0442\u0430\u0442\u044C\u0438 \u0438\u0437 \u0431\u0430\u0437\u044B \u0437\u043D\u0430\u043D\u0438\u0439 \u043F\u0440\u043E\u0435\u043A\u0442\u0430, \u0430 \u043D\u0435 \u043D\u0430 \u0434\u043E\u0433\u0430\u0434\u043A\u0438.
8610
9165
 
8611
9166
  \u041F\u0440\u0430\u0432\u0438\u043B\u0430 \u043E\u0442\u0432\u0435\u0442\u0430:
8612
9167
  - \u041E\u0442\u0432\u0435\u0447\u0430\u0439 \u043A\u043E\u0440\u043E\u0442\u043A\u043E (2-5 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439), \u043D\u0430 \u0440\u0443\u0441\u0441\u043A\u043E\u043C.
@@ -8652,7 +9207,7 @@ var ASSISTANT_SYSTEM = `\u0422\u044B \u2014 \u0432\u0441\u0442\u0440\u043E\u0435
8652
9207
 
8653
9208
  \u0412\u0430\u0436\u043D\u044B\u0435 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438:
8654
9209
  - ignoreTendency: 0 \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442; 100 \u2014 \u043F\u043E\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0433\u043D\u043E\u0440\u0438\u0442. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 35.
8655
- - \u0415\u0441\u043B\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0436\u0430\u043B\u0443\u0435\u0442\u0441\u044F \u0447\u0442\u043E "\u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442" \u2192 \u043F\u0440\u043E\u0432\u0435\u0440\u044C runtime-action stat\u0435 \u0438 read_logs.
9210
+ - \u0415\u0441\u043B\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0436\u0430\u043B\u0443\u0435\u0442\u0441\u044F \u0447\u0442\u043E "\u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442" \u2192 \u043F\u0440\u043E\u0432\u0435\u0440\u044C runtime state \u0438 read_logs.
8656
9211
  - \u0415\u0441\u043B\u0438 LLM \u043E\u0448\u0438\u0431\u043A\u0438 \u2192 \u043F\u0440\u043E\u0432\u0435\u0440\u044C llm.apiKey, llm.baseURL, llm.model.
8657
9212
  - \u0415\u0441\u043B\u0438 \u0441\u043C\u0435\u043D\u0438\u043B\u0438 telegram.mode \u2014 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E \u043D\u0443\u0436\u0435\u043D restart.`;
8658
9213
  function registerAssistantRoutes(r) {
@@ -8675,22 +9230,69 @@ function registerAssistantRoutes(r) {
8675
9230
  return { reply: reply2, toolCalls: [] };
8676
9231
  }
8677
9232
  const stage = findStage(cfg.stage);
9233
+ const status = bus.status(cfg.slug);
9234
+ const userQuestion = body.messages.slice().reverse().find((m) => m.role === "user")?.content ?? "";
9235
+ const relevantKnowledge = renderRelevantKnowledge(userQuestion);
8678
9236
  let scoreLine = "";
9237
+ let memoryContext = "";
8679
9238
  let recentLogs = "";
8680
9239
  try {
8681
9240
  const rel = await readRelationship(cfg.slug);
8682
9241
  scoreLine = ` score=${JSON.stringify(rel.score)}`;
8683
9242
  } catch {
8684
9243
  }
9244
+ try {
9245
+ const [persona, speech, communication, boundaries, longTerm, facts, uncertain, timeline, openLoops, promises] = await Promise.all([
9246
+ readMd(cfg.slug, "persona.md"),
9247
+ readMd(cfg.slug, "speech.md"),
9248
+ readMd(cfg.slug, "communication.md"),
9249
+ readMd(cfg.slug, "boundaries.md"),
9250
+ readMd(cfg.slug, "memory/long-term.md"),
9251
+ readMd(cfg.slug, "memory/facts.md"),
9252
+ readMd(cfg.slug, "memory/uncertain.md"),
9253
+ readMd(cfg.slug, "relationship/timeline.md"),
9254
+ readMd(cfg.slug, "time/open-loops.md"),
9255
+ readMd(cfg.slug, "time/promises.md")
9256
+ ]);
9257
+ memoryContext = renderAssistantMemoryContext({
9258
+ persona,
9259
+ speech,
9260
+ communication,
9261
+ boundaries,
9262
+ longTerm,
9263
+ facts,
9264
+ uncertain,
9265
+ timeline,
9266
+ openLoops,
9267
+ promises
9268
+ });
9269
+ } catch {
9270
+ }
8685
9271
  try {
8686
9272
  const buf = bus.recentLogs(cfg.slug, 25);
8687
9273
  recentLogs = buf.map((e) => `[${e.type}] ${e.text ?? ""}`).join("\n");
8688
9274
  } catch {
8689
9275
  }
8690
- const ctxPrompt = `\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043F\u0440\u043E\u0444\u0438\u043B\u044C: ${cfg.name}, ${cfg.age}, \u0441\u0442\u0430\u0434\u0438\u044F "${stage.label}" (${cfg.stage}), privacy=${cfg.privacy ?? "owner-only"}, ignoreTendency=${cfg.ignoreTendency ?? 35}, llm=${cfg.llm.presetId}/${cfg.llm.model}, telegram=${cfg.mode ?? "bot"}.${scoreLine}` + (recentLogs ? `
8691
-
8692
- \u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u0441\u043E\u0431\u044B\u0442\u0438\u044F runtime'\u0430 (\u0434\u043B\u044F \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430):
8693
- ${recentLogs.slice(-1500)}` : "");
9276
+ const runtimeContext = [
9277
+ `\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043F\u0440\u043E\u0444\u0438\u043B\u044C: ${cfg.name}, ${cfg.age}, ${cfg.nationality}, tz=${cfg.tz}`,
9278
+ `slug=${cfg.slug}, runtime=${status.state}${status.lastError ? `, lastError=${status.lastError}` : ""}`,
9279
+ `\u0441\u0442\u0430\u0434\u0438\u044F "${stage.label}" (${cfg.stage}), ${stage.description}`,
9280
+ `stage defaults: ignoreChance=${stage.defaults.ignoreChance}, replyDelaySec=${stage.defaults.replyDelaySec[0]}-${stage.defaults.replyDelaySec[1]}`,
9281
+ `privacy=${cfg.privacy ?? "owner-only"}, ownerId=${cfg.ownerId ?? "\u2014"}, ignoreTendency=${cfg.ignoreTendency ?? 35}`,
9282
+ `sleep=${cfg.sleepFrom}:00-${cfg.sleepTo}:00, nightWakeChance=${cfg.nightWakeChance}`,
9283
+ `communication=${cfg.communication ? JSON.stringify(cfg.communication) : "default"}, vibe=${cfg.vibe ?? "\u2014"}`,
9284
+ `llm=${cfg.llm.presetId}/${cfg.llm.model} (${cfg.llm.proto}), telegram=${cfg.mode ?? "bot"}, useWSS=${cfg.telegram.useWSS ?? true}`,
9285
+ `busySchedule=${cfg.busySchedule?.length ? JSON.stringify(cfg.busySchedule).slice(0, 1e3) : "[]"}`,
9286
+ scoreLine.trim()
9287
+ ].filter(Boolean).join("\n");
9288
+ const ctxPrompt = [
9289
+ relevantKnowledge,
9290
+ `\u041A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0444\u0438\u043B\u044F:
9291
+ ${runtimeContext}`,
9292
+ memoryContext,
9293
+ recentLogs ? `\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u0441\u043E\u0431\u044B\u0442\u0438\u044F runtime'\u0430:
9294
+ ${recentLogs.slice(-2500)}` : ""
9295
+ ].filter(Boolean).join("\n\n");
8694
9296
  const llm = makeLLM(cfg.llm);
8695
9297
  const messages = [
8696
9298
  { role: "system", content: ASSISTANT_SYSTEM },
@@ -8786,12 +9388,14 @@ async function applyTool(cfg, call) {
8786
9388
  const stage = String(call.args?.stage ?? "");
8787
9389
  const found = STAGE_PRESETS.find((s) => s.id === stage);
8788
9390
  if (!found) return { changed: false, message: `unknown stage: ${stage}. \u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435: ${STAGE_PRESETS.map((s) => s.id).join(", ")}` };
9391
+ const prevStage = cfg.stage;
8789
9392
  cfg.stage = stage;
8790
9393
  try {
8791
9394
  const rel = await readRelationship(cfg.slug);
8792
9395
  await writeRelationship(cfg.slug, { ...rel, stage });
8793
9396
  } catch {
8794
9397
  }
9398
+ await maybeAdvanceRelationshipTimeline(cfg, prevStage, stage);
8795
9399
  return { changed: true, message: `stage = ${stage} (${found.label})` };
8796
9400
  }
8797
9401
  case "set_communication_preset": {
@@ -8933,6 +9537,32 @@ ${preset.description}
8933
9537
  return { changed: false, message: `unknown tool: ${call.tool}` };
8934
9538
  }
8935
9539
  }
9540
+ function renderAssistantMemoryContext(parts) {
9541
+ const sections = [
9542
+ ["persona.md", parts.persona],
9543
+ ["speech.md", parts.speech],
9544
+ ["communication.md", parts.communication],
9545
+ ["boundaries.md", parts.boundaries],
9546
+ ["memory/facts.md", parts.facts],
9547
+ ["memory/uncertain.md", parts.uncertain],
9548
+ ["memory/long-term.md", parts.longTerm],
9549
+ ["relationship/timeline.md", parts.timeline],
9550
+ ["time/open-loops.md", parts.openLoops],
9551
+ ["time/promises.md", parts.promises]
9552
+ ].map(([name, text]) => renderContextSection(name, text)).filter(Boolean);
9553
+ return sections.length ? `\u041F\u0430\u043C\u044F\u0442\u044C \u0438 \u0444\u0430\u0439\u043B\u044B \u043F\u0440\u043E\u0444\u0438\u043B\u044F:
9554
+ ${sections.join("\n\n")}` : "";
9555
+ }
9556
+ function renderContextSection(name, text) {
9557
+ const clean = text.trim();
9558
+ if (!clean) return "";
9559
+ return `## ${name}
9560
+ ${tail(clean, 1400)}`;
9561
+ }
9562
+ function tail(text, limit) {
9563
+ if (text.length <= limit) return text;
9564
+ return text.slice(-limit);
9565
+ }
8936
9566
  function setNested(obj, path13, value) {
8937
9567
  const parts = path13.split(".");
8938
9568
  let cur = obj;