harubashi 0.1.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/LICENSE +201 -0
- package/README.md +293 -0
- package/README.ru.md +293 -0
- package/dist/agent/agent.module.d.ts +2 -0
- package/dist/agent/agent.module.js +34 -0
- package/dist/agent/agent.module.js.map +1 -0
- package/dist/agent/agent.processor.d.ts +31 -0
- package/dist/agent/agent.processor.js +266 -0
- package/dist/agent/agent.processor.js.map +1 -0
- package/dist/agent/command-guard.service.d.ts +10 -0
- package/dist/agent/command-guard.service.js +48 -0
- package/dist/agent/command-guard.service.js.map +1 -0
- package/dist/agent/interruption.service.d.ts +11 -0
- package/dist/agent/interruption.service.js +52 -0
- package/dist/agent/interruption.service.js.map +1 -0
- package/dist/agent/system-executor.service.d.ts +32 -0
- package/dist/agent/system-executor.service.js +200 -0
- package/dist/agent/system-executor.service.js.map +1 -0
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +38 -0
- package/dist/app.module.js.map +1 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +137 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +141 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.command.d.ts +2 -0
- package/dist/commands/config.command.js +83 -0
- package/dist/commands/config.command.js.map +1 -0
- package/dist/commands/logs.command.d.ts +5 -0
- package/dist/commands/logs.command.js +130 -0
- package/dist/commands/logs.command.js.map +1 -0
- package/dist/commands/profile.command.d.ts +5 -0
- package/dist/commands/profile.command.js +293 -0
- package/dist/commands/profile.command.js.map +1 -0
- package/dist/commands/setup.command.d.ts +1 -0
- package/dist/commands/setup.command.js +94 -0
- package/dist/commands/setup.command.js.map +1 -0
- package/dist/commands/setup.helpers.d.ts +34 -0
- package/dist/commands/setup.helpers.js +265 -0
- package/dist/commands/setup.helpers.js.map +1 -0
- package/dist/commands/skills.command.d.ts +2 -0
- package/dist/commands/skills.command.js +111 -0
- package/dist/commands/skills.command.js.map +1 -0
- package/dist/common/adapters/cli-interaction.adapter.d.ts +8 -0
- package/dist/common/adapters/cli-interaction.adapter.js +67 -0
- package/dist/common/adapters/cli-interaction.adapter.js.map +1 -0
- package/dist/common/adapters/interaction-adapter.interface.d.ts +6 -0
- package/dist/common/adapters/interaction-adapter.interface.js +10 -0
- package/dist/common/adapters/interaction-adapter.interface.js.map +1 -0
- package/dist/common/constants.d.ts +3 -0
- package/dist/common/constants.js +7 -0
- package/dist/common/constants.js.map +1 -0
- package/dist/common/index.d.ts +4 -0
- package/dist/common/index.js +21 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/logger.d.ts +9 -0
- package/dist/common/logger.js +87 -0
- package/dist/common/logger.js.map +1 -0
- package/dist/common/paths.d.ts +12 -0
- package/dist/common/paths.js +28 -0
- package/dist/common/paths.js.map +1 -0
- package/dist/common/types/message.types.d.ts +48 -0
- package/dist/common/types/message.types.js +18 -0
- package/dist/common/types/message.types.js.map +1 -0
- package/dist/common/types/tool.types.d.ts +20 -0
- package/dist/common/types/tool.types.js +3 -0
- package/dist/common/types/tool.types.js.map +1 -0
- package/dist/common/utils/type-guards.d.ts +8 -0
- package/dist/common/utils/type-guards.js +46 -0
- package/dist/common/utils/type-guards.js.map +1 -0
- package/dist/config/config-loader.d.ts +6 -0
- package/dist/config/config-loader.js +90 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config.module.d.ts +2 -0
- package/dist/config/config.module.js +28 -0
- package/dist/config/config.module.js.map +1 -0
- package/dist/config/config.types.d.ts +55 -0
- package/dist/config/config.types.js +21 -0
- package/dist/config/config.types.js.map +1 -0
- package/dist/daemon.d.ts +2 -0
- package/dist/daemon.js +28 -0
- package/dist/daemon.js.map +1 -0
- package/dist/llm/anthropic/anthropic.provider.d.ts +15 -0
- package/dist/llm/anthropic/anthropic.provider.js +162 -0
- package/dist/llm/anthropic/anthropic.provider.js.map +1 -0
- package/dist/llm/google/google.provider.d.ts +14 -0
- package/dist/llm/google/google.provider.js +189 -0
- package/dist/llm/google/google.provider.js.map +1 -0
- package/dist/llm/llm-factory.service.d.ts +24 -0
- package/dist/llm/llm-factory.service.js +76 -0
- package/dist/llm/llm-factory.service.js.map +1 -0
- package/dist/llm/llm.interface.d.ts +19 -0
- package/dist/llm/llm.interface.js +5 -0
- package/dist/llm/llm.interface.js.map +1 -0
- package/dist/llm/llm.module.d.ts +2 -0
- package/dist/llm/llm.module.js +34 -0
- package/dist/llm/llm.module.js.map +1 -0
- package/dist/llm/nvidia/nvidia.provider.d.ts +11 -0
- package/dist/llm/nvidia/nvidia.provider.js +49 -0
- package/dist/llm/nvidia/nvidia.provider.js.map +1 -0
- package/dist/llm/openai/openai.provider.d.ts +9 -0
- package/dist/llm/openai/openai.provider.js +35 -0
- package/dist/llm/openai/openai.provider.js.map +1 -0
- package/dist/llm/openai-compatible/openai-compatible.helper.d.ts +4 -0
- package/dist/llm/openai-compatible/openai-compatible.helper.js +155 -0
- package/dist/llm/openai-compatible/openai-compatible.helper.js.map +1 -0
- package/dist/llm/proxy/proxy.provider.d.ts +9 -0
- package/dist/llm/proxy/proxy.provider.js +35 -0
- package/dist/llm/proxy/proxy.provider.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +14 -0
- package/dist/main.js.map +1 -0
- package/dist/prisma/prisma.module.d.ts +2 -0
- package/dist/prisma/prisma.module.js +22 -0
- package/dist/prisma/prisma.module.js.map +1 -0
- package/dist/prisma/prisma.service.d.ts +9 -0
- package/dist/prisma/prisma.service.js +40 -0
- package/dist/prisma/prisma.service.js.map +1 -0
- package/dist/sessions/sessions.module.d.ts +2 -0
- package/dist/sessions/sessions.module.js +23 -0
- package/dist/sessions/sessions.module.js.map +1 -0
- package/dist/sessions/sessions.service.d.ts +21 -0
- package/dist/sessions/sessions.service.js +82 -0
- package/dist/sessions/sessions.service.js.map +1 -0
- package/dist/skills/definitions/directory_explorer.md +69 -0
- package/dist/skills/definitions/execute_command.md +27 -0
- package/dist/skills/definitions/git_manager.md +98 -0
- package/dist/skills/definitions/read_file.md +25 -0
- package/dist/skills/skills-bundle.d.ts +7 -0
- package/dist/skills/skills-bundle.js +27 -0
- package/dist/skills/skills-bundle.js.map +1 -0
- package/dist/skills/skills-parser.d.ts +8 -0
- package/dist/skills/skills-parser.js +67 -0
- package/dist/skills/skills-parser.js.map +1 -0
- package/dist/skills/skills.module.d.ts +2 -0
- package/dist/skills/skills.module.js +22 -0
- package/dist/skills/skills.module.js.map +1 -0
- package/dist/skills/skills.service.d.ts +22 -0
- package/dist/skills/skills.service.js +150 -0
- package/dist/skills/skills.service.js.map +1 -0
- package/dist/skills/skills.types.d.ts +16 -0
- package/dist/skills/skills.types.js +3 -0
- package/dist/skills/skills.types.js.map +1 -0
- package/dist/soul/prompts/core.md +28 -0
- package/dist/soul/prompts/rules.md +40 -0
- package/dist/soul/prompts/runtime.md +13 -0
- package/dist/soul/prompts/voice.md +45 -0
- package/dist/soul/soul.module.d.ts +2 -0
- package/dist/soul/soul.module.js +22 -0
- package/dist/soul/soul.module.js.map +1 -0
- package/dist/soul/soul.service.d.ts +22 -0
- package/dist/soul/soul.service.js +89 -0
- package/dist/soul/soul.service.js.map +1 -0
- package/dist/telegram/pairing.service.d.ts +11 -0
- package/dist/telegram/pairing.service.js +81 -0
- package/dist/telegram/pairing.service.js.map +1 -0
- package/dist/telegram/telegram-interaction.adapter.d.ts +16 -0
- package/dist/telegram/telegram-interaction.adapter.js +54 -0
- package/dist/telegram/telegram-interaction.adapter.js.map +1 -0
- package/dist/telegram/telegram.module.d.ts +2 -0
- package/dist/telegram/telegram.module.js +25 -0
- package/dist/telegram/telegram.module.js.map +1 -0
- package/dist/telegram/telegram.service.d.ts +28 -0
- package/dist/telegram/telegram.service.js +255 -0
- package/dist/telegram/telegram.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +68 -0
- package/prisma/migrations/20260403134611_init/migration.sql +40 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +74 -0
package/README.ru.md
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
🌍 **Читать на:** [English](README.md) | [Русский](README.ru.md)
|
|
2
|
+
|
|
3
|
+
# 🌉 Harubashi
|
|
4
|
+
|
|
5
|
+
**Headless мульти-профильный AI-агент для системного использования — глобальный npm-пакет.**
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/harubashi)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
[](https://nodejs.org)
|
|
10
|
+
|
|
11
|
+
Harubashi превращает ваш терминал — и Telegram-чат — в думающий интерфейс к вашей машине. Агент выполняет shell-команды, читает файлы, управляет git и расширяется через hot-reload скиллы, которые вы пишете сами в обычном Markdown.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## ✨ Зачем Harubashi?
|
|
16
|
+
|
|
17
|
+
- **🔁 Мульти-профили** — разделяйте профили для work, личных задач, экспериментов. У каждого профиля свой провайдер, ключи, модель и SQLite база. Переключение одной командой.
|
|
18
|
+
- **🧠 Скиллы как Markdown** — положите `.md` файл в `~/.harubashi/skills/` и агент мгновенно его подхватит через hot-reload. Два типа: **Tools** (вызываемые функции) и **Guidance** (расширение system prompt).
|
|
19
|
+
- **🔐 Маскировка секретов в логах** — Winston файловые логи автоматически редактируют ключи NVIDIA / OpenAI / Anthropic / Google, токены Telegram-ботов и Bearer-заголовки. Daily rotation, ретенция 14 дней.
|
|
20
|
+
- **📡 Готов к Telegram** — запустите `harubashi daemon` и общайтесь с машиной с телефона. Или оставайтесь в терминале через `harubashi cli`.
|
|
21
|
+
- **🛡 Самовосстановление** — случайно удалили `~/.harubashi/skills/`? Следующий запуск демона автоматически восстановит bundled-скиллы.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 📦 Установка
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install -g harubashi
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Требуется **Node.js ≥ 18**. После установки запустите визард настройки:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
harubashi setup
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Это создаст `~/.harubashi/`:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
~/.harubashi/
|
|
41
|
+
├── config.yaml # Все профили + активный выбор
|
|
42
|
+
├── databases/ # По одной SQLite базе на профиль
|
|
43
|
+
│ └── default.db
|
|
44
|
+
├── skills/ # Hot-reload Markdown скиллы
|
|
45
|
+
│ ├── system_execute_command.md
|
|
46
|
+
│ ├── system_read_file.md
|
|
47
|
+
│ ├── directory_explorer.md (guidance)
|
|
48
|
+
│ └── git_manager.md (guidance)
|
|
49
|
+
└── logs/ # Daily-rotated JSON логи
|
|
50
|
+
└── harubashi-YYYY-MM-DD.log
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 🚀 Быстрый старт
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# 1. Настроить первый профиль (интерактивный визард)
|
|
59
|
+
harubashi setup
|
|
60
|
+
|
|
61
|
+
# 2. Поговорить с агентом в терминале
|
|
62
|
+
harubashi cli
|
|
63
|
+
|
|
64
|
+
# 3. Или запустить как Telegram-демон (фоном)
|
|
65
|
+
harubashi daemon
|
|
66
|
+
|
|
67
|
+
# 4. Смотреть логи из другого терминала
|
|
68
|
+
harubashi logs
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Визард спросит про LLM-провайдера (Nvidia NIM, Google Gemini; Anthropic / OpenAI / Proxy на подходе), API-ключ, модель и опционально Telegram bot token.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 👤 Профили
|
|
76
|
+
|
|
77
|
+
**Профиль** — это полная личность агента: провайдер, креды, модель, опциональный Telegram-бот и выделенная SQLite база.
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
harubashi profile list # Показать все профили, отметить активный
|
|
81
|
+
harubashi profile use work # Переключить активный профиль
|
|
82
|
+
harubashi profile create staging # Визард с pre-fill из активного
|
|
83
|
+
harubashi profile edit work # Визард, но пропускает init БД (только конфиг)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Edit-флоу мгновенный** — если `~/.harubashi/databases/<name>.db` уже существует, визард пропускает шаг Prisma-инициализации. **Create-флоу rollback-safe** — если init БД падает, профиль *не* добавляется в `config.yaml`.
|
|
87
|
+
|
|
88
|
+
При повторном запуске `harubashi setup` (когда конфиг уже есть) появляется единый picker:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
? Select profile to configure:
|
|
92
|
+
[+] Create new profile...
|
|
93
|
+
❯ work (active) · nvidia · meta/llama-3.1-70b-instruct
|
|
94
|
+
staging · google · gemini-1.5-pro
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 🧩 Скиллы
|
|
100
|
+
|
|
101
|
+
Скиллы — это Markdown-файлы в `~/.harubashi/skills/`. У каждого есть YAML frontmatter и body. **Два типа**:
|
|
102
|
+
|
|
103
|
+
### Active Tool — `input_schema` **присутствует**
|
|
104
|
+
|
|
105
|
+
Скилл регистрируется как вызываемая LLM-функция. Body становится документацией tool'а в system prompt'е.
|
|
106
|
+
|
|
107
|
+
```markdown
|
|
108
|
+
---
|
|
109
|
+
name: system_execute_command
|
|
110
|
+
description: Execute a shell command on the host OS.
|
|
111
|
+
input_schema:
|
|
112
|
+
type: object
|
|
113
|
+
properties:
|
|
114
|
+
command:
|
|
115
|
+
type: string
|
|
116
|
+
description: The shell command to execute
|
|
117
|
+
required: [command]
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Usage Guidelines
|
|
121
|
+
|
|
122
|
+
- Предпочитайте простые команды сложным пайплайнам.
|
|
123
|
+
- Всегда указывайте `workdir` при работе с проектом.
|
|
124
|
+
- Никогда не запускайте деструктивные команды без явного подтверждения.
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Guidance-only — `input_schema` **отсутствует**
|
|
128
|
+
|
|
129
|
+
Скилл **НЕ** экспортируется как tool, но его body конкатенируется в system prompt агента под `## Guidance: <name>`. Используйте чтобы научить агента правильно использовать существующие tools.
|
|
130
|
+
|
|
131
|
+
```markdown
|
|
132
|
+
---
|
|
133
|
+
name: git_manager
|
|
134
|
+
description: Workflow guidance for using Git via system_execute_command.
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Обязательный workflow
|
|
138
|
+
|
|
139
|
+
1. **`git status`** — понять состояние перед любыми изменениями.
|
|
140
|
+
2. **`git diff`** — инспектировать изменения.
|
|
141
|
+
3. **`git add <path>`** — стейджить выборочно.
|
|
142
|
+
4. **`git commit -m "..."`** — Conventional Commits style.
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Встроенные скиллы
|
|
146
|
+
|
|
147
|
+
| Имя | Тип | Назначение |
|
|
148
|
+
|----------------------------|----------|-----------------------------------------------------------|
|
|
149
|
+
| `system_execute_command` | Tool | Выполнение shell-команд кроссплатформенно |
|
|
150
|
+
| `system_read_file` | Tool | Чтение файла по абсолютному пути |
|
|
151
|
+
| `directory_explorer` | Guidance | Безопасное shallow-first исследование FS, игнор тяжёлых папок |
|
|
152
|
+
| `git_manager` | Guidance | Status → diff → add → commit; запрет деструктивных операций |
|
|
153
|
+
|
|
154
|
+
### Управление скиллами
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
harubashi skills list # Красивый вывод всех скиллов, разделён на Tools / Guidance
|
|
158
|
+
harubashi skills open # Открыть ~/.harubashi/skills/ в файловом менеджере ОС
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Отредактируйте любой `.md` файл → запущенный демон подхватит изменение мгновенно через chokidar hot-reload.
|
|
162
|
+
|
|
163
|
+
### Auto-heal
|
|
164
|
+
|
|
165
|
+
Если вы удалите `~/.harubashi/skills/` (или папка останется пустой), следующий запуск демона **автоматически восстановит bundled-скиллы** из npm-пакета:
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
[SkillsService] Auto-healed skills from bundled package (4 file(s)) into ~/.harubashi/skills/
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Демон сложно сломать. Bundled-скиллы — это read-only источник; пользовательские правки живут в home-директории.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 📜 Логи
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
harubashi logs # Tail последнего лог-файла
|
|
179
|
+
harubashi logs --no-follow # Напечатать и выйти
|
|
180
|
+
harubashi logs --lines 200 # 200 строк истории перед tail'ом
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
- **Формат файла**: построчный JSON, одна запись на строку. Daily rotation (`harubashi-YYYY-MM-DD.log`), ретенция 14 дней, лимит 20 MB на файл.
|
|
184
|
+
- **Console rendering**: pretty-print, цвета по уровням: `INFO` зелёный, `WARN` жёлтый, `ERROR` красный, `DEBUG` синий.
|
|
185
|
+
- **Маскировка секретов**: API-ключи (`nvapi-***`, `sk-***`, `AIza***`), Telegram bot tokens и `Bearer` заголовки редактируются в **обоих** transports.
|
|
186
|
+
- **Кроссплатформенный tail**: реализован через `chokidar` вместо `tail -f`, поэтому работает одинаково на Windows / macOS / Linux. Переход через полночь (rotation) детектится автоматически.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## ⚙️ Конфигурация
|
|
191
|
+
|
|
192
|
+
Единственный источник истины — `~/.harubashi/config.yaml`. Узнать абсолютный путь:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
harubashi config path
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Команда возвращает голый путь (без декораций), что отлично пайпится:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
code "$(harubashi config path)" # открыть в VS Code
|
|
202
|
+
cd "$(dirname "$(harubashi config path)")" # перейти в ~/.harubashi
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Схема (сокращённо):
|
|
206
|
+
|
|
207
|
+
```yaml
|
|
208
|
+
activeProfile: work
|
|
209
|
+
profiles:
|
|
210
|
+
work:
|
|
211
|
+
llmProvider: nvidia # nvidia | google | anthropic | openai | proxy
|
|
212
|
+
providers:
|
|
213
|
+
nvidia:
|
|
214
|
+
apiKey: nvapi-***
|
|
215
|
+
model: meta/llama-3.1-70b-instruct
|
|
216
|
+
telegram:
|
|
217
|
+
enabled: true
|
|
218
|
+
botToken: ***
|
|
219
|
+
staging:
|
|
220
|
+
llmProvider: google
|
|
221
|
+
providers:
|
|
222
|
+
google:
|
|
223
|
+
apiKey: AIza***
|
|
224
|
+
model: gemini-1.5-pro
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Ручные правки приветствуются — визард просто автоматизирует то же самое.
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## 📚 Список команд
|
|
232
|
+
|
|
233
|
+
| Команда | Назначение |
|
|
234
|
+
|-------------------------------|----------------------------------------------------------------------|
|
|
235
|
+
| `harubashi setup` | Первичный визард или pick-existing-or-create при наличии конфига |
|
|
236
|
+
| `harubashi cli` | Запустить интерактивный REPL |
|
|
237
|
+
| `harubashi daemon` | Запустить фоновый Telegram-демон |
|
|
238
|
+
| `harubashi logs [opts]` | Tail дневного лога; `-n <N>`, `--no-follow` |
|
|
239
|
+
| `harubashi profile list` | Список профилей, активный отмечен |
|
|
240
|
+
| `harubashi profile use <name>`| Переключить активный профиль |
|
|
241
|
+
| `harubashi profile create [name]` | Визард создания (rollback-safe, pre-fill из активного) |
|
|
242
|
+
| `harubashi profile edit [name]` | Редактирование (пропускает init БД если она есть) |
|
|
243
|
+
| `harubashi skills list` | Список установленных скиллов с разделением Tools / Guidance |
|
|
244
|
+
| `harubashi skills open` | Открыть `~/.harubashi/skills/` в файловом менеджере ОС |
|
|
245
|
+
| `harubashi config path` | Печатает абсолютный путь к `config.yaml` (pipeable) |
|
|
246
|
+
| `harubashi -V` / `--version` | Версия пакета |
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 🏗 Архитектура
|
|
251
|
+
|
|
252
|
+
- **NestJS standalone application** — без HTTP-сервера; агент работает как контекст, удерживаемый `cli` или `daemon`.
|
|
253
|
+
- **Prisma + SQLite** — одна база на профиль в `~/.harubashi/databases/<name>.db`. Схема bundled с npm-пакетом.
|
|
254
|
+
- **Telegraf** — Telegram-бот интеграция (опционально, только в daemon).
|
|
255
|
+
- **chokidar** — file-watching для hot-reload скиллов и кроссплатформенного log tail.
|
|
256
|
+
- **Winston + winston-daily-rotate-file** — цветной console + JSON файловые логи с маскировкой секретов.
|
|
257
|
+
- **Commander** — CLI surface, ленивые динамические импорты для каждой подкоманды (быстрый cold-start).
|
|
258
|
+
- **Inquirer** — интерактивные визарды для setup и profile management.
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## 🛠 Разработка
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
git clone https://github.com/Hilrein/harubashi.git
|
|
266
|
+
cd harubashi
|
|
267
|
+
npm install
|
|
268
|
+
npm run build
|
|
269
|
+
|
|
270
|
+
# Локальный бета-тест как если бы пакет был установлен глобально
|
|
271
|
+
npm link
|
|
272
|
+
harubashi setup
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Полезные скрипты:
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
npm run build # nest build
|
|
279
|
+
npm run lint # eslint
|
|
280
|
+
npm run format # prettier
|
|
281
|
+
npm run cli # ts-node src/bin.ts cli
|
|
282
|
+
npm run daemon # ts-node src/bin.ts daemon
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 📄 Лицензия
|
|
288
|
+
|
|
289
|
+
MIT — см. [LICENSE](LICENSE).
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
<sub>Сделано с заботой. Открывайте issue, если что-то ощущается шероховато.</sub>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.AgentModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const agent_processor_1 = require("./agent.processor");
|
|
12
|
+
const command_guard_service_1 = require("./command-guard.service");
|
|
13
|
+
const system_executor_service_1 = require("./system-executor.service");
|
|
14
|
+
const interruption_service_1 = require("./interruption.service");
|
|
15
|
+
let AgentModule = class AgentModule {
|
|
16
|
+
};
|
|
17
|
+
exports.AgentModule = AgentModule;
|
|
18
|
+
exports.AgentModule = AgentModule = __decorate([
|
|
19
|
+
(0, common_1.Module)({
|
|
20
|
+
providers: [
|
|
21
|
+
agent_processor_1.AgentProcessorService,
|
|
22
|
+
command_guard_service_1.CommandGuardService,
|
|
23
|
+
system_executor_service_1.SystemExecutorService,
|
|
24
|
+
interruption_service_1.InterruptionService,
|
|
25
|
+
],
|
|
26
|
+
exports: [
|
|
27
|
+
agent_processor_1.AgentProcessorService,
|
|
28
|
+
command_guard_service_1.CommandGuardService,
|
|
29
|
+
system_executor_service_1.SystemExecutorService,
|
|
30
|
+
interruption_service_1.InterruptionService,
|
|
31
|
+
],
|
|
32
|
+
})
|
|
33
|
+
], AgentModule);
|
|
34
|
+
//# sourceMappingURL=agent.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.module.js","sourceRoot":"","sources":["../../src/agent/agent.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,uDAA0D;AAC1D,mEAA8D;AAC9D,uEAAkE;AAClE,iEAA6D;AAgBtD,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,kCAAW;sBAAX,WAAW;IAdvB,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT,uCAAqB;YACrB,2CAAmB;YACnB,+CAAqB;YACrB,0CAAmB;SACpB;QACD,OAAO,EAAE;YACP,uCAAqB;YACrB,2CAAmB;YACnB,+CAAqB;YACrB,0CAAmB;SACpB;KACF,CAAC;GACW,WAAW,CAAG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { PrismaService } from '../prisma/prisma.service';
|
|
2
|
+
import { SoulService } from '../soul/soul.service';
|
|
3
|
+
import { SkillsService } from '../skills/skills.service';
|
|
4
|
+
import { LlmFactoryService } from '../llm/llm-factory.service';
|
|
5
|
+
import { SystemExecutorService } from './system-executor.service';
|
|
6
|
+
import { InterruptionService } from './interruption.service';
|
|
7
|
+
import { IInteractionAdapter } from '../common/adapters/interaction-adapter.interface';
|
|
8
|
+
export interface ProcessorResult {
|
|
9
|
+
taskId: string;
|
|
10
|
+
finalText: string;
|
|
11
|
+
iterations: number;
|
|
12
|
+
aborted: boolean;
|
|
13
|
+
totalTokens: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class AgentProcessorService {
|
|
16
|
+
private readonly prisma;
|
|
17
|
+
private readonly soul;
|
|
18
|
+
private readonly skills;
|
|
19
|
+
private readonly llmFactory;
|
|
20
|
+
private readonly executor;
|
|
21
|
+
private readonly interruption;
|
|
22
|
+
private readonly logger;
|
|
23
|
+
constructor(prisma: PrismaService, soul: SoulService, skills: SkillsService, llmFactory: LlmFactoryService, executor: SystemExecutorService, interruption: InterruptionService);
|
|
24
|
+
process(sessionId: string, userMessage: string, adapter: IInteractionAdapter): Promise<ProcessorResult>;
|
|
25
|
+
private buildSoulContext;
|
|
26
|
+
private ensureActiveTask;
|
|
27
|
+
private saveMessage;
|
|
28
|
+
private loadHistory;
|
|
29
|
+
private parseContent;
|
|
30
|
+
private extractText;
|
|
31
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var AgentProcessorService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.AgentProcessorService = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const os = require("os");
|
|
16
|
+
const prisma_service_1 = require("../prisma/prisma.service");
|
|
17
|
+
const soul_service_1 = require("../soul/soul.service");
|
|
18
|
+
const skills_service_1 = require("../skills/skills.service");
|
|
19
|
+
const llm_factory_service_1 = require("../llm/llm-factory.service");
|
|
20
|
+
const system_executor_service_1 = require("./system-executor.service");
|
|
21
|
+
const interruption_service_1 = require("./interruption.service");
|
|
22
|
+
const message_types_1 = require("../common/types/message.types");
|
|
23
|
+
const type_guards_1 = require("../common/utils/type-guards");
|
|
24
|
+
const constants_1 = require("../common/constants");
|
|
25
|
+
const MAX_ITERATIONS = 10;
|
|
26
|
+
let AgentProcessorService = AgentProcessorService_1 = class AgentProcessorService {
|
|
27
|
+
prisma;
|
|
28
|
+
soul;
|
|
29
|
+
skills;
|
|
30
|
+
llmFactory;
|
|
31
|
+
executor;
|
|
32
|
+
interruption;
|
|
33
|
+
logger = new common_1.Logger(AgentProcessorService_1.name);
|
|
34
|
+
constructor(prisma, soul, skills, llmFactory, executor, interruption) {
|
|
35
|
+
this.prisma = prisma;
|
|
36
|
+
this.soul = soul;
|
|
37
|
+
this.skills = skills;
|
|
38
|
+
this.llmFactory = llmFactory;
|
|
39
|
+
this.executor = executor;
|
|
40
|
+
this.interruption = interruption;
|
|
41
|
+
}
|
|
42
|
+
async process(sessionId, userMessage, adapter) {
|
|
43
|
+
const task = await this.ensureActiveTask(sessionId, userMessage);
|
|
44
|
+
const taskId = task.id;
|
|
45
|
+
this.logger.log(`Processing task ${taskId} in session ${sessionId}`);
|
|
46
|
+
await this.saveMessage(taskId, 'USER', [
|
|
47
|
+
{ type: message_types_1.ContentBlockType.Text, text: userMessage },
|
|
48
|
+
]);
|
|
49
|
+
const conversationHistory = await this.loadHistory(sessionId);
|
|
50
|
+
const skillInstructions = this.skills.getSkillInstructions();
|
|
51
|
+
const soulContext = await this.buildSoulContext(sessionId);
|
|
52
|
+
const systemPrompt = this.soul.getSystemPrompt(soulContext, skillInstructions);
|
|
53
|
+
const tools = this.skills.getTools();
|
|
54
|
+
const llm = this.llmFactory.getProvider();
|
|
55
|
+
const signal = this.interruption.createAbortSignal();
|
|
56
|
+
const messages = [...conversationHistory];
|
|
57
|
+
let iterations = 0;
|
|
58
|
+
let finalText = '';
|
|
59
|
+
let aborted = false;
|
|
60
|
+
let totalTokens = 0;
|
|
61
|
+
while (iterations < MAX_ITERATIONS) {
|
|
62
|
+
iterations++;
|
|
63
|
+
if (this.interruption.isInterrupted()) {
|
|
64
|
+
aborted = true;
|
|
65
|
+
this.logger.warn(`Task ${taskId} interrupted at iteration ${iterations}`);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
this.logger.log(`Iteration ${iterations}/${MAX_ITERATIONS} — sending ${messages.length} messages to ${this.llmFactory.getProviderName()}`);
|
|
69
|
+
let responseBlocks;
|
|
70
|
+
try {
|
|
71
|
+
const response = await llm.generateResponse(systemPrompt, messages, tools, signal);
|
|
72
|
+
responseBlocks = response.contentBlocks;
|
|
73
|
+
totalTokens += response.tokenUsage.totalTokens;
|
|
74
|
+
this.logger.debug(`LLM returned ${responseBlocks.length} block(s), tokens: +${response.tokenUsage.totalTokens}`);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
if (err.name === 'AbortError' || signal.aborted) {
|
|
78
|
+
aborted = true;
|
|
79
|
+
this.logger.warn(`Task ${taskId} aborted during LLM call`);
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
throw err;
|
|
83
|
+
}
|
|
84
|
+
await this.saveMessage(taskId, 'ASSISTANT', responseBlocks);
|
|
85
|
+
messages.push({ role: 'assistant', content: responseBlocks });
|
|
86
|
+
const toolUseBlocks = responseBlocks.filter(type_guards_1.isToolUseBlock);
|
|
87
|
+
if (toolUseBlocks.length === 0) {
|
|
88
|
+
finalText = this.extractText(responseBlocks);
|
|
89
|
+
this.logger.log(`Task ${taskId} completed with text response at iteration ${iterations}`);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
const toolResults = [];
|
|
93
|
+
for (const toolBlock of toolUseBlocks) {
|
|
94
|
+
if (this.interruption.isInterrupted()) {
|
|
95
|
+
aborted = true;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
this.logger.log(`Executing tool: ${toolBlock.name} (id: ${toolBlock.id})`);
|
|
99
|
+
let result;
|
|
100
|
+
try {
|
|
101
|
+
const execResult = await this.executor.dispatch(toolBlock.name, toolBlock.input, adapter);
|
|
102
|
+
result = {
|
|
103
|
+
type: message_types_1.ContentBlockType.ToolResult,
|
|
104
|
+
tool_use_id: toolBlock.id,
|
|
105
|
+
content: [
|
|
106
|
+
{
|
|
107
|
+
type: message_types_1.ContentBlockType.Text,
|
|
108
|
+
text: execResult.output,
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
is_error: execResult.is_error,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
result = {
|
|
116
|
+
type: message_types_1.ContentBlockType.ToolResult,
|
|
117
|
+
tool_use_id: toolBlock.id,
|
|
118
|
+
content: [
|
|
119
|
+
{
|
|
120
|
+
type: message_types_1.ContentBlockType.Text,
|
|
121
|
+
text: `Tool execution error: ${err.message}`,
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
is_error: true,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
toolResults.push(result);
|
|
128
|
+
this.logger.debug(`Tool ${toolBlock.name} → ${result.is_error ? 'ERROR' : 'OK'} (${result.content[0].text.length} chars)`);
|
|
129
|
+
}
|
|
130
|
+
if (aborted) {
|
|
131
|
+
this.logger.warn(`Task ${taskId} interrupted during tool execution`);
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
await this.saveMessage(taskId, 'USER', toolResults);
|
|
135
|
+
messages.push({ role: 'user', content: toolResults });
|
|
136
|
+
}
|
|
137
|
+
if (iterations >= MAX_ITERATIONS && !aborted && !finalText) {
|
|
138
|
+
finalText =
|
|
139
|
+
`Agent reached maximum iteration limit (${MAX_ITERATIONS}). ` +
|
|
140
|
+
`The task may be incomplete. Please review the results and continue if needed.`;
|
|
141
|
+
this.logger.warn(`Task ${taskId} hit MAX_ITERATIONS (${MAX_ITERATIONS})`);
|
|
142
|
+
}
|
|
143
|
+
await this.prisma.task.update({
|
|
144
|
+
where: { id: taskId },
|
|
145
|
+
data: {
|
|
146
|
+
status: aborted ? 'CANCELLED' : 'COMPLETED',
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
this.interruption.reset();
|
|
150
|
+
return {
|
|
151
|
+
taskId,
|
|
152
|
+
finalText,
|
|
153
|
+
iterations,
|
|
154
|
+
aborted,
|
|
155
|
+
totalTokens,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
async buildSoulContext(sessionId) {
|
|
159
|
+
let userName = constants_1.DEFAULT_USER_NAME;
|
|
160
|
+
try {
|
|
161
|
+
const session = await this.prisma.chatSession.findUnique({
|
|
162
|
+
where: { id: sessionId },
|
|
163
|
+
include: { user: true },
|
|
164
|
+
});
|
|
165
|
+
const dbName = session?.user?.name?.trim();
|
|
166
|
+
if (dbName)
|
|
167
|
+
userName = dbName;
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
this.logger.warn(`Failed to resolve userName from DB, falling back to "${constants_1.DEFAULT_USER_NAME}": ${err.message}`);
|
|
171
|
+
}
|
|
172
|
+
const now = new Date().toLocaleString('en-US', {
|
|
173
|
+
weekday: 'long',
|
|
174
|
+
year: 'numeric',
|
|
175
|
+
month: 'long',
|
|
176
|
+
day: 'numeric',
|
|
177
|
+
hour: '2-digit',
|
|
178
|
+
minute: '2-digit',
|
|
179
|
+
timeZoneName: 'short',
|
|
180
|
+
});
|
|
181
|
+
return {
|
|
182
|
+
userName,
|
|
183
|
+
now,
|
|
184
|
+
os: `${os.platform()} (${os.release()})`,
|
|
185
|
+
host: os.hostname(),
|
|
186
|
+
nodeVersion: process.version,
|
|
187
|
+
cwd: process.cwd(),
|
|
188
|
+
llmProvider: this.llmFactory.getProviderName(),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
async ensureActiveTask(sessionId, description) {
|
|
192
|
+
const existing = await this.prisma.task.findFirst({
|
|
193
|
+
where: {
|
|
194
|
+
sessionId,
|
|
195
|
+
status: { in: ['PENDING', 'RUNNING'] },
|
|
196
|
+
},
|
|
197
|
+
orderBy: { createdAt: 'desc' },
|
|
198
|
+
});
|
|
199
|
+
if (existing) {
|
|
200
|
+
if (existing.status === 'PENDING') {
|
|
201
|
+
return this.prisma.task.update({
|
|
202
|
+
where: { id: existing.id },
|
|
203
|
+
data: { status: 'RUNNING' },
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
return existing;
|
|
207
|
+
}
|
|
208
|
+
return this.prisma.task.create({
|
|
209
|
+
data: {
|
|
210
|
+
sessionId,
|
|
211
|
+
description: description.length > 200
|
|
212
|
+
? description.slice(0, 197) + '...'
|
|
213
|
+
: description,
|
|
214
|
+
status: 'RUNNING',
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
async saveMessage(taskId, role, content) {
|
|
219
|
+
await this.prisma.message.create({
|
|
220
|
+
data: {
|
|
221
|
+
taskId,
|
|
222
|
+
role,
|
|
223
|
+
content: JSON.stringify(content),
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
async loadHistory(sessionId) {
|
|
228
|
+
const dbMessages = await this.prisma.message.findMany({
|
|
229
|
+
where: { task: { sessionId } },
|
|
230
|
+
orderBy: { createdAt: 'asc' },
|
|
231
|
+
});
|
|
232
|
+
return dbMessages.map((msg) => ({
|
|
233
|
+
role: msg.role === 'USER' ? 'user' : 'assistant',
|
|
234
|
+
content: this.parseContent(msg.content),
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
parseContent(raw) {
|
|
238
|
+
try {
|
|
239
|
+
return JSON.parse(raw);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
return [
|
|
243
|
+
{ type: message_types_1.ContentBlockType.Text, text: raw },
|
|
244
|
+
];
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
extractText(blocks) {
|
|
248
|
+
return blocks
|
|
249
|
+
.filter((b) => b.type === message_types_1.ContentBlockType.Text &&
|
|
250
|
+
!(0, type_guards_1.isThinkingBlock)(b) &&
|
|
251
|
+
!(0, type_guards_1.isRedactedThinkingBlock)(b))
|
|
252
|
+
.map((b) => b.text)
|
|
253
|
+
.join('\n\n');
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
exports.AgentProcessorService = AgentProcessorService;
|
|
257
|
+
exports.AgentProcessorService = AgentProcessorService = AgentProcessorService_1 = __decorate([
|
|
258
|
+
(0, common_1.Injectable)(),
|
|
259
|
+
__metadata("design:paramtypes", [prisma_service_1.PrismaService,
|
|
260
|
+
soul_service_1.SoulService,
|
|
261
|
+
skills_service_1.SkillsService,
|
|
262
|
+
llm_factory_service_1.LlmFactoryService,
|
|
263
|
+
system_executor_service_1.SystemExecutorService,
|
|
264
|
+
interruption_service_1.InterruptionService])
|
|
265
|
+
], AgentProcessorService);
|
|
266
|
+
//# sourceMappingURL=agent.processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.processor.js","sourceRoot":"","sources":["../../src/agent/agent.processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ConfigService } from '@nestjs/config';
|
|
2
|
+
import { IInteractionAdapter } from '../common/adapters/interaction-adapter.interface';
|
|
3
|
+
export declare class CommandGuardService {
|
|
4
|
+
private readonly configService;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
private readonly safeCommands;
|
|
7
|
+
constructor(configService: ConfigService);
|
|
8
|
+
requestApproval(command: string, adapter: IInteractionAdapter): Promise<boolean>;
|
|
9
|
+
private isSafeCommand;
|
|
10
|
+
}
|