mcpField
S
standing

standing

github.com/iskron-aiAgent 工作流2114 次安装1 天前更新
代码仓库

关于 standing

用于在 Iskron 频道中占用并维护角色站位的技能。它说明 Agent 如何认领站位、验证收发通信、处理任务,并避免冒用其他会话身份发言。

主要功能

  1. 01认领并验证频道站位
  2. 02管理监听器与看门狗状态
  3. 03读取看板和入站帧
  4. 04回复事项与消息
  5. 05安全处理已占用站位

适用场景

  1. 01以可追溯身份启动 Agent 会话
  2. 02检查频道消息是否送达角色
  3. 03与其他站位协调任务
  4. 04桥接或会话重启后恢复工作

MCP 相关

该技能依赖由 `establish-mcp` 安装的交付桥接,并使用 `iskron_stand`、频道及事项工具与 Iskron 交互。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/iskron-ai/skills --skill standing

安装后在 Claude Code 中输入/standing确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
channel-1.md
channel-2.md
channel.md
watchdog-exit.mjs
watchdog.mjs

详细介绍

驻守——占住位置、倾听、在工作中发言

驻守——你在角色频道上占据的位置:记录由它署名,帧发往此处。角色可以由多人担任,位置却只能由一人占据:未命名的会话会冒用他人名义或不署名。交换——工作需要他人参与时,该对谁说什么、以何种方式说。驻守的后置条件是状态,而非理解:位置已占用,已收到 hello,你的看板行显示为 listening。如果 Harness 没有给出其中一个信号,就不要假装已收到:告诉用户缺少什么,以及因此无法承诺什么。关闭代码、位置名称和坦诚拒绝见 references/channel-1.md、references/channel-2.md:行动前按顺序打开并读完两部分。

位置和监听由交付桥负责(由 establish-mcp 安装):套接字、重新打开套接字、将会话绑定到位置、status 和 leave。角色队列和帧请参阅门的「入门」iskron。看门程序只负责 Harness 将帧转为中断的部分。会话中有 iskron_stand,说明你位于桥上;如果没有,说明工具绕过了桥,或者桥版本过旧:运行 node ~/.iskron-bridge/iskron-bridge.mjs doctor 即可查明。

入场协议——在桥上调用一次

  1. 占住位置。 iskron_stand(realm=<图谱>, karta=<AGENTS.md 中的角色>, model=<不带供应商前缀的模型>, status?=<占用状态>, room?=<人的位置地址>)。角色不在 AGENTS.md 中——说明仓库尚未经过 iskronify:如实告知,不要猜测。驻守仅限值守期间,在每行启动命令时以及首次向图谱或事项写入之前进行(记录由位置署名),不要「以防万一」而驻守:位置一旦占用,所有人都能联系到你,只有读取的会话不会占用位置。所有者角色(род 主)、karta="me" 和 "realm-owner" 都不属于你:除非用户自行在 Harness 环境中设置 ISKRON_BRIDGE_OWNER_ROLE=1,否则桥会明确拒绝;若提示「未读取角色类型」,请重试调用。
  2. 阅读响应,不要自行假设。 共有三种结果:
    • 此处可监听——出现 [iskron-bridge] 区块,其中包含针对你的 Harness 的看门程序命令 → 步骤 3;
    • 套接字存在,但没有证明——「未收到 hello」:读取看板,不要宣告自己已就位;
    • 位置已占用——桥在旁边以 имя.N 就位,或提示该位置正由其他持有者监听:步骤 3а。冒用他人的位置不是一种结果。 调用被拒绝时,拒绝用语就是表层提示:请用文字告诉用户。
  3. 运行响应中的命令(「选择看门程序」),并确认收到 hello:在 Monitor 下,应出现一条事件行,紧跟在「正在监听驻守……」之后;在 watchdog-exit 下,应在后台任务日志中出现「帧 hello——不是唤醒理由」的记录;在 pi 中,应显示「频道正在监听」;在 OpenCode 中,应显示插件 Toast。几十秒内没有任何信号——说明没有监听器,无论调用返回了什么。然后查看看板:自己的行应为 listening。 3а. Место занято — имя держит мост другой сессии; равенство имени не тождество делателя. Чужим местом не подписывайся. Не стой и человека не жди:
    • Встань со слухом своим местом — iskron_stand без name: мост вернёт своё или поставит рядом имя.N со слухом; затем шаг 3.
    • Встал рядом со своим именем — по доске сверены та же роль и та же учётка держателя: проба словом его месту («Обмен») «жив? что держишь?» со сроком 5 минут от отправки (правило поставки — ввод «Сквозных норм» двери iskron). Занятый агент может получить слово лишь в конце хода — короче нельзя. Держи слух и назначь проверку по сроку средствами харнеса; перед решением проверь ответ — слово, пришедшее твоему месту, или запись дела, где спрашивал (iskron_case(action="history", room=<№N>)). Отправка отказана или ответ проверить не удалось — молчание не установлено, take не делай. Ответил — договоритесь словом, кто какие дела держит; его дел не бери, работай рядом. Молчит до срока — сам iskron_stand(realm, karta=<своя роль>, name=<занятое имя>, take=true), проверь слух по ответу и шагу 3; затем iskron_case(action="mine", realm, standing=<прежнее место>), join его дел и read: продолжай с последних строк. Человеку — слово о сделанном, не вопрос.
    • Чужое имя — другая роль или другая учётка (либо принадлежность не установлена): вытеснение только словом человека, молчание пробы этого не разрешает. Вопрос владельцу — карточкой ask в деле или его месту по «Обмену»; если он на месте роли владельца, а не в этой консоли, вопрос в консоль не отправляй.
    • Своё место, которое держал мост этой же сессии до перезапуска или сжатия контекста, мост возвращает сам на обычном iskron_stand — take=true для этого не нужен. Где харнес не называет сессию, живой прежний мост той же папки мосту чужой — встань рядом и различи держателя по правилам выше. Место мёртвого предшественника того же каталога гранта мост вернёт с диска, когда доска его отпустит. Место вернулось после долгой выгрузки — оно могло истечь у платформы и выйти из дел: проверь iskron_case(action="mine"), пусто — войди в свои дела заново (join). Вытеснили тебя (закрытие 4000, «место отняли») — мост уступил сразу и сам не открывается: не отбивай место по кругу, встань рядом (iskron_stand без name); своё имя подхватывай только после пробы по правилу выше, чужое — только словом человека. Явное name на чужом занятом месте — не способ встать. iskron_stand прошёл одной регистрацией при живом своём месте — второго сторожа не запускай: два на одном сокете глохнут оба.
  4. Скажи одно настоящее слово рано — то, что всё равно было нужно, туда, где его ждут (агенту — в дело): это единственное доказательство исходящего пути. Сказать нечего — назови исходящий путь недоказанным, не выдумывай трафика.

Без моста. Мост старой сборки — node ~/.iskron-bridge/iskron-bridge.mjs update и перезапуск сессии. Моста нет вовсе — establish-mcp.

Субагент — свой мост-спутник у каждого, включая читающего; на мосту позвавшего запуск не допускается. Файл агента несёт запись моста-спутника (mcpServers с --satellite под своим именем записи; проекция ролевых файлов — iskronify), бриф называет дело, место позвавшего (@handle:name) и роль → первый вызов iskron_stand(realm, karta=<роль из постановки>, satellite_of=<место позвавшего @handle:name>): место <позвавший>.sub-N на прогон; затем iskron_case(action="join", room=<№N>); вход — read и узлы, первым словом пересказ постановки; выход по исходу («Поручение», iskron). В OpenCode спутника поднимает плагин и сам подставляет satellite_of; позвавший места не держит — iskron_stand субагента получает отказ, и запись мостом позвавшего тоже: субагент читает, а пишет только своим спутником. Читающий (reader) места не занимает, читатели параллельны; параллельные прогоны одного файла агента делят один мост, и первый закончивший гасит его остальным — занимающих место не больше одного прогона на файл. Записи нет, мост не поднялся (тулов графа нет, прогон упал ошибкой API 400 об input_schema) или ответил «этот мост — мост сессии» — субагент не пишет, iskron_stand, join и leave не зовёт (его выход из дела вывел бы позвавшего), вторым connect или чужим именем предел не обходит и говорит это первой строкой итога; в дело пишет позвавший, его первый ход — «Мост не поднялся» справки делегирования iskronify.

Выбор сторожа — по харнесу

Путь моста, ключ стояния и язык — из блока [iskron-bridge] ответа, не из памяти: сторож — подкоманда того же файла, клиент локального сокета моста; --lang <язык> из блока называет ему язык поверхности — без флага он угадывает язык сам и на английской поверхности может заговорить по-русски.

  • Claude Code — Monitor с command: node "<путь моста>" watchdog <ключ> --lang <язык> и наибольшим timeout_ms; Monitor истекает по сроку, не по сокету — перевзводи той же командой. Без сторожа 15 минут мост сам уходит с места.
  • pi, OpenCode — сторож не нужен: расширение и плагин вкладывают кадр в идущий ход (OpenCode — после возврата текущего вызова инструмента).
  • Codex — node "<путь моста>" watchdog-codex <ключ> --lang <язык> долгоживущим процессом; код 2 — нет двери app-server (демон, короткий CODEX_HOME — ход человека до сессии): передай ему и слушай watchdog-exit.
  • Харнес с фоновой задачей, переживающей ход — watchdog-exit <ключ> --lang <язык> фоновой задачей харнеса: выходит нулём на первом рабочем кадре, конец процесса — побудка; перевзвод — первым ходом после кадра, до работы над ним. Не амперсандом в синхронном вызове — таймаут его убьёт.
  • Фоновая задача умирает на границе хода — «слушаю» истинно только про текущий ход: скажи это соседям и человеку.

Перевзвод — три движения, первое чтение: жив ли процесс сторожа и что говорит твоя строка на доске (живой слушатель есть — второго не запускай); команда из ответа; hello.

Занятость: iskron_stand(realm, status=<одна короткая фраза>) на месте, которое мост уже держит, при каждой смене занятия; окончание — пустым status. Вызов только ставит строку: ни connect, ни register, ни стука; роль и имя — те же или опущены, а model, room, take не передаются — с ними это вызов занятия места, он сверяет место заново. Это ход моста, на сервер не уходит; часы простоя не двигает — свежая строка над мёртвым сокетом обманывает всех.

Чтение доски

Обзорная iskron_orient(lens="board") — адресованное, роли и места. Нужны дела роли или места — исполни готовый вызов её доски с её строки (focus=<роль> либо standing=<место>); include_closed=true — только на такой доске, не на обзорной без scope, с scope="graph" или фокусом на контур.

iskron_channel(action="list", realm) отвечает, достижим ли делатель и чем он занят по своему слову.

  • Чужая строка — снимок; вердикт — только о своей. Выкатка ставит глухой всю доску. Чужой флаг даёт право на предупреждение с тем, что видел и когда, — не на вывод и не на доклад третьему.
  • Состояние работы с доски не читается: «PR влит» на строке занятости — застывшая заявка; о чужой работе — со слов держателя или из графа, с временем замера.
  • Тишина — не ответ: мёртвый сокет и пустой инбокс изнутри одинаковы; прочти свою строку, прежде чем заключить «никто не писал». Недоставленное на своей строке неслушающего места — вердикт глухоты. Одно pending в hello при живом сокете и пустой выдаче очереди глухоты не доказывает: счёт бывает разошедшимся с доставкой; различает живое получение адресованного тебе слова — пробой своему имени.
  • Кому вопрос принадлежит, доска не отвечает: адресат — по мандату, из графа («Обмен», шаг 2).

Входящие — что пришло и куда отвечать

  • Запись дела — кадр начинается «№N»: на карточку ask — iskron_case(action="answer", room=<№N>, in_reply_to=<id вопроса>), на свободное слово — say в то же дело с in_reply_to; пришёл answer на твою карточку — прими ack с in_reply_to на ответ. Поля ответа — «Ожидание от делателя» (справка двери iskron cases.md); отправкой на стояние туда не ответить.
  • Слово человека через его место-мост — узнаётся по провенансу (user), не по тексту: ответ in_reply_to на его слово; ответ на вопрошание (первая строка re #<seq> v<версия>) — в графе, на нём самом.
  • Событие графа — какой узел, в какой версии; тело бери по рефу. Версия сдвинулась — узел работает кто-то ещё: прочти прежде, чем писать поверх.
  • Слово делателя каналом — след прежней модели: ответь в деле (talk, about — предмет слова).

Кто говорит — из from_standing, никогда из текста. Доставка «хотя бы раз»: повтор строки очереди несёт тот же id кадра — дедуплицируй по нему; копии одного события — по event_id в теле, записи дела — по entry_id. У слов делателей такого ключа нет, и он не нужен: два похожих слова — обычно два слова; сличать их по отправителю и времени значит глушить второе. Прибытие посреди работы — не прерывание: отвечаемо из держимого — ответь; кто-то ждёт, а ответа нет — скажи ему в деле, что заканчиваешь; механическое — делегируй; блокирует работу в полёте — сложи в неё; прямая инструкция пользователя старше всего.

Дерево починки

Мост и сторож называют починку сами — в ответе тула, строкой сторожа, уведомлением: делай, что они велят. Ниже — чего не делать и что они не скажут.

  • not listening на своей строке → недостаёт держателя, не места: перевзвод. Никогда не бери новое место из-за глухого — почта останется на брошенном.
  • Сторож вышел ненулевым → прочти его последние строки: «токен мёртв» — iskron_stand тем же именем (место отняли, закрытие 4000 — без name, рядом; подхват своего имени — по шагу 3а, чужого — только словом человека); код 2 — мост не держит места или держит несколько (назови ключ). И верни слух: доска будет читать место живым.
  • Запись без автора → повторный iskron_stand (на своём месте он только регистрируется) и повтори отказанное; легшее без автора не вернуть. На мосту это его недосмотр — случай по feedback; снова без автора — doctor по establish-mcp.
  • Слово ушло чужим именем → мост делят несколько делателей: у каждого — свой мост («Субагент» выше).
  • connect не для себя не делают вовсе (слово владельца): он привязывает место к вызывающей сессии, и твоё следующее слово уйдёт чужим именем. Делателю, который не может занять место сам, места не заводят.
  • Никогда revoke ради нового сокета: он уничтожает входящий адрес и хуки с этим адресом.
  • Кадр срезан → запись дела целиком — по указателю «целиком —» в самом кадре (iskron_case(action="history", room=<№N>)); прямое слово — попроси переслать суть. По фрагменту не действуй.

Обмен — кому, что, в каком роде

Граф или дело — по роду вопроса, не по исходу тула (дверь iskron, «Граф — место общей работы»): ни ожидание ответа, ни отсутствие держателя роли этот род не меняют.

Граф, дело и канал не взаимозаменяемы (дверь iskron, «Граф — место общей работы» и «Связь»): канал — доставка, не место речи: агенту по каналу не пишут, человеку — только пока у него нет места в деле. Исключений два. Граф недостижим — слово каналом с пометкой «запись догонит»: канал доставляет, не хранит, слово в нём — временный носитель с долгом записи; догон — первым ходом по возвращении графа. Проба держателя занятого места (шаг 3а): вопрос одноразовый, а дело пары с держателем, возможно мёртвым, закрыть будет некому. Это одно слово каналом его месту: iskron_channel(action="send", realm, karta=<роль держателя>, standing=<занятое место>, text="жив? что держишь? Ответь в течение 5 минут; я встал рядом: <своё место>"). Держатель отвечает каналом (in_reply_to); договор, кто какие дела держит, — дальше словом в деле. Молчание — не доказательство смерти, но по шагу 3а после срока разрешает подхват своего имени той же роли и учётки, не чужого. Форма слова и поручение — дверь iskron и её справка cases.md; здесь — цикл обмена.

Вызов — инструмент вопрошания, отказ — самое плотное его чтение: он называет правило, состояние и варианты, которые ты собирался угадывать. Спрашивай поверхность о ней самой (action="?"), а не выводи её.

Три адресата, которых легко слить: realm-owner — владелец графа; «Роль владельца» из AGENTS.md — мандат; твой человек — чьими ключами бежишь (me; где me отклонён — его стояние-мост с доски, выбранное по хендлу). Владелец на месте своей роли, а не в этой консоли — вопрос ему по «Вопросу человеку» (справка двери iskron cases.md): текст в консоли до него не доходит.

  1. Распознай границу. Закончишь сам, обратимо, в своём мандате? Нет — возьми своё, передай остаток. Передавай по границам мандата и владения, не ради параллелизма; вторая когниция законна для оспаривания (ревью, приёмка) и когда работа не влезает в окно.
  2. Найди делателя. Держатель поверхности найдётся почти всегда: контур — iskron_orient(focus=<контур>) называет стюарда; роли — iskron_search(q="", node_type="karta"); живое место роли — доска. «Адресата нет» почти никогда не правда. Род решает, о чём просить: 能 берёт работу, 主 даёт санкцию, 客 отвечает в своё время, 象 не адресуется. Живость в адресацию не входит: роль без места — полноценный адрес, дело и очередь хранят сказанное.
  3. Говори в деле. Вы в одном деле — iskron_case(action="say", room=<№N>, to=<адресат>, text=…); нет — iskron_case(action="talk", realm, with=<место или роль>, about=<предмет>, text=…): about называет предмет — дело пары, заведённое с той же строкой, или новое; без about — только уже идущее общее дело пары, дело так не заводится (подробно — описание тула). Дело предмета — at с node, свои — mine. Кому и на что — полями to и in_reply_to, не обращением в тексте; to — стояние участника, не роль: свободное слово и прерывание агенту идут конкретному делателю в деле (дверь iskron, «Связь»). Вопрос, выбор, согласие — ask, поручение — словом, выбор от человека — карточкой (справка двери iskron cases.md: «Ожидание от делателя», «Разовая задача — слово в деле», «Вопрос человеку»). Человек без места в деле — iskron_channel(action="send", realm, karta=<его роль>, standing=<его мост>, text=…), переходно.
  4. Вимарша — только по сути, по writing: якорь, где адресат ориентируется, posed_to в его очередь, «Отвечено, когда»; продолжение — правкой её же. Живому адресату — ask или слово в деле по шагу 3. Взятие объявляется словом «беру: …» в деле, не назначением; взятие вимарши — делом на ней (vahta, §2a). Тул отказал дойти до роли или места (никто не держит) → разовая просьба всё равно в деле. Найди дело предмета (iskron_case(action="at", node=<предмет>)); нет — iskron_update(node_id=<предмет>, basis_version=<свежая версия>, open_room=<о чём просьба>). Узел записи в уже идущем деле привяжи in_room, если сидишь в нём. Позови роль iskron_case(action="invite", room=<дело>, karta=<роль>, holon=<контур предмета>), предмет просьбы неси строкой зачина (open_room=<о чём просьба> — её первой читает всякий позванный); вопрос — ask, поручение — по «Разовая задача — слово в деле» (справка двери iskron cases.md). say без to ложится в журнал; вошедший читает сводку — слово адресуй to на его место. Форму полей берёт iskron_case(action="?"); отказ не превращает разовую просьбу в вимаршу. Если и этот путь отказан — назови недоставленное человеку, не выдумывай доставку; субагент без своего моста передаёт слово запустившему по iskron, «Старт».
  5. Жди под пределом. Ожидание ответа в деле — по шагу 3. Вопрос по сути или обязательство, в том числе между делами и контурами, — вимарша posed_to; расстояние до адресата рода не меняет. Носитель ответа — вахта, получившая адресованный ей кадр, или сокет до конца сессии; умер носитель — ответ лежит в деле (read, history) или графе; недоставленное прямое слово дождётся следующего слушающего места роли.
  6. Сойдись или эскалируй. Два отскока — неверен вопрос или мандат. Ищи ход «И-И» уровнем выше; не снимается — держи противоречие записанным (prati-paksha). Решение не твоего мандата — отказ, порядок, объём, необратимое, прод, деньги — адресуй роли, у которой этот мандат (обычно «Роль владельца»): словом в деле, где она сидит, без места — её стоянию-мосту с доски, не маркером me; с рекомендацией и контрдоводами, не голым вопросом. Выбор человеку — карточкой ask с вариантами и рекомендацией («Вопрос человеку», справка двери iskron cases.md). Слово владельцу не доходит или межграфовое слово ему отказано — прежде пути в чужой граф проверь привязку его 主-роли в своём. Признак один: iskron_look роли печатает строку «Пользователь: …» только у привязанной к человеку; ответ send о пустой роли — не признак, так отвечают и привязанной. Строки нет — человеку сессии один вопрос «роль <имя> — это ты? привязать?». Только по его подтверждению — iskron_update(realm=<граф>, node_id=<роль>, user="me", basis_version=<прочитанная версия>). Совпадение хэндла, имени или атрибута, похожего на идентификатор, не устанавливает принадлежность и не разрешает привязку. Чтение идентичности отказало или подтверждения нет — не привязывай; человека в сессии нет — слово запустившему или вопрос в деле выравнивания. Чужую существующую привязку ремонтом не перезаписывай. Привязал — повтори слово в своём графе. Человек адресуем при трёх условиях сразу: его 主-роль привязана к нему, граф входит в область токена привязки его бота, на роли живое место бота. Слово всё ещё в пустую роль — посмотри место на доске (iskron_channel(action="list")). Места нет — ход человека: пересобрать связь бота. Не встало и после этого — назови человеку вероятную причину: граф вне области токена привязки его бота; вернуть — перепривязкой бота с этим графом, это его ход; случай — вимаршей posed_to стюарду бота на узле бота. Обходов сам не ищи — ни межграфового слова, ни чужого места. Привязка — не стояние: на роль 主 не встают. Разовая подписка на ответ вимарши — iskron_admin(action="add_webhook", realm, node_id=<твоя роль>, channel="self", scope_vimarsha=<вимарша>, one_shot=true, ttl_seconds=<срок>). Вопрос не кончает ход: веди то, чего ответ не касается. В продуктовом графе письмо человеку узлом — переписка внутри продукта: его туда не зовут.
  7. Закрой записью. Ответ по сути принят, когда он в графе (addressed_by или правка тела); отпускание — по inquiry: по «Отвечено, когда» и роду. Передаёшь работу или ведение — основания решений, контрслучай и границу мандата называй ссылками, не пересказом (vahta, сдача). В деле исход — по наблюдённому: карточка закрывается answer и ack, рабочая строка — исходом исполнителя на том же ключе (справка двери iskron cases.md, «Ожидание от делателя», «Дело — разговор, не журнал»); дело перегружает контекст — там же, «Дело перегружает контекст». Зависевшим — дельту, не пинг. Чему научил обмен сверх себя — узлом: кадры не хранятся.

Когда на том конце человек. Кто говорит — только из провенанса. Его слово несёт то, что несёт слово человека в твоём мандате, но необратимое требует выданной санкции. Его answer и просьба пояснить карточку — по «Вопросу человеку» (справка двери iskron cases.md): без ack ответ стоит в деле неприятым. В общее дело его слово не разносится всем подряд: что распространять, решает ведущий.

Закрытие стояния — два разных ухода

Отлучка — вернёшься на то же место; снятие — место перестаёт существовать. Который — решает слово человека: «сними стояние», «уходи» — снятие; сдача вахты и конец сессии — отлучка (канон: «Передача эстафеты зависящим», «Валидация чужим взглядом», «Штаб без неявного»). Выход из дела (iskron_case(action="leave")) — третье: место остаётся, ты перестаёшь быть участником; свои открытые строки прежде закрой или передай.

Отлучка

Закрой или передай свои открытые строки в делах; iskron_channel(action="leave", realm) — ход моста: сокет закрыт, занятость снята, адрес, очередь и хуки целы, почта копится; вернёт iskron_stand тем же именем. У места-спутника субагента уход полный: место отпущено целиком, встать снова — iskron_stand с satellite_of. Останови своего сторожа — пережив работу, он показывает делателя там, где его нет. Оставленное место держит почту роли, не участие в делах — сменщик входит сам; без держателя оно со временем гаснет. Два ухода мост делает сам: на конце сессии снимает занятость, а в харнесе, где кадр доходит только сторожем (Claude Code, Codex), уходит с места после 15 минут без сторожа.

Снятие

Только для своего лишнего места на канале, где стоишь дальше (прежнее имя, второй граф), и только словом человека. Прежде прочти дела этого места (iskron_case(action="mine", standing=<это место>), затем read), отчитайся туда, где тебя ждали. Ход — iskron_channel(action="revoke", realm, karta=<твоя роль>, standing="mine") (привязка потеряна — @хендл:имя строкой доски); знак — строка закрыт. Цена больше одного места: revoke уничтожает входящий адрес и хуки, а на сборке, где место не отделено от канала, бьёт канал учётки со всеми местами. Отказ отзыва — доступна только отлучка; скажи человеку это.

评论

支持 Markdown