@agfpd/iapeer 0.2.98 → 0.2.99

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.
Files changed (32) hide show
  1. package/README.md +1 -1
  2. package/docs/01-overview.md +86 -0
  3. package/docs/02-quickstart.md +110 -0
  4. package/docs/03-peers-runtimes-identity.md +117 -0
  5. package/docs/04-lifecycle-and-daemon.md +101 -0
  6. package/docs/05-system-prompt.md +82 -0
  7. package/docs/06-storage.md +115 -0
  8. package/docs/07-install-and-update.md +87 -0
  9. package/docs/08-peer-management.md +119 -0
  10. package/docs/09-runtimes.md +103 -0
  11. package/docs/10-messaging.md +69 -0
  12. package/docs/11-extensions-and-memory.md +60 -0
  13. package/docs/12-cli-reference.md +96 -0
  14. package/docs/13-architecture-and-contract.md +190 -0
  15. package/docs/14-configuration-and-logs.md +91 -0
  16. package/docs/README.md +97 -0
  17. package/docs/ru/01-/320/276/320/261/320/267/320/276/321/200.md +86 -0
  18. package/docs/ru/02-/320/261/321/213/321/201/321/202/321/200/321/213/320/271-/321/201/321/202/320/260/321/200/321/202.md +110 -0
  19. package/docs/ru/03-/320/277/320/270/321/200/321/213-/321/200/320/260/320/275/321/202/320/260/320/271/320/274/321/213-/320/270/320/264/320/265/320/275/321/202/320/270/321/207/320/275/320/276/321/201/321/202/321/214.md +117 -0
  20. package/docs/ru/04-/320/266/320/270/320/267/320/275/320/265/320/275/320/275/321/213/320/271-/321/206/320/270/320/272/320/273-/320/270-/320/264/320/265/320/274/320/276/320/275.md +101 -0
  21. package/docs/ru/05-/321/201/320/270/321/201/321/202/320/265/320/274/320/275/321/213/320/271-/320/277/321/200/320/276/320/274/320/277/321/202.md +82 -0
  22. package/docs/ru/06-/321/205/321/200/320/260/320/275/320/265/320/275/320/270/320/265.md +115 -0
  23. package/docs/ru/07-/321/203/321/201/321/202/320/260/320/275/320/276/320/262/320/272/320/260-/320/270-/320/276/320/261/320/275/320/276/320/262/320/273/320/265/320/275/320/270/320/265.md +87 -0
  24. package/docs/ru/08-/321/203/320/277/321/200/320/260/320/262/320/273/320/265/320/275/320/270/320/265-/320/277/320/270/321/200/320/260/320/274/320/270.md +119 -0
  25. package/docs/ru/09-/321/200/320/260/320/275/321/202/320/260/320/271/320/274/321/213.md +103 -0
  26. package/docs/ru/10-/320/276/320/261/320/274/320/265/320/275-/321/201/320/276/320/276/320/261/321/211/320/265/320/275/320/270/321/217/320/274/320/270.md +69 -0
  27. package/docs/ru/11-/321/200/320/260/321/201/321/210/320/270/321/200/320/265/320/275/320/270/321/217-/320/270-/320/277/320/260/320/274/321/217/321/202/321/214.md +60 -0
  28. package/docs/ru/12-cli-reference.md +96 -0
  29. package/docs/ru/13-/320/260/321/200/321/205/320/270/321/202/320/265/320/272/321/202/321/203/321/200/320/260-/320/270-/320/272/320/276/320/275/321/202/321/200/320/260/320/272/321/202.md +190 -0
  30. package/docs/ru/14-/320/272/320/276/320/275/321/204/320/270/320/263/321/203/321/200/320/260/321/206/320/270/321/217-/320/270-/320/266/321/203/321/200/320/275/320/260/320/273/321/213.md +91 -0
  31. package/docs/ru/README.md +97 -0
  32. package/package.json +4 -2
@@ -0,0 +1,119 @@
1
+ # 08 — Управление пирами
2
+
3
+ **Русский** · [English](../08-peer-management.md)
4
+
5
+ Повседневные операции с пирами. Полные сигнатуры команд с флагами — в [12 — CLI](12-cli-reference.md); здесь — когда и зачем применять каждую.
6
+
7
+ ## Создание пира: create и init
8
+
9
+ Создать пир можно двумя командами, и разница между ними — в том, откуда берётся рабочая папка.
10
+
11
+ **`iapeer create <имя>`** создаёт пир из любого места. Команда сама выбирает папку (по умолчанию `~/.iapeer/peers/<имя>`, или укажите `--path`), разворачивает её и инициализирует. Это основной способ.
12
+
13
+ ```bash
14
+ iapeer create assistant --runtime claude
15
+ iapeer create reviewer --runtime codex --description "Ревью кода и архитектуры"
16
+ iapeer create helper --path ~/projects/helper --runtime claude
17
+ ```
18
+
19
+ **`iapeer init`** превращает в пир текущую (или указанную) папку. Это удобно, когда у пира уже есть своя папка проекта и хочется, чтобы `.iapeer/` появился прямо в ней.
20
+
21
+ ```bash
22
+ cd ~/projects/myagent
23
+ iapeer init
24
+ ```
25
+
26
+ Имя пира берётся из имени папки (нормализованный `basename` — `myagent`); отдельного флага для имени нет — чтобы пир назывался иначе, переименуйте папку. Рантайм определяется автоматически из установленных (Claude/Codex), при необходимости задаётся флагом `--runtime`.
27
+
28
+ По сути `create` — это «выбрать/создать папку, затем `init`». Обе команды выполняют одно и то же наполнение пира:
29
+
30
+ - пишут профиль `peer-profile.json`;
31
+ - заносят пир в реестр;
32
+ - настраивают подключение к демону по MCP (так агент получит `send_to_peer`);
33
+ - создают файл доктрины `IAPEER.md` для наполнения;
34
+ - если занят слот памяти — подключают общую память и проводят связанную с этим настройку рантайма.
35
+
36
+ Защита от затирания: если в целевой папке уже живёт другой пир (с другим именем в профиле), команда откажет, а не перезапишет.
37
+
38
+ Флаг `--no-bootstrap` создаёт пир, не запуская его службу (актуально для инфраструктурных пиров, которые иначе сразу поднимаются под launchd).
39
+
40
+ ## Обзор пиров: list
41
+
42
+ ```bash
43
+ iapeer list # таблица
44
+ iapeer list --json # машинно-читаемый формат
45
+ ```
46
+
47
+ Каждая строка — пир, его рантаймы и состояние каждого: `●` живой, `○` спит, `✕` остановлен. Если запустить в интерактивном терминале, `list` открывает панель управления (стрелки для навигации, Enter — присоединиться, `/` — поиск, `q` — выход); в неинтерактивном режиме или с `--json` печатает таблицу для скриптов.
48
+
49
+ ## Проверка целостности: verify
50
+
51
+ ```bash
52
+ iapeer verify # отчёт о расхождениях
53
+ iapeer verify --fix # починить
54
+ ```
55
+
56
+ `verify` проверяет две вещи: соответствие профилей стандарту и расхождения между реестром и локальными профилями. С `--fix` команда самовосстанавливает реестр из профилей (и попутно мигрирует профили со старого формата поля рантайма на актуальный). Это штатный способ привести реестр в порядок, если он рассинхронизировался.
57
+
58
+ ## Остановка и запуск: stop, start
59
+
60
+ ```bash
61
+ iapeer stop assistant # остановить
62
+ iapeer start assistant # снять остановку
63
+ iapeer stop --all # остановить всех пиров
64
+ iapeer start --all # снять остановку со всех
65
+ ```
66
+
67
+ Поведение зависит от класса рантайма:
68
+
69
+ - **Агент claude/codex.** `stop` ставит стойкий стоп-флаг и закрывает сессию — демон не будит пир, пока не выполнят `start`. `start` снимает флаг: пир снова можно разбудить, но **сессия не запускается сразу** — демон поднимет её при первом сообщении.
70
+ - **Инфраструктурный пир.** `stop` снимает службу с launchd, `start` загружает обратно.
71
+
72
+ Можно адресовать конкретный рантайм: `iapeer stop assistant codex`.
73
+
74
+ ## Безусловный перезапуск: new
75
+
76
+ ```bash
77
+ iapeer new assistant
78
+ ```
79
+
80
+ `new` — аварийный рычаг для зависшей или мёртвой сессии. В отличие от мягкого пути (когда живой агент сам читает команду и перезапускается), `new` действует механически, в обход агента: чисто сносит текущую сессию и поднимает свежую. Команда возвращает успех только тогда, когда свежая сессия действительно поднялась и готова. Это спасение для случая, когда агент завис настолько, что не читает ничего.
81
+
82
+ ## Ленивый мягкий перезапуск: refresh
83
+
84
+ ```bash
85
+ iapeer refresh assistant # пометить пира на свежий старт при следующем пробуждении
86
+ iapeer refresh --all # пометить все пиры
87
+ ```
88
+
89
+ `refresh` — отложенный рычаг для случая «обновилась доктрина, хочу, чтобы команда её перечитала, но без рывка». Он **только ставит маркер**: не убивает живую сессию, не будит спящих, не делает немедленный перезапуск. Эффект наступает сам собой — на **следующем естественном пробуждении** пира (после штатного усыпления за простой, или на следующем сообщении спящему): вместо продолжения прежнего диалога поднимется свежая сессия, которая перечитает доктрину и фрагменты с диска.
90
+
91
+ Зачем отдельно от `new`: `new` — немедленный и жёсткий (рвёт текущую работу), а массовый `new --all` поднял бы разом всю команду. `refresh` — ленивый и мягкий: живую работу не трогает, всплеска пробуждений нет, свежесть приходит к каждому пиру в его обычный момент подъёма. Маркер перекрывает «продолжение» для **всех** типов пиров, в том числе людей-в-Telegram, которые иначе продолжают старую сессию до явного `/new`. Роутеры (notifier/telegram) и absent-рантаймы пропускаются — у них нет доктрины. Применять `refresh` — осознанный шаг оператора (например после релиза обновлённой доктрины), а не автоматический побочный эффект.
92
+
93
+ ## Удаление: remove
94
+
95
+ ```bash
96
+ iapeer remove assistant # удалить запись из реестра
97
+ iapeer remove assistant --force # удалить, даже если пир сейчас живой
98
+ ```
99
+
100
+ `remove` удаляет запись пира из реестра. Важные свойства:
101
+
102
+ - **Папку пир не удаляет.** Данные пира (его `.iapeer/`, история, память) остаются на диске — `remove` чистит только запись в реестре. Если папка была одноразовой, удалите её сами.
103
+ - **Отказывает живому пиру.** Удалить запись работающего пира — значит оторвать его сессию от маршрутизации. Команда откажет, пока пир жив; обойти можно флагом `--force`, но честнее сначала остановить.
104
+ - **Идемпотентно.** Удаление несуществующего пира — не ошибка, а успешный ноль.
105
+
106
+ Типичное применение — подчистить «зомби»-записи, оставшиеся от завершившихся одноразовых пиров.
107
+
108
+ ## Присоединение к сессии: attach
109
+
110
+ ```bash
111
+ iapeer attach assistant
112
+ iapeer attach assistant codex # конкретный рантайм
113
+ ```
114
+
115
+ `attach` поднимает пир, если тот спит, продолжает его прежний диалог и открывает его сессию под супервизором прямо в вашем терминале — как обычную консоль. Отсоединиться — сочетанием `Ctrl-]` или просто закрыть терминал; сессия в любом случае продолжает работать в фоне, а `iapeer attach` снова подключит вас, когда понадобится.
116
+
117
+ ## Граница: чужой launchd неприкосновенен
118
+
119
+ Команды `stop`, `start`, `new` **отказываются трогать пиров, которыми управляет чужой launchd-плист** (например, действующие пиры под отдельным менеджером жизненного цикла). Для таких пиров ядро — только читатель: вмешательство означало бы драку с launchd за управление процессом. Это сознательная защита, а не ограничение — она не даёт ядру случайно сломать то, чем владеет не оно.
@@ -0,0 +1,103 @@
1
+ # 09 — Рантаймы
2
+
3
+ **Русский** · [English](../09-runtimes.md)
4
+
5
+ Рантайм — способ присутствия пира. Ядро знает четыре: `claude`, `codex`, `telegram`, `notifier`. Первые два — AI-агенты, вторые два — инфраструктурные роутеры.
6
+
7
+ ## Агентские рантаймы: claude, codex
8
+
9
+ Демон поднимает агента на входящее сообщение в сессии под pty-супервизором и закрывает её после часа простоя. Системный промпт ([05](05-системный-промпт.md)) подменяется штатным механизмом рантайма.
10
+
11
+ **Claude** запускается с флагом `--system-prompt-file`, который заменяет встроенный системный промпт собранным iapeer текстом. Продолжение диалога идёт через `--continue` (берётся последняя сессия), не через выбор сессии по идентификатору. История диалога лежит в `~/.claude/projects/<папка>/*.jsonl`.
12
+
13
+ **Codex** получает промпт настройкой `model_instructions_file` (`codex -c model_instructions_file=<файл>`), которая подменяет компилированные базовые инструкции. Продолжение — `codex resume --last`. История — в `~/.codex/sessions/`. Подключение к демону по MCP у Codex идёт через токен-заголовок: Codex закрывает HTTP-MCP за проверкой токена, поэтому ядро подставляет нерабочий «пустой» токен (он не несёт защитной функции), а демон узнаёт пир по заголовку `X-IAPeer-Identity`.
14
+
15
+ При настройке Codex ядро host-wide гасит стартовый диалог проверки обновлений (`check_for_update_on_startup = false` в `config.toml`). Интерактивное «доступно обновление, нажмите Enter» — это шлагбаум на загрузке: разбуженная демоном headless-сессия Codex зависла бы на нём, не дойдя до готовности, пока к ней не подключится человек. Обновления Codex остаются ручными (`codex update` либо brew), а не вопросом на старте. Уже выставленное оператором значение ключа ядро не переписывает.
16
+
17
+ Запустить агента в текущей папке вручную, свежей сессией:
18
+
19
+ ```bash
20
+ iapeer claude # поднять пир текущей папки в Claude
21
+ iapeer codex # в Codex
22
+ ```
23
+
24
+ Тонкие флаги запуска для конкретной пары пир+рантайм задаются в `<папка>/.iapeer/runtimes/<рантайм>/launch.env` ([06](06-хранение.md)).
25
+
26
+ ### Какой рантайм выбирается при создании пира
27
+
28
+ Когда пир создаётся (`create` / `init`), основной рантайм определяется по слоям:
29
+
30
+ 1. Явный `--runtime` — берётся он, но сначала проверяется, что рантайм установлен; если нет, команда завершается внятной ошибкой, а не принимает несуществующий рантайм молча.
31
+ 2. Иначе — маркер в папке (`.claude` / `.codex`): папка, уже сконфигурированная под рантайм, сохраняет его. Маркер в приоритете и на установленность не перепроверяется.
32
+ 3. Иначе — из установленных на хосте: ровно один установлен — он; ни одного — внятная ошибка (а не тихий Claude на хосте без рантайма); установлены оба — по умолчанию Claude (выбрать Codex явно — `--runtime codex`).
33
+
34
+ Установленность рантайма ядро определяет по его лаунчеру — переменная `IAPEER_<РАНТАЙМ>_BIN`, нативное расположение установщика, затем `PATH` — и по глобальному каталогу конфигурации (`~/.claude` / `~/.codex`).
35
+
36
+ ## Инфраструктурные рантаймы: telegram, notifier
37
+
38
+ Это долгоживущие процессы-роутеры, не AI. Работают постоянно под launchd; демон их не поднимает и не усыпляет.
39
+
40
+ **telegram** — мост Telegram ↔ пиры. Требует, чтобы пир был природы `natural` (человек): попытка завести Telegram-присутствие у AI-агента отклоняется. Запускается как `telegram-runtime run`.
41
+
42
+ **notifier** — планировщик. Разворачивает служебных пиров `timer` (срабатывает по расписанию) и `watcher` (следит за событиями). Запускается как `notifier-runtime run`.
43
+
44
+ Плисты инфраструктурных пиров, в отличие от плиста демона, **загружаются автоматически** при `iapeer create --runtime telegram|notifier` и при `iapeer onboard` (если не передан `--no-bootstrap`). Поэтому отдельный `launchctl bootstrap` для них не нужен.
45
+
46
+ ## Несколько рантаймов у пира
47
+
48
+ В профиле пира два поля про рантаймы: `runtimes` (все, на которых пир может присутствовать) и `default_runtime` (основной — куда маршрутизируются сообщения и какой поднимается первым). Расширить возможности и переключить основной рантайм — разные команды.
49
+
50
+ ### add-runtime — добавить рантайм
51
+
52
+ ```bash
53
+ iapeer add-runtime codex --peer assistant # одному пиру
54
+ iapeer add-runtime codex --all # всем пирам
55
+ ```
56
+
57
+ Добавляет агентский рантайм существующим пирам: дописывает его в `runtimes`, разворачивает пространство рантайма и проводит полную настройку для Codex (предварительное доверие к папке, рычаг родной памяти, подключение памяти, MCP). `default_runtime` команда **не трогает** — это расширение возможностей, не смена маршрутизации. Идемпотентна. Инфраструктурные пиры пропускаются: добавить им агентский рантайм — решение оператора через `create`, а не массовая операция.
58
+
59
+ ### default-runtime — переключить основной
60
+
61
+ ```bash
62
+ iapeer default-runtime codex --peer assistant # одному
63
+ iapeer default-runtime codex --all # все пиры
64
+ ```
65
+
66
+ Переключает основной рантайм — куда идёт маршрутизация и какой рантайм поднимается первым. Массовое переключение `--all` — это и есть «пересадка» всей команды с одного агентского рантайма на другой; обратно симметрично (`default-runtime claude --all`). Команда откажет, если пир не объявляет этот рантайм (сначала `add-runtime`), и пропустит инфраструктурных. Реестр чинится в той же команде, поэтому маршрутизация переключается сразу.
67
+
68
+ ## Подключение Telegram: connect
69
+
70
+ ```bash
71
+ iapeer connect telegram assistant --token <токен-бота>
72
+ ```
73
+
74
+ Подключает Telegram-бота к пиру за один проход: регистрирует бота, прописывает его в профиль пира, перезапускает роутер. От человека нужен только токен (у `@BotFather`). После — отправьте боту **первое сообщение**: Telegram не позволяет боту начать чат первым, поэтому канал оживёт только после входящего от человека.
75
+
76
+ Команда идемпотентна, и поведение зависит от токена. **Тот же токен** — чистый no-op: файл учётных данных бота не меняется, живой роутер уже работает на этих данных, перезапуска нет. **Новый или изменённый токен** требует перезапуска роутера (учётные данные читаются только при старте) — это секундная пауза в доставке для всех Telegram-пиров; входящие при этом не теряются (long-polling помнит смещение, Telegram держит сообщения до 24 часов). Неверный токен отсекается сразу, с дословной причиной от Telegram.
77
+
78
+ ## Рантайм-пакеты
79
+
80
+ Инфраструктурные рантаймы поставляются отдельными npm-пакетами (`*-runtime`). Ставит и обновляет их ядро:
81
+
82
+ ```bash
83
+ iapeer install-runtime notifier # установить пакет + развернуть его пиров
84
+ iapeer update-runtime notifier # обновить с перезапуском пиров
85
+ iapeer update-runtime --all # обновить все рантайм-пакеты
86
+ ```
87
+
88
+ `install-runtime` ставит пакет и разворачивает объявленный им набор пиров (notifier разворачивает `timer` и `watcher`); флаг `--no-bootstrap` ставит пакет, не загружая его пиров в launchd. Рантайм без объявленного набора (telegram) — это режим «добавляет оператор»: пиров заводят вручную через `iapeer create <имя> --runtime telegram`.
89
+
90
+ ### Деплой рантайм-пакета: всегда из облака, как `iapeer update`
91
+
92
+ Доставка рантайм-пакета следует тому же разделению **release ≠ deploy**, что и ядро (см. [07 — Установка и обновление](07-установка-и-обновление.md)). `iapeer update-runtime <рантайм>` — это рантайм-аналог `iapeer update`: деплой на хост **из облака (npm)**, а не из локального рабочего дерева. Он:
93
+
94
+ 1. **version-gate** — сверяет npm-latest с `version`-штампом манифеста (`~/.iapeer/runtimes/<рантайм>/runtime.json`); установлен latest → no-op (`already-latest`). Без штампа гейт пропускается, переустановка идёт идемпотентно (и сообщает об этом) — поэтому штамповать `version` в манифест обязанность пакета (иначе ломается и `update-runtime`-гейтинг, и наблюдаемость версии в `iapeer status` и аудите версий по пирам).
95
+ 2. **re-install** — форс-`npx @agfpd/<рантайм>-runtime`: **тянет пакет из npm** и даёт ему self-deploy'ить новый бинарь + манифест. Источник — опубликованный пакет, **не** рабочее дерево.
96
+ 3. **re-provision** — идемпотентно тем же путём, что `install-runtime` (sync описаний, re-self-config; живые пиры не клоббятся).
97
+ 4. **restart** — перезапускает зарегистрированных пиров рантайма обычными `stop`/`start`. Они **host-aware**: пир под супервизором корректно гасится (kill супервизора и ребёнка) и поднимается заново на новом бинаре — отдельная процедура не нужна.
98
+
99
+ Соответственно, **локальный self-install из рабочего дерева — это dev-проба, а не деплой** (аналог запуска ядра из исходников `bun src/...`). Деплоить рантайм надо из облака: сначала release (`npm publish` — в облако, живые хосты не трогает), затем deploy (`update-runtime` — pull из облака + перезапуск). Обход npm (активация локального кода через self-install) рассинхронизирует npm и хост и невоспроизводим на новом хосте: чистый хост поднимает рантайм только из npm (`install-runtime`, далее `update-runtime`). Ядро (`iapeer update`) сознательно НЕ трогает рантайм-пакеты — симметрия намеренная.
100
+
101
+ Путь к лаунчеру рантайма по умолчанию резолвится из `PATH`; переопределить его (например для launchd с минимальным `PATH`) можно переменными `NOTIFIER_RUNTIME_BIN` / `TELEGRAM_RUNTIME_BIN` — см. [14 — Конфигурация и журналы](14-конфигурация-и-журналы.md).
102
+
103
+ Контракт рантайм-пакета — формат манифеста, обязанности, команды — в [13 — Архитектура и контракт](13-архитектура-и-контракт.md).
@@ -0,0 +1,69 @@
1
+ # 10 — Обмен сообщениями
2
+
3
+ **Русский** · [English](../10-messaging.md)
4
+
5
+ Пиры обмениваются сообщениями по протоколу IAP. Агенты делают это инструментом `send_to_peer`, оператор — командой `iapeer send`. Оба пути ведут через один и тот же роутинг демона.
6
+
7
+ ## Два способа отправить
8
+
9
+ **`send_to_peer`** — MCP-инструмент, который получает каждый агент claude/codex (через подключение к демону). Это основной канал между агентами.
10
+
11
+ ```text
12
+ send_to_peer(personality="assistant", message="...", topic?, attachments?)
13
+ ```
14
+
15
+ **`iapeer send`** — отправка из командной строки, тот же путь доставки в обход агентской сессии (работает, даже когда HTTP-слушатель демона недоступен):
16
+
17
+ ```bash
18
+ iapeer send assistant --message "текст"
19
+ iapeer send assistant --message-file ./report.md # тело из файла; '-' = stdin
20
+ iapeer send assistant --message "см. вложение" --attachment ./report.pdf
21
+ iapeer send assistant --message "..." --topic "релиз" --from claude-reviewer
22
+ ```
23
+
24
+ Флаг `--from` задаёт отправителя (`<рантайм>-<имя>`); по умолчанию — идентичность пира текущей папки. `--attachment` повторяемый. `--message-file` с телом из файла или stdin удобен для длинных и многострочных сообщений.
25
+
26
+ ## Путь доставки
27
+
28
+ Демон находит получателя в реестре и смотрит на его состояние:
29
+
30
+ - **живой** — демон пишет сообщение в сессию пира через сокет супервизора на ввод сессии. Демон ждёт подтверждения, что ввод принят (поле ввода очистилось); ответ — `доставлено`.
31
+ - **занят** (агент в середине хода, поле ввода не пустое) — сообщение встаёт в очередь композера и доставляется, как только агент освободится; ответ отправителю — `в очереди`. Очередь ждёт до 120 секунд, потом досылает принудительно.
32
+ - **спит** — демон поднимает сессию, перепроверяет получателя, доставляет; ответ — `доставлено, разбудил`.
33
+ - **остановлен** — демон отказывает и сообщает отправителю прямо.
34
+
35
+ Ключевая гарантия: `доставлено` означает, что сообщение действительно легло в живую сессию (демон дождался подтверждения), а не просто было отправлено в пустоту. Если сессия не подтвердила приём в отведённое время, демон считает её мёртвой и не лжёт об успехе.
36
+
37
+ В конверте каждого сообщения едет природа отправителя (`intelligence`) — получатель знает, пишет ему человек, агент или служебный процесс.
38
+
39
+ ## Ограничения сообщения
40
+
41
+ У протокола есть пределы: тело сообщения — до 16000 символов, тема — до 200, вложений — до 20 за раз. Сообщение сверх лимита нужно разбивать или передавать содержимое файлом-вложением.
42
+
43
+ ## Отправка в Telegram только со своим ботом
44
+
45
+ Пир не может слать сообщения в Telegram-домен, если у него нет привязанного Telegram-бота. Это защита: ответ человеку уходит через бота конкретного агента, и пир без такой привязки в Telegram не пишет — доставка ему отказывается. Привязка делается командой `iapeer connect telegram` (см. [09 — Рантаймы](09-рантаймы.md)).
46
+
47
+ ## Контрольные команды
48
+
49
+ Контроль сессии идёт отдельным каналом от сообщений — это не текст в диалог, а управляющее воздействие:
50
+
51
+ ```bash
52
+ iapeer interrupt assistant # прервать текущий ход (Escape), контекст цел
53
+ iapeer compact assistant # сжать диалог
54
+ ```
55
+
56
+ `interrupt` останавливает зашедший не туда или зависший ход, не теряя контекст. `compact` сжимает диалог; если пир спит после чистого усыпления, демон сначала продолжит диалог, потом сожмёт, а для пустой сессии честно ответит, что сжимать нечего.
57
+
58
+ Отдельно стоят **алиасы** — шорткаты вида `/alias-new`, `/alias-compact`, заданные в профиле пира. Это не контроль, а заготовки текста: рантайм разворачивает алиас в полный текст и доставляет его пиру как обычное сообщение. Так оператор одной короткой командой запускает заранее прописанный сценарий (например, «сохрани состояние в память и перезапустись свежим»).
59
+
60
+ ## Эфемерные воркеры
61
+
62
+ Пир с политикой пробуждения `wake_policy: "ephemeral"` в профиле работает иначе обычного агента — он предназначен для одноразовых задач:
63
+
64
+ - **всегда свежий.** Каждая задача поднимает свежую сессию, без продолжения прошлого диалога.
65
+ - **очередь по одной.** Задачи такому пиру не доставляются в живую сессию параллельно — они выстраиваются в durable-очередь (переживает перезапуск демона) и обрабатываются строго по одной. Демон докармливает очередь на надзорных тиках.
66
+ - **завершение после ответа.** Отправив свой единственный ответ, воркер помечается на тихое сворачивание: окно тишины (по умолчанию 20 секунд) — и демон закрывает сессию, никого не будя. Если воркер молчит и не отвечает, страховочный предел (по умолчанию 600 секунд) всё равно его свернёт.
67
+ - **`iapeer self-done`** — самовызов воркера, которому нечего отправить: освобождает очередь под следующую задачу, не разбудив никого. Доктрина «нечего отправлять — `self-done` вместо пустого ответа».
68
+
69
+ Эта модель держит поток одноразовых задач упорядоченным: один воркер на задачу, без накопления параллельных сессий, без пустых пробуждений адресата.
@@ -0,0 +1,60 @@
1
+ # 11 — Расширения и память
2
+
3
+ **Русский** · [English](../11-extensions-and-memory.md)
4
+
5
+ Возможности пира расширяются двумя видами пакетов: capability-плагины (способности — инструменты, контекст) и рантайм-пакеты (способы присутствия). Память — отдельный механизм: один провайдер на хост через слот. Этот раздел — как этим пользоваться; контракт для разработчиков пакетов — в [13 — Архитектура и контракт](13-архитектура-и-контракт.md).
6
+
7
+ ## Capability-плагины: enable
8
+
9
+ Плагин добавляет пиру способность, не будучи рантаймом, — общую память, синтез речи, набор навыков. Подключение:
10
+
11
+ ```bash
12
+ iapeer enable peer-voice assistant # подключить плагин пиру
13
+ iapeer enable iapeer-memory # пиру текущей папки
14
+ iapeer enable peer-voice assistant --no-setup # без шага установки плагина
15
+ ```
16
+
17
+ Команда ставит плагин на каждом агентском рантайме пира (для Claude — в область проекта внутри папки пира, для Codex — в общий конфиг хоста), включает его и, если плагин объявляет шаг установки, выполняет его. Операция идемпотентна и не мешает другим пирам: для Claude привязка идёт по папке конкретного пира.
18
+
19
+ Локальный снимок marketplace у рантайма может отставать: плагин, зарегистрированный в marketplace уже после последней синхронизации хоста, до неё читается как «неизвестный плагин». Поэтому, если установка с первого раза не прошла, `enable` обновляет снимок marketplace рантайма (Claude — `marketplace update`, Codex — `marketplace upgrade`) и повторяет попытку один раз.
20
+
21
+ ## Слот памяти
22
+
23
+ Память в iapeer — first-class опция, не встроенная функция. Её даёт **провайдер памяти** — отдельный пакет, занимающий единственный на хост слот. Слот либо занят ровно одним провайдером, либо пуст; пустой слот — нормальное состояние.
24
+
25
+ Провайдер по умолчанию ставится при онбординге:
26
+
27
+ ```bash
28
+ iapeer onboard # ставит провайдера по умолчанию, если слот пуст
29
+ iapeer onboard --memory <пакет> # указать другого провайдера
30
+ iapeer onboard --no-memory # оставить слот пустым
31
+ ```
32
+
33
+ Состояние слота показывает `iapeer status` — имя провайдера, версия и свежесть его демона (или `none`, если слот пуст).
34
+
35
+ Эталонный провайдер — **iapeer-memory** (`@agfpd/iapeer-memory`), он же ставится по умолчанию. Это общая память команды: канон знаний (знания, решения, идеи, проекты, списки) и личная оперативка каждого агента, с поиском по содержимому и графу связей. Память доезжает агенту двумя путями — карта его заметок попадает в системный промпт слоем фрагментов ([05 — Системный промпт](05-системный-промпт.md)), а читает и пишет он через MCP-инструменты провайдера. Подробности — в собственной документации iapeer-memory.
36
+
37
+ Когда слот занят, ядро на стыках жизни пира зовёт команды провайдера: при рождении пира (`birth`) — настроить ему память, при удалении (`remove`) — свернуть. Формат манифеста провайдера, команды и моменты вызова — в [13](13-архитектура-и-контракт.md).
38
+
39
+ ### Родная память рантайма
40
+
41
+ У Claude и Codex есть собственная встроенная память. Когда слот занят провайдером, держать параллельно ещё и родную память рантайма вредно — копится второй, никем не курируемый набор. Поэтому при рождении пира с занятым слотом ядро автоматически отключает родную память его рантаймов.
42
+
43
+ Управлять этим вручную:
44
+
45
+ ```bash
46
+ iapeer native-memory off --peer assistant # отключить родную память
47
+ iapeer native-memory on --peer assistant # вернуть как было
48
+ iapeer native-memory off --all # по всем пирам
49
+ ```
50
+
51
+ ## Рантайм-пакеты
52
+
53
+ Способы присутствия (Telegram, планировщик) поставляются рантайм-пакетами:
54
+
55
+ ```bash
56
+ iapeer install-runtime notifier # установить + развернуть объявленных пиров
57
+ iapeer update-runtime --all # обновить все рантайм-пакеты
58
+ ```
59
+
60
+ `install-runtime` ставит пакет и разворачивает объявленный им набор пиров (notifier — `timer` и `watcher`). Рантайм без объявленного набора (telegram) заводит пиров оператор через `iapeer create … --runtime telegram`. Подробности подключения Telegram — [09 — Рантаймы](09-рантаймы.md); контракт рантайм-пакета — [13](13-архитектура-и-контракт.md).
@@ -0,0 +1,96 @@
1
+ # 12 — CLI
2
+
3
+ **Русский** · [English](../12-cli-reference.md)
4
+
5
+ Полный перечень команд `iapeer <команда>`. Общие правила: `--help` / `-h` в любом месте строки печатает справку и ничего не выполняет; флаги принимают форму `--key value` и `--key=value`.
6
+
7
+ ## Установка и обслуживание ядра
8
+
9
+ | Команда | Что делает |
10
+ |---|---|
11
+ | `install` | Bootstrap ядра: собрать бинарь `~/.local/bin/iapeer`, создать раскладку `~/.iapeer/`, записать плист демона (без загрузки). |
12
+ | `update [версия] [--force]` | Обновить ядро из npm, перезапустить демон, перезапустить инфра-службы ядра. Без аргумента — до последней версии; с версией — до точной. `--force` переустанавливает даже при совпадении версий. |
13
+ | `rollback` | Вернуть предыдущий бинарь (`.prev`), перезапустить демон, проверить здоровье. На один уровень назад. |
14
+ | `version` · `--version` · `-v` | Версия установленного бинаря. |
15
+ | `help` · `--help` · `-h` | Справка по командам. |
16
+ | `daemon [--install-plist]` | Запустить роутер (обычно держит launchd). `--install-plist` только пишет плист, не загружая. |
17
+
18
+ `update` проверяет здоровье демона после перезапуска: если демон не ожил — команда возвращает ненулевой код и советует `rollback`.
19
+
20
+ ## Хост
21
+
22
+ | Команда | Что делает |
23
+ |---|---|
24
+ | `onboard [флаги]` | Подготовка хоста: marketplace (Claude + Codex) → notifier → Telegram (пир-человек) → провайдер памяти. Все шаги по умолчанию включены. |
25
+ | `status` | Снимок хоста: версия, здоровье демона, слот памяти. Код возврата ненулевой, если демон нездоров. |
26
+ | `install-runtime <рантайм> [--package <пакет>] [--npx] [--no-bootstrap]` | Установить рантайм-пакет и развернуть его объявленный набор пиров. `--no-bootstrap` — не загружать пиров в launchd. |
27
+ | `update-runtime <рантайм> \| --all [--force]` | Обновить рантайм-пакет(ы) с перезапуском их пиров. |
28
+
29
+ Флаги `onboard`: `--dry-run` (показать без изменений), `--no-notifier`, `--no-telegram`, `--no-memory`, `--telegram-human <имя>`, `--telegram-user-id <id>`, `--memory <пакет>`, `--infra <список>`.
30
+
31
+ ## Пиры: создание и обзор
32
+
33
+ | Команда | Что делает |
34
+ |---|---|
35
+ | `init [папка] [--runtime r] [--description d] [--bin путь] [--no-bootstrap]` | Сделать текущую (или указанную) папку пиром: профиль, MCP, доктрина. Имя пира — это имя папки; отдельным флагом не задаётся. |
36
+ | `create <имя> [--runtime r] [--path папка] [--bin путь] [--description d] [--intelligence i] [--no-bootstrap]` | Создать пир из любого места (по умолчанию `~/.iapeer/peers/<имя>`) и провизионировать. |
37
+ | `list [--json]` | Реестр пиров с состоянием по рантаймам. В интерактивном терминале — панель управления; иначе или с `--json` — таблица. |
38
+ | `verify [--json] [--fix]` | Проверка профилей на соответствие стандарту и расхождений реестр↔профиль. `--fix` самовосстанавливает реестр и мигрирует старый формат поля рантайма. |
39
+
40
+ ## Пиры: жизненный цикл
41
+
42
+ | Команда | Что делает |
43
+ |---|---|
44
+ | `stop <пир> [рантайм] \| --all` | Агент: стоп-флаг + закрыть сессию (демон не будит). Инфра: снять с launchd. `--all` — все пиры. |
45
+ | `start <пир> [рантайм] \| --all` | Снять стоп-флаг (сессия поднимется на первом сообщении). Инфра: загрузить в launchd. |
46
+ | `new <пир> [рантайм]` | Безусловный свежий перезапуск — аварийный рычаг для зависшей/мёртвой сессии, в обход агента. Код 0 = свежая сессия поднята и готова. |
47
+ | `refresh <пир> [рантайм] \| --all` | Ленивый «мягкий перезапуск»: агентский пир поднимется свежим (перечитает доктрину/фрагменты с диска) на своём СЛЕДУЮЩЕМ естественном пробуждении. Не убивает живую сессию, не будит остальных, не делает немедленный перезапуск — только ставит маркер. Роутеры (notifier/telegram) и absent-рантаймы пропускаются (у них нет доктрины). `--all` — все пиры. |
48
+ | `remove <пир> [--force]` | Удалить запись из реестра (папку пира не трогает). Отказывает живому пиру без `--force`. Идемпотентно. |
49
+ | `attach <пир> [рантайм]` | Поднять (если спит), продолжить диалог, открыть сессию под супервизором в терминале (отсоединиться — `Ctrl-]`). |
50
+ | `interrupt <пир> [рантайм]` | Прервать текущий ход (Escape), контекст цел. |
51
+ | `compact <пир> [рантайм]` | Сжать диалог; спящего после усыпления сначала продолжить. |
52
+ | `add-runtime <рантайм> (--peer <p> \| --all)` | Добавить агентский рантайм существующим пирам. `default_runtime` не трогает. |
53
+ | `default-runtime <рантайм> (--peer <p> \| --all)` | Переключить основной рантайм (маршрутизация/первый подъём). Откажет, если рантайм не объявлен. |
54
+
55
+ `stop`/`start`/`new` отказываются трогать пиров под чужим launchd-плистом — ядро не вмешивается в то, чем управляет не оно.
56
+
57
+ ## Сообщения
58
+
59
+ | Команда | Что делает |
60
+ |---|---|
61
+ | `send <цель> (--message <текст> \| --message-file <f\|->) [--from <id>] [--runtime <r>] [--attachment <путь>]… [--topic <t>]` | Ручная отправка IAP по тому же пути, что `send_to_peer`. |
62
+
63
+ `--message-file -` читает тело из stdin. `--attachment` повторяемый. `--from` по умолчанию — идентичность пира текущей папки.
64
+
65
+ ## Запуск и рантаймы
66
+
67
+ | Команда | Что делает |
68
+ |---|---|
69
+ | `<рантайм>` (например `iapeer claude`) | Запустить пир текущей папки в этом рантайме — всегда свежей сессией. |
70
+ | `connect telegram <пир> [--token <t>]` | Подключить Telegram-бота к пиру: регистрация бота → запись в профиль → перезапуск роутера. Спрашивает только токен. |
71
+
72
+ ## Расширения и память
73
+
74
+ | Команда | Что делает |
75
+ |---|---|
76
+ | `enable <плагин> [пир] [--no-setup]` | Установить и включить capability-плагин для пира (по рантаймам), вызвать его шаг установки. |
77
+ | `native-memory <off\|on> (--peer <p> \| --all)` | Отключить/вернуть родную память рантаймов пира. |
78
+ | `trust-hooks <hooks.json> [--check]` | Предварительно доверить codex-хуки из файла (без модального окна). `--check` — отчёт о расхождениях. |
79
+
80
+ ## Агентские самовызовы
81
+
82
+ Команды, которые агент выполняет в своей сессии (требуют `PEER_IDENTITY` в окружении):
83
+
84
+ | Команда | Что делает |
85
+ |---|---|
86
+ | `self-fresh` | Пометить себя на свежий перезапуск и закрыть свою сессию — демон поднимет свежую. |
87
+ | `self-done` | Эфемерный воркер: тихо завершиться, освободив очередь, никого не разбудив. |
88
+
89
+ ## Служебные
90
+
91
+ | Команда | Что делает |
92
+ |---|---|
93
+ | `daemon` | Точка входа демона-роутера; запускается из плиста `com.agfpd.iapeer`. |
94
+ | `run-infra <имя> <рантайм>` | Точка входа инфраструктурного пира; запускается из его launchd-плиста. |
95
+
96
+ Эти две команды вызывает launchd, а не оператор напрямую.