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.
Files changed (172) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +293 -0
  3. package/README.ru.md +293 -0
  4. package/dist/agent/agent.module.d.ts +2 -0
  5. package/dist/agent/agent.module.js +34 -0
  6. package/dist/agent/agent.module.js.map +1 -0
  7. package/dist/agent/agent.processor.d.ts +31 -0
  8. package/dist/agent/agent.processor.js +266 -0
  9. package/dist/agent/agent.processor.js.map +1 -0
  10. package/dist/agent/command-guard.service.d.ts +10 -0
  11. package/dist/agent/command-guard.service.js +48 -0
  12. package/dist/agent/command-guard.service.js.map +1 -0
  13. package/dist/agent/interruption.service.d.ts +11 -0
  14. package/dist/agent/interruption.service.js +52 -0
  15. package/dist/agent/interruption.service.js.map +1 -0
  16. package/dist/agent/system-executor.service.d.ts +32 -0
  17. package/dist/agent/system-executor.service.js +200 -0
  18. package/dist/agent/system-executor.service.js.map +1 -0
  19. package/dist/app.module.d.ts +2 -0
  20. package/dist/app.module.js +38 -0
  21. package/dist/app.module.js.map +1 -0
  22. package/dist/bin.d.ts +2 -0
  23. package/dist/bin.js +137 -0
  24. package/dist/bin.js.map +1 -0
  25. package/dist/cli.d.ts +2 -0
  26. package/dist/cli.js +141 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/commands/config.command.d.ts +2 -0
  29. package/dist/commands/config.command.js +83 -0
  30. package/dist/commands/config.command.js.map +1 -0
  31. package/dist/commands/logs.command.d.ts +5 -0
  32. package/dist/commands/logs.command.js +130 -0
  33. package/dist/commands/logs.command.js.map +1 -0
  34. package/dist/commands/profile.command.d.ts +5 -0
  35. package/dist/commands/profile.command.js +293 -0
  36. package/dist/commands/profile.command.js.map +1 -0
  37. package/dist/commands/setup.command.d.ts +1 -0
  38. package/dist/commands/setup.command.js +94 -0
  39. package/dist/commands/setup.command.js.map +1 -0
  40. package/dist/commands/setup.helpers.d.ts +34 -0
  41. package/dist/commands/setup.helpers.js +265 -0
  42. package/dist/commands/setup.helpers.js.map +1 -0
  43. package/dist/commands/skills.command.d.ts +2 -0
  44. package/dist/commands/skills.command.js +111 -0
  45. package/dist/commands/skills.command.js.map +1 -0
  46. package/dist/common/adapters/cli-interaction.adapter.d.ts +8 -0
  47. package/dist/common/adapters/cli-interaction.adapter.js +67 -0
  48. package/dist/common/adapters/cli-interaction.adapter.js.map +1 -0
  49. package/dist/common/adapters/interaction-adapter.interface.d.ts +6 -0
  50. package/dist/common/adapters/interaction-adapter.interface.js +10 -0
  51. package/dist/common/adapters/interaction-adapter.interface.js.map +1 -0
  52. package/dist/common/constants.d.ts +3 -0
  53. package/dist/common/constants.js +7 -0
  54. package/dist/common/constants.js.map +1 -0
  55. package/dist/common/index.d.ts +4 -0
  56. package/dist/common/index.js +21 -0
  57. package/dist/common/index.js.map +1 -0
  58. package/dist/common/logger.d.ts +9 -0
  59. package/dist/common/logger.js +87 -0
  60. package/dist/common/logger.js.map +1 -0
  61. package/dist/common/paths.d.ts +12 -0
  62. package/dist/common/paths.js +28 -0
  63. package/dist/common/paths.js.map +1 -0
  64. package/dist/common/types/message.types.d.ts +48 -0
  65. package/dist/common/types/message.types.js +18 -0
  66. package/dist/common/types/message.types.js.map +1 -0
  67. package/dist/common/types/tool.types.d.ts +20 -0
  68. package/dist/common/types/tool.types.js +3 -0
  69. package/dist/common/types/tool.types.js.map +1 -0
  70. package/dist/common/utils/type-guards.d.ts +8 -0
  71. package/dist/common/utils/type-guards.js +46 -0
  72. package/dist/common/utils/type-guards.js.map +1 -0
  73. package/dist/config/config-loader.d.ts +6 -0
  74. package/dist/config/config-loader.js +90 -0
  75. package/dist/config/config-loader.js.map +1 -0
  76. package/dist/config/config.module.d.ts +2 -0
  77. package/dist/config/config.module.js +28 -0
  78. package/dist/config/config.module.js.map +1 -0
  79. package/dist/config/config.types.d.ts +55 -0
  80. package/dist/config/config.types.js +21 -0
  81. package/dist/config/config.types.js.map +1 -0
  82. package/dist/daemon.d.ts +2 -0
  83. package/dist/daemon.js +28 -0
  84. package/dist/daemon.js.map +1 -0
  85. package/dist/llm/anthropic/anthropic.provider.d.ts +15 -0
  86. package/dist/llm/anthropic/anthropic.provider.js +162 -0
  87. package/dist/llm/anthropic/anthropic.provider.js.map +1 -0
  88. package/dist/llm/google/google.provider.d.ts +14 -0
  89. package/dist/llm/google/google.provider.js +189 -0
  90. package/dist/llm/google/google.provider.js.map +1 -0
  91. package/dist/llm/llm-factory.service.d.ts +24 -0
  92. package/dist/llm/llm-factory.service.js +76 -0
  93. package/dist/llm/llm-factory.service.js.map +1 -0
  94. package/dist/llm/llm.interface.d.ts +19 -0
  95. package/dist/llm/llm.interface.js +5 -0
  96. package/dist/llm/llm.interface.js.map +1 -0
  97. package/dist/llm/llm.module.d.ts +2 -0
  98. package/dist/llm/llm.module.js +34 -0
  99. package/dist/llm/llm.module.js.map +1 -0
  100. package/dist/llm/nvidia/nvidia.provider.d.ts +11 -0
  101. package/dist/llm/nvidia/nvidia.provider.js +49 -0
  102. package/dist/llm/nvidia/nvidia.provider.js.map +1 -0
  103. package/dist/llm/openai/openai.provider.d.ts +9 -0
  104. package/dist/llm/openai/openai.provider.js +35 -0
  105. package/dist/llm/openai/openai.provider.js.map +1 -0
  106. package/dist/llm/openai-compatible/openai-compatible.helper.d.ts +4 -0
  107. package/dist/llm/openai-compatible/openai-compatible.helper.js +155 -0
  108. package/dist/llm/openai-compatible/openai-compatible.helper.js.map +1 -0
  109. package/dist/llm/proxy/proxy.provider.d.ts +9 -0
  110. package/dist/llm/proxy/proxy.provider.js +35 -0
  111. package/dist/llm/proxy/proxy.provider.js.map +1 -0
  112. package/dist/main.d.ts +1 -0
  113. package/dist/main.js +14 -0
  114. package/dist/main.js.map +1 -0
  115. package/dist/prisma/prisma.module.d.ts +2 -0
  116. package/dist/prisma/prisma.module.js +22 -0
  117. package/dist/prisma/prisma.module.js.map +1 -0
  118. package/dist/prisma/prisma.service.d.ts +9 -0
  119. package/dist/prisma/prisma.service.js +40 -0
  120. package/dist/prisma/prisma.service.js.map +1 -0
  121. package/dist/sessions/sessions.module.d.ts +2 -0
  122. package/dist/sessions/sessions.module.js +23 -0
  123. package/dist/sessions/sessions.module.js.map +1 -0
  124. package/dist/sessions/sessions.service.d.ts +21 -0
  125. package/dist/sessions/sessions.service.js +82 -0
  126. package/dist/sessions/sessions.service.js.map +1 -0
  127. package/dist/skills/definitions/directory_explorer.md +69 -0
  128. package/dist/skills/definitions/execute_command.md +27 -0
  129. package/dist/skills/definitions/git_manager.md +98 -0
  130. package/dist/skills/definitions/read_file.md +25 -0
  131. package/dist/skills/skills-bundle.d.ts +7 -0
  132. package/dist/skills/skills-bundle.js +27 -0
  133. package/dist/skills/skills-bundle.js.map +1 -0
  134. package/dist/skills/skills-parser.d.ts +8 -0
  135. package/dist/skills/skills-parser.js +67 -0
  136. package/dist/skills/skills-parser.js.map +1 -0
  137. package/dist/skills/skills.module.d.ts +2 -0
  138. package/dist/skills/skills.module.js +22 -0
  139. package/dist/skills/skills.module.js.map +1 -0
  140. package/dist/skills/skills.service.d.ts +22 -0
  141. package/dist/skills/skills.service.js +150 -0
  142. package/dist/skills/skills.service.js.map +1 -0
  143. package/dist/skills/skills.types.d.ts +16 -0
  144. package/dist/skills/skills.types.js +3 -0
  145. package/dist/skills/skills.types.js.map +1 -0
  146. package/dist/soul/prompts/core.md +28 -0
  147. package/dist/soul/prompts/rules.md +40 -0
  148. package/dist/soul/prompts/runtime.md +13 -0
  149. package/dist/soul/prompts/voice.md +45 -0
  150. package/dist/soul/soul.module.d.ts +2 -0
  151. package/dist/soul/soul.module.js +22 -0
  152. package/dist/soul/soul.module.js.map +1 -0
  153. package/dist/soul/soul.service.d.ts +22 -0
  154. package/dist/soul/soul.service.js +89 -0
  155. package/dist/soul/soul.service.js.map +1 -0
  156. package/dist/telegram/pairing.service.d.ts +11 -0
  157. package/dist/telegram/pairing.service.js +81 -0
  158. package/dist/telegram/pairing.service.js.map +1 -0
  159. package/dist/telegram/telegram-interaction.adapter.d.ts +16 -0
  160. package/dist/telegram/telegram-interaction.adapter.js +54 -0
  161. package/dist/telegram/telegram-interaction.adapter.js.map +1 -0
  162. package/dist/telegram/telegram.module.d.ts +2 -0
  163. package/dist/telegram/telegram.module.js +25 -0
  164. package/dist/telegram/telegram.module.js.map +1 -0
  165. package/dist/telegram/telegram.service.d.ts +28 -0
  166. package/dist/telegram/telegram.service.js +255 -0
  167. package/dist/telegram/telegram.service.js.map +1 -0
  168. package/dist/tsconfig.build.tsbuildinfo +1 -0
  169. package/package.json +68 -0
  170. package/prisma/migrations/20260403134611_init/migration.sql +40 -0
  171. package/prisma/migrations/migration_lock.toml +3 -0
  172. 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
+ [![npm version](https://img.shields.io/npm/v/harubashi.svg?style=flat-square)](https://www.npmjs.com/package/harubashi)
8
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](LICENSE)
9
+ [![Node](https://img.shields.io/node/v/harubashi.svg?style=flat-square)](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,2 @@
1
+ export declare class AgentModule {
2
+ }
@@ -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
+ }