@geekbeer/minion 2.70.2 → 3.4.7

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.
@@ -85,7 +85,7 @@ async function chatRoutes(fastify) {
85
85
  return { success: false, error: 'Unauthorized' }
86
86
  }
87
87
 
88
- const session = await chatStore.load()
88
+ const session = chatStore.load()
89
89
  if (!session) {
90
90
  return { success: true, session: null }
91
91
  }
@@ -95,12 +95,41 @@ async function chatRoutes(fastify) {
95
95
  session: {
96
96
  session_id: session.session_id,
97
97
  messages: session.messages,
98
+ turn_count: session.turn_count,
98
99
  created_at: session.created_at,
99
100
  updated_at: session.updated_at,
100
101
  },
101
102
  }
102
103
  })
103
104
 
105
+ // GET /api/chat/sessions - List all sessions (metadata only)
106
+ fastify.get('/api/chat/sessions', async (request, reply) => {
107
+ if (!verifyToken(request)) {
108
+ reply.code(401)
109
+ return { success: false, error: 'Unauthorized' }
110
+ }
111
+
112
+ const limit = parseInt(request.query?.limit) || 50
113
+ const sessions = chatStore.listSessions(limit)
114
+ return { success: true, sessions }
115
+ })
116
+
117
+ // GET /api/chat/sessions/:sessionId - Get a specific session with messages
118
+ fastify.get('/api/chat/sessions/:sessionId', async (request, reply) => {
119
+ if (!verifyToken(request)) {
120
+ reply.code(401)
121
+ return { success: false, error: 'Unauthorized' }
122
+ }
123
+
124
+ const session = chatStore.loadById(request.params.sessionId)
125
+ if (!session) {
126
+ reply.code(404)
127
+ return { success: false, error: 'Session not found' }
128
+ }
129
+
130
+ return { success: true, session }
131
+ })
132
+
104
133
  // POST /api/chat/clear - Clear the active session
105
134
  fastify.post('/api/chat/clear', async (request, reply) => {
106
135
  if (!verifyToken(request)) {
@@ -204,16 +233,34 @@ async function chatRoutes(fastify) {
204
233
  async function buildContextPrefix(message, context, sessionId) {
205
234
  const parts = []
206
235
 
207
- // Tell the LLM where to find memory and daily logs (content is NOT injected)
236
+ // Tell the LLM how to access memory and daily logs via API
208
237
  if (!sessionId) {
209
- const memoryDir = require('path').join(DATA_DIR, 'memory')
210
- const dailyLogDir = require('path').join(DATA_DIR, 'daily-logs')
238
+ const port = require('../../core/config').config.AGENT_PORT
239
+ const baseUrl = `http://localhost:${port}`
211
240
  parts.push(
212
241
  '[長期記憶・デイリーログについて]',
213
242
  'あなたには長期記憶(メモリ)とデイリーログがあります。内容は毎回読み込まれません。',
214
- '必要なときだけ以下のファイルを読んで参照してください:',
215
- `- メモリ索引: ${memoryDir}/MEMORY.md(概要一覧。詳細は個別の .md ファイルを読む)`,
216
- `- デイリーログ: ${dailyLogDir}/YYYY-MM-DD.md(日付別の作業記録)`,
243
+ '必要なときは以下のAPIで検索・取得してください(認証ヘッダー必須):',
244
+ '',
245
+ '```bash',
246
+ '# メモリ検索(キーワードで全文検索)',
247
+ `curl -H "Authorization: Bearer $API_TOKEN" "${baseUrl}/api/memory?search=キーワード"`,
248
+ '',
249
+ '# メモリ一覧',
250
+ `curl -H "Authorization: Bearer $API_TOKEN" ${baseUrl}/api/memory`,
251
+ '',
252
+ '# メモリ詳細(IDを指定)',
253
+ `curl -H "Authorization: Bearer $API_TOKEN" ${baseUrl}/api/memory/{id}`,
254
+ '',
255
+ '# デイリーログ検索',
256
+ `curl -H "Authorization: Bearer $API_TOKEN" "${baseUrl}/api/daily-logs?search=キーワード"`,
257
+ '',
258
+ '# デイリーログ一覧',
259
+ `curl -H "Authorization: Bearer $API_TOKEN" ${baseUrl}/api/daily-logs`,
260
+ '',
261
+ '# 特定日のデイリーログ取得',
262
+ `curl -H "Authorization: Bearer $API_TOKEN" ${baseUrl}/api/daily-logs/YYYY-MM-DD`,
263
+ '```',
217
264
  '',
218
265
  '参照すべきタイミング:',
219
266
  '- 過去の作業や決定事項を思い出す必要があるとき',
package/linux/server.js CHANGED
@@ -128,7 +128,9 @@ async function shutdown(signal) {
128
128
  stopTerminalProxy()
129
129
  cleanupTtyd()
130
130
 
131
- // Close server
131
+ // Close database and server
132
+ const { closeDb } = require('../core/db')
133
+ closeDb()
132
134
  await fastify.close()
133
135
  process.exit(0)
134
136
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geekbeer/minion",
3
- "version": "2.70.2",
3
+ "version": "3.4.7",
4
4
  "description": "AI Agent runtime for Minion - manages status and skill deployment on VPS",
5
5
  "main": "linux/server.js",
6
6
  "bin": {
@@ -25,6 +25,7 @@
25
25
  "start:win": "node win/server.js"
26
26
  },
27
27
  "dependencies": {
28
+ "better-sqlite3": "^11.0.0",
28
29
  "croner": "^9.0.0",
29
30
  "fastify": "^5.2.2",
30
31
  "ws": "^8.0.0"
@@ -33,7 +34,7 @@
33
34
  "node-pty": "^1.0.0"
34
35
  },
35
36
  "engines": {
36
- "node": ">=20.0.0"
37
+ "node": ">=22.0.0"
37
38
  },
38
39
  "publishConfig": {
39
40
  "access": "public"
package/roles/engineer.md CHANGED
@@ -23,6 +23,18 @@
23
23
 
24
24
  詳細な手順は `~/.minion/docs/task-guides.md` を参照。
25
25
 
26
+ ## ブロッカー対処
27
+
28
+ スキル実行中に自力で解決できない問題に遭遇した場合:
29
+
30
+ 1. **まずプロジェクトメモリーを検索** — `GET /api/project-memories?project_id=...&search=キーワード` で過去の知見を確認
31
+ 2. **自己解決不可なら即ヘルプスレッドを起票** — `POST /api/threads` で `thread_type: "help"` を作成。`attempted_resolution` に試したことを記載
32
+ 3. **人間にしか解決できない問題は `mentions: ["user"]` で即エスカレーション** — 認証コード、パスワード、外部承認など
33
+ 4. **解決後はスレッドを resolve し、知見をプロジェクトメモリーに保存**
34
+
35
+ **スキルを失敗終了させる前に、必ずヘルプスレッドでエスカレーションすること。**
36
+ 詳細は `~/.minion/rules/core.md` の「Blocker Handling」セクションを参照。
37
+
26
38
  ## 実行コンテキスト
27
39
 
28
40
  ミニオン変数・シークレット(HQ UIまたはAPI経由で設定)はサーバー起動時に `process.env` にロードされ、ワークフロー実行中も利用可能。
package/roles/pm.md CHANGED
@@ -42,6 +42,22 @@ HQのDBがステートマシンとして状態を管理し、ミニオン間の
42
42
  - `GET /api/minion/me/project/[id]/context` でコンテキスト取得
43
43
  - `PUT /api/minion/me/project/[id]/context` でコンテキスト更新(PMのみ)
44
44
 
45
+ ## ブロッカー対処
46
+
47
+ PMとして、ブロッカーの解決を主導する責務がある:
48
+
49
+ ### 自分がブロッカーに遭遇した場合
50
+ 1. **プロジェクトメモリーを検索** — 過去の知見で解決できないか確認
51
+ 2. **自己解決不可なら `mentions: ["user"]` でヘルプスレッドを起票** — PMが解決できない問題は人間にエスカレーション
52
+ 3. **解決後はスレッドを resolve し、知見をプロジェクトメモリーに保存**
53
+
54
+ ### エンジニアからのヘルプスレッドに対応する場合
55
+ 1. **thread_watcher が自動で通知するので、`role:pm` 宛のスレッドに回答する**
56
+ 2. **自分で解決できない場合は `@user` メンション付きで人間にエスカレーション**
57
+ 3. **解決策が汎用的なら、プロジェクトメモリーへの保存を促す**
58
+
59
+ 詳細は `~/.minion/rules/core.md` の「Blocker Handling」セクションを参照。
60
+
45
61
  ## Routine (従来方式)
46
62
 
47
63
  ワークフローは `project-workflow-check` スキルを通じてルーティンからも実行可能:
package/rules/core.md CHANGED
@@ -157,6 +157,72 @@ Routine 実行中は以下もtmuxセッション環境で利用可能:
157
157
  - `pm.md` — PM (Project Manager) のガイドライン
158
158
  - `engineer.md` — Engineer のガイドライン
159
159
 
160
+ ## Blocker Handling (ブロッカー対処)
161
+
162
+ タスク実行中にブロッカー(自力で解決できない問題)に遭遇した場合、以下のフローに従うこと。
163
+ **ブロッカーを放置してタスクを失敗終了させてはならない。** 必ずエスカレーションすること。
164
+
165
+ ### ブロッカーの判断基準
166
+
167
+ 以下のいずれかに該当する場合、ブロッカーとして対処する:
168
+ - 認証情報・アクセス権限が不足している(2FA、APIキー、ログイン情報等)
169
+ - 外部サービスがエラーを返し、リトライしても解決しない
170
+ - 必要な情報やファイルが見つからず、推測では進められない
171
+ - 人間の判断・承認が必要(デプロイ承認、契約内容の確認等)
172
+ - 環境の問題(サービスダウン、ネットワークエラー等)で作業を継続できない
173
+
174
+ ### 対処フロー
175
+
176
+ ```
177
+ 1. プロジェクトメモリーを検索(過去に同じ問題が解決済みか確認)
178
+ GET /api/project-memories?project_id=...&category=...&search=キーワード
179
+
180
+ 2-a. 該当する知見あり → 知見に基づいて自己解決を試みる
181
+
182
+ 2-b. 該当なし or 自己解決不可 → ヘルプスレッドを起票
183
+ POST /api/threads
184
+ {
185
+ "project_id": "...",
186
+ "thread_type": "help",
187
+ "title": "問題の要約(1行)",
188
+ "content": "状況の詳細説明",
189
+ "mentions": ["role:pm"],
190
+ "context": {
191
+ "category": "auth|environment|external-service|information|approval",
192
+ "attempted_resolution": "試行した内容"
193
+ }
194
+ }
195
+
196
+ 3. スレッドの返信を待つ(thread_watcher が自動監視)
197
+
198
+ 4. 解決後 → プロジェクトメモリーに知見を保存
199
+ POST /api/project-memories
200
+ {
201
+ "project_id": "...",
202
+ "title": "知見タイトル",
203
+ "content": "解決方法の詳細",
204
+ "category": "know-how",
205
+ "source_thread_id": "スレッドUUID"
206
+ }
207
+ ```
208
+
209
+ ### メンションの使い分け
210
+
211
+ | 状況 | メンション |
212
+ |------|-----------|
213
+ | PMに判断を仰ぐ | `["role:pm"]` |
214
+ | エンジニアの知見が必要 | `["role:engineer"]` |
215
+ | 特定ミニオンに聞く | `["minion:<minion_id>"]` |
216
+ | 人間の介入が必要(認証コード、承認等) | `["user"]` |
217
+ | チーム全体に共有 | `[]`(メンションなし) |
218
+
219
+ ### 重要なルール
220
+
221
+ - **スレッド起票時は `attempted_resolution` を必ず含める。** 何を試したか不明だと、回答者が同じことを提案してしまう。
222
+ - **人間にしか解決できない問題(認証コード入力、外部サービスのパスワード等)は即 `@user` メンション**で起票する。自己解決を試みて時間を浪費しないこと。
223
+ - **ブロッカーが解決したらスレッドを `resolve` する。** 放置しない。
224
+ - **解決策をプロジェクトメモリーに保存する。** 同じブロッカーに再度遭遇する他のミニオンの助けになる。
225
+
160
226
  ## Documentation
161
227
 
162
228
  API仕様やタスク手順の詳細は以下を参照: