eniac-slack 0.1.38 → 0.1.40

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.40] - 2026-03-14
4
+
5
+ - feat(slack): 시스템 프롬프트 경량화로 토큰 최적화 (#45)
6
+ - feat(slack): MCP 서버 키워드 기반 선별 로딩 (#44)
7
+
8
+
9
+ ## [0.1.39] - 2026-03-14
10
+
11
+ - feat(slack): 프로젝트별/세션별 도구 사용량 통계 수집
12
+ - docs: README.md, SPEC.md 최신 코드베이스 기준 업데이트 (#42)
13
+
14
+
3
15
  ## [0.1.38] - 2026-03-13
4
16
 
5
17
  - feat(slack): 사용량 조회 명령어 추가 (#41)
package/SPEC.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- Slack 소켓모드 봇으로, 멘션을 통해 Claude Code 세션을 시작하고 스레드 단위로 대화를 이어갈 수 있다. GitHub 레포지토리 연동 도구 실행 권한 승인을 Slack 버튼으로 처리한다.
5
+ Slack 소켓모드 봇으로, 멘션을 통해 Claude Code 세션을 시작하고 스레드 단위로 대화를 이어갈 수 있다. GitHub 레포지토리 연동, 레포 자동 생성, 도구 실행 권한 승인, 이미지 분석, MCP 서버 연동을 지원한다.
6
6
 
7
7
  ## Architecture
8
8
 
@@ -42,8 +42,10 @@ Slack 소켓모드 봇으로, 멘션을 통해 Claude Code 세션을 시작하
42
42
 
43
43
  - `.env` 로드 (실행 디렉토리 및 상위 디렉토리)
44
44
  - 필수 환경변수 검증: `SLACK_BOT_TOKEN`, `SLACK_APP_TOKEN`
45
- - `REPOS_BASE_DIR` (선택, 기본: `~/.eniac/repos`)
45
+ - 선택 환경변수: `REPOS_BASE_DIR` (기본: `~/.eniac/repos`), `GITHUB_TOKEN`, `SLACK_USER_TOKEN`
46
46
  - Bolt 앱 시작
47
+ - EPIPE 에러 핸들링 (Claude Agent SDK 서브프로세스 비정상 종료 대응)
48
+ - **자동 업데이트:** npm 레지스트리에서 10분 간격으로 새 버전 확인, 새 버전 발견 시 `process.exit(0)` (프로세스 매니저가 재시작)
47
49
 
48
50
  ### `app.ts` — Slack Bolt App
49
51
 
@@ -54,30 +56,61 @@ Slack 소켓모드 봇으로, 멘션을 통해 Claude Code 세션을 시작하
54
56
  - 액션 등록:
55
57
  - `approve_permission` → 도구 실행 승인
56
58
  - `deny_permission` → 도구 실행 거부
59
+ - `create_repo_private` → 비공개 레포 생성 후 세션 시작
60
+ - `create_repo_public` → 공개 레포 생성 후 세션 시작
61
+ - `skip_repo` → 레포 없이 세션 시작
62
+ - `GITHUB_TOKEN` 전달 시 `setGithubToken()` 호출
63
+ - `SLACK_USER_TOKEN` 전달 시 `initUserClient()` 호출
57
64
 
58
65
  ### `handlers/mention.ts` — @Mention Handler
59
66
 
67
+ **관리 명령어 (Claude 호출 없이 즉시 처리):**
68
+
69
+ - `세션조회` → 모든 활성 세션 목록 표시
70
+ - `모든 세션 종료` → 전체 세션 삭제
71
+ - `스레드삭제` (스레드 내 멘션) → 스레드의 모든 메시지 삭제 + 세션 종료
72
+
60
73
  **새 메시지 (thread 아닌 경우):**
61
74
 
62
75
  1. 메시지에서 봇 멘션 제거
63
- 2. GitHub repo 패턴 감지:
64
- - **있으면:** bare clone → worktree 생성 → Claude 세션 시작
65
- - **없으면:** temp 디렉토리 생성 → Claude 세션 시작
66
- 3. Claude 응답을 스레드에 스트리밍
76
+ 2. 멘션이면 세션만 생성하고 안내 메시지 표시
77
+ 3. GitHub repo 패턴 감지:
78
+ - **레포 있고 존재함:** bare clone → worktree 생성 → Claude 세션 시작
79
+ - **레포 있고 존재하지 않음:** 레포 생성 버튼 표시 (private / public / skip)
80
+ - **레포 없음:** temp 디렉토리 생성 → Claude 세션 시작
81
+ 4. Claude 응답을 스레드에 스트리밍
67
82
 
68
83
  **스레드 내 멘션:**
69
84
 
70
- - 기존 세션이 있으면 이어서 진행
71
- - 없으면 temp 디렉토리에 새 세션 생성
85
+ - 기존 세션이 있으면 기존 요청 abort 후 이어서 진행
86
+ - 없으면 안내 메시지 표시
87
+
88
+ **레포 생성 플로우:**
89
+
90
+ - `pendingRepoRequests` Map으로 대기 중인 레포 생성 요청 관리
91
+ - 스레드 작성자만 버튼 클릭 가능
92
+ - 생성 완료 후 자동으로 세션 시작
72
93
 
73
94
  ### `handlers/thread.ts` — Thread Reply Handler
74
95
 
75
96
  - 봇이 활성 세션을 가진 스레드의 일반 메시지 처리
76
- - 봇 자신의 메시지, subtype 메시지 무시
77
- - `file_share` subtype은 허용 (이미지 첨부 메시지)
78
- - 기존 세션에 이어서 Claude에 전달
79
- - **이미지 첨부:** `downloadSlackImages()`로 이미지 다운로드 후 Claude에 전달
80
- - **요청 중단:** 메시지 수신 `abortActiveChat(threadTs)`로 기존 요청 즉시 중단
97
+ - 봇 자신의 메시지, subtype 메시지 무시 (`file_share`는 허용)
98
+
99
+ **관리 명령어 (세션 유무와 무관하게 동작):**
100
+
101
+ - `스레드삭제` 스레드 전체 메시지 삭제 + 세션 종료
102
+ - `세션조회` → 모든 활성 세션 목록 표시
103
+ - `모든 세션 종료` → 전체 세션 삭제
104
+
105
+ **세션이 필요한 명령어:**
106
+
107
+ - `세션종료` → 현재 스레드의 세션만 종료
108
+
109
+ **일반 메시지:**
110
+
111
+ - 세션이 없으면 안내 메시지 표시
112
+ - 이미지 첨부 시 `downloadSlackImages()`로 다운로드 후 Claude에 전달
113
+ - 새 메시지 수신 시 `abortActiveChat(threadTs)`로 기존 요청 즉시 중단
81
114
 
82
115
  ### `services/claude.ts` — Claude Code Session Manager
83
116
 
@@ -92,6 +125,9 @@ Slack 소켓모드 봇으로, 멘션을 통해 Claude Code 세션을 시작하
92
125
 
93
126
  - `createSession(threadTs, workDir, authorUserId)` → 새 세션 생성
94
127
  - `getSession(threadTs)` → 기존 세션 조회
128
+ - `getAllSessions()` → 전체 세션 목록 반환
129
+ - `deleteSession(threadTs)` → 단일 세션 삭제 (worktree + JSONL 정리)
130
+ - `deleteAllSessions()` → 전체 세션 삭제
95
131
  - `lastActivityAt` 매 대화마다 갱신
96
132
  - 서버 시작 시 2주 이상 비활성 세션 자동 정리 (SDK `.jsonl` + worktree 삭제)
97
133
 
@@ -211,15 +247,22 @@ Claude canUseTool 콜백 호출 (위험 도구)
211
247
 
212
248
  ### `services/slack-messenger.ts` — Streaming Message Updater
213
249
 
214
- - 초기 메시지 "⏳ Thinking..." 포스트 (Claude 아이콘 사용)
250
+ - 초기 메시지 "⏳ 생각하는 중..." 포스트 (Claude 아이콘 사용)
215
251
  - `ChatEvent` 스트림을 소비하며:
216
252
  - `text` → 텍스트 누적 후 메시지 업데이트
217
253
  - `error` → 에러 메시지 추가
218
254
  - 500ms 스로틀링으로 Slack rate limit 방지
219
255
  - 중간 업데이트 시 단어 경계에서 텍스트 자르기 (한글 punycode 버그 방지)
220
256
  - **AbortSignal 지원:** `options.signal`로 스트림 중단 감지, 중단 시 ":no_entry_sign:" 메시지로 업데이트
257
+ - **최종 전달:** 스트리밍 메시지 삭제 후 새 메시지로 포스트 (Slack 알림 트리거)
221
258
  - **Claude 아이콘:** `CLAUDE_ICON_URL` 상수를 사용하여 봇 응답에 Claude 공식 아이콘 표시
222
259
 
260
+ ### `services/slack-user-client.ts` — Slack User Token Client
261
+
262
+ - `initUserClient(token)` — `SLACK_USER_TOKEN`으로 `WebClient` 인스턴스 생성
263
+ - `getUserClient()` — 유저 토큰 클라이언트 반환 (없으면 `undefined`)
264
+ - 스레드 삭제 시 봇 토큰 대신 유저 토큰을 사용하여 다른 사용자의 메시지도 삭제 가능
265
+
223
266
  ### `services/git.ts` — Repository Manager
224
267
 
225
268
  **전략: bare repo + worktree**
@@ -240,6 +283,18 @@ Claude canUseTool 콜백 호출 (위험 도구)
240
283
  4. default branch는 `HEAD` symbolic ref에서 자동 감지
241
284
  5. 스레드마다 독립 브랜치 → PR 생성 가능
242
285
 
286
+ **레포 존재 확인:**
287
+
288
+ - `checkRepoExists(owner, repo)` → `boolean`
289
+ - `GITHUB_TOKEN` 있으면 GitHub API 사용, 없으면 `git ls-remote` 폴백
290
+
291
+ **레포 생성:**
292
+
293
+ - `createGithubRepo(owner, repo, isPrivate)` → GitHub API로 레포 생성
294
+ - `GITHUB_TOKEN` 필수
295
+ - 인증된 사용자 감지 후 user/org 엔드포인트 구분
296
+ - `auto_init: true` (빈 레포 방지)
297
+
243
298
  ### `constants.ts` — Shared Constants
244
299
 
245
300
  - `CLAUDE_ICON_URL` — Claude 공식 apple-touch-icon URL (`https://claude.ai/apple-touch-icon.png`)
@@ -250,7 +305,9 @@ Claude canUseTool 콜백 호출 (위험 도구)
250
305
  - `downloadSlackImages(client, files)` → `Promise<SlackImageFile[]>`
251
306
  - Slack 메시지의 `files` 배열에서 이미지 다운로드
252
307
  - 지원 타입: `image/jpeg`, `image/png`, `image/gif`, `image/webp`
253
- - Bot 토큰으로 `url_private_download` (또는 `url_private`) 접근
308
+ - 다중 다운로드 전략: Bearer 헤더, 쿼리 파라미터, `files.info` API, 썸네일 폴백
309
+ - 매직 바이트로 실제 이미지 포맷 검증 (HTML 응답 거부)
310
+ - `sharp`로 최대 1568px 리사이즈 + PNG 정규화
254
311
  - base64 인코딩된 이미지 데이터 반환
255
312
 
256
313
  ### `utils/slack-format.ts` — Markdown → Slack mrkdwn Converter
@@ -278,15 +335,21 @@ Claude canUseTool 콜백 호출 (위험 도구)
278
335
  - `owner/repo` ✅ (유효한 GitHub 네이밍 규칙 충족 시)
279
336
  - `../path` ❌ (파일 경로 형태 거부)
280
337
 
338
+ ### `utils/session-info.ts` — Session Info Formatter
339
+
340
+ - `formatSessionInfo(sessions)`: 세션 목록을 Slack 메시지로 포맷
341
+ - 세션별 표시: 상태 이모지 (🟢 시작됨 / ⚪ 대기), 스레드 ID, 작성자, 레포, 생성 시간, 마지막 활동 상대 시간
342
+
281
343
  ## Data Storage
282
344
 
283
345
  | 데이터 | 경로 | 내용 |
284
346
  |--------|------|------|
285
- | 세션 매핑 | `~/.eniac/sessions.json` | `threadTs → { sessionId, workDir, authorUserId, ... }` |
347
+ | 세션 매핑 | `~/.eniac/sessions.json` | `threadTs → { sessionId, workDir, authorUserId, createdAt, lastActivityAt, hasStarted }` |
286
348
  | SDK 대화 기록 | `~/.claude/projects/{cwd-encoded}/{sessionId}.jsonl` | 전체 대화 히스토리 (SDK 자동 관리) |
287
349
  | MCP 설정 | `~/.claude/.mcp.json` | MCP 서버 연결 설정 (선택) |
288
350
  | Git bare repos | `{REPOS_BASE_DIR}/{owner}/{repo}.git/` | 공유 bare clone |
289
351
  | Git worktrees | `{REPOS_BASE_DIR}/{owner}/{repo}/worktrees/{timestamp}/` | 스레드별 작업 디렉토리 |
352
+ | 이미지 | `{workDir}/.eniac-images/` | 분석을 위해 다운로드된 이미지 파일 |
290
353
 
291
354
  **세션 만료:** `lastActivityAt` 기준 2주 경과 시 서버 시작 시점에 자동 정리 (세션 파일 + worktree 삭제)
292
355
 
@@ -296,6 +359,8 @@ Claude canUseTool 콜백 호출 (위험 도구)
296
359
  |------|------|------|
297
360
  | `SLACK_BOT_TOKEN` | ✅ | `xoxb-` 봇 토큰 |
298
361
  | `SLACK_APP_TOKEN` | ✅ | `xapp-` 앱 레벨 토큰 (소켓모드) |
362
+ | `GITHUB_TOKEN` | ❌ | GitHub API 토큰 (레포 존재 확인 + 신규 생성) |
363
+ | `SLACK_USER_TOKEN` | ❌ | `xoxp-` 유저 토큰 (스레드 삭제 시 타인 메시지 삭제 가능) |
299
364
  | `REPOS_BASE_DIR` | ❌ | 레포 저장 경로 (기본: `~/.eniac/repos`) |
300
365
 
301
366
  ## Tech Stack
@@ -307,6 +372,7 @@ Claude canUseTool 콜백 호출 (위험 도구)
307
372
  - **Slack:** `@slack/bolt` v4 (Socket Mode)
308
373
  - **Claude:** `@anthropic-ai/claude-agent-sdk` ^0.2.72 (`query()` API)
309
374
  - **Git:** `simple-git`
375
+ - **Image Processing:** `sharp` (리사이즈 + PNG 정규화)
310
376
 
311
377
  ## Slack App 설정 요구사항
312
378
 
@@ -1 +1 @@
1
- {"version":3,"file":"mention.d.ts","sourceRoot":"","sources":["../../src/handlers/mention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAoC,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAItF,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAUnF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,GAChB,kBAAkB,GAAG,SAAS,CAEhC;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEhE;AAID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEjD;AASD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,iBAAiB,GAAG,wBAAwB,CAAC,aAAa,CAAC,GAChE,OAAO,CAAC,IAAI,CAAC,CAuIf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAMf"}
1
+ {"version":3,"file":"mention.d.ts","sourceRoot":"","sources":["../../src/handlers/mention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAoC,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAItF,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAWnF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,GAChB,kBAAkB,GAAG,SAAS,CAEhC;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEhE;AAID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEjD;AASD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,iBAAiB,GAAG,wBAAwB,CAAC,aAAa,CAAC,GAChE,OAAO,CAAC,IAAI,CAAC,CAuIf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -6,6 +6,7 @@ import { downloadSlackImages } from "../utils/slack-files.js";
6
6
  import { CLAUDE_ICON_URL } from "../constants.js";
7
7
  import { formatSessionInfo } from "../utils/session-info.js";
8
8
  import { fetchUsage } from "../services/usage.js";
9
+ import { setSessionRepo } from "../services/stats.js";
9
10
  import { getUserClient } from "../services/slack-user-client.js";
10
11
  import { deleteThreadMessages } from "../utils/thread-delete.js";
11
12
  import fs from "node:fs/promises";
@@ -185,6 +186,7 @@ export async function startSessionWithRepo(client, channel, threadTs, repoInfo,
185
186
  return;
186
187
  }
187
188
  createSession(threadTs, workDir, authorUserId);
189
+ setSessionRepo(threadTs, `${repoInfo.owner}/${repoInfo.repo}`);
188
190
  const userMessage = `[Working directory: ${workDir} — Repository: ${repoInfo.owner}/${repoInfo.repo}]\n\n${cleanText}`;
189
191
  const stream = chat(threadTs, userMessage, client, channel, images?.length ? images : undefined);
190
192
  await postStreamingReply(client, channel, threadTs, stream);
@@ -1 +1 @@
1
- {"version":3,"file":"mention.js","sourceRoot":"","sources":["../../src/handlers/mention.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mention.js","sourceRoot":"","sources":["../../src/handlers/mention.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAK9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,UAAU,OAAO;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAuJvC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CASzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAExE;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAaT;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAuCvD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAyC1C;AAED,wBAAgB,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAErD;AAsCD;;;;;GAKG;AACH,wBAAuB,IAAI,CACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,SAAS,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,cAAc,EAAE,GACxB,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CA0N1C"}
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAK9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD,UAAU,OAAO;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAkKvC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CASzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAExE;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAaT;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAuCvD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAyC1C;AAED,wBAAgB,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAErD;AAsCD;;;;;GAKG;AACH,wBAAuB,IAAI,CACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,SAAS,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,cAAc,EAAE,GACxB,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAwP1C"}
@@ -4,6 +4,7 @@ import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import os from "node:os";
6
6
  import { requestPermission } from "./permissions.js";
7
+ import { recordToolUse, recordResult } from "./stats.js";
7
8
  // --- Persistent session store ---
8
9
  const SESSIONS_FILE = path.join(os.homedir(), ".eniac", "sessions.json");
9
10
  function loadSessions() {
@@ -44,49 +45,51 @@ function loadMcpServers() {
44
45
  return undefined;
45
46
  }
46
47
  const mcpServers = loadMcpServers();
47
- // --- Slack formatting system prompt ---
48
- const SLACK_FORMAT_PROMPT = `
49
- # Slack Formatting Rules
50
-
51
- You are responding inside a Slack conversation. Follow these formatting rules strictly:
52
-
53
- ## Text Formatting
54
- - Use *bold* (single asterisk) instead of **bold** (double asterisk)
55
- - Use _italic_ (underscore) for emphasis
56
- - Use ~strikethrough~ for deleted text
57
- - Use \`inline code\` with backticks (same as Markdown)
58
- - Use \`\`\`code blocks\`\`\` with triple backticks (same as Markdown)
59
- - Use > for blockquotes (same as Markdown)
60
-
61
- ## Structure
62
- - Use bullet lists with • or - for unordered items
63
- - Use numbered lists with 1. 2. 3. for ordered items
64
- - Do NOT use # headers. Instead, use *bold text* on its own line as a section title
65
- - Use ─────── (horizontal line with box-drawing characters) instead of --- for dividers
66
-
67
- ## Tables
68
- - Slack does not support Markdown tables
69
- - When you need to display tabular data, use a code block with box-drawing characters:
70
- \`\`\`
71
- ┌──────┬───────┬──────┐
72
- │ Name │ Value │ Note │
73
- ├──────┼───────┼──────┤
74
- foo │ 123 │ ok │
75
- bar │ 456 │ ok │
76
- └──────┴───────┴──────┘
77
- \`\`\`
78
-
79
- ## Links
80
- - Use <URL|display text> format instead of [display text](URL)
48
+ // --- MCP server filtering by user message ---
49
+ const KEYWORD_MCP_RULES = [
50
+ { key: "dokploy", patterns: /배포|deploy|dokploy|서버\s*상태|앱\s*(시작|중지|재시작|삭제)|redeploy|도메인/ },
51
+ { key: "vault", patterns: /시크릿|secret|vault|인증서|cert|pki|마운트|mount/ },
52
+ { key: "slack", patterns: /슬랙|slack|채널|메시지\s*보내|리액션|reaction/ },
53
+ ];
54
+ const KEYWORD_MCP_KEYS = new Set(KEYWORD_MCP_RULES.map((r) => r.key));
55
+ function selectMcpServers(userMessage, allServers) {
56
+ if (!allServers)
57
+ return undefined;
58
+ const msg = userMessage.toLowerCase();
59
+ const selected = {};
60
+ // Always include non-keyword MCP servers (e.g. filesystem, context7)
61
+ for (const [key, config] of Object.entries(allServers)) {
62
+ if (!KEYWORD_MCP_KEYS.has(key)) {
63
+ selected[key] = config;
64
+ }
65
+ }
66
+ // Include keyword MCP servers only when message matches
67
+ for (const { key, patterns } of KEYWORD_MCP_RULES) {
68
+ if (patterns.test(msg) && allServers[key]) {
69
+ selected[key] = allServers[key];
70
+ }
71
+ }
72
+ return Object.keys(selected).length > 0 ? selected : undefined;
73
+ }
74
+ // --- System prompt for Slack bot ---
75
+ const SYSTEM_PROMPT = `
76
+ You are an AI assistant in a Slack workspace, helping with software engineering tasks.
77
+ You have access to tools for reading/searching/editing code, running shell commands, and browsing the web.
81
78
 
82
- ## Emoji
83
- - Use emoji actively to make messages more readable and engaging :rocket: :white_check_mark: :warning: :bulb: :memo:
84
- - Use emoji as visual indicators for status, categories, or emphasis
79
+ # Guidelines
80
+ - Read and understand existing code before suggesting modifications.
81
+ - Keep solutions simple and focused. Only make changes that are directly requested.
82
+ - Do not introduce security vulnerabilities (injection, XSS, etc).
83
+ - When referencing code, include file_path:line_number format.
84
+ - Be concise. Lead with the answer, skip filler words.
85
85
 
86
- ## General
87
- - Keep responses concise and scannable
88
- - Use line breaks generously for readability
89
- - Never use HTML tags
86
+ # Slack Formatting
87
+ - *bold* (not **bold**), _italic_, ~strike~, \`code\`, \`\`\`code block\`\`\`
88
+ - No # headers → use *bold text* on its own line as section title
89
+ - Tables code block with box-drawing chars (┌─┬┐ │ ├─┼┤ └─┴┘)
90
+ - Links → <URL|display text> (not [text](URL))
91
+ - Use emoji actively for readability :rocket: :white_check_mark: :warning:
92
+ - Keep responses concise and scannable. No HTML.
90
93
  `.trim();
91
94
  const SESSION_TTL_MS = 14 * 24 * 60 * 60 * 1000; // 2 weeks
92
95
  function cleanupExpiredSessions() {
@@ -357,18 +360,17 @@ export async function* chat(threadTs, userMessage, slackClient, channel, images)
357
360
  permissionMode: "bypassPermissions",
358
361
  allowDangerouslySkipPermissions: true,
359
362
  includePartialMessages: true,
360
- systemPrompt: {
361
- type: "preset",
362
- preset: "claude_code",
363
- append: SLACK_FORMAT_PROMPT,
364
- },
363
+ systemPrompt: SYSTEM_PROMPT,
365
364
  stderr: (data) => {
366
365
  stderrChunks.push(data);
367
366
  // Keep only last 50 chunks to avoid memory bloat
368
367
  if (stderrChunks.length > 50)
369
368
  stderrChunks.shift();
370
369
  },
371
- ...(mcpServers && { mcpServers }),
370
+ ...(() => {
371
+ const filtered = selectMcpServers(userMessage, mcpServers);
372
+ return filtered ? { mcpServers: filtered } : {};
373
+ })(),
372
374
  ...(session.hasStarted
373
375
  ? { resume: session.sessionId }
374
376
  : { sessionId: session.sessionId }),
@@ -396,6 +398,14 @@ export async function* chat(threadTs, userMessage, slackClient, channel, images)
396
398
  }
397
399
  continue;
398
400
  }
401
+ // Track tool usage from tool_progress messages
402
+ if (msgType === "tool_progress") {
403
+ const tp = message;
404
+ if (tp.tool_name) {
405
+ recordToolUse(threadTs, tp.tool_name);
406
+ }
407
+ continue;
408
+ }
399
409
  // Final result — if streaming didn't deliver the text, use result.result as fallback
400
410
  if (msgType === "result") {
401
411
  const result = message;
@@ -403,6 +413,20 @@ export async function* chat(threadTs, userMessage, slackClient, channel, images)
403
413
  if (result.errors && result.errors.length > 0) {
404
414
  console.error(`[claude] result errors: ${JSON.stringify(result.errors)}`);
405
415
  }
416
+ // Record stats
417
+ recordResult(threadTs, {
418
+ costUsd: result.total_cost_usd,
419
+ tokens: result.usage
420
+ ? {
421
+ input: result.usage.input_tokens,
422
+ output: result.usage.output_tokens,
423
+ cacheRead: result.usage.cache_read_input_tokens,
424
+ cacheCreation: result.usage.cache_creation_input_tokens,
425
+ }
426
+ : undefined,
427
+ turns: result.num_turns,
428
+ durationMs: result.duration_ms,
429
+ });
406
430
  if (result.subtype === "success") {
407
431
  receivedSuccessResult = true;
408
432
  }
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ interface SessionStats {
2
+ repo: string | null;
3
+ costUsd: number;
4
+ tokens: {
5
+ input: number;
6
+ output: number;
7
+ cacheRead: number;
8
+ cacheCreation: number;
9
+ };
10
+ toolUsage: Record<string, number>;
11
+ turns: number;
12
+ durationMs: number;
13
+ createdAt: string;
14
+ lastUpdatedAt: string;
15
+ }
16
+ export declare function recordToolUse(threadTs: string, toolName: string): void;
17
+ export declare function recordResult(threadTs: string, data: {
18
+ costUsd?: number;
19
+ tokens?: {
20
+ input?: number;
21
+ output?: number;
22
+ cacheRead?: number;
23
+ cacheCreation?: number;
24
+ };
25
+ turns?: number;
26
+ durationMs?: number;
27
+ }): void;
28
+ export declare function setSessionRepo(threadTs: string, repo: string | null): void;
29
+ interface ProjectSummary {
30
+ repo: string;
31
+ totalCostUsd: number;
32
+ totalTokens: {
33
+ input: number;
34
+ output: number;
35
+ cacheRead: number;
36
+ cacheCreation: number;
37
+ };
38
+ toolUsage: Record<string, number>;
39
+ totalTurns: number;
40
+ totalDurationMs: number;
41
+ sessionCount: number;
42
+ }
43
+ export declare function getProjectSummaries(): ProjectSummary[];
44
+ export declare function getSessionStats(threadTs: string): SessionStats | undefined;
45
+ export {};
46
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/services/stats.ts"],"names":[],"mappings":"AAIA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AA2BD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMtE;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IACJ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,IAAI,CAgBN;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB,IAAI,CAKN;AAkBD,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAqCtD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAG1E"}
@@ -0,0 +1,106 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ const STATS_FILE = path.join(os.homedir(), ".eniac", "stats.json");
5
+ function loadStats() {
6
+ try {
7
+ const data = fs.readFileSync(STATS_FILE, "utf-8");
8
+ return JSON.parse(data);
9
+ }
10
+ catch {
11
+ return { sessions: {} };
12
+ }
13
+ }
14
+ function saveStats(store) {
15
+ try {
16
+ const dir = path.dirname(STATS_FILE);
17
+ fs.mkdirSync(dir, { recursive: true });
18
+ fs.writeFileSync(STATS_FILE, JSON.stringify(store, null, 2));
19
+ }
20
+ catch (err) {
21
+ console.warn("[stats] failed to save:", err);
22
+ }
23
+ }
24
+ export function recordToolUse(threadTs, toolName) {
25
+ const store = loadStats();
26
+ const session = ensureSession(store, threadTs);
27
+ session.toolUsage[toolName] = (session.toolUsage[toolName] ?? 0) + 1;
28
+ session.lastUpdatedAt = new Date().toISOString();
29
+ saveStats(store);
30
+ }
31
+ export function recordResult(threadTs, data) {
32
+ const store = loadStats();
33
+ const session = ensureSession(store, threadTs);
34
+ if (data.costUsd != null)
35
+ session.costUsd += data.costUsd;
36
+ if (data.tokens) {
37
+ session.tokens.input += data.tokens.input ?? 0;
38
+ session.tokens.output += data.tokens.output ?? 0;
39
+ session.tokens.cacheRead += data.tokens.cacheRead ?? 0;
40
+ session.tokens.cacheCreation += data.tokens.cacheCreation ?? 0;
41
+ }
42
+ if (data.turns != null)
43
+ session.turns += data.turns;
44
+ if (data.durationMs != null)
45
+ session.durationMs += data.durationMs;
46
+ session.lastUpdatedAt = new Date().toISOString();
47
+ saveStats(store);
48
+ }
49
+ export function setSessionRepo(threadTs, repo) {
50
+ const store = loadStats();
51
+ const session = ensureSession(store, threadTs);
52
+ session.repo = repo;
53
+ saveStats(store);
54
+ }
55
+ function ensureSession(store, threadTs) {
56
+ if (!store.sessions[threadTs]) {
57
+ store.sessions[threadTs] = {
58
+ repo: null,
59
+ costUsd: 0,
60
+ tokens: { input: 0, output: 0, cacheRead: 0, cacheCreation: 0 },
61
+ toolUsage: {},
62
+ turns: 0,
63
+ durationMs: 0,
64
+ createdAt: new Date().toISOString(),
65
+ lastUpdatedAt: new Date().toISOString(),
66
+ };
67
+ }
68
+ return store.sessions[threadTs];
69
+ }
70
+ export function getProjectSummaries() {
71
+ const store = loadStats();
72
+ const byRepo = new Map();
73
+ for (const session of Object.values(store.sessions)) {
74
+ const repo = session.repo ?? "(no repo)";
75
+ let summary = byRepo.get(repo);
76
+ if (!summary) {
77
+ summary = {
78
+ repo,
79
+ totalCostUsd: 0,
80
+ totalTokens: { input: 0, output: 0, cacheRead: 0, cacheCreation: 0 },
81
+ toolUsage: {},
82
+ totalTurns: 0,
83
+ totalDurationMs: 0,
84
+ sessionCount: 0,
85
+ };
86
+ byRepo.set(repo, summary);
87
+ }
88
+ summary.totalCostUsd += session.costUsd;
89
+ summary.totalTokens.input += session.tokens.input;
90
+ summary.totalTokens.output += session.tokens.output;
91
+ summary.totalTokens.cacheRead += session.tokens.cacheRead;
92
+ summary.totalTokens.cacheCreation += session.tokens.cacheCreation;
93
+ summary.totalTurns += session.turns;
94
+ summary.totalDurationMs += session.durationMs;
95
+ summary.sessionCount += 1;
96
+ for (const [tool, count] of Object.entries(session.toolUsage)) {
97
+ summary.toolUsage[tool] = (summary.toolUsage[tool] ?? 0) + count;
98
+ }
99
+ }
100
+ return [...byRepo.values()].sort((a, b) => b.totalCostUsd - a.totalCostUsd);
101
+ }
102
+ export function getSessionStats(threadTs) {
103
+ const store = loadStats();
104
+ return store.sessions[threadTs];
105
+ }
106
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/services/stats.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/services/usage.ts"],"names":[],"mappings":"AAuCA,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CA0ClD"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/services/usage.ts"],"names":[],"mappings":"AAwCA,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAkElD"}
@@ -1,4 +1,5 @@
1
1
  import { execSync } from "node:child_process";
2
+ import { getProjectSummaries } from "./stats.js";
2
3
  function getOAuthToken() {
3
4
  // 1) Environment variable
4
5
  const envToken = process.env["ANTHROPIC_OAUTH_TOKEN"];
@@ -57,11 +58,32 @@ export async function fetchUsage() {
57
58
  const ss = Math.round(data.seven_day_sonnet?.utilization ?? 0);
58
59
  const fhLeft = data.five_hour?.resets_at ? formatRemaining(data.five_hour.resets_at) : "";
59
60
  const sdLeft = data.seven_day?.resets_at ? formatRemaining(data.seven_day.resets_at) : "";
60
- return [
61
+ const lines = [
61
62
  `:bar_chart: *Claude 사용량*`,
62
63
  `• *5시간:* ${fh}%${fhLeft}`,
63
64
  `• *7일:* ${sd}%${sdLeft}`,
64
65
  `• *7일 (Sonnet):* ${ss}%`,
65
- ].join("\n");
66
+ ];
67
+ // Append project stats
68
+ const projects = getProjectSummaries();
69
+ if (projects.length > 0) {
70
+ lines.push("");
71
+ lines.push(`:memo: *프로젝트별 통계*`);
72
+ for (const p of projects) {
73
+ const cost = p.totalCostUsd > 0 ? `$${p.totalCostUsd.toFixed(4)}` : "$0";
74
+ const tokens = p.totalTokens.input + p.totalTokens.output;
75
+ const toolList = Object.entries(p.toolUsage)
76
+ .sort(([, a], [, b]) => b - a)
77
+ .slice(0, 5)
78
+ .map(([name, count]) => `${name}(${count})`)
79
+ .join(", ");
80
+ lines.push(`\n*${p.repo}* — ${p.sessionCount}개 세션`);
81
+ lines.push(` • 비용: ${cost} | 토큰: ${tokens.toLocaleString()} | 턴: ${p.totalTurns}`);
82
+ if (toolList) {
83
+ lines.push(` • 도구: ${toolList}`);
84
+ }
85
+ }
86
+ }
87
+ return lines.join("\n");
66
88
  }
67
89
  //# sourceMappingURL=usage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/services/usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/services/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAQjD,SAAS,aAAa;IACpB,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACtD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,6BAA6B;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAClB,yEAAyE,EACzE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CACrC,CAAC,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,MAAM,EAAE,aAAa,EAAE,WAAW,IAAI,IAAI,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACpE,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,QAAQ,GAAG,EAAE,CAAC;IAC3B,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC;IAC7C,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,KAAK,KAAK,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC;IACvE,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,2FAA2F,CAAC;IACrG,CAAC;IAED,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,KAAK,CAAC,2CAA2C,EAAE;YAC9D,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,gBAAgB,EAAE,kBAAkB;aACrC;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,mBAAmB,IAAI,CAAC,MAAM,GAAG,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAI9B,CAAC;IAEF,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC;IAE/D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1F,MAAM,KAAK,GAAG;QACZ,0BAA0B;QAC1B,YAAY,EAAE,IAAI,MAAM,EAAE;QAC1B,WAAW,EAAE,IAAI,MAAM,EAAE;QACzB,oBAAoB,EAAE,GAAG;KAC1B,CAAC;IAEF,uBAAuB;IACvB,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACzE,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;iBACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;iBAC7B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;iBAC3C,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,UAAU,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;YACpF,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eniac-slack",
3
- "version": "0.1.38",
3
+ "version": "0.1.40",
4
4
  "type": "module",
5
5
  "bin": "./dist/cli.js",
6
6
  "scripts": {
@@ -7,6 +7,7 @@ import { downloadSlackImages, type SlackImageFile } from "../utils/slack-files.j
7
7
  import { CLAUDE_ICON_URL } from "../constants.js";
8
8
  import { formatSessionInfo } from "../utils/session-info.js";
9
9
  import { fetchUsage } from "../services/usage.js";
10
+ import { setSessionRepo } from "../services/stats.js";
10
11
  import { getUserClient } from "../services/slack-user-client.js";
11
12
  import { deleteThreadMessages } from "../utils/thread-delete.js";
12
13
  import fs from "node:fs/promises";
@@ -231,6 +232,7 @@ export async function startSessionWithRepo(
231
232
  }
232
233
 
233
234
  createSession(threadTs, workDir, authorUserId);
235
+ setSessionRepo(threadTs, `${repoInfo.owner}/${repoInfo.repo}`);
234
236
 
235
237
  const userMessage = `[Working directory: ${workDir} — Repository: ${repoInfo.owner}/${repoInfo.repo}]\n\n${cleanText}`;
236
238
  const stream = chat(threadTs, userMessage, client, channel, images?.length ? images : undefined);
@@ -12,6 +12,7 @@ import path from "node:path";
12
12
  import os from "node:os";
13
13
  import type { WebClient } from "@slack/web-api";
14
14
  import { requestPermission } from "./permissions.js";
15
+ import { recordToolUse, recordResult } from "./stats.js";
15
16
 
16
17
  interface Session {
17
18
  sessionId: string;
@@ -76,49 +77,60 @@ function loadMcpServers(): Record<string, McpServerConfig> | undefined {
76
77
 
77
78
  const mcpServers = loadMcpServers();
78
79
 
79
- // --- Slack formatting system prompt ---
80
- const SLACK_FORMAT_PROMPT = `
81
- # Slack Formatting Rules
82
-
83
- You are responding inside a Slack conversation. Follow these formatting rules strictly:
84
-
85
- ## Text Formatting
86
- - Use *bold* (single asterisk) instead of **bold** (double asterisk)
87
- - Use _italic_ (underscore) for emphasis
88
- - Use ~strikethrough~ for deleted text
89
- - Use \`inline code\` with backticks (same as Markdown)
90
- - Use \`\`\`code blocks\`\`\` with triple backticks (same as Markdown)
91
- - Use > for blockquotes (same as Markdown)
92
-
93
- ## Structure
94
- - Use bullet lists with • or - for unordered items
95
- - Use numbered lists with 1. 2. 3. for ordered items
96
- - Do NOT use # headers. Instead, use *bold text* on its own line as a section title
97
- - Use ─────── (horizontal line with box-drawing characters) instead of --- for dividers
98
-
99
- ## Tables
100
- - Slack does not support Markdown tables
101
- - When you need to display tabular data, use a code block with box-drawing characters:
102
- \`\`\`
103
- ┌──────┬───────┬──────┐
104
- Name Value Note
105
- ├──────┼───────┼──────┤
106
- foo │ 123 │ ok │
107
- bar │ 456 │ ok │
108
- └──────┴───────┴──────┘
109
- \`\`\`
110
-
111
- ## Links
112
- - Use <URL|display text> format instead of [display text](URL)
113
-
114
- ## Emoji
115
- - Use emoji actively to make messages more readable and engaging :rocket: :white_check_mark: :warning: :bulb: :memo:
116
- - Use emoji as visual indicators for status, categories, or emphasis
117
-
118
- ## General
119
- - Keep responses concise and scannable
120
- - Use line breaks generously for readability
121
- - Never use HTML tags
80
+ // --- MCP server filtering by user message ---
81
+ const KEYWORD_MCP_RULES: Array<{ key: string; patterns: RegExp }> = [
82
+ { key: "dokploy", patterns: /배포|deploy|dokploy|서버\s*상태|앱\s*(시작|중지|재시작|삭제)|redeploy|도메인/ },
83
+ { key: "vault", patterns: /시크릿|secret|vault|인증서|cert|pki|마운트|mount/ },
84
+ { key: "slack", patterns: /슬랙|slack|채널|메시지\s*보내|리액션|reaction/ },
85
+ ];
86
+
87
+ const KEYWORD_MCP_KEYS = new Set(KEYWORD_MCP_RULES.map((r) => r.key));
88
+
89
+ function selectMcpServers(
90
+ userMessage: string,
91
+ allServers: Record<string, McpServerConfig> | undefined
92
+ ): Record<string, McpServerConfig> | undefined {
93
+ if (!allServers) return undefined;
94
+
95
+ const msg = userMessage.toLowerCase();
96
+ const selected: Record<string, McpServerConfig> = {};
97
+
98
+ // Always include non-keyword MCP servers (e.g. filesystem, context7)
99
+ for (const [key, config] of Object.entries(allServers)) {
100
+ if (!KEYWORD_MCP_KEYS.has(key)) {
101
+ selected[key] = config;
102
+ }
103
+ }
104
+
105
+ // Include keyword MCP servers only when message matches
106
+ for (const { key, patterns } of KEYWORD_MCP_RULES) {
107
+ if (patterns.test(msg) && allServers[key]) {
108
+ selected[key] = allServers[key]!;
109
+ }
110
+ }
111
+
112
+ return Object.keys(selected).length > 0 ? selected : undefined;
113
+ }
114
+
115
+ // --- System prompt for Slack bot ---
116
+ const SYSTEM_PROMPT = `
117
+ You are an AI assistant in a Slack workspace, helping with software engineering tasks.
118
+ You have access to tools for reading/searching/editing code, running shell commands, and browsing the web.
119
+
120
+ # Guidelines
121
+ - Read and understand existing code before suggesting modifications.
122
+ - Keep solutions simple and focused. Only make changes that are directly requested.
123
+ - Do not introduce security vulnerabilities (injection, XSS, etc).
124
+ - When referencing code, include file_path:line_number format.
125
+ - Be concise. Lead with the answer, skip filler words.
126
+
127
+ # Slack Formatting
128
+ - *bold* (not **bold**), _italic_, ~strike~, \`code\`, \`\`\`code block\`\`\`
129
+ - No # headers → use *bold text* on its own line as section title
130
+ - Tables → code block with box-drawing chars (┌─┬┐ │ ├─┼┤ └─┴┘)
131
+ - Links → <URL|display text> (not [text](URL))
132
+ - Use emoji actively for readability :rocket: :white_check_mark: :warning:
133
+ - Keep responses concise and scannable. No HTML.
122
134
  `.trim();
123
135
 
124
136
  const SESSION_TTL_MS = 14 * 24 * 60 * 60 * 1000; // 2 weeks
@@ -475,17 +487,16 @@ export async function* chat(
475
487
  permissionMode: "bypassPermissions",
476
488
  allowDangerouslySkipPermissions: true,
477
489
  includePartialMessages: true,
478
- systemPrompt: {
479
- type: "preset",
480
- preset: "claude_code",
481
- append: SLACK_FORMAT_PROMPT,
482
- },
490
+ systemPrompt: SYSTEM_PROMPT,
483
491
  stderr: (data: string) => {
484
492
  stderrChunks.push(data);
485
493
  // Keep only last 50 chunks to avoid memory bloat
486
494
  if (stderrChunks.length > 50) stderrChunks.shift();
487
495
  },
488
- ...(mcpServers && { mcpServers }),
496
+ ...(() => {
497
+ const filtered = selectMcpServers(userMessage, mcpServers);
498
+ return filtered ? { mcpServers: filtered } : {};
499
+ })(),
489
500
  ...(session.hasStarted
490
501
  ? { resume: session.sessionId }
491
502
  : { sessionId: session.sessionId }),
@@ -523,6 +534,15 @@ export async function* chat(
523
534
  continue;
524
535
  }
525
536
 
537
+ // Track tool usage from tool_progress messages
538
+ if (msgType === "tool_progress") {
539
+ const tp = message as SDKMessage & { tool_name?: string };
540
+ if (tp.tool_name) {
541
+ recordToolUse(threadTs, tp.tool_name);
542
+ }
543
+ continue;
544
+ }
545
+
526
546
  // Final result — if streaming didn't deliver the text, use result.result as fallback
527
547
  if (msgType === "result") {
528
548
  const result = message as SDKMessage & {
@@ -534,6 +554,12 @@ export async function* chat(
534
554
  duration_ms?: number;
535
555
  total_cost_usd?: number;
536
556
  num_turns?: number;
557
+ usage?: {
558
+ input_tokens?: number;
559
+ output_tokens?: number;
560
+ cache_read_input_tokens?: number;
561
+ cache_creation_input_tokens?: number;
562
+ };
537
563
  };
538
564
  console.log(
539
565
  `[claude] result: subtype=${result.subtype}, is_error=${result.is_error ?? false}, stop_reason=${result.stop_reason ?? "null"}, duration_ms=${result.duration_ms ?? 0}, cost=$${result.total_cost_usd ?? 0}, turns=${result.num_turns ?? 0}, len=${result.result?.length ?? 0}, preview=${result.result?.substring(0, 200) ?? "null"}`
@@ -541,6 +567,22 @@ export async function* chat(
541
567
  if (result.errors && result.errors.length > 0) {
542
568
  console.error(`[claude] result errors: ${JSON.stringify(result.errors)}`);
543
569
  }
570
+
571
+ // Record stats
572
+ recordResult(threadTs, {
573
+ costUsd: result.total_cost_usd,
574
+ tokens: result.usage
575
+ ? {
576
+ input: result.usage.input_tokens,
577
+ output: result.usage.output_tokens,
578
+ cacheRead: result.usage.cache_read_input_tokens,
579
+ cacheCreation: result.usage.cache_creation_input_tokens,
580
+ }
581
+ : undefined,
582
+ turns: result.num_turns,
583
+ durationMs: result.duration_ms,
584
+ });
585
+
544
586
  if (result.subtype === "success") {
545
587
  receivedSuccessResult = true;
546
588
  }
@@ -0,0 +1,168 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+
5
+ interface SessionStats {
6
+ repo: string | null;
7
+ costUsd: number;
8
+ tokens: {
9
+ input: number;
10
+ output: number;
11
+ cacheRead: number;
12
+ cacheCreation: number;
13
+ };
14
+ toolUsage: Record<string, number>;
15
+ turns: number;
16
+ durationMs: number;
17
+ createdAt: string;
18
+ lastUpdatedAt: string;
19
+ }
20
+
21
+ interface StatsStore {
22
+ sessions: Record<string, SessionStats>;
23
+ }
24
+
25
+ const STATS_FILE = path.join(os.homedir(), ".eniac", "stats.json");
26
+
27
+ function loadStats(): StatsStore {
28
+ try {
29
+ const data = fs.readFileSync(STATS_FILE, "utf-8");
30
+ return JSON.parse(data) as StatsStore;
31
+ } catch {
32
+ return { sessions: {} };
33
+ }
34
+ }
35
+
36
+ function saveStats(store: StatsStore): void {
37
+ try {
38
+ const dir = path.dirname(STATS_FILE);
39
+ fs.mkdirSync(dir, { recursive: true });
40
+ fs.writeFileSync(STATS_FILE, JSON.stringify(store, null, 2));
41
+ } catch (err) {
42
+ console.warn("[stats] failed to save:", err);
43
+ }
44
+ }
45
+
46
+ export function recordToolUse(threadTs: string, toolName: string): void {
47
+ const store = loadStats();
48
+ const session = ensureSession(store, threadTs);
49
+ session.toolUsage[toolName] = (session.toolUsage[toolName] ?? 0) + 1;
50
+ session.lastUpdatedAt = new Date().toISOString();
51
+ saveStats(store);
52
+ }
53
+
54
+ export function recordResult(
55
+ threadTs: string,
56
+ data: {
57
+ costUsd?: number;
58
+ tokens?: {
59
+ input?: number;
60
+ output?: number;
61
+ cacheRead?: number;
62
+ cacheCreation?: number;
63
+ };
64
+ turns?: number;
65
+ durationMs?: number;
66
+ }
67
+ ): void {
68
+ const store = loadStats();
69
+ const session = ensureSession(store, threadTs);
70
+
71
+ if (data.costUsd != null) session.costUsd += data.costUsd;
72
+ if (data.tokens) {
73
+ session.tokens.input += data.tokens.input ?? 0;
74
+ session.tokens.output += data.tokens.output ?? 0;
75
+ session.tokens.cacheRead += data.tokens.cacheRead ?? 0;
76
+ session.tokens.cacheCreation += data.tokens.cacheCreation ?? 0;
77
+ }
78
+ if (data.turns != null) session.turns += data.turns;
79
+ if (data.durationMs != null) session.durationMs += data.durationMs;
80
+ session.lastUpdatedAt = new Date().toISOString();
81
+
82
+ saveStats(store);
83
+ }
84
+
85
+ export function setSessionRepo(
86
+ threadTs: string,
87
+ repo: string | null
88
+ ): void {
89
+ const store = loadStats();
90
+ const session = ensureSession(store, threadTs);
91
+ session.repo = repo;
92
+ saveStats(store);
93
+ }
94
+
95
+ function ensureSession(store: StatsStore, threadTs: string): SessionStats {
96
+ if (!store.sessions[threadTs]) {
97
+ store.sessions[threadTs] = {
98
+ repo: null,
99
+ costUsd: 0,
100
+ tokens: { input: 0, output: 0, cacheRead: 0, cacheCreation: 0 },
101
+ toolUsage: {},
102
+ turns: 0,
103
+ durationMs: 0,
104
+ createdAt: new Date().toISOString(),
105
+ lastUpdatedAt: new Date().toISOString(),
106
+ };
107
+ }
108
+ return store.sessions[threadTs]!;
109
+ }
110
+
111
+ interface ProjectSummary {
112
+ repo: string;
113
+ totalCostUsd: number;
114
+ totalTokens: {
115
+ input: number;
116
+ output: number;
117
+ cacheRead: number;
118
+ cacheCreation: number;
119
+ };
120
+ toolUsage: Record<string, number>;
121
+ totalTurns: number;
122
+ totalDurationMs: number;
123
+ sessionCount: number;
124
+ }
125
+
126
+ export function getProjectSummaries(): ProjectSummary[] {
127
+ const store = loadStats();
128
+ const byRepo = new Map<string, ProjectSummary>();
129
+
130
+ for (const session of Object.values(store.sessions)) {
131
+ const repo = session.repo ?? "(no repo)";
132
+ let summary = byRepo.get(repo);
133
+ if (!summary) {
134
+ summary = {
135
+ repo,
136
+ totalCostUsd: 0,
137
+ totalTokens: { input: 0, output: 0, cacheRead: 0, cacheCreation: 0 },
138
+ toolUsage: {},
139
+ totalTurns: 0,
140
+ totalDurationMs: 0,
141
+ sessionCount: 0,
142
+ };
143
+ byRepo.set(repo, summary);
144
+ }
145
+
146
+ summary.totalCostUsd += session.costUsd;
147
+ summary.totalTokens.input += session.tokens.input;
148
+ summary.totalTokens.output += session.tokens.output;
149
+ summary.totalTokens.cacheRead += session.tokens.cacheRead;
150
+ summary.totalTokens.cacheCreation += session.tokens.cacheCreation;
151
+ summary.totalTurns += session.turns;
152
+ summary.totalDurationMs += session.durationMs;
153
+ summary.sessionCount += 1;
154
+
155
+ for (const [tool, count] of Object.entries(session.toolUsage)) {
156
+ summary.toolUsage[tool] = (summary.toolUsage[tool] ?? 0) + count;
157
+ }
158
+ }
159
+
160
+ return [...byRepo.values()].sort(
161
+ (a, b) => b.totalCostUsd - a.totalCostUsd
162
+ );
163
+ }
164
+
165
+ export function getSessionStats(threadTs: string): SessionStats | undefined {
166
+ const store = loadStats();
167
+ return store.sessions[threadTs];
168
+ }
@@ -1,4 +1,5 @@
1
1
  import { execSync } from "node:child_process";
2
+ import { getProjectSummaries } from "./stats.js";
2
3
 
3
4
  interface UsageData {
4
5
  fiveHour: { utilization: number; resetsAt: string };
@@ -73,10 +74,34 @@ export async function fetchUsage(): Promise<string> {
73
74
  const fhLeft = data.five_hour?.resets_at ? formatRemaining(data.five_hour.resets_at) : "";
74
75
  const sdLeft = data.seven_day?.resets_at ? formatRemaining(data.seven_day.resets_at) : "";
75
76
 
76
- return [
77
+ const lines = [
77
78
  `:bar_chart: *Claude 사용량*`,
78
79
  `• *5시간:* ${fh}%${fhLeft}`,
79
80
  `• *7일:* ${sd}%${sdLeft}`,
80
81
  `• *7일 (Sonnet):* ${ss}%`,
81
- ].join("\n");
82
+ ];
83
+
84
+ // Append project stats
85
+ const projects = getProjectSummaries();
86
+ if (projects.length > 0) {
87
+ lines.push("");
88
+ lines.push(`:memo: *프로젝트별 통계*`);
89
+ for (const p of projects) {
90
+ const cost = p.totalCostUsd > 0 ? `$${p.totalCostUsd.toFixed(4)}` : "$0";
91
+ const tokens = p.totalTokens.input + p.totalTokens.output;
92
+ const toolList = Object.entries(p.toolUsage)
93
+ .sort(([, a], [, b]) => b - a)
94
+ .slice(0, 5)
95
+ .map(([name, count]) => `${name}(${count})`)
96
+ .join(", ");
97
+
98
+ lines.push(`\n*${p.repo}* — ${p.sessionCount}개 세션`);
99
+ lines.push(` • 비용: ${cost} | 토큰: ${tokens.toLocaleString()} | 턴: ${p.totalTurns}`);
100
+ if (toolList) {
101
+ lines.push(` • 도구: ${toolList}`);
102
+ }
103
+ }
104
+ }
105
+
106
+ return lines.join("\n");
82
107
  }