@agfpd/iapeer 0.2.98 → 0.3.0
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/README.md +21 -7
- package/docs/01-overview.md +86 -0
- package/docs/02-quickstart.md +110 -0
- package/docs/03-peers-runtimes-identity.md +117 -0
- package/docs/04-lifecycle-and-daemon.md +101 -0
- package/docs/05-system-prompt.md +82 -0
- package/docs/06-storage.md +115 -0
- package/docs/07-install-and-update.md +87 -0
- package/docs/08-peer-management.md +119 -0
- package/docs/09-runtimes.md +103 -0
- package/docs/10-messaging.md +69 -0
- package/docs/11-extensions-and-memory.md +60 -0
- package/docs/12-cli-reference.md +96 -0
- package/docs/13-architecture-and-contract.md +190 -0
- package/docs/14-configuration-and-logs.md +91 -0
- package/docs/README.md +97 -0
- package/docs/ru/01-/320/276/320/261/320/267/320/276/321/200.md +86 -0
- 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
- 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
- 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
- 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
- package/docs/ru/06-/321/205/321/200/320/260/320/275/320/265/320/275/320/270/320/265.md +115 -0
- 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
- 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
- package/docs/ru/09-/321/200/320/260/320/275/321/202/320/260/320/271/320/274/321/213.md +103 -0
- 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
- 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
- package/docs/ru/12-cli-reference.md +96 -0
- 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
- 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
- package/docs/ru/README.md +97 -0
- package/package.json +8 -2
- package/src/cli/index.ts +20 -0
- package/src/tui/onboard/app.tsx +260 -0
- package/src/tui/onboard/run.tsx +72 -0
- package/tsconfig.json +3 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# 07 — Установка и обновление
|
|
2
|
+
|
|
3
|
+
**Русский** · [English](../07-install-and-update.md)
|
|
4
|
+
|
|
5
|
+
Установка — два шага: разложить ядро и подготовить хост. Демон поднимать вручную не нужно — это делает онбординг. Ниже — оба шага, плюс обновление ядра и откат.
|
|
6
|
+
|
|
7
|
+
## Что нужно заранее
|
|
8
|
+
|
|
9
|
+
- **macOS.** Процессами управляет launchd — другой платформы пока нет.
|
|
10
|
+
- **[bun](https://bun.sh)** на `PATH`. Ядро исполняется через bun; скомпилированного JS в пакете нет.
|
|
11
|
+
- **`~/.local/bin` на `PATH`.** Сюда ставится бинарь `iapeer`. Нет в `PATH` — команда не найдётся после установки.
|
|
12
|
+
- **Хотя бы один агентский рантайм** — Claude Code или Codex CLI. Без него `iapeer create` и `iapeer init` откажут с явной ошибкой.
|
|
13
|
+
|
|
14
|
+
## Шаг 1. Установите ядро
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npx @agfpd/iapeer
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Запуск без аргументов выполняет установку. Она делает ровно три вещи:
|
|
21
|
+
|
|
22
|
+
1. **Раскладка.** Создаёт `~/.iapeer/` со всеми каталогами: реестр, состояние, логи, кеш, пространства рантаймов.
|
|
23
|
+
2. **Бинарь.** Собирает `iapeer` и атомарно кладёт в `~/.local/bin/iapeer`. Прежняя версия остаётся рядом как `iapeer.prev` — резерв для отката. Атомарность важна: между старой и новой версией нет момента, когда по пути лежит пустышка.
|
|
24
|
+
3. **Плист демона.** Пишет `~/Library/LaunchAgents/com.agfpd.iapeer.plist`, но **не загружает** его. Загрузку берёт на себя `iapeer onboard` (шаг 2): на работающем хосте демон уже может крутиться, и миграция на новый бинарь — осознанное действие, а не побочный эффект установки.
|
|
25
|
+
|
|
26
|
+
При установке однократно создаётся локальная подпись бинаря (для разрешений macOS). Подпись стабильна и переживает обновления.
|
|
27
|
+
|
|
28
|
+
Установка идемпотентна — повторный запуск безопасен.
|
|
29
|
+
|
|
30
|
+
Та же операция доступна как `iapeer install`, если бинарь уже стоит. Но самый первый раз — всегда через `npx` или из исходников: скомпилированный бинарь не умеет пересобирать сам себя.
|
|
31
|
+
|
|
32
|
+
## Шаг 2. Подготовьте хост
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
iapeer onboard
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
`onboard` готовит хост к появлению агентов. Первым делом он **поднимает демон** — загружает плист в launchd, дальше launchd держит демон сам, поднимая его заново при падении и перезагрузке. Отдельная команда `launchctl` для этого не нужна. Затем onboard регистрирует marketplace расширений в Claude и Codex, разворачивает планировщик (`notifier`), создаёт пир-человека в Telegram и ставит провайдера памяти. Старт демона идёт всегда; остальные шаги включены по умолчанию и отключаются флагами (`--no-notifier`, `--no-telegram`, `--no-memory`).
|
|
39
|
+
|
|
40
|
+
Проверьте, что демон жив и хост готов:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
iapeer status
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Вы увидите версию ядра, здоровье демона и состояние слота памяти. Код возврата ненулевой, если демон нездоров, — это удобно для скриптов-проверок.
|
|
47
|
+
|
|
48
|
+
Разбор каждого шага onboard — в [02 — Быстрый старт](02-быстрый-старт.md); рантаймы и память подробно — в [09](09-рантаймы.md) и [11](11-расширения-и-память.md).
|
|
49
|
+
|
|
50
|
+
## Обновление ядра
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
iapeer update # до последней версии
|
|
54
|
+
iapeer update 0.2.80 # до конкретной версии
|
|
55
|
+
iapeer update --force # переустановить, даже если версия уже стоит
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Обновление тянет версию ядра из npm и перезапускает демон на неё. По шагам:
|
|
59
|
+
|
|
60
|
+
1. Узнаёт нужную версию из npm. Если установленная уже совпадает и нет `--force` — ничего не делает.
|
|
61
|
+
2. Скачивает и собирает новый бинарь. Это делается через `npm pack`, а не `npx`: бинарь не пересобирает себя сам.
|
|
62
|
+
3. Перезапускает демон на новый бинарь.
|
|
63
|
+
4. Перезапускает launchd-джобы инфраструктуры, которыми владеет ядро (`com.iapeer.*` — роутеры `timer`, `watcher`, Telegram), переводя их на только что заменённый бинарь. Их плисты запускают тот же бинарь ядра, что и демон, — без перезапуска джоб остался бы на старом коде. Перезапускается именно джоб (снимается и поднимается заново); **пакетный код** рантаймов (telegram-runtime, notifier-runtime) при этом не обновляется — это отдельная операция `update-runtime`. Провайдер памяти (`iapeer-memory`) и плисты обычных пиров не трогаются вовсе. Если демон на шаге 3 не поднялся, этот шаг пропускается — нет смысла переводить джобы на бинарь, на котором демон не ожил.
|
|
64
|
+
5. Проверяет, что демон действительно поднялся здоровым, — не по тому, что команда перезапуска завершилась успешно, а пробой: подключается к сокету демона (тому самому, что демон открывает прямо перед сигналом готовности). Здоровым демон считается, только когда сокет принимает соединение **дважды подряд** — одиночная проба прошла бы и у демона, который привязал сокет и тут же упал. На проверку отведено 15 секунд; если за это время серия успешных проб не набралась — команда говорит об этом прямо и советует откатиться.
|
|
65
|
+
|
|
66
|
+
Обновление трогает **только ядро**. Плист демона и сторонние пакеты остаются как есть.
|
|
67
|
+
|
|
68
|
+
Указать конкретную версию (`iapeer update <версия>`) полезно, когда нужно откатиться глубже, чем на один шаг назад, или встать на проверенную версию.
|
|
69
|
+
|
|
70
|
+
## Откат
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
iapeer rollback
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Восстанавливает предыдущий бинарь (тот самый `iapeer.prev`), перезапускает демон на него и проверяет здоровье. Откат идёт **на один уровень назад** — хранится одна предыдущая версия. Это локальное «отменить последнее обновление», пока в npm выкладывают исправленную версию. Если нужно встать на версию глубже — `iapeer update <версия>`.
|
|
77
|
+
|
|
78
|
+
## Если демон не поднялся после обновления
|
|
79
|
+
|
|
80
|
+
Признак — `iapeer status` показывает нездоровый демон, или `update` завершился с предупреждением. Порядок действий:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
iapeer rollback # вернуться на прежний бинарь
|
|
84
|
+
# если демон всё ещё лежит — поднять вручную:
|
|
85
|
+
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.agfpd.iapeer.plist
|
|
86
|
+
iapeer status # убедиться, что ожил
|
|
87
|
+
```
|
|
@@ -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, а не оператор напрямую.
|